Menu
Coddy logo textTech

Vérification de la sortie

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 83 sur 90.

challenge icon

Défi

Dans cette leçon, vous allez ajouter des commandes de sauvegarde de forme d’onde et vérifier que le contrôleur de feux de circulation fonctionne correctement.

Jusqu’à présent, le banc de test était masqué et ajouté à votre module. À cette étape, le banc de test fait partie de votre fichier : conservez le module traffic_light de l’étape précédente (temporisation du compteur, aucune entrée next) et ajoutez un module testbench en dessous. Si votre fichier ne contient pas encore de module testbench, copiez celui-ci :

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

À faire :

Mettez à jour le banc de test pour :

  1. Ajouter $dumpfile pour créer un fichier de forme d’onde nommé traffic.vcd
  2. Ajouter $dumpvars pour sauvegarder tous les signaux du banc de test
  3. Exécuter la simulation et vérifier la sortie

Le test compare la sortie complète du simulateur : le banc de test doit donc afficher exactement ce que le banc de test ci-dessus affiche, et rien d’autre : l’en-tête $display("Traffic Light Test"), une ligne $monitor à chaque changement des feux, une horloge qui change d’état à chaque unité de temps, la désactivation de la réinitialisation au temps 2 et $finish après #90. N’ajoutez pas d’autres lignes $display (pas de "Test complete").

Sortie attendue (le simulateur ajoute lui-même une dernière ligne $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

Essayez vous-même

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // États : 0=Vert, 1=Jaune, 2=Rouge
  reg [1:0] state;
  reg [5:0] counter;
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Commence au Rouge
      counter <= 0;
    end else begin
      if (counter == 0) begin
        // Changer d'état
        if (state == 0) begin  // Vert -> Jaune
          state <= 1;
          counter <= 10;       // Le jaune dure 10 secondes
        end else if (state == 1) begin  // Jaune -> Rouge
          state <= 2;
          counter <= 40;       // Le rouge dure 40 secondes
        end else begin  // Rouge -> Vert
          state <= 0;
          counter <= 30;       // Le vert dure 30 secondes
        end
      end else begin
        counter <= counter - 1;
      end
    end
  end
  
  // Logique de sortie
  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: Ajouter $dumpfile pour créer "traffic.vcd"
    
    // TODO: Ajouter $dumpvars pour dumper tous les signaux (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
    
    

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne