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 Eingangswerte, die Sie an Ihr Design anlegen, um zu testen, ob es korrekt funktioniert. Indem Sie die Eingänge ändern und die Ausgänge beobachten, 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 (outputs). Das Erstellen eines guten stimulus ist ein wesentlicher Bestandteil beim Schreiben eines testbench.

Schauen Sie sich beispielsweise das Stimulus-Signal 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

Jedes Stimulus wird angewendet, danach warten wir 10 Zeiteinheiten (#10) vor dem nächsten Stimulus. Dies gibt dem DUT Zeit, einen Ausgang zu erzeugen.

Methoden zur Erzeugung von Stimuli

MethodeAm besten 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

Die einfachste Möglichkeit, Stimuli zu erzeugen. 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 vielmals 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
Verwenden Sie Verzögerungen zwischen Stimulus-Zuweisungen#10 gibt dem DUT Zeit zu reagieren
Verwenden Sie reg für Stimulus-SignaleWeil sie sich im Laufe der Zeit ändern
Fügen Sie am Ende $finish hinzuUm die Simulation zu stoppen
challenge icon

Aufgabe

Ihnen wird ein OR-Gate-Modul bereitgestellt. 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 Eingabekombinationen (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);

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