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,问题解决了。
我会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,问题解决了。