10. Testumgebungen

Zu einer kompletten Beschreibung in VHDL gehört auch die Erstellung einer Testumgebung (Testbench) für jedes Modul. Darunter versteht man die Bereitstellung von Stimuli und erwarteten Antworten für die zugehörigen Modelle. Außerdem kann eine Testbench verwendet werden, um das Verhalten alternativer Architekturen einer Schnittstelle miteinander zu vergleichen.

Die Testbench kann so aufgebaut werden, daß das zu testende Modul (MUT, model under test) in die Testbench instantiiert wird und parallel dazu die Stimulierzeugung bzw. Ergebnisprüfung realisiert wird. Stimulierzeugung und Ergebnisprüfung können auch in einem bzw. zwei von der Testbench getrennten Modulen stehen. Die Testbench hat dann nur noch die Aufgabe der Zusammenschaltung dieser Einzelmodule. Bild 10 zeigt die verschiedenen Realisierungsmöglichkeiten.

10.1 Beschreibung der Stimuli

Leider gibt es keine komfortablen Möglichkeiten, um in VHDL Stimuli zu beschreiben. Als einfachste Variante kann eine nebenläufige Signalzuweisung etwa wie folgt verwendet werden:

   net_1 <= '0' AFTER 0 ns,  '1' AFTER 15 ns,
'0' AFTER 40 ns, '1' AFTER 55 ns,
... ,
'0' AFTER 190 ns;

Alle angegebenen Zeiten sind relativ zum Zeitpunkt der Ausführung zu verstehen. Da es sich hierbei um eine einzige nebenläufige Anweisung handelt, die in der angegebenen Form zum Zeitnullpunkt ausgeführt wird, sind die Zeitangaben in diesem Fall absolut. Wird diese Art von Signalzuweisung innerhalb eines Prozesses verwendet, ist der Zeitpunkt der Abarbeitung von Bedeutung.

Bei mehreren Eingängen können natürlich mehrere solcher Zuweisungen akkumuliert werden. Zur übersichtlichen Art der Zusammenfassung muß der zugewiesene Ausdruck "qualifiziert" werden, d.h. man muß durch ein "qualified expression" angeben, von welchem Typ der nachfolgende Ausdruck ist. Dies geschieht zunächst durch Deklaration eines Subtyps vom gewünschten Datentyp (Vektor der richtigen Länge) und folgender Syntax:

  subtype_name'(expression
)

  SUBTYPE t3 IS std_ulogic_vector (1 TO 3);

...

(net_1, net_2, net_3) <= t3'("000") AFTER 10 ns,
t3'("010") AFTER 20 ns,
... ,
t3'("111") AFTER 99 ns;

Wenn man anstelle von absoluten mit relativen Zeiten arbeiten möchte, kann man stattdessen sequentielle Anweisungen verwenden:

   stimuli_generation : PROCESS
BEGIN
net_12 <= '0'; -- absolute time is 0 ns now
WAIT FOR 10 ns;
net_12 <= '1'; -- absolute time is 10 ns now
WAIT FOR 20 ns;
net_12 <= '0'; -- absolute time is 30 ns now
...
WAIT;
END PROCESS;

10.2 Überprüfung der erwarteten Antworten

In VHDL gibt es eine elegante Möglichkeit, unabhängig vom verwendeten Simulator die erwarteten mit den tatsächlichen Antworten zu vergleichen. Dazu verwendet man Assertions:

  ASSERT condition

REPORT "message_string"
SEVERITY level;

Die Anweisung erzeugt während der Simulation eine (Fehler-)Meldung ("message_ string" ), wenn die Bedingung (condition ) nicht erfüllt ist. Je nach angegebenem Severity-level (level ) und der Einstellung des Simulators wird die Simulation dann abgebrochen oder nicht. Ein Beispiel für die Verwendung:

   response_control : PROCESS
BEGIN
WAIT FOR 5 ns; -- absolute time is now 5 ns
ASSERT (rot = '0')
REPORT ("Rot ungleich 0") SEVERITY ERROR;
WAIT FOR 10 ns; -- absolute time is now 15 ns
ASSERT (rot = '1')
REPORT ("Rot ungleich 1") SEVERITY ERROR;
...
WAIT;
END PROCESS;

Stimulierzeugung und Antwortkontrolle können auch kombiniert werden:

    stimuli_gen_and_response_ctrl : PROCESS
BEGIN
sig_in1 <= '0'; sig_in2 <= '1';
WAIT FOR 1 ns; -- absolute time is now 1 ns
ASSERT (out_sig = '0')
REPORT ("Fehler am Ausgang") SEVERITY ERROR;
WAIT FOR 9 ns; -- absolute time is now 10 ns
sig_in1 <= '1'; sig_in2 <= '0';
WAIT FOR 1 ns; -- absolute time is now 11 ns
ASSERT (out_sig = '1')
REPORT ("Fehler am Ausgang") SEVERITY ERROR;
WAIT FOR 9 ns; -- absolute time is now 20 ns
sig_in1 <= '1'; sig_in2 <= '0';
WAIT FOR 1 ns; -- absolute time is now 21 ns
ASSERT (out_sig = '1')
REPORT ("Fehler am Ausgang") SEVERITY ERROR;
...
WAIT;
END PROCESS;