Erstellen von Stimuli
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 74 von 90.
Stimulus bezieht sich auf die Eingangswerte, die Sie an Ihr Design anlegen, um zu testen, ob es korrekt funktioniert. Indem Sie die Eingänge ändern und die Ausgänge beobachten, können Sie überprüfen, ob sich Ihr Design wie erwartet verhält.
Stellen Sie es sich wie das Testen einer Maschine vor: Sie drücken verschiedene Knöpfe (stimulus) und beobachten, was passiert (outputs). Das Erstellen eines guten stimulus ist ein wesentlicher Bestandteil beim Schreiben eines testbench.
Schauen Sie sich beispielsweise das Stimulus-Signal in der 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
endmoduleJedes Stimulus wird angewendet, danach warten wir 10 Zeiteinheiten (#10) vor dem nächsten Stimulus. Dies gibt dem DUT Zeit, einen Ausgang zu erzeugen.
Methoden zur Erzeugung von Stimuli
| Methode | Am besten für | Beispiel |
|---|---|---|
| Sequenzielle 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: Sequenzielle Zuweisungen
Die einfachste Möglichkeit, Stimuli zu erzeugen. Sie weisen Werte nacheinander 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 Sie alle möglichen Eingabekombinationen testen möchten.
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: Repeat-Schleife
Nützlich, um denselben Stimulus vielmals zu wiederholen.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endMethode 4: Forever-Schleife
Nützlich für kontinuierliche Signale wie Taktsignale.
initial begin
clk = 0;
forever #5 clk = ~clk;
endWichtige Regeln
| Regel | Erklärung |
|---|---|
| Verwenden Sie Verzögerungen zwischen Stimulus-Zuweisungen | #10 gibt dem DUT Zeit zu reagieren |
Verwenden Sie reg für Stimulus-Signale | Weil sie sich im Laufe der Zeit ändern |
Fügen Sie am Ende $finish hinzu | Um die Simulation zu stoppen |
Aufgabe
Ihnen wird ein OR-Gate-Modul bereitgestellt. Ihre Aufgabe ist es, den fehlenden Stimulus und die $display-Anweisungen hinzuzufügen, um die Ergebnisse auszugeben.
Was zu tun ist:
Fügen Sie Stimulus hinzu, um alle vier Eingabekombinationen (00, 01, 10, 11) zu testen:
- Setzen Sie in jeder Zeile die Werte für
xundy - Fügen Sie
#10für eine Verzögerung hinzu - Fügen Sie
$displayhinzu, um das Ergebnis auszugeben
Das <strong>$display</strong> 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. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster14Testbench-Grundlagen
Was ist eine TestbenchErstellen von StimuliDisplay und MonitorDumpfile und DumpvarsSystem-Tasks verwendenZusammenfassung – Vollständige Testbench3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen