VHDL Testbenk

From ift

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.