Afin d’effectuer des tests sur les modules écrits en Verilog, il suffit d’installer iverilog ou cver et de créer des fichiers de simulation.

module counter(out, clk, reset);

  parameter WIDTH = 8;

  output [WIDTH-1 : 0] out;
  input 	       clk, reset;

  reg [WIDTH-1 : 0]   out;
  wire 	       clk, reset;

  always @(posedge clk)
    out <= out + 1;

  always @reset
    if (reset)
      assign out = 0;
    else
      deassign out;

endmodule // counter

Le module counter.v est le code qui sera implémenté. On crée maintenant le code nécessaire à la simulation counter_tb.v

module test;

  /* Make a reset that pulses once. */
  reg reset = 0;
  initial begin
     # 17 reset = 1;
     # 11 reset = 0;
     # 29 reset = 1;
     # 11 reset = 0;
     # 100 $stop;
  end

  /* Make a regular pulsing clock. */
  reg clk = 0;
  always #5 clk = !clk;

  wire [7:0] value;
  counter c1 (value, clk, reset);

  initial
     $monitor("At time %t, value = %h (%0d)",
              $time, value, value);
endmodule // test

Pour tester le tout,

$ iverilog -o design  counter_tb.v counter.v
$ vvp design

On remarque qu’il est très facile de générer une horloge. L’instruction monitor se comporte comme un printf, son déclenchement se fait à chaque changement de valeurs des variables en argument. Les changements du reset ne sont pas très clairs, on peut toutefois gagner en lisibilité.

initial begin
     #17;
     reset = 1;
     #11;
     reset = 0;
     #100;
     $stop; // on peut mettre l'instruction $finish afin de terminer la simulation
end

Liens :