verilog 赋值导致未定义的 'X' 输出——为什么?

verilog assignment results in undefined 'X' output -- why?

我会VHDL,刚学verilog。我正在尝试使用位移位进行简单的赋值,结果得到 undefined 'X' 。我不明白为什么。这是用 Xilinx ISim 软件进行的仿真。

这个作业:

assign dout = $signed(data_out >>> shift_bits);

在应该是“1”的地方得到 'X'。例如,如果 data_out = '00001100',并且 shift_bits = 1,则 dout 将 = '00000XX0'。

下面是模块定义和赋值操作:

module SensorINV(
    input clk,
     input [23:0] din,
     input idv,
     input [4:0] shift_bits,
     output [23:0] dout,
     output reg odv
    );


reg [47:0] data_out = 0;        // initialize the output
assign dout = $signed(data_out >>> shift_bits);
// assign dout = data_out[44:21];   // this didn't work either

reg [1:0] state = 0;

always @(posedge clk) begin
    case (state)
        0   :   begin       // waiting for new data
            ...
        end
        1   :   begin
            ...
            data_out <= data_out + temp1_w;
            state <= 2;
        end
        2   :   begin
            ...
            state <= 0;
        end
        default :   state <= 0;
    endcase
end

问题原来是dout的驱动冲突,上面的代码中只显示了其中一个。在下一个模块中,这个模块被实例化(未显示),我有这样一行:

wire [23:0] dout = 0;

这创建了一个连续赋值,而不是一个初始化值。直到我试图使 dout 非零,这种冲突才出现在模拟中。如果它是一个寄存器reg,它将是一个初始化值,但在这种情况下它是一根电线。摆脱了连续分配= 0,问题解决了。