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 das Testen einer Maschine vor: Du drückst verschiedene Tasten (Stimulus) und beobachtest, was passiert (Ausgaben). Das Erzeugen eines guten Stimulus ist ein wesentlicher Bestandteil beim Schreiben einer Testbench.
Betrachte zum Beispiel das Stimulus-Signal in der folgenden Testbench:
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), bevor der nächste Stimulus angewendet wird. Dadurch hat das DUT Zeit, eine Ausgabe zu erzeugen.
Methoden zum Erzeugen von Stimuli
| Methode | Am besten geeignet für | Beispiel |
|---|---|---|
| Sequenzielle Zuweisungen | Einfache Tests | a = 0; b = 0; #10; |
| For-Schleife | Das Testen aller Kombinationen | for (i = 0; i < 4; i++) |
| Repeat-Schleife | Das Wiederholen von Mustern | repeat (10) #5 clk = ~clk; |
| Forever-Schleife | Kontinuierliche Signale | forever #5 clk = ~clk; |
Methode 1: Sequentielle Zuweisungen
Die einfachste Methode, Stimulus zu erzeugen. Du weist Werte einzeln 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 Eingangskombinationen 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 stoppen |
Aufgabe
Dir wird ein OR-Gatter-Modul gegeben. Deine Aufgabe ist es, die fehlenden Stimuli und $display-Anweisungen hinzuzufügen, um die Ergebnisse auszugeben.
Was zu tun ist:
Füge Stimuli hinzu, um alle vier Eingangskombinationen (00, 01, 10, 11) zu testen:
- Setze in jeder Zeile die Werte für
xundy - Füge
#10für eine Verzögerung hinzu - Füge
$displayhinzu, um das Ergebnis auszugeben
Das <strong>$display</strong> sollte so 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