Menu
Coddy logo textTech

Die Ausgabe überprüfen

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

challenge icon

Aufgabe

In dieser Lektion fügst du Befehle zum Dumpen von Wellenformen hinzu und überprüfst, ob der Ampelcontroller korrekt funktioniert.

Bisher war die Testbench verborgen und wurde an dein Modul angehängt. In diesem Schritt ist die Testbench Bestandteil deiner Datei: Behalte das traffic_light-Modul aus dem vorherigen Schritt bei (Zähler-Timing, kein next-Eingang) und füge darunter ein testbench-Modul hinzu. Falls deine Datei noch kein module testbench enthält, kopiere dieses:

module testbench;
  reg clk, reset;
  wire red, yellow, green;
  traffic_light uut (
    .clk(clk),
    .reset(reset),
    .red(red),
    .yellow(yellow),
    .green(green)
  );
  always #1 clk = ~clk;
  initial begin
    // TODO: Add $dumpfile to create "traffic.vcd"
    // TODO: Add $dumpvars to dump all signals (0, testbench)
    $display("Traffic Light Test");
    $monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
    clk = 0;
    reset = 1;
    #2 reset = 0;
    #90;
    $finish;
  end
endmodule

Was zu tun ist:

Aktualisiere die Testbench wie folgt:

  1. Füge $dumpfile hinzu, um eine Wellenformdatei mit dem Namen traffic.vcd zu erstellen
  2. Füge $dumpvars hinzu, um alle Signale in der Testbench zu dumpen
  3. Führe die Simulation aus und überprüfe die Ausgabe

Der Test vergleicht die gesamte Sim simulatorausgabe, daher muss die Testbench exakt das ausgeben, was die obige Testbench ausgibt, und nichts anderes: den $display("Traffic Light Test")-Header, eine $monitor-Zeile pro Änderung der Lichter, eine Uhr, die bei jeder Zeiteinheit umschaltet, die bei Zeit 2 aufgehobene Rücksetzung und $finish nach #90. Füge keine weiteren $display-Zeilen hinzu (kein "Test complete").

Erwartete Ausgabe (der Simulator fügt selbst eine abschließende Zeile $finish called at 92 hinzu):

VCD info: dumpfile traffic.vcd opened for output.
Traffic Light Test
Time 0: red=1, yellow=0, green=0
Time 3: red=0, yellow=0, green=1
Time 65: red=0, yellow=1, green=0
Time 87: red=1, yellow=0, green=0

Probier es selbst

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // Zustände: 0=Grün, 1=Gelb, 2=Rot
  reg [1:0] state;
  reg [5:0] counter;
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Starte bei Rot
      counter <= 0;
    end else begin
      if (counter == 0) begin
        // Zustand ändern
        if (state == 0) begin  // Grün -> Gelb
          state <= 1;
          counter <= 10;       // Gelb dauert 10 Sekunden
        end else if (state == 1) begin  // Gelb -> Rot
          state <= 2;
          counter <= 40;       // Rot dauert 40 Sekunden
        end else begin  // Rot -> Grün
          state <= 0;
          counter <= 30;       // Grün dauert 30 Sekunden
        end
      end else begin
        counter <= counter - 1;
      end
    end
  end
  
  // Ausgabelogik
  always @(*) begin
    red = (state == 2);
    yellow = (state == 1);
    green = (state == 0);
  end
  
endmodule

module testbench;
  reg clk, reset;
  wire red, yellow, green;
  
  traffic_light uut (
    .clk(clk),
    .reset(reset),
    .red(red),
    .yellow(yellow),
    .green(green)
  );
  
  always #1 clk = ~clk;
  
  initial begin
    // TODO: Füge $dumpfile hinzu, um "traffic.vcd" zu erstellen
    
    // TODO: Füge $dumpvars hinzu, um alle Signale auszugeben (0, testbench)
    
    $display("Traffic Light Test");
    $monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
    
    clk = 0;
    reset = 1;
    #2 reset = 0;
    
    #90;
    $finish;
  end
endmodule
    
    

Alle Lektionen in Grundlagen

Übe selbstständig: Online-Verilog-Compiler