使用 verilog 生成所有输出 X 的纹波进位加法器

Using verilog to generate a ripple-carry-adder with all output X

我是初学者,我想使用生成块编写一个纹波进位加法器。所以我编写了以下模块:

module ripple_carry_adder(ia, ib,  ci,  so,  co);

parameter N = 32;
input[N-1:0] ia;
input[N-1:0] ib;
input ci;
output[N-1:0] so;
output co;

wire [N:0] carry;
assign carry[0] = ci;

genvar j;
generate for(j = 0; j < N; j = j + 1) 
begin:r_loop
    wire t1, t2, t3;
    xor g1(t1, ia[i], ib[j]);
    xor g2(so[j], t1, carry[j]);
    and g3(t2, ia[i], ib[j]);
    and g4(t3, t1, carry[j]);
    or g5(carry[j+1], t2, t3);
end
endgenerate

assign co = carry[N];
endmodule

和测试台模块:

`include "ripple_carry_adder.v"
`timescale 1ns/1ps
module ripple_carry_adder_tb;

parameter N = 32;

reg clk;
reg[N-1:0] a, b;
wire[N-1:0] sum;
reg cin;
wire cout;

ripple_carry_adder rca(.ia(a), .ib(b), .ci(cin), .so(sum), .co(cout));
initial begin
    #10;
    a = 0;
    b = 0;
    cin = 0;
    clk = 0;
    #10;
end

always @(posedge clk)
begin
    #50;
    #1 a <= $random() % 1000000;
    #1 b <= $random() % 1000000;
end

always @(a or b)
    #5 $display("%d + %d = %d", a, b, sum);

always #5 clk = ~clk;

endmodule

但我得到了所有位未知的结果: result

我花了 1 个小时试图找出错误,但没有成功。你能帮帮我吗?

如我的评论所述,ia[i] 中的 i 未定义。将其更改为 j 应该可以获得所需的功能。

Verilog 会将任何未声明的变量视为单个位线,这被认为是正常行为,您很少会收到警告。一些模拟器可以选择标记未声明的变量。 IEEE Std 1364-2001(又名 Verilog-2001)中还添加了一个通用选项。您可以使用 `define_nettype 宏覆盖默认网络类型。通过将其设置为 none,必须显式声明宏声明后的所有网络。您可以通过阅读 IEEE Std 1364-2001 § 19.2 `default_nettypeIEEE Std 1800-2012 § 22.8 ` 获得有关 default_nettype 的更多详细信息default_nettype