我知道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
答案 0 :(得分:4)
问题原来是dout
的驱动程序冲突,其中只有一个在上面的代码中显示。在下一个模块中,这个实例化(未显示),我有一个这样的行:
wire [23:0] dout = 0;
这创建了连续赋值,而不是初始化值。在我尝试使dout
非零之前,此冲突未出现在模拟中。如果它是一个寄存器reg
,它将是一个初始化值,但在这种情况下它是一个连线。摆脱了连续的assign = 0,问题解决了。