initial 块
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 47 课,共 90 课。
Verilog 有两个过程块:initial(运行一次)和 always(持续运行)。现在我们来介绍 initial 块。
什么是 Initial 块?
initial 块在仿真开始时(时间 0)只运行一次。运行结束后,它不会再次运行。
它主要用于测试平台,用来:
- 设置初始值
- 生成测试信号
- 显示消息
- 启动仿真
语法
initial begin
// 语句按顺序执行一次
end基础示例
initial begin
$display("Simulation started");
$display("This runs once");
$finish;
end输出:
Simulation started
This runs once使用初始块生成测试信号
initial begin
a = 0;
#10 a = 1;
#10 a = 0;
#10 $finish;
end这会使 a 在时间点 0、10 和 20 发生变化。
初始执行与始终执行
initial | always | |
|---|---|---|
| 运行方式 | 一次 | 持续运行(永远) |
| 用途 | 测试平台、初始化 | 硬件(触发器、计数器) |
| 可综合? | 仅用于设置初始值(FPGA) | 可以(需使用敏感列表) |
重要说明
initial块主要用于仿真。综合工具无法将#10这样的延迟或$display这样的任务转换为硬件- 主要在测试平台中使用
initial。在设计模块中,只有 FPGA 综合工具会使用它,而且仅用于设置寄存器或存储器的初始值 - 如果测试平台中包含自由运行的时钟(例如
always #5 clk = ~clk;),除非调用$finish,否则仿真会一直运行;如果只有一个initial块,当没有剩余事件时,仿真器会自行停止,但添加$finish仍是良好的做法
挑战
添加缺失的 initial 块,将 a 设为 0,然后在 10 个时间单位后将 a 设为 1。
要做什么:
- 添加
initial begin和end - 设置
a = 0 - 等待
#10 - 设置
a = 1 - 添加 $finish 以结束仿真
亲手试试
module test;
reg a;
// TODO: 在这里添加 initial 块
// 将 a 设为 0
// 等待 #10
// 将 a 设为 1
// 添加 $finish; 以结束仿真
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器