Automatisierung des Testvektors in Verilog HDL

Dies ist mein erster Versuch, die Verilog HDL-Testbench für ein UND-Gatter zu lernen:

   '
   ' 
initial
   begin
  //case 0
  A_t <= 0; B_t <= 0;
  #1 $display("F_t = %b", F_t);

  //case 1
  A_t <= 0; B_t <= 1;
  #1 $display("F_t = %b", F_t);

  //case 2
  A_t <= 1; B_t <= 0;
  #1 $display("F_t = %b", F_t);

  // case 3
  A_t <= 1; B_t <= 1;
  #1 $display("F_t = %b", F_t);

  end
endmodule

Meine Frage ist, da dies für zwei Eingänge gilt, wir nur vier Testfälle hatten, sagen wir, wir haben 2000 Fälle, können wir dann eine for-Schleife wie unten gezeigt verwenden:

   '
   '
initial
  begin
 for (i=0;i<2000;i++)
{
 for (j=0;j<2000;j++)
 {
A_t <= i; B_t <= j;
  #1 $display("F_t = %b", F_t);
 }
}
  end
 endmodule   

Ist es rechtlich korrekt, solche Schleifen zu verwenden? Wenn nicht, schlagen Sie mir bitte die richtige Methode zur Automatisierung der Eingaben vor.

Antworten (3)

'for'-Schleifen gibt es in Verilog, aber sie sehen so aus:

for(i = 0; i < 2000; i = i + 1) begin
 A_t <= i;
 #1 $display("F_t = %b", F_t);
end

Es gibt keinen ++Operator und Sie müssen beginand verwenden end.

Es ist eine sehr vernünftige Möglichkeit, die Eingaben zu automatisieren. Natürlich muss man das Timing richtig hinbekommen, was in deinem Fall damit erledigt ist #1.

Es ist ein ziemlich guter Ansatz, da die Testbench nicht synthetisiert werden soll. (Kleine syntaktische Änderungen müssen noch vorgenommen werden, wie in der vorherigen Antwort vorgeschlagen)

Sie können die Testbench auch erweitern, indem Sie die Testvektoren in einer externen Datei haben, das würde sie flexibler machen.

Eine andere Lösung wäre, Do-Files für Modelsim zu verwenden und auf diese Weise Stimuli zu generieren.

Eine einfachere Möglichkeit, alle Kombinationen anzuwenden, ist die Verwendung des Verkettungsoperators anstelle von verschachtelten for-Schleifen. Es sieht aus wie das,

integer i; //Represents range of input values
for(i = 0; i < 2000; i = i + 1)
begin
{A_t, B_t} = i; //Nonblocking assignment "<=" is non needed here.
$display($time, "A = %b, B = %b", A_t, B_t);
#1;
end