Menu
Coddy logo textTech

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
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-SchleifeDas Testen aller Kombinationenfor (i = 0; i < 4; i++)
Repeat-SchleifeDas Wiederholen von Musternrepeat (10) #5 clk = ~clk;
Forever-SchleifeKontinuierliche Signaleforever #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;
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: 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 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