Verilog HDL中的always
关键字( 不 always @
阻止)和forever
关键字有什么区别?
always #1 a=!a;
forever #1 a=!a;
以下是我的发现,但我仍然无法在两者之间划清界线:
来自Wikipedia:
始终关键字的行为类似于" C"构造while(1){..},因为它将永远执行。
来自electroSofts:
forever 指令不断重复其后的语句。因此,它应该与程序时序控件一起使用(否则它会挂起模拟)。
有人可以对此做出更明确的解释吗?谢谢!
答案 0 :(得分:7)
可以在模块级别使用always
构造来创建始终触发的过程块。通常,它之后是事件控件,例如,您可以在模块中编写类似的内容:
always @(posedge clk) <do stuff>
always @(en or d) <do stuff>
always @* <do stuff>
,也可以使用@(*)
这是编写锁存器,触发器等的典型方法。
相反,forever
构造是一个程序语句,通常只应用于测试平台代码。它可以在always
和initial
块以及其他语句中出现,但不能直接在模块中出现。例如,您可以使用它来编写如下内容:
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
或类似物中。