【问题标题】:Always vs forever in Verilog HDLVerilog 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 指令不断重复其后的语句。因此,它应该与程序时序控制一起使用(否则它会挂起模拟)。

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

【问题讨论】:

  • 类似的问题,你可能会找到答案stackoverflow.com/questions/15938158/…
  • 显然我在这里的搜索中甚至在 Google 中都没有看到这个问题,我想知道为什么。无论如何,谢谢@chitranna!

标签: verilog hdl icarus


【解决方案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 或类似的块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多