以下代码均生成时钟。我需要知道除了时钟生成之外是否还有永久循环的使用?我只是在时钟生成中遇到过。如果只是为了这个目的,那不是没用吗?
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
clk = 0 ;
always begin
# 5 clk = ~clk;
end
end
答案 0 :(得分:8)
您的第二个代码段实际上是语法错误。 forever
和always
之间的区别在于always
可以作为“模块项”存在,这是Verilog规范为可能直接在模块中编写的构造提供的名称,不包含在其他一些构造中。 initial
也是一个模块项。重复always
个块,而initial
个块在模拟开始时运行一次。
forever
是一个程序语句,只能在程序上下文中使用。因此,撰写initial forever
或always 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