【问题标题】:verilog assignment results in undefined 'X' output -- why?verilog 赋值导致未定义的“X”输出——为什么?
【发布时间】: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 &gt;&gt;&gt; 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; 的行为是严格定义的。仍然值得短暂删除初始化并查看模拟器会发生什么。

标签: verilog assign


【解决方案1】:

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

wire [23:0] dout = 0;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多