Menu
CoddyTech

永久循环

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 61 课,共 90 课。

forever 循环会持续不断地重复执行一段代码。它不会自行停止。

forever 循环会不断重复执行,没有尽头。它适合在测试平台中生成时钟和其他连续信号。

语法:

forever begin
  // 会一直重复运行的代码
end

简单示例

forever begin
  $display("This prints forever");
end

这会一直输出,导致你的模拟崩溃。一定要添加延迟或停止条件。

生成时钟(常见用法)

forever 最常见的用途是生成时钟:

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;   // 每隔 5 个时间单位翻转一次
  end
end

这会创建一个在整个模拟过程中运行的时钟。

使用 Disable 结束循环

你可以使用 disable 语句停止 forever 循环:

initial begin : clock_gen   // 这里添加了名称
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end
initial begin
  #100;
  disable clock_gen;   // 现在这样就可以了
end

forever 循环与其他循环的区别

循环会停止吗?适用场景
for会(达到固定迭代次数后)重复次数已知
while会(条件为 false 时)停止条件未知
repeat会(达到固定迭代次数后)重复次数已知
forever不会(永远不会)持续信号(时钟)

重要规则

规则说明
必须包含延迟#10 或 @(posedge clk)
没有延迟,仿真会卡住无限循环,时间不会推进
使用 disable 停止循环,或使用 $finish 结束仿真否则仿真永远不会结束
最适合在测试平台中使用不可综合
challenge icon

挑战

要做什么:

添加缺失的 forever 循环,生成一个每隔 10 个时间单位切换一次的时钟。

亲手试试

module forever_challenge;
  reg clk;
  
  initial begin
    clk = 0;
    // TODO: 添加 forever 循环,每隔 10 个时间单位切换一次 clk 的状态
  end
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器