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 构造是一个程序语句,通常只能在测试台代码中使用。它可以出现在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 或类似的块中。

【讨论】:

以上是关于Verilog HDL 中的始终与永远的主要内容,如果未能解决你的问题,请参考以下文章

Verilog HDL函数与任务的使用

Verilog HDL仿真常用命令

Verilog HDL基本语法规则

Verilog HDL门级建模

HDL4SE:软件工程师学习Verilog语言

HDL4SE:软件工程师学习Verilog语言