Verilog For 循环

Verilog For loop

我在 verilog 中有以下代码来测试 For 循环:

module test1;

reg [2:0] i;

initial
begin
    for(i=0;i<=3;i=i+1) begin
         #10;
         $display("%d",i);
    end
end

endmodule

打印输出显示:

0 1个 2个 3

这对我来说很有意义。但是下面的波形让我很困惑:

reg 'i' 如何在此处取值“4”?

这是我正在处理的更大代码的一部分,我在测试台中使用了许多嵌套的 for 循环。

我正在添加一个行为怪异的嵌套循环:

module test1;

reg signed [2:0] i,j;

initial
begin
    for(i=-3;i<=3;i=i+1) begin
        for(j=-3;j<=3;j=j+1) begin
            #10;
            $display("%d   %d",i,j);
        end
    end
end

endmodule

输出波形如下图:

为什么第二个循环不工作而第一个循环一直重复?

这与 for 循环如何知道何时停止有关。

写的时候

for(i=0;i<=3;i=i+1)

这说明了三件事:

  1. i 从 0
  2. 开始
  3. 循环继续,直到 i<=3 变为 false
  4. 每次,i加一

问题是,在i变为4之前,i<=3不能变为假。当i变为4时,循环停止循环。但是 i 仍然是 4.


在您的嵌套循环示例中,问题是溢出。

您已将 j 声明为带符号的三位:

reg signed [2:0] i,j;

但是你一直在循环,直到 j 变成 4:

for(j=-3;j<=3;j=j+1)

无法将 4 表示为带符号的三位整数。因为 j<=3 必须始终为真,所以循环永远不会停止。