Printer friendly format for http://doc.uib.no/wiki/Testbenk1 :
Display with child pages or without header

Testbenk1

Do-file og testbenk.

Oppstart av modelsim:

Opne eit terminalvindu, og skriv :

source /gruppe/micro/.conf 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:

------------------------------------------------------------------------------
Copyright University of Bergen, Physics dep., 1995. -- All Rights Reserved. ----------------------------------------------------------------------------- -- -- File name : SR_latch.vhdl -- Title : -- Module : SR_latch -- -- Purpose : Ovingsoppgave -- -- Roadmap : ------------------------------------------------------------------------------- -- Modification History : -- Date Author Revision Comments -- Wed Mar 23 1995 Kjetil Ullaland REV A -- Tue Nov 25 2003 Kjetil Ullaland REV B -------------------------------------------------------------------------------

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;

Del.1 Do-file:

Første del av opogåva besto av å konstruere ei såkalt do-file som beskriv stimuli til sr_latch. Dette var ei ganske enkelt textfil som såg slik ut:

#Starter simulering på nytt(cleare) restart -f #Force s til 1 etter 100ns og til 0 etter 200ns, gjentar etter 200 ns force s 1 100ns, 0 200ns -repeat 200ns force r 1 100ns, 0 300ns -repeat 400ns #simulerer i 800ns run 800ns

Bruk av do-file: vsim SR_latch add wave * do f.fo

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.

Del.2 Testbench:

No skulle 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 skreiv vi så testbenken vår.

Koden til SR_tb.vhdl:

library ieee; use ieee.std_logic_1164.all; library work; use work.all;

--Navn på testbenken. entity sr_tb is end entity sr_tb;

architecture struct of sr_tb is --Deklarerer testsinglar 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: # 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.

Vi la inn nokon feil for å vise forskjellige feilmeldinger. Vi fekk også SR_latch til å oscillere.

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.