【发布时间】:2015-06-18 18:33:06
【问题描述】:
我知道 VHDL,并且正在学习 verilog。我正在尝试使用位移位进行简单分配,结果中出现未定义的“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
【问题讨论】:
-
可能是因为data_out和dout的宽度不同。也不确定为什么要使用一些中间 24 位(在您的注释行中)。你可以试试
assign dout = $signed(data_out >>> shift_bits)[UB:LB]。另外,为什么 data_out 是 reg 而不是电线?有没有你没有向我们展示的同步块? -
如果没有更多代码,我认为它与
reg [47:0] data_out = 0;行有关,该行正在为data_out设置一个连续赋值给48'd0。因此,每当您尝试将值 1 分配给data_out的任何位时,您都会得到1'bx。尝试删除= 0;部分,看看您的代码现在是否有效。 -
@mstbaum,是的,data_out 在同步块中,我发布了更多代码来展示。
-
@Unn,我相信 data_out = 0 行只是初始化值,而不是连续分配。我错了吗?
-
@ScottC 理论上,
reg类型应该是一个初始化。如果它是一个网,它将被视为一个连续分配(即wire [47:0] data_out = 0将是一个连续分配)。我认为这个工具可能正在这样做,即使我认为你是对的,它不应该是。我无法找到 LRM 所说的关于在声明时设置的变量类型,所以我不能 100% 确定reg [47:0] data_out = 0;的行为是严格定义的。仍然值得短暂删除初始化并查看模拟器会发生什么。