Stimuli erzeugen
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 74 von 90.
Stimulus bezeichnet die Eingabewerte, die du auf deinen Entwurf anwendest, um zu testen, ob er korrekt funktioniert. Indem du die Eingaben änderst und die Ausgaben beobachtest, kannst du überprüfen, ob sich dein Entwurf wie erwartet verhält.
Stell es dir wie beim Testen einer Maschine vor: Du drückst verschiedene Knöpfe (Stimulus) und beobachtest, was passiert (Ausgaben). Gute Stimuli zu erzeugen, ist ein wesentlicher Bestandteil beim Schreiben einer Testbench.
Sieh dir zum Beispiel den Stimulus im folgenden Testbench an:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// STIMULUS BEGINNT HIER
// Testfall 1: Beide Eingänge sind 0
a = 0; b = 0; #10;
// Testfall 2: a=0, b=1
a = 0; b = 1; #10;
// Testfall 3: a=1, b=0
a = 1; b = 0; #10;
// Testfall 4: Beide Eingänge sind 1
a = 1; b = 1; #10;
// STIMULUS ENDET HIER
$finish;
end
endmoduleJeder Reiz wird angelegt, dann warten wir 10 Zeiteinheiten (#10), bevor der nächste Reiz angelegt wird. Dadurch hat das DUT Zeit, einen Ausgang zu erzeugen.
Methoden zum Erzeugen von STIMULUS
| Methode | Am besten geeignet für | Beispiel |
|---|---|---|
| Sequentielle Zuweisungen | Einfache Tests | a = 0; b = 0; #10; |
| For-Schleife | Testen aller Kombinationen | for (i = 0; i < 4; i++) |
| Repeat-Schleife | Wiederholende Muster | repeat (10) #5 clk = ~clk; |
| Forever-Schleife | Kontinuierliche Signale | forever #5 clk = ~clk; |
Methode 1: Sequentielle Zuweisungen
Die einfachste Möglichkeit, STIMULUS zu erstellen. Du weist nacheinander Werte mit Verzögerungen zu.
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
endMethode 2: For-Schleife
Nützlich, wenn du alle möglichen Eingabekombinationen testen möchtest.
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endDies testet: 00, 01, 10, 11.
Methode 3: Wiederholungsschleife
Nützlich, um denselben STIMULUS viele Male zu wiederholen.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endMethode 4: Endlosschleife
Nützlich für kontinuierliche Signale wie Taktgeber.
initial begin
clk = 0;
forever #5 clk = ~clk;
endWichtige Regeln
| Regel | Erklärung |
|---|---|
| Verwende Verzögerungen zwischen Stimuluszuweisungen | #10 gibt dem DUT Zeit, zu reagieren |
Verwende reg für Stimulus-Signale | Weil sie sich im Laufe der Zeit ändern |
Füge am Ende $finish hinzu | Um die Simulation zu beenden |
Aufgabe
Du erhältst ein ODER-Gattermodul. Deine Aufgabe ist es, die fehlenden Stimuli und $display-Anweisungen hinzuzufügen, um die Ergebnisse auszugeben.
Aufgabe:
Füge Stimuli hinzu, um alle vier Eingangskombinationen zu testen (00, 01, 10, 11):
- Lege in jeder Zeile die Werte für
xundyfest - Füge
#10für eine Verzögerung hinzu - Füge
$displayhinzu, um das Ergebnis auszugeben
Das $display sollte wie folgt aussehen:
$display("%d %d | %d", x, y, z);Probier es selbst
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
$display("x y | z");
$display("---------");
// TODO: Stimulus und Anzeige für 0 0 hinzufügen
// TODO: Stimulus und Anzeige für 0 1 hinzufügen
// TODO: Stimulus und Anzeige für 1 0 hinzufügen
// TODO: Stimulus und Anzeige für 1 1 hinzufügen
$finish;
end
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster14Grundlagen von Testbenches
Was ist ein TestbenchStimuli erzeugenDisplay und MonitorDumpfile und DumpvarsSystem Tasks verwendenZusammenfassung – vollständiger Testbench3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellenÜbe selbstständig: Online-Verilog-Compiler