以下代码均生成时钟。我需要知道除了时钟生成之外是否还使用了永远循环?我只在时钟生成中永远遇到过。如果只是为了这个目的,岂不是没用?
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
clk = 0 ;
always begin
# 5 clk = ~clk;
end
end
以下代码均生成时钟。我需要知道除了时钟生成之外是否还使用了永远循环?我只在时钟生成中永远遇到过。如果只是为了这个目的,岂不是没用?
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
clk = 0 ;
always begin
# 5 clk = ~clk;
end
end
您的第二个代码段实际上是语法错误。forever
和之间的区别在于always
它always
可以作为“模块项”存在,这是 Verilog 规范赋予可以直接写入模块中的构造的名称,而不包含在其他构造中。initial
也是一个模块项。always
块被重复,而initial
块在模拟开始时运行一次。
forever
是只能在程序上下文中使用的程序语句。所以写initial forever
or是合法的always forever
,但不只是forever
.
变得非常重要的情况forever
是在任务中,这是程序上下文,因此always
不允许使用。(函数也是程序上下文,但可能不包含延迟,这使得它不太可能forever
有用。
是的,forever
循环在设计验证的测试平台中广泛使用,特别是在行业标准方法、UVM 及其前身(如 VMM)中。它们用于验证组件,例如广泛使用 SystemVerilog 类中的任务的驱动程序和监视器。
//我将显示差异;;;;;;; //我们不能在初始块内使用永远块,但我们可以在初始块内使用永远块 //错误代码:
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