门延迟
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 68 课,共 90 课。
在上一课中,我们介绍了像 #10 a = b; 这样的通用延迟。它们会在执行语句前等待。
在本课中,我们将介绍门延迟,它特指内置门原语(如 and、or 和 not)的延迟。门延迟用于模拟硬件门在输入发生变化后生成输出所需的时间。
在真实硬件中,门不会立即响应,而是会有短暂延迟。使用内置门原语时,你可以添加延迟来模拟门的传播时间。只有经过指定的延迟后,输出才会改变。
普通延迟与门延迟的区别
| 普通延迟 | 门延迟 | |
|---|---|---|
| 语法 | #10 a = b; | and #5 (out, a, b); |
| 位置 | 语句前的 # | 门原语内部的 # |
| 用途 | 执行前等待 | 模拟门的传播时间 |
语法:
gate_type #(delay) (output, input1, input2, ...);#(delay) 指定门响应所需的时间单位数。
简单示例
and #5 (out, a, b);这个 AND 门在 a 或 b 发生变化后,需要 5 个时间单位才能改变输出。
多输入门延迟
nand #8 (out, a, b, c, d); // 4 输入与非门,延迟 8 个时间单位重要规则
| 规则 | 说明 |
|---|---|
| 延迟写在门名称之后 | and #5 (out, a, b) |
| 延迟值以时间单位表示 | 取决于 timescale 指令 |
| 所有输入都会影响输出 | 任何输入发生变化都可能改变输出,但只有经过延迟后才会改变 |
| 不可综合 | 门延迟仅用于仿真 |
挑战
为这个模块添加缺失的门延迟。为每个门使用不同的延迟。
要做什么:
- AND 门:延迟 5 个时间单位
- OR 门:延迟 3 个时间单位
- NOT 门:延迟 2 个时间单位
亲手试试
module gate_delay_challenge;
reg a, b;
wire and_out, or_out, not_out;
// TODO:添加延迟为 5 个时间单位的与门(输入为 a、b)
// TODO:添加延迟为 3 个时间单位的或门(输入为 a、b)
// TODO:添加延迟为 2 个时间单位的非门(输入为 a)
initial begin
$monitor("Time %0t: a=%b, b=%b | and=%b, or=%b, not=%b",
$time, a, b, and_out, or_out, not_out);
a = 1; b = 1;
#10 $finish;
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器