“for”的输出是未知的,而不是 Verilog 中的 1

adr*_*202 1 for-loop verilog iverilog

我正在使用 Icarus iVerilog 来综合和测试我的代码,但是当逻辑上应该出现 1 时,我得到了未知值。这是我正在尝试做的一个例子。

reg [8:0] a = 000110100;
wire [8:0] b = 0;

generate
    genvar i;
    for (i = 8; i > -1; i = i - 1)
    begin:loop
        assign b[i] = |a[8:i];
    end
endgenerate
Run Code Online (Sandbox Code Playgroud)

这应该产生一些形式的门

b[8] = a[8];
b[7] = a[8] | a[7];
b[6] = a[8] | a[7] | a[6];
b[5] = a[8] | a[7] | a[6] | a[5];
...
Run Code Online (Sandbox Code Playgroud)

我的预期输出是

000111111
Run Code Online (Sandbox Code Playgroud)

我实际上得到

000xxxxxx
Run Code Online (Sandbox Code Playgroud)

我找不到 x 的任何原因,并且开始怀疑这是 iVerilog 的问题。

小智 5

请删除下面声明中的赋值。声明中的赋值连线 0 与 genvar 块中的赋值 1 发生冲突

 wire [8:0] b = 0;
Run Code Online (Sandbox Code Playgroud)

改成

wire [8:0] b;
Run Code Online (Sandbox Code Playgroud)

这是因为

wire [8:0] b = 0;
Run Code Online (Sandbox Code Playgroud)

不是初始化,而是连续赋值。它相当于

wire [8:0] b;
assign b = 0;
Run Code Online (Sandbox Code Playgroud)

因此,冲突。