Este es mi primer intento de aprender el banco de pruebas Verilog HDL para una puerta AND:
'
'
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
Mi pregunta es que, dado que esto es para dos entradas, solo teníamos cuatro casos de prueba, digamos que tenemos 2000 casos, entonces podemos usar un bucle for como se muestra a continuación:
'
'
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
¿Es legalmente correcto usar bucles como este? De lo contrario, sugiérame el método correcto para automatizar las entradas.
Los bucles 'for' existen en verilog, pero se ven así:
for(i = 0; i < 2000; i = i + 1) begin
A_t <= i;
#1 $display("F_t = %b", F_t);
end
No hay ++
operador y tienes que usar begin
y end
.
Es una forma muy razonable de automatizar las entradas. Por supuesto que tienes que acertar en el momento, que en tu caso se hace con eso #1
ahí.
Es un enfoque bastante bueno ya que se supone que el banco de pruebas no debe sintetizarse. (Todavía se deben hacer pequeños cambios sintácticos como se sugiere en la respuesta anterior)
También puede extender el banco de pruebas al tener los vectores de prueba en un archivo externo, lo que lo haría más flexible.
Otra solución sería usar do-files para modelsim y generar estímulos de esa manera.
Una forma más fácil de aplicar todas las combinaciones es usar el operador de concatenación en lugar de bucles for anidados. Se parece a esto,
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