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