1

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

これにより、いくつかのゲートが次の形式で生成されます。

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];
...

私の期待される出力は

000111111

私は実際に取得しています

000xxxxxx

x の理由が見つからず、iVerilog の問題ではないかと疑い始めています。

4

1 に答える 1

5

以下の宣言で代入を削除してください。宣言でワイヤを 0 に割り当てると、genvar ブロックの割り当て 1 と競合します。

 wire [8:0] b = 0;

への変更

wire [8:0] b;

それの訳は

wire [8:0] b = 0;

は初期化ではなく、継続的な代入です。と同等です

wire [8:0] b;
assign b = 0;

したがって、競合。

于 2016-08-01T04:33:53.057 に答える