VHDL Testbenk

From ift
Revision as of 11:55, 10 February 2010 by Ave082 (talk | contribs)

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;

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.

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.