verilog赋值结果未定义' X'输出 - 为什么?

时间:2015-06-18 18:33:06

标签: verilog assign

我知道VHDL,只是学习verilog。我尝试使用位移做一个简单的任务,我得到了未定义的X' X'在结果中。我不明白为什么。这是使用Xilinx ISim软件进行仿真的。

这项任务:

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

结果' X'无论在哪里' 1'应该。例如,如果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

1 个答案:

答案 0 :(得分:4)

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

wire [23:0] dout = 0;

这创建了连续赋值,而不是初始化值。在我尝试使dout非零之前,此冲突未出现在模拟中。如果它是一个寄存器reg,它将是一个初始化值,但在这种情况下它是一个连线。摆脱了连续的assign = 0,问题解决了。