深入理解 Verilog 门延迟:精准时序助力可靠数字设计
数字元件是二值实体,只能保持 0 或 1。然而 0→1 和 1→0 的转换存在过渡延迟,每个门元件将输入值传播到输出也需要时间。
例如,两输入与门需在两输入均为 1 时将输出切换为 1,任一输入变 0 时切换回 0。这些门及引脚间延迟可在实例化逻辑基本单元时指定。
上升、下降与关断延迟
门输出从某值变为 1 所需时间称为上升延迟;从某值变为 0 称为下降延迟;从某值变为高阻态称为关断延迟。
这些延迟实际上适用于任何信号,因为实际电路中所有信号都可能随时上升或下降,不限于门输出。有三种方式表示门延迟,双延迟格式适用于输出不转高阻的大多数基本单元。例如三延迟格式不能用于与门,因为其输出对任何输入组合都不会变为 Z。
// 单延迟:用于三种转换延迟 or #(<delay>) o1 (out, a, b); // 双延迟:用于上升和下降转换 or #(<rise>, <fall>) o1 (out, a, b); // 三延迟:用于上升、下降和关断转换 or #(<rise>, <fall>, <turn_off>) o1 (out, a, b);
若仅指定单个延迟,三种延迟均使用该值。若指定两个延迟,第一个代表上升,第二个代表下降。若指定三个,分别代表上升、下降和关断延迟。
单延迟格式
module des ( input a, b, output out1, out2); // 与门延迟 2 时间单位 and #(2) o1 (out1, a, b); // bufif0 门延迟 3 时间单位 bufif0 #(3) b1 (out2, a, b); endmodule
module tb; reg a, b; wire out1, out2; des d0 (.out1(out1), .out2(out2), .a(a), .b(b)); initial begin {a, b} <= 0; $monitor ("T=%0t a=%0b b=%0b and=%0b bufif0=%0b", $time, a, b, out1, out2); #10 a <= 1; #10 b <= 1; #10 a <= 0; #10 b <= 0; end endmodule
可见与门输出在输入变化后 2 个时间单位改变。例如 b 在 a 已为 1 时于 T=20 变 1,输出直到 T=22 才变 1。同理 a 在 T=30 回 0,输出在 T=32 更新。
bufif0 指定 3 时间单位门延迟,故当 a 已为 1 时 b 从 0 变 1,输出经 3 个时间单位在 T=23 更新为 Z。
仿真日志
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=2 a=0 b=0 and=0 bufif0=x T=3 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=13 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=23 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=32 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=43 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
双延迟格式
将上述测试平台应用于显式指定上升/下降延迟的模型:
module des ( input a, b, output out1, out2); and #(2, 3) o1 (out1, a, b); bufif0 #(4, 5) b1 (out2, a, b); endmodule
仿真日志
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=5 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=14 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=24 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=45 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
三延迟格式
module des ( input a, b, output out1, out2); and #(2, 3) o1 (out1, a, b); bufif0 #(5, 6, 7) b1 (out2, a, b); endmodule
仿真日志
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=6 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=15 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=27 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=46 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
最小/典型/最大延迟
芯片不同区域、不同温度等工艺变化导致延迟不一。Verilog 为上述每种延迟类型提供最小、典型、最大三个值控制。每个数字门和晶体管单元基于工艺节点都有最小/典型/最大延迟,通常由晶圆厂库提供。
对每种延迟类型——上升、下降、关断——可分别指定 min、typ、max 三值。
module des ( input a, b, output out1, out2); and #(2:3:4, 3:4:5) o1 (out1, a, b); bufif0 #(5:6:7, 6:7:8, 7:8:9) b1 (out2, a, b); endmodule
仿真日志
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=4 a=0 b=0 and=0 bufif0=x T=7 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=16 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=23 a=1 b=1 and=1 bufif0=1 T=28 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=34 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=47 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Verilog 入门:数字电路设计完整教程
- 掌握 Verilog 拼接操作:实用指南
- 深入理解 Verilog 赋值语句:类型、语法与最佳实践
- Verilog阻塞与非阻塞赋值:关键区别详解
- 理解Verilog延时控制:时序技术与最佳实践
- 深入理解 Verilog 中的赋值间延迟与赋值内延迟
- Verilog 门级建模:从硬件原理图到代码的桥梁
- Verilog 门级设计实战:与/或/非门与 2x1 多路选择器
- Verilog 时钟发生器设计与实现指南
- 掌握 Verilog 数学函数:高效硬件设计的利器
- 掌握 Verilog $timeformat:精度控制与显示格式化
- 理解与打印 Verilog 任意作用域下的 Timescale