Revisions for Testbenk
changed:
-
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 :
<pre>
mentor
vsim &
</pre>
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
<pre>
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;
</pre>
Del.1 - 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:
<pre>
# 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
</pre>
Bruk av do-file
<pre>
vsim SR_latch
add wave *
do f.fo
</pre>
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.
*Del.2 Testbench:*
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:*
<pre>
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;
</pre>
Resultat:
Vi kan leggje inn feil for å få fram nokon feil for å vise forskjellige feilmeldinger. Vi fekk også SR_latch til å oscillere.
<pre>
# ** 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.
</pre>
*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.