在Verilog HDL中始终与永远相对

时间:2014-11-28 02:44:19

标签: verilog hdl icarus

Verilog HDL中的always关键字( always @阻止)和forever关键字有什么区别?

always #1 a=!a;
forever #1 a=!a;

以下是我的发现,但我仍然无法在两者之间划清界线:

来自Wikipedia

  

始终关键字的行为类似于" C"构造while(1){..},因为它将永远执行。

来自electroSofts

  

forever 指令不断重复其后的语句。因此,它应该与程序时序控件一起使用(否则它会挂起模拟)。

有人可以对此做出更明确的解释吗?谢谢!

1 个答案:

答案 0 :(得分:7)

可以在模块级别使用always构造来创建始终触发的过程块。通常,它之后是事件控件,例如,您可以在模块中编写类似的内容:

  • always @(posedge clk) <do stuff>

  • always @(en or d) <do stuff>

  • always @* <do stuff>,也可以使用@(*)

这是编写锁存器,触发器等的典型方法。

相反,forever构造是一个程序语句,通常只应用于测试平台代码。它可以在alwaysinitial块以及其他语句中出现,但不能直接在模块中出现。例如,您可以使用它来编写如下内容:

initial begin
  if (do_random_testing)
  begin
    forever #100 input = $random(...);
  end
  else if (read_from_file)
  begin
     ... read inputs from a file or whatever ...
  end
end

forever #1 a=!a;之类的东西写成模块中的顶级构造是不合法的。必须将其放在例如always块,initial块,task或类似物中。