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.
'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 begin
and 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