3

Verilog HDL中的always关键字(不是always @块)和关键字有什么区别?forever

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

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

来自维基百科

always关键字的作用类似于“C”构造 while(1) {..},因为它将永远执行。

来自ElectroSofts

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

有人可以对此给出更清晰的解释吗?谢谢!

4

1 回答 1

9

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块、atask或类似物中。

于 2014-11-28T04:25:04.937 回答