Erstellen von Stimuli
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 74 von 90.
Stimulus bezieht sich auf die Eingabewerte, die Sie auf Ihr Design anwenden, um zu testen, ob es korrekt funktioniert. Durch Ändern der Eingaben und Beobachten der Ausgaben 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 (Ausgaben). Das Erzeugen eines guten Stimulus ist ein wesentlicher Bestandteil beim Schreiben einer Testbench.
Schauen Sie sich zum Beispiel den Stimulus 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
endmoduleJeder Stimulus wird angewendet, dann warten wir 10 Zeiteinheiten (#10) vor dem nächsten Stimulus. Dies gibt dem DUT Zeit, eine Ausgabe zu erzeugen.
Methoden zur Erzeugung von Stimuli
| Methode | Bestens geeignet 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
Der einfachste Weg, Stimuli zu erstellen. 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 viele Male 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 |
|---|---|
| Verzögerungen zwischen Stimulus-Zuweisungen verwenden | #10 gibt dem DUT Zeit zu reagieren |
reg für Stimulus-Signale verwenden | Da sie sich über die Zeit ändern |
$finish am Ende hinzufügen | Um die Simulation zu beenden |
Aufgabe
Ihnen ist ein OR-Gate-Modul gegeben. 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 Eingangskombinationen (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);Spickzettel
Stimulus sind die Eingabewerte, die an ein DUT in einer Testbench angelegt werden, um das korrekte Verhalten zu verifizieren.
Methoden zur Erzeugung von Stimuli
Sequenzielle Zuweisungen – der einfachste Ansatz:
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
$finish;
endFor-Schleife – Testen aller Eingabekombinationen:
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i; #10;
end
$finish;
endRepeat-Schleife – Stimulus N-mal wiederholen:
repeat (10) begin
#10 a = ~a;
endForever-Schleife – kontinuierliche Signale wie Clocks:
initial begin
clk = 0;
forever #5 clk = ~clk;
endWichtige Regeln
- Verwenden Sie
regfür Stimulus-Signale (da sie sich über die Zeit ändern) - Fügen Sie Verzögerungen (z. B.
#10) zwischen den Zuweisungen ein, damit das DUT reagieren kann - Beenden Sie die Simulation mit
$finish
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