problemas con el banco de pruebas

1

Así que todavía estoy aprendiendo bancos de pruebas y este me está desconcertando. Escribí un módulo para hacer la multiplicación de 32 bits y pude hacer funcionar un banco de pruebas. Luego intenté una conversión simple para hacer que el módulo manejara la suma / resta y modifiqué el banco de pruebas. Por alguna razón, la salida del módulo está regresando con una 'x' pero no puedo ver el error. Se agradecería la ayuda.

El módulo suma & diff (2s complementa la resta) sin desbordamiento, así que solo paso los últimos 32 bits.

Estoy ejecutando esto bajo VCS 2014.12 con las siguientes opciones: -timescale = 1ns / 1ns + vcs + flush + all + warn = all -sverilog

module address_sum_diff(i_Aj, i_Ak, i_Instr, clk, o_Ai);
parameter size = 32; //Size is the width of adder
parameter level = 3; //Number of pipeline stages

input wire[size-1:0] i_Aj; //Aj wire
input wire[size-1:0] i_Ak; //Ak wire
input wire[6:0] i_Instr;   //Instr wire
input wire clk;            //Clock signal

output reg[size-1:0] o_Ai; //Ai register (No Overflow)

reg [size-1:0] Aj_int;            //Aj temp register
reg [size-1:0] Ak_int;            //Ak temp register
reg [6:0] Instr_int;              //Instr temp register
reg [size-1:0] Ai_int[level:1];   //Ai temp register
integer iCount;                   //Temp counter

assign o_Ai = Ai_int[level-1][31:0];//Move LSB only

always @(posedge clk)
 begin
  // Registering input of the adder
  Aj_int <= i_Aj;
  Ak_int <= i_Ak;
  Instr_int <= i_Instr;
  case(Instr_int[6:0])
   7'o020:Ai_int[0] <= Ak_int[size-1:0] + Aj_int[size-1:0];          //addition
   7'o021:Ai_int[0] <= Aj_int[size-1:0] + ~Ak_int[size-1:0] + 32'b1; //two's complement subtraction
  endcase
  // 'level' levels of registers to be inferred at the output of the multiplier
  for(iCount=1;iCount<level;iCount =iCount +1)
   Ai_int [iCount] <= Ai_int [iCount-1];
  end

   endmodule

El banco de pruebas es el siguiente

//Test Bench
module address_sum_diff_tb;
 parameter size = 32; //Width of adder
 parameter level = 3; //Stages in the pipelined adder

 reg [31:0] i_Aj;  //Aj register (input)
 reg [31:0] i_Ak;  //Ak register (input)
 reg [6:0] i_Instr;//Instr register (input) 

 reg clk;          //Clock signal (input)
 wire [31:0] o_Ai; //Ai register (output)

 //Temp registers & variables
 reg [31:0] Aj_temp [level:0];   //Aj temp register array
 reg [31:0] Ak_temp [level:0];   //Ak temp register array
 reg [31:0] Ai_temp [level:0];   //Ai temp register array
 reg [6:0] Instr_temp [level:0]; //Instr temp register array
 real i; //Temp counter
 real j; //Temp counter
 int k; //Temp counter

 //Initialize values
 initial begin
  clk <= 1'b0;
  i_Aj <= 32'b0;
  i_Ak <= 32'b0;
  i_Instr <= 7'b0;
 end

 //Cycle through all test cases
 always @(posedge clk)
  begin   
   i_Instr <=7'o020;
   for (i=1;i<15;i=i+1)
    begin
     for (j=1;j<15;j=j+1)
      begin
       i_Aj <= i;
       i_Ak <= j;
       Aj_temp[0] <= i_Aj;
       Ak_temp[0] <= i_Ak;          
       Instr_temp[0] <= i_Instr;
       @(posedge clk);
       for(k=1;k<level+1;k=k+1) 
        begin
         Instr_temp[k] <= Instr_temp[k-1];
         Aj_temp[k] <= Aj_temp [k-1];
         Ak_temp[k] <= Ak_temp [k-1];
         Ai_temp[k] <= Aj_temp [k-1] + Ak_temp [k-1];
        end
      end
    end
    $finish;
  end

 //Generate clock 
 always #1 clk <= ~clk;

 //Alert on self-check error
 always @(Ai_temp[level])
  begin
    if (o_Ai!==Ai_temp[level])
    begin
      $monitor("ERROR: %0d,\t%0o,\t%0d,\t%0d,\t%0d,\t%0d",$time, Instr_temp[level],Aj_temp[level], Ak_temp[level], o_Ai, Ai_temp[level]);
    end
  end

 //Log output 
 initial begin
  $dumpfile ("dump.vcd"); 
  $dumpvars; 
 end 

 //Output data to terminal     
  initial begin
    $display("\t\ttime,\tInstr,\tAj,\tAk,\tAi\tAiTmp"); 
    $monitor("%d,\t%0o,\t%0d,\t%0d,\t%0d,\t%0d",$time, Instr_temp[level], Aj_temp[level], Ak_temp[level], o_Ai, Ai_temp[level]); 
  end 

 //Initialize DUT
 address_sum_diff test_address_sum_diff (i_Aj, i_Ak, i_Instr, clk, o_Ai);
endmodule
    
pregunta J Kula

2 respuestas

1

Lo encontré, el error estaba en el verilog.

reg [size-1:0] Ai_int[level:1];   //Ai temp register

Estaba asignando a Ai_int[0] . La línea debe ser:

reg [size-1:0] Ai_int[level:0];   //Ai temp register
    
respondido por el J Kula
0

Creo que está actualizando Ai_int varias veces en el mismo bloque siempre, por lo que está tomando el valor actualizado, es decir, no lo use para el bucle y tampoco existe una memoria como Ai_int [0] como la declaró [3: 1].

    
respondido por el user168938

Lea otras preguntas en las etiquetas