4. 门级仿真中的延迟模型与SDF反标
门级仿真的价值,很大程度上取决于“时间”是否被正确建模。RTL 仿真通常只关心功能对不对,而门级仿真必须回答另一个问题:信号经过每一级标准单元、每一条互连线之后,究竟延迟了多少。Xcelium 通过延迟模型与 SDF 反标(Back-Annotation)把综合、布局布线后的真实时序信息注入网表,使仿真时间轴逼近硅片行为。本节围绕分布式延迟、引脚到引脚延迟和 SDF 文件结构展开,并给出在 Xcelium 中完成反标与延迟检查的完整方法。
一、三种延迟模型:从集总到分布式
Verilog 为门和模块定义了三种延迟模型,它们决定了延迟如何分配到输出端:
- 集总延迟(Lumped Delay):把整条路径的延迟全部加在最后一个输出上,中间节点无延迟。写法如
and #5 u1 (out, a, b);,out 相对输入整体延后 5 个时间单位。 - 引脚到引脚延迟(Pin-to-Pin / Path Delay):为每一对“输入引脚→输出引脚”单独指定延迟,可精确描述不同输入路径的差异。写法如
and u1 (out, a, b); specify (a => out) = 3; (b => out) = 5; endspecify。 - 分布式延迟(Distributed Delay):把延迟分散到多个输出或内部节点上,使各输出在不同时刻翻转,最贴近真实门内部与连线的物理行为。
三者的关键区别在于“延迟放在哪里”。集总延迟最粗糙,引脚到引脚延迟最灵活,分布式延迟最接近物理现实。SDF 反标主要作用于引脚到引脚延迟和互连延迟,因此理解这一模型是读懂 SDF 的前提。
二、引脚到引脚延迟与 specify 块
引脚到引脚延迟通过 specify 块描述,是 SDF 反标真正写入的目标。一个典型的 specify 块包含路径延迟、时序检查和条件路径:
module dff (q, d, clk);
output q; input d, clk;
specify
(clk => q) = (2.1, 1.8); // 上升/下降延迟
(d => q) = (1.5, 1.3);
$setup(d, posedge clk, 0.8); // 建立时间检查
$hold(posedge clk, d, 0.3); // 保持时间检查
endspecify
endmodule
括号中的两个数值分别对应输出上升沿和下降沿的延迟。SDF 反标时,工具会按 (clk => q) 这样的路径名匹配,把 SDF 中的 IOPATH 数值填入对应位置。若网表中的路径名与 SDF 不一致,反标会失败或部分失败,因此路径匹配是调试重点。
三、SDF 文件结构
SDF(Standard Delay Format)是文本格式的延迟描述文件,由布局布线工具生成。其结构自上而下为:DELAYFILE 头 → CELL → INSTANCE → 延迟条目。核心条目有三类:
- IOPATH:引脚到引脚的路径延迟,对应 specify 中的路径。
- INTERCONNECT:互连线延迟,描述模块端口到内部节点或模块间的连线延时。
- TIMINGCHECK:建立、保持、脉宽等时序检查约束。
(DELAYFILE
(SDFVERSION "3.0")
(DIVIDER /)
(TIMESCALE 1ns)
(CELL
(CELLTYPE "dff")
(INSTANCE top/u1)
(DELAY
(ABSOLUTE
(IOPATH clk q (2.1) (1.8))
(IOPATH d q (1.5) (1.3))))
(TIMINGCHECK
(SETUP d (posedge clk) (0.8))
(HOLD (posedge clk) d (0.3)))))
注意 TIMESCALE 1ns 与仿真时间精度的关系:若仿真精度为 1ps,SDF 中的 2.1 会被解释为 2.1ns,即 2100ps。时间尺度不一致是反标后延迟“看起来不对”的常见原因。
四、在 Xcelium 中完成 SDF 反标
Xcelium 通过 -sdf 选项在编译或仿真阶段加载 SDF。常用形式如下:
xrun -f run.f \
-sdf max:top/u1:top.sdf \
-sdf max:top/u2:top.sdf \
-timescale 1ns/1ps
其中 max 表示使用 SDF 中的最大值(对应最坏时序),也可用 min、typ。冒号后依次是实例路径和 SDF 文件。若整个设计共用一个 SDF,可写 -sdf max:top:top.sdf。反标完成后,Xcelium 会在日志中报告匹配与未匹配的条目数量,这是判断反标是否成功的第一手依据。
-sdf_verbose 打开详细日志,逐条查看 IOPATH 是否命中。未匹配条目通常源于层次路径错误、实例名大小写不一致或 SDF 与网表版本不匹配。五、延迟检查与结果判读
反标只是把延迟写进去,是否真正生效还要靠检查。常用手段有三类:
- 波形观察:在关键路径上测量输入跳变到输出跳变的实际时间差,与 SDF 中的 IOPATH 数值比对。例如 SDF 写
(IOPATH clk q (2.1) (1.8)),波形上 clk 上升沿到 q 上升沿应约为 2.1ns。 - 时序违例报告:当
$setup、$hold被违反时,仿真器会输出 violation 信息,包含实例、检查类型和裕量。 - 反标统计:查看日志中 annotated / not annotated 的条目数,确认覆盖率。
若发现延迟未生效,按以下顺序排查:确认 -sdf 的实例路径与网表层次一致;确认 SDF 的 TIMESCALE 与仿真精度匹配;确认 specify 块存在且路径名与 SDF 的 IOPATH 对应;确认没有用 +delay_mode_zero 之类的选项把延迟清零。逐项排除后,门级仿真的时间轴才能真正反映签核所需的时序行为。