VHDL Testbenk
Simulering av kode og testbenk i QuestaSim
Do-file og testbenk
Vi vil lage ei Do-file for å sleppe å skrive inn stimuli manuellt kvar gang vi simulerer.
Testbenken er eit nyttig hjelpemiddel for å kontrollere resultet frå simulering.
Oppstart av modelsim
Opne eit terminalvindu, og skriv :
ssh -X mikroserver4 source /eda/mentor/2019-20/scripts/QUESTA-CORE-PRIME_2019.4_RHELx86.sh vsim
Lage prosjekt i modelsim
Velg: file >new>project. Deretter kan du legge til vhdl-filer ved å velge add to project>add existing file. I denne oppgåva treng vi fila: sr_latch. Husk å kompliere vhdl filer før du simulerer.
Koden til SR_latch.vhdl
LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY SR_latch IS PORT ( S,R : IN std_logic ; Q,QB : INOUT std_logic ); END SR_latch; ------------------------------------------------------------------------------- ARCHITECTURE behave OF SR_latch IS BEGIN -- behave Q <= S nand QB; QB <= R nand Q; END behave;
Bruk av "Do-file"
Første del av oppgåva er å konstruere ei såkalt do-file som beskriv stimuli til sr_latch. Dette er ganske enkelt ei textfil som kan sjå slik ut:
# Starter simulering på nytt (clear) restart -f # Force s til 1 etter 100ns og til 0 etter 200ns, gjentar etter 200 ns force s 1 100 ns, 0 200 ns -repeat 200 ns force r 1 100 ns, 0 300 ns -repeat 400 ns # Simulerer i 800ns run 800 ns
Bruk av do-file
vsim -voptargs=+acc SR_latch add wave * do f.do
Resultat av simulering
# ** Error: (vsim-3601) Iteration limit reached at time 500 ns.
Som viser at vi får oscillasjon etter 500ns.
Vi får også opp eit wave-vindu med alle signal som er beskrive i entity.
Testbenk i VHDL
No skal vi lære oss å lage ein testbench som testar utverdiane mot forventa resultat og skriv ut forskjellige feilmeldingar. Velg: add to project>new file (type vhdl). I denne skriv vi så testbenken vår.
- Eksempelkode til SR_tb.vhdl:*
library ieee; use ieee.std_logic_1164.all; library work; use work.all; --Navn på testbenken. Vi treng ingen kopling til utanverda i testbenken. entity sr_tb is end entity sr_tb; architecture struct of sr_tb is --Deklarerer testsignalar og kva type dei er. signal S_tb : std_logic; signal R_tb : std_logic; signal Q_tb : std_logic; signal QB_tb : std_logic; begin --Velg kva einheit testbenken skal teste. SR : entity SR_latch(behave) --Koblar signala fra einheiten til testbenken. port map ( S => S_tb, R => R_tb, Q => Q_tb, QB => QB_tb); --Setter testvektorane, venter og ser kva vi får ut. --Samanliknar med forventa resultat, og gir ut eventuelle error. --Vi har lagt inn alle feiltypane i assert som eit eksempel. process begin --Setter S_tb <= '0'; R_tb <= '1'; wait for 100 ns; assert (Q_tb = '1') report "Q vart ikkje 1!" severity Error; assert (QB_tb = '0') report "QB vart ikkje 0!" severity Error; --Ingen endring S_tb <= '1'; R_tb <= '1'; wait for 100 ns; --Tester på feil verdier for å lage feilmelding assert (Q_tb = '0') report "Dette er ein feil" severity Error; assert (QB_tb = '1') report "Ein feil til" severity warning; --Reset S_tb <= '1'; R_tb <= '0'; wait for 100 ns; assert (Q_tb = '0') report "Q vart ikkje 0!" severity Error; assert (QB_tb = '1') report "QB vart ikkje 1!" severity Error; --Ingen endring S_tb <= '1'; R_tb <= '1'; wait for 100 ns; --Tester på feil verdier assert (Q_tb = '1') report "Endå meir feil" severity note; assert (QB_tb = '0') report "hu, masse feil ja" severity Warning; --Reset S_tb <= '1'; R_tb <= '0'; wait for 100 ns; assert (Q_tb = '0') report "Q does not match the expected value!" severity Error; assert (QB_tb = '1') report "QB does not match the expected value!" severity Error; --Set og reset S_tb <= '0'; R_tb <= '0'; wait for 100 ns; assert (Q_tb = '1') report "Q does not match the expected value!" severity Error; assert (QB_tb = '1') report "QB does not match the expected value!" severity Error; --Oscillilerer S_tb <= '1'; R_tb <= '1'; wait for 100 ns; assert (Q_tb = '1') report "Q does not match the expected value!" severity Error; assert (QB_tb = '0') report "QB does not match the expected value!" severity Error; end process; end;
For å kjøre igjennom hele filen bruker en
run -all
Resultat
Vi kan leggje inn feil for å få fram nokon feil for å vise forskjellige feilmeldinger. Vi fekk også SR_latch til å oscillere.
# ** Error: Dette er ein feil # Time: 200 ns Iteration: 0 Instance: :sr_tb # ** Warning: Ein feil til # Time: 200 ns Iteration: 0 Instance: :sr_tb # ** Note: Endå meir feil # Time: 400 ns Iteration: 0 Instance: :sr_tb # ** Warning: hu, masse feil ja # Time: 400 ns Iteration: 0 Instance: :sr_tb # ** Error: (vsim-3601) Iteration limit reached at time 600 ns.
Om en legger til testbenk signalene i wave vinduet så får en opp markeringer der hvor det har oppstått feil, rød for error og gul for warning. En kan så trykke på markeringene og få opp feilmeldingen.
Konklusjon
Vi kan lage ein do-file som styrer stimuli under simulering, slik at vi slepp å skrive kommandoer kvar gang vi simulerer. Vi kan lage ein testbench for å simuler og kontrollere svaret mot forventa resultat. Med assert kan vi skrive ut feilmeldinger av ulike typer når det oppstår feil.