VHDL Testbenk: Difference between revisions
New page: ===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 n... |
mNo edit summary |
||
Line 43: | Line 43: | ||
</pre> | </pre> | ||
== | ==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: | 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: | ||
Line 74: | Line 74: | ||
Vi får også opp eit wave-vindu med alle signal som er beskrive i entity. | 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. | No skal vi lære oss å lage ein testbench som testar utverdiane mot forventa resultat og skriv ut forskjellige feilmeldingar. |
Revision as of 07:19, 19 February 2009
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 :
mentor 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 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 oscilliasjon 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;
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.
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.