3. SDF文件格式深度解析
SDF(Standard Delay Format)是IEEE 1497标准定义的时序信息交换格式,它把综合或布局布线工具提取出的延迟、时序检查与约束,以文本形式回标到门级网表中。理解SDF的关键不在于记住所有关键字,而在于弄清三件事:版本差异决定了哪些语法可用,层级结构决定了延迟挂到哪个对象上,时序弧类型决定了这条延迟在仿真中如何被使用。
一、版本差异:2.1 与 3.0 的核心区别
SDF 2.1 与 3.0 在语法骨架上一脉相承,但 3.0 引入了若干影响回标行为的扩展。最常被提及的差异集中在以下几点:
- 时序检查的边沿与条件表达:3.0 对 SETUP/HOLD、RECOVERY/REMOVAL 的
COND、timing_check_condition支持更完整,允许在更复杂的条件表达式下描述检查弧,2.1 的表达能力相对受限。 - PATHPULSE 与脉冲传播:3.0 对 PATHPULSEPERCENT、脉冲宽度过滤的语义描述更明确,便于仿真器统一处理窄脉冲。
- 增量与层次化标注:3.0 更强调
CELL与INSTANCE的区分使用,支持在库单元级与实例级分别标注,便于同一单元在不同实例上承载不同延迟。 - 数值与时间刻度:两者都使用
(timescale 1ns/10ps)这类声明,但 3.0 对多刻度、单位换算的约束更严格,回标时若网表 timescale 与 SDF 不一致,仿真器会按比例换算或直接报错。
实际工程中,若后端工具输出的是 3.0,而仿真器或网表只支持 2.1,常见做法是让工具降级输出,或手工裁剪 3.0 特有语法。反过来,用 2.1 的 SDF 回标到期望 3.0 语义的流程时,要特别检查条件时序检查是否被完整表达。
二、层级结构:CELL、INSTANCE、PORT 的挂载关系
SDF 的层级结构是回标准确性的根基。一个 SDF 文件通常以 (DELAYFILE ...) 开头,内部由 (CELL ...) 块组织。每个 CELL 块对应一个模块定义或一个实例路径,块内再通过 (INSTANCE ...) 指定具体实例,通过 (PORT ...) 指定端口,最后把 IOPATH、INTERCONNECT、SETUP/HOLD 等时序弧挂在端口或端口对上。
需要区分两种写法:(CELL (CELLTYPE "NAND2") ...) 表示按单元类型标注,作用于所有该类型实例;(CELL (INSTANCE top/u1) ...) 表示按实例路径标注,只作用于指定实例。前者适合库级默认延迟,后者适合实例级精确回标。若两者同时存在,实例级通常优先。
端口在 SDF 中既可以是模块端口,也可以是实例端口。对于 IOPATH,源端口与目的端口必须属于同一 CELL 块内的同一实例或同一单元类型;对于 INTERCONNECT,源与目的通常跨实例,描述的是连线延迟。层级写错会导致仿真器报 “no matching instance” 或静默忽略,因此回标后必须检查仿真日志中的 SDF 注解统计。
三、IOPATH 与 INTERCONNECT:延迟弧的两种基本形态
IOPATH 描述的是单元内部从输入端口到输出端口的路径延迟,语法形如:
(IOPATH A Y (0.12:0.15:0.18) (0.10:0.13:0.16))
括号内三个数分别对应 min:typ:max 三种工艺角。若只写一个数,则三角相同。IOPATH 还可以带条件,例如 (IOPATH (COND A==1) B Y ...),表示仅当 A 为 1 时该路径才生效。回标时,仿真器会把 IOPATH 转换为门级单元内部的延迟,影响输出跳变时刻。
INTERCONNECT 描述的是两个实例端口之间的连线延迟,通常来自布局布线后的寄生参数提取:
(INTERCONNECT u1/Q u2/D (0.05:0.06:0.08))
它不改变单元内部行为,只改变信号在实例之间的传播时间。若网表中该连线已被综合成缓冲器链,则 INTERCONNECT 可能被拆分到多段。回标后应确认连线延迟是否被正确加到路径上,而不是被单元延迟覆盖。
四、时序检查弧:SETUP/HOLD 与 RECOVERY/REMOVAL
SETUP 与 HOLD 是同步时序检查,描述数据相对时钟边沿的建立与保持要求:
(SETUP D (posedge CLK) (0.20:0.25:0.30))
(HOLD D (posedge CLK) (0.05:0.06:0.08))
语义是:在 CLK 上升沿之前,D 必须稳定至少 setup 时间;在上升沿之后,D 必须继续保持至少 hold 时间。仿真器在时钟边沿采样时,会检查这两个窗口,若违反则报告 timing violation。注意 SDF 中的 setup/hold 是“要求值”,不是“实际延迟”,它们不改变信号波形,只触发检查。
RECOVERY 与 REMOVAL 则针对异步控制信号,如复位、置位:
(RECOVERY CLR (posedge CLK) (0.15:0.18:0.22))
(REMOVAL CLR (posedge CLK) (0.03:0.04:0.05))
RECOVERY 要求异步信号在时钟有效边沿之前提前释放,REMOVAL 要求它在边沿之后继续保持。两者共同保证触发器不会进入亚稳态。与 SETUP/HOLD 一样,它们属于检查弧,回标后若条件不满足,仿真器会输出 violation 信息。
五、回标时的常见判断依据
拿到一份 SDF 后,可以按以下顺序快速判断其可用性:先看 (timescale ...) 是否与网表一致;再看 CELL 块使用的是 INSTANCE 还是 CELLTYPE,实例路径能否在网表中找到;然后检查 IOPATH 的端口对是否存在于对应单元;最后确认 SETUP/HOLD、RECOVERY/REMOVAL 的条件表达式是否被仿真器支持。若仿真器版本较旧,3.0 特有的条件写法可能被忽略,此时应改用 2.1 兼容写法或升级仿真器。
理解 SDF 的版本、层级与弧类型,本质上是在理解“延迟挂在哪里、以什么语义生效”。只有把这三者对齐,回标后的门级仿真才具备可信的时序基础。