In VHDL gehört die Simulation (schreiben einer Testbench) fix zur Entwicklung dazu. Die Testbench ist in VHDL geschrieben und liegt im Ordner vhdl.
Achtung: Nie in Quartus-Projekt einbinden. Quartus kann waits und asserts nicht kompilieren.
Ausgeführt (kompiliert) wird die Testbench über die Konsole vom Simlationsprogramm (per Script):
Simulationsprogramm
Bei altera ist questasim die Vollversion des Simulationsprogramms.

Ablage
Im Projektordner wird ein Ordner simulation angelegt. In diesen Ordner kommt – über das Einbinden der Bibliothek work – der Unterordner Work.
In diesen legt man das Script zum Starten der Simulation compile.do .
Testbench Datei
– die entity hat keine Ports. Sie besteht nur aus Signalen
– die IOs jeder Componente werden an Signale gehängt
– die Testsignale (stimuli) werden in processen gesetzt
– Signale dürfen nur Signalen zugewiesen werden
– die Tests (Vergleichsergebnis von Signalen)
. finden in den Prozessen statt. Die Processe haben keine Klammern
– stimuli: sind selbst entworfene Signalverläufe
– waits: bestimmen die zeitliche Abfolge unter den
. Signalen
– reports: geben die Resultat aus
. (Konsole oder in File (textbasiertes Testing).
– clk: der clk muss simuliert (erzeugt) werden.
. Dies geschieht durch einen eigenen clk-prozess
clk_generator : process begin . wait for 1 * clk_halfp; . clock_sig <= '1'; . wait for 1 * clk_halfp; . clock_sig <= '0'; end process;
entity ram_tb is end ram_tb; architecture struct of ram_tb is --------------------------------------------------------------- -- component declaration --------------------------------------------------------------- component ram port( . address : IN STD_LOGIC_VECTOR (15 DOWNTO 0); . clock : IN STD_LOGIC := '1'; . data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); . wren : IN STD_LOGIC ; . q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); end component; --------------------------------------------------------------- -- signal instantiation --------------------------------------------------------------- signal address_sig : STD_LOGIC_VECTOR (15 DOWNTO 0); signal clock_sig : STD_LOGIC := '1'; signal data_sig : STD_LOGIC_VECTOR (7 DOWNTO 0); signal wren_sig : STD_LOGIC ; signal q_sig : STD_LOGIC_VECTOR (7 DOWNTO 0); signal clk_halfp : time := 10 ns; signal clk_period : time := 20 ns; -- eventuell constanten mit resultaten definieren begin --------------------------------------------------------------- -- component instantiation --------------------------------------------------------------- inst_1 : ram port map ( . address => address_sig, . clock => clock_sig, . data => data_sig, . wren => wren_sig, . q => q_sig ); --------------------------------------------------------------- -- Set stimuli in process with timing --------------------------------------------------------------- test_1: process(all) . -- Initialwerte setzen . -- Signale an Komponenten legen (Stimulation) . -- Warten . -- Signal von Ausgang Komponente abfangen . -- Vergleichen des Outputs mit Erwartung . -- Ausgabe Testresulat end; -- test_1 end; -- architektur
Wie man die Tests startet, wird unter dem Eintrag Testbench ausführen erklärt. Eine professioneller Form des Testens basiert auf textbasierten Scripts.
Hier wird die Syntax der Testbench-Fehler (assert, report, severity,..) beschrieben.