使用永远和永远的陈述

时间:2013-04-10 23:15:45

标签: verilog

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

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

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

3 个答案:

答案 0 :(得分:8)

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

forever是一个程序语句,只能在程序上下文中使用。因此,撰写initial foreveralways forever是合法的,但不仅仅是forever

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

//我将展示差异; ;;;;;; //我们不能在初始块内使用forever块,但我们可以在初始块内使用forever块  //带错误的代码:

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