Menu
Coddy logo textTech

Verificación de la salida

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 83 de 90.

challenge icon

Desafío

En esta lección, añadirás comandos para volcar formas de onda y verificarás que el controlador del semáforo funciona correctamente.

Hasta ahora, el banco de pruebas estaba oculto y se añadía a tu módulo. En este paso, el banco de pruebas forma parte de tu archivo: conserva el módulo traffic_light del paso anterior (temporización del contador, sin entrada next) y añade debajo un módulo testbench. Si tu archivo aún no tiene module testbench, copia este:

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

Qué hacer:

Actualiza el banco de pruebas para:

  1. Añadir $dumpfile para crear un archivo de formas de onda llamado traffic.vcd
  2. Añadir $dumpvars para volcar todas las señales del banco de pruebas
  3. Ejecutar la simulación y comprobar la salida

La prueba compara toda la salida del simulador, por lo que el banco de pruebas debe imprimir exactamente lo que imprime el banco de pruebas anterior y nada más: el encabezado $display("Traffic Light Test"), una línea de $monitor por cada cambio de las luces, un reloj que cambia de estado en cada unidad de tiempo, el reset desactivado en el tiempo 2 y $finish después de #90. No añadas otras líneas de $display (ninguna "Test complete").

Salida esperada (el simulador añade por sí mismo una línea final $finish called at 92):

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

Pruébalo tú mismo

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // Estados: 0=Verde, 1=Amarillo, 2=Rojo
  reg [1:0] state;
  reg [5:0] counter;
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Comienza en Rojo
      counter <= 0;
    end else begin
      if (counter == 0) begin
        // Cambiar estado
        if (state == 0) begin  // Verde -> Amarillo
          state <= 1;
          counter <= 10;       // El amarillo dura 10 segundos
        end else if (state == 1) begin  // Amarillo -> Rojo
          state <= 2;
          counter <= 40;       // El rojo dura 40 segundos
        end else begin  // Rojo -> Verde
          state <= 0;
          counter <= 30;       // El verde dura 30 segundos
        end
      end else begin
        counter <= counter - 1;
      end
    end
  end
  
  // Lógica de salida
  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: Añadir $dumpfile para crear "traffic.vcd"
    
    // TODO: Añadir $dumpvars para volcar todas las señales (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
    
    

Todas las lecciones de Fundamentos

Practica por tu cuenta: Compilador de Verilog online