Verilog Testbench con módulos canalizados

2

Primero, soy muy nuevo en verilog ... y los bancos de pruebas me están volviendo loco. Tengo un multiplicador canalizado y estoy tratando de escribir un banco de pruebas para verificarlo automáticamente. Mi problema es que aplico estímulos a la entrada, pero la respuesta correcta no sale hasta 5 ciclos más tarde. Entonces, en el banco de pruebas, estoy calculando la respuesta cuando golpea el estímulo, que nunca coincidirá con la salida. Pienso que debe haber una solución fácil para esto, pero aún no lo he resuelto.

El código de mi banco de pruebas está abajo. El módulo es un multiplicador de 32 bits con tuberías.

El resultado se calcula después de i_Aj & Los i_Ak están configurados, sin embargo, el módulo no produce una respuesta en o_Ai durante cinco ciclos. Esa es la esencia del problema.

module scalar_multiply_tb;

 reg [31:0] i_Aj, i_Ak;
 reg clk;
 wire [31:0] o_Ai;
 reg [32:0] count1, count2;

 initial
 begin
  clk <= 1'b0;
  i_Aj <= 32'b0;
  i_Ak <= 32'b0;

  repeat (50) @(posedge clk);
  //check all possible input
   for(count1 = 1; count1 <= 32'hffffffff; count1 = count1 + 1)  //Aj max 2^32
   begin
     for(count2 = 1; count2 <= 32'hffffffff; count2 = count2 + 1) //Ak max 2^32
      begin
       i_Aj = count1;
       i_Ak = count2;
       @(posedge clk);
      end
    end
  end

  always #10 clk <= ~clk;

  scalar_multiply u_scalar_multiply (i_Ak, i_Aj, clk, o_Ai);
   reg [63:0] Aj_d, Ak_d;
   reg [63:0] result;

   always@(posedge clk) 
    begin
     Aj_d <= i_Aj;
     Ak_d <= i_Ak;
    end

    always@(Aj_d or Ak_d) 
    begin
      result <= Aj_d*Ak_d;
    end  

   always@(result) 
    begin
     $display("CLK=%t,Aj=%d,Ak=%d,result=%d,actual=%d", $time,Aj_d,Ak_d,result,o_Ai);
     if(result != o_Ai)
      $display("ERROR: %t,sj=%d,sk=%d,result=%d,actual=%d", $time,Aj_d,Ak_d,result,o_Ai);
     end
    initial begin
     $dumpfile("dump.vcd");
     $dumpvars;
     #32000 $finish;
    end
endmodule
    
pregunta J Kula

1 respuesta

1

Cree una canalización para los resultados en su banco de pruebas:

   parameter PIPE = 5;
   reg [63:0] result [1:PIPE];

   always@(posedge clk) 
    begin
     Aj_d <= i_Aj;
     Ak_d <= i_Ak;
    end

    always@(Aj_d or Ak_d) 
    begin
      result[1] <= Aj_d*Ak_d;
      for (int i=2; i<=PIPE; i++) result[i] <= result[i-1];
    end  

   always@(result[PIPE]) 
    begin
     $display("CLK=%t,Aj=%d,Ak=%d,result=%d,actual=%d", $time,Aj_d,Ak_d,result[PIPE],o_Ai);
     if(result[PIPE] !== o_Ai)
      $display("ERROR: %t,sj=%d,sk=%d,result=%d,actual=%d", $time,Aj_d,Ak_d,result[PIPE],o_Ai);
     end
    
respondido por el toolic

Lea otras preguntas en las etiquetas