forever,repeat,while,for和do-while之间有什么区别

这些都是循环语句,根本上的不同在于begin-end语句块中执行了多少次循环:

从时间上看,在Verilog-2001中支持forever, repeat, while和for循环语句,do-while结构则是在SystemVerilog中引入的。

具体区别如下:

forever :forever 语句块中的语句会一直执行,没有任何变量来控制它,直到仿真结束。 例如:

  initial begin

    clk=1;

    forever begin:clk_block

    #(clk_period/2)clk=~clk;

    end

  end

forever 循环不能通过disable语句终止。

repeat:repeat语句块中执行一个固定循环次数的语句。

例如:

  integer var1,i;

  initial begin

    var1=8;

    i=0;

    repeat(var1)begin:this_loop

      i=i+1;

      $display("i=%0d",i)

    end

    $finish;

  end

var1必须在括号内。由于变量大小是循环执行的次数,所以在进入循环之前需要确定一个固定的常数。 disable语句可用于过早退出循环。

  integer i;

  initial begin

    i=8;

    while(i)begin:this_loop

      i=i-1;

      $display("i=%0d",i)

    end

    $finish;

  end

while:在begin-end语句块中无限地执行语句,表达式变为false。例如:

如果while里面的表达式一直为真的话,上面的代码可能最终成为一个无限循环。disable语句可用于提前退出循环。

 

for:和while循环类似,基于变量的次数执行begin-end里面的语句。 

  integer i;

  initial begin

    for(i=0;i<8;i++)begin:this_loop

      $display("i=%0d",i)

    end

    $finish;

  end

上面的代码将i的值显示为0,1,2,3,4,5,6,7。

如果for循环里面的表达式一直为真,for循环也会进入无限循环。disable语句可用于提前退出for循环。

for循环的另一个独特功能是它是唯一被综合工具支持的可综合循环语句结构。for循环中的语句会被复制固定次数。因此,for循环语句在被逻辑综合工具读取时,应该具有确定的循环次数,因为这是硬件,不是软件。

 

do-while:执行begin-end里面的,直到表达式为false。

  integer i;

  initial begin

    i=2;

    do begin

      i++;

    end while(i<15);

    $display("i=%0d",i)

    $finish;

  end

 

posted @ 2022-02-13 12:05  bsqhades  阅读(51)  评论(0)    收藏  举报