Menu
Coddy logo textTech

Creating Stimulus

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 74 von 90.

Stimulus bezeichnet die Eingangswerte, die du auf dein Design anwendest, um zu testen, ob es korrekt funktioniert. Indem du die Eingänge änderst und die Ausgänge beobachtest, kannst du überprüfen, ob sich dein Design wie erwartet verhält.

Stell es dir wie das Testen einer Maschine vor: Du drückst verschiedene Tasten (stimulus) und beobachtest, was passiert (outputs). Gutes stimulus zu erstellen, ist ein wesentlicher Bestandteil beim Schreiben eines testbench.

Betrachte zum Beispiel stimulus im 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
endmodule

Jeder 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

MethodeAm besten geeignet fürBeispiel
Sequenzielle ZuweisungenEinfache Testsa = 0; b = 0; #10;
For-SchleifeTesten aller Kombinationenfor (i = 0; i < 4; i++)
Repeat-SchleifeWiederholen von Musternrepeat (10) #5 clk = ~clk;
Forever-SchleifeKontinuierliche Signaleforever #5 clk = ~clk;

Methode 1: Sequenzielle Zuweisungen

Die einfachste Möglichkeit, Stimulus zu erzeugen. Du weist Werte mit Verzögerungen einzeln 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 Eingangskombinationen 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: 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;
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 stimulus-Zuweisungen#10 gibt dem DUT Zeit zu reagieren
Verwende reg für stimulus-SignaleWeil sie sich im Laufe der Zeit ändern
Add $finish am Ende hinzuUm die Simulation zu stoppen
challenge icon

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:

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