Automatización del vector de prueba en Verilog HDL

1

Este es mi primer intento de aprender Verilog HDL testbench 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, ya que es para dos entradas, solo tuvimos 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? Si no es así, por favor sugiérame el método correcto para automatizar las entradas.

    
pregunta gpuguy

3 respuestas

2

'for' existen bucles 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 un operador ++ y debes usar begin y end .

Es una forma muy razonable de automatizar las entradas. Por supuesto, debe obtener el tiempo correcto, lo que en su caso se realiza con ese #1 allí.

    
respondido por el pjc50
0

Es un enfoque bastante bueno ya que se supone que el banco de pruebas no se debe sintetizar. (Aún se deben hacer pequeños cambios sintácticos como se sugiere en la respuesta anterior)

También puede ampliar el banco de pruebas teniendo 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.

    
respondido por el Tomas
0

Una forma más sencilla de aplicar todas las combinaciones es usar un operador de concatenación en lugar de anidado para bucles. 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
    
respondido por el MayurKubavat

Lea otras preguntas en las etiquetas