Verilog HDL 中的始终与永远
Posted
技术标签:
【中文标题】Verilog HDL 中的始终与永远【英文标题】:Always vs forever in Verilog HDL 【发布时间】:2014-11-28 02:44:19 【问题描述】:Verilog HDL 中的always
关键字(不是 always @
块)和forever
关键字有什么区别?
always #1 a=!a;
forever #1 a=!a;
这是我的发现,但我仍然无法在两者之间划清界限:
来自Wikipedia:
always 关键字的作用类似于“C”构造 while(1) ..,因为它将永远执行。
来自electroSofts:
forever 指令不断重复其后的语句。因此,它应该与程序时序控制一起使用(否则它会挂起模拟)。
有人可以对此给出更清晰的解释吗?谢谢!
【问题讨论】:
类似的问题,你可能会找到答案***.com/questions/15938158/… 显然我在这里的搜索中甚至在 Google 中都没有看到这个问题,我想知道为什么。无论如何,谢谢@chitranna! 【参考方案1】: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
或类似的块中。
【讨论】:
以上是关于Verilog HDL 中的始终与永远的主要内容,如果未能解决你的问题,请参考以下文章