Menu
Coddy logo textTech

Writing The Testbench

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

challenge icon

Aufgabe

In dieser Lektion erstellst du einen testbench, um zu überprüfen, ob der Traffic-Light-Controller korrekt funktioniert.

Aufgabe:

Erstelle einen testbench, der:

  1. Signale deklariert (reg für clk und reset, wire für red, yellow, green)
  2. das Modul traffic_light mit dem Namen uut instanziiert
  3. einen Takt erzeugt, der alle 1 time unit wechselt
  4. reset für 2 time units anwendet und anschließend freigibt
  5. die simulation 100 time units lang ausführt

Die simulation wird anhand der ausgegebenen Daten überprüft, daher muss der initial-Block ebenfalls genau diese Zeilen erzeugen:

  1. Traffic Light Test mit $display ausgeben, bevor clock und reset eingerichtet werden
  2. Nach den 100 time units Test complete mit $display ausgeben
  3. Die simulation mit $finish beenden, wodurch eine eigene Zeile zur Ausgabe hinzugefügt wird

Probier es selbst

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;
  reg [5:0] counter;

  // Ausgabezuweisungen
  always @(*) begin
    case (state)
      0: begin green = 1; yellow = 0; red = 0; end
      1: begin green = 0; yellow = 1; red = 0; end
      2: begin green = 0; yellow = 0; red = 1; end
      default: begin green = 0; yellow = 0; red = 1; end
    endcase
  end

  // Zustandsmaschine mit Timing
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;
      counter <= 0;
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            counter <= 10;
          end
          1: begin
            state <= 2;
            counter <= 40;
          end
          2: begin
            state <= 0;
            counter <= 30;
          end
        endcase
      end else begin
        counter <= counter - 1;
      end
    end
  end

endmodule

module testbench;
  // TODO: Deklariere reg für clk und reset
  
  // TODO: Deklariere wire für red, yellow, green
  

  // TODO: Instanziiere traffic_light-Modul mit Namen uut
  // Verbinde clk, reset, red, yellow, green
  

  // TODO: Generiere Takt (umschalten alle 1 Zeiteinheit)
  

  initial begin
    $display("Traffic Light Test");
    
    // TODO: Initialisiere clk auf 0
    
    // TODO: Setze reset an (reset=1 für 2 Zeiteinheiten, dann reset=0)
    
    
    // TODO: Führe Simulation für 100 Zeiteinheiten aus
    
    
    $display("Test complete");
    $finish;
  end
endmodule

Alle Lektionen in Grundlagen

Übe selbstständig: Online-Verilog-Compiler