首页 > 解决方案 > 输出处于未定义状态

问题描述

图像。我正在尝试解决下面写的问题。我很困惑为什么我的输出处于未定义状态。“人口计数”电路计算输入向量中“1”的数量。为 255 位输入向量构建人口计数电路。

module top_module( 
    input [254:0] in,
    output [7:0] out );

    reg [7:0] counter=8'b0;
    reg [7:0] counter_next=8'b0;
    always @ (*)
        begin
            counter=counter_next;
        end
    always @ (*)
        begin
            for (int i=0; i<$bits(in);i++)
                counter_next=counter+in[i];
        end
    assign out=counter;
endmodule

标签: verilog

解决方案


困惑为什么我的输出处于未定义状态。

所有 HDL 变量都是未定义的(“X”或“U”),直到您给它们一个值。
然后,您将一个值添加到counter_next=counter+in[i];仍然给出未定义的未定义值。所以它保持这种状态。

此外,您正在使用“counter=counter_next”,这表明您已经看到了一些现有的 HDL 代码并且您正在尝试复制它,但您不明白为什么它会以这种方式实现。当有时钟时使用“下一个”系统。你没有时钟,因此在这里它是多余的。

您正在寻找的代码可能是这样的:

output reg [7:0] out

always @( * )
begin
   out = 0;
   for (int i=0; i<$bits(in);i++)
      out =out+in[i];
end

请注意,我在counter这里没有使用额外的变量。我所做的只是制作一个 reg 类型,以便我可以直接使用它。


推荐阅读