Menu
CoddyTech

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
endmodule

Jeder 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

MethodeAm besten geeignet fürBeispiel
Sequentielle ZuweisungenEinfache Testsa = 0; b = 0; #10;
For-SchleifeTesten aller Kombinationenfor (i = 0; i < 4; i++)
Repeat-SchleifeWiederholende Musterrepeat (10) #5 clk = ~clk;
Forever-SchleifeKontinuierliche Signaleforever #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;
end

Methode 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;
end

Dies 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;
end

Methode 4: Endlosschleife

Nützlich für kontinuierliche Signale wie Taktgeber.

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Wichtige Regeln

RegelErklärung
Verwende Verzögerungen zwischen Stimuluszuweisungen#10 gibt dem DUT Zeit, zu reagieren
Verwende reg für Stimulus-SignaleWeil sie sich im Laufe der Zeit ändern
Füge am Ende $finish hinzuUm die Simulation zu beenden
challenge icon

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):

  1. Lege in jeder Zeile die Werte für x und y fest
  2. Füge #10 für eine Verzögerung hinzu
  3. Füge $display hinzu, 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
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen

Übe selbstständig: Online-Verilog-Compiler