8

以下代码均生成时钟。我需要知道除了时钟生成之外是否还使用了永远循环?我只在时钟生成中永远遇到过。如果只是为了这个目的,岂不是没用?

initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end

initial begin
clk = 0 ;
always begin 
# 5 clk = ~clk;
end
end
4

3 回答 3

8

您的第二个代码段实际上是语法错误。forever和之间的区别在于alwaysalways可以作为“模块项”存在,这是 Verilog 规范赋予可以直接写入模块中的构造的名称,而不包含在其他构造中。initial也是一个模块项。always块被重复,而initial块在模拟开始时运行一次。

forever是只能在程序上下文中使用的程序语句。所以写initial foreveror是合法的always forever,但不只是forever.

变得非常重要的情况forever是在任务中,这是程序上下文,因此always不允许使用。(函数也是程序上下文,但可能不包含延迟,这使得它不太可能forever有用。

于 2013-04-11T00:40:04.387 回答
1

是的,forever循环在设计验证的测试平台中广泛使用,特别是在行业标准方法、UVM 及其前身(如 VMM)中。它们用于验证组件,例如广泛使用 SystemVerilog 类中的任务的驱动程序和监视器。

于 2013-04-10T23:32:41.923 回答
0

//我将显示差异;;;;;;; //我们不能在初始块内使用永远块,但我们可以在初始块内使用永远块 //错误代码:

module stimulus(output reg a,b); 

 initial
 begin
  a = 1'b1;
  b = 1'b0;

  always
  begin
   #5 a = ~a;           //error when compiling
    #6 b = ~a;
  end

end

 initial
    #25 $stop;

endmodule




  // code with no error
module stimulus(output reg a,b); 

 initial
 begin
  a = 1'b1;
  b = 1'b0;

  always
  begin
   #5 a = ~a;    //no error when compiling
    #6 b = ~a;
  end

end

 initial
    #25 $stop;

endmodule
于 2014-06-19T05:58:34.827 回答