Menu
Coddy logo textTech

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
endmodule

Jeder 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

MethodeBestens geeignet fürBeispiel
Sequenzielle 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: 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;
end

Methode 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;
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: Forever-Schleife

Nützlich für kontinuierliche Signale wie Taktsignale.

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

Wichtige Regeln

RegelErklärung
Verzögerungen zwischen Stimulus-Zuweisungen verwenden#10 gibt dem DUT Zeit zu reagieren
reg für Stimulus-Signale verwendenDa sie sich über die Zeit ändern
$finish am Ende hinzufügenUm die Simulation zu beenden
challenge icon

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:

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

For-Schleife – Testen aller Eingabekombinationen:

integer i;
initial begin
  for (i = 0; i < 4; i = i + 1) begin
    {a, b} = i; #10;
  end
  $finish;
end

Repeat-Schleife – Stimulus N-mal wiederholen:

repeat (10) begin
  #10 a = ~a;
end

Forever-Schleife – kontinuierliche Signale wie Clocks:

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

Wichtige Regeln

  • Verwenden Sie reg fü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
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