永久循环
本课属于 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
endinitial begin
#100;
disable clock_gen; // 现在这样就可以了
endforever 循环与其他循环的区别
| 循环 | 会停止吗? | 适用场景 |
|---|---|---|
for | 会(达到固定迭代次数后) | 重复次数已知 |
while | 会(条件为 false 时) | 停止条件未知 |
repeat | 会(达到固定迭代次数后) | 重复次数已知 |
forever | 不会(永远不会) | 持续信号(时钟) |
重要规则
| 规则 | 说明 |
|---|---|
| 必须包含延迟 | #10 或 @(posedge clk) |
| 没有延迟,仿真会卡住 | 无限循环,时间不会推进 |
使用 disable 停止循环,或使用 $finish 结束仿真 | 否则仿真永远不会结束 |
| 最适合在测试平台中使用 | 不可综合 |
挑战
要做什么:
添加缺失的 forever 循环,生成一个每隔 10 个时间单位切换一次的时钟。
亲手试试
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: 添加 forever 循环,每隔 10 个时间单位切换一次 clk 的状态
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器