Menu
Coddy logo textTech

Writing The Testbench

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 82 de 90.

challenge icon

Desafio

Nesta lição, você criará um testbench para verificar se o controlador de semáforo funciona corretamente.

O que fazer:

Crie um testbench que:

  1. Declare sinais (reg para clk e reset, wire para red, yellow, green)
  2. Instancie o módulo traffic_light com o nome uut
  3. Gere um clock que alterne a cada 1 unit de time
  4. Aplique reset por 2 units de time e, então, libere-o
  5. Execute a simulation por 100 units de time

A simulation é verificada pelo que ela imprime, portanto o bloco initial também precisa produzir exatamente estas linhas:

  1. Imprima Traffic Light Test com $display antes que o clock e o reset sejam configurados
  2. Após as 100 units de time, imprima Test complete com $display
  3. Encerre a simulation com $finish, que adiciona sua própria linha à saída

Experimente você mesmo

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

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

  // Atribuições de saída
  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

  // Máquina de estados com temporização
  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: Declare reg para clk e reset
  
  // TODO: Declare wire para red, yellow, green
  

  // TODO: Instancie o módulo traffic_light com o nome uut
  // Conecte clk, reset, red, yellow, green
  

  // TODO: Gere o clock (alterne a cada 1 unidade de tempo)
  

  initial begin
    $display("Traffic Light Test");
    
    // TODO: Inicialize clk com 0
    
    // TODO: Aplique reset (reset=1 por 2 unidades de tempo, depois reset=0)
    
    
    // TODO: Execute a simulação por 100 unidades de tempo
    
    
    $display("Test complete");
    $finish;
  end
endmodule

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online