SystemVerilog X 传播问题

SystemVerilog X propagation issue

我的 SV 代码有问题。我正在尝试模拟一个进位超前加法器。但是,当我查看计时结果时

他们显示结果传播了 x,以及 SUM

这是我的 SystemVerilog 代码

module fulladder (input logic i_bit1, i_bit2, i_carry,
                  output logic o_sum, o_carry);
  
  assign o_sum = i_bit1 ^ i_bit2 ^ i_carry;
  assign o_carry = (i_bit1 & i_bit2) | (i_carry & (i_bit1 ^ i_bit2));
  
endmodule


module carry_lookahead_adder
  #(parameter WIDTH)
  (input logic [WIDTH-1:0] i_add1,
   input logic [WIDTH-1:0] i_add2,
   output logic [WIDTH:0] o_result
  );
  logic [WIDTH:0]  w_C;
  logic [WIDTH-1:0] w_G, w_P, w_SUM;
  
  //Generate full adders
  genvar i;
  generate for (i= 1; i<WIDTH; i++)
    begin : f_loop   
      fulladder fi ( 
              .i_bit1(i_add1[i]),
              .i_bit2(i_add2[i]),
              .i_carry(w_C[i]),
              .o_sum(w_SUM[i]),
              .o_carry()
              );
    end 
  endgenerate
  
  genvar jj;
  generate 
    for (jj=0; jj<WIDTH; jj++)
      begin 
        assign w_G[jj]  = i_add1[jj] & i_add2[jj];
        assign w_P[jj]  = i_add1[jj] | i_add2[jj];
        assign w_C[jj+1] = w_G[jj] | (w_P[jj] & w_C[jj]);
      end
  endgenerate     
    
      assign w_C[0] = 1'b0; //No carry input
     
  assign o_result = {w_C[WIDTH], w_SUM};
                                          
endmodule

和测试平台

module carry_lookahead_adder_tb (w_RESULT);
 
  parameter WIDTH = 32;
 
  logic [WIDTH-1:0] r_ADD_1 = 0;
  logic [WIDTH-1:0] r_ADD_2 = 0;
 output logic [WIDTH:0]  w_RESULT;
   
  carry_lookahead_adder #(.WIDTH(WIDTH)) carry_lookahead_inst
    (
     .i_add1(r_ADD_1),
     .i_add2(r_ADD_2),
     .o_result(w_RESULT)
     );
 
  initial
    begin
      $dumpfile("dump.vcd");
     $dumpvars;
      
      #10;
      r_ADD_1 = 32'b00000000000000000000000000000000;
      r_ADD_2 = 32'b00000000000000000000000000000001;
      #10;
      r_ADD_1 = 32'b00000000000000000000000000000010;
      r_ADD_2 = 32'b00000000000000000000000000000010;
      #10;
      r_ADD_1 = 32'b00000000000000000000000000000101;
      r_ADD_2 = 32'b00000000000000000000000000000110;
      #10;
      r_ADD_1 = 32'b00000000100000000000000000000101;
      r_ADD_2 = 32'b00000000100000000000000000000110;
      #10;
      r_ADD_1 = 32'b11111111111111111111111111111111;
      r_ADD_2 = 32'b11111111111111111111111111111111;
      #10;
      r_ADD_1 = 32'b00000000000000000000000000000000;
      r_ADD_2 = 32'b00000000000000000000000000000001;
      #10;
    end
 
endmodule // carry_lookahead_adder_tb

任何人都可以告诉我可能导致此 x 的原因吗?抱歉 post 我的完整代码;我只是不知道问题出在哪里。

w_SUM 的位 [0] 未知,因为您没有驾驶它。更改 generate for 循环,使计数从 0 开始,而不是 1。更改:

  generate for (i= 1; i<WIDTH; i++)

至:

  generate for (i= 0; i<WIDTH; i++)

此更改后,x 消失。

问题是 for 循环没有生成正确数量的 fulladder 实例:你需要 32 个,但你只有 31 个。没有 fulladder 个实例你连接 w_SUM[0], i_add1[0], 等.