Revisions for Testbenk1

added:
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.