什么是延迟
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 67 课,共 90 课。
在 Verilog 中,延迟用于控制语句执行或信号变化的时间。它们用于模拟真实硬件的时序行为。
为什么需要延迟
真实硬件中的信号需要时间才能通过导线和逻辑门。延迟可以让你模拟这种时序行为。
- 在仿真中,如果没有延迟,所有事情都会在时间 0 发生
- 延迟可以让事件随着时间推移依次发生
- 它们有助于测试时序敏感的设计,例如时钟和状态机
延迟类型
| 延迟类型 | 用途 |
|---|---|
| 门延迟 | 逻辑门中的延迟 |
| 赋值延迟 | 赋值时的延迟 |
| 时间刻度指令 | 设置仿真的时间单位 |
基本语法
延迟的写法是在数字前加上 #:
#10 clk = ~clk; // 等待 10 个时间单位,然后翻转时钟信号
#5 a = b; // 等待 5 个时间单位,然后执行 a = b# 后面的数字表示需要等待的时间单位数。
简单示例
initial begin
a = 0;
#10 a = 1; // 经过 10 个时间单位后,a 变为 1
#5 a = 0; // 再经过 5 个时间单位后,a 变为 0
end时间:
- 时间 0:
a = 0 - 时间 10:
a = 1 - 时间 15:
a = 0
always 块中的延迟
always #5 clk = ~clk; // 每隔 5 个时间单位翻转一次时钟信号这会创建一个连续的时钟信号(假设 clk 已在 initial 块中先初始化为 0。否则,~x 会一直保持为 x)。
重要规则
| 规则 | 说明 |
|---|---|
# 符号 | 表示延迟 |
# 后面的数字 | 要等待多少个时间单位 |
| 延迟会累积 | #10 然后 #20,总共等待 30 个时间单位 |
| 不可综合 | 延迟仅用于仿真 |
挑战
要做什么:
添加缺少的延迟,让这段代码分别在时间 0、10、25 和 40 时打印消息。
亲手试试
module delay_challenge;
initial begin
$display("Time %0t: Start", $time);
// TODO:添加延迟,使时间达到 10
$display("Time %0t: After first delay", $time);
// TODO:添加延迟,使时间达到 25
$display("Time %0t: After second delay", $time);
// TODO:添加延迟,使时间达到 40
$display("Time %0t: End", $time);
$finish;
end
endmodule
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器