从芯片手册到EDA工具:图解set_output_delay与setup/hold time的数学关系
每次打开时序约束文件,看到那些 set_output_delay 后面跟着的正负数值,你是不是也曾经困惑过:为什么一个约束值可以是负数?这个数字和下游芯片手册里写的 tSU、tH 到底是怎么换算的?工具又是如何根据这个看似简单的数字,去调整内部布局布线,最终让芯片在真实世界里稳定工作的?如果你是一名IC验证工程师或者正在攻读相关方向的研究生,那么这种从抽象约束到物理实现的“黑盒”感,可能正是你希望捅破的那层窗户纸。这篇文章,我们就用最直观的波形图和数学公式,亲手拆解这个换算过程,让你不仅知道怎么填约束,更明白为什么这么填,以及填错了会怎样。
时序约束的本质,是设计者与EDA工具之间的一份“契约”。我们通过约束告诉工具:“我的信号在芯片引脚处,相对于某个时钟边沿,最早不能早于多少,最晚不能晚于多少。” 工具则根据这份契约,在芯片内部有限的资源和物理规则下,拼命调整逻辑单元的位置、驱动强度、走线路径,来满足我们的要求。set_output_delay 正是这份契约中,关于输出引脚的关键条款。理解它,就等于拿到了解读后端时序报告、精准定位时序违例根源的钥匙。
1. 场景还原:一个输出路径的时空分解
要理解约束,必须先看清它约束的对象。我们来看一个最典型的场景:我们的设计(DUA, Design Under Analysis)内部有一个触发器 UFF0,它的数据经过内部组合逻辑 C1,从输出端口 OUTB 送出芯片。芯片外部,另一颗器件的触发器 UFF1 在时钟 CLKQ 的驱动下,准备捕获这个数据,数据在板级走线上还会经历一段延迟 Tc2。
+---------------------+ +---------------------+
CLKQ --->| DUA | | 外部器件 |
| +------+ +---+ | | +------+ +---+ |
| | UFF0 |--->|C1 |----------->| | UFF1 | |C2 | |
| +------+ +---+ | OUTB | +------+ +---+ |
| | | |
+---------------------+ +---------------------+
Tclk2q Tc1 Tc2 Tsetup/Thold
这个简单的框图里,隐藏着时序分析的几个核心变量:
- Tclk2q: DUA 内部触发器 UFF0 的时钟到输出延迟。从时钟有效边沿到数据在Q端开始变化的时间。
- Tc1: DUA 内部从 UFF0 的Q端到输出引脚 OUTB 之间的组合逻辑和走线延迟。
- Tc2: 芯片外部,从 OUTB 引脚到外部器件 UFF1 数据输入引脚之间的板级走线延迟。
- Tsetup / Thold: 外部器件 UFF1 所需的建立时间和保持时间。
关键问题来了:我们作为 DUA 的设计者,能控制的是 Tclk2q 和 Tc1(通过选择器件、布局布线),但我们往往不知道或不精确知道外部的 Tc2。然而,我们必须保证最终到达 UFF1 的数据,满足其 Tsetup 和 Thold。set_output_delay 就是我们用来“告知”EDA工具外部世界(Tc2 + Tsetup/Thold)要求的手段。
2. 建立时间约束:max_output_delay 的数学推导
让我们把目光聚焦在建立时间检查上。建立时间要求数据在时钟捕获沿到来之前,必须稳定一段时间。对于外部触发器 UFF1 来说,数据必须在 CLKQ 的上升沿(假设上升沿触发)之前的 Tsetup 时间就准备好。
那么,从 DUA 内部时钟沿(启动沿)到数据在 UFF1 的D端稳定,总共允许的最大时间是多少?显然,是一个时钟周期 Tperiod 减去 Tsetup。这个总时间被分成了三段:
- DUA 内部延迟:
Tclk2q + Tc1 - 外部板级延迟:
Tc2 - 时钟偏移:为了简化,我们先假设 CLKQ 到 UFF0 和 UFF1 的时钟是完全对齐的,没有偏移。这是一个理想模型,后续可以引入时钟不确定性(cloc



被折叠的 条评论
为什么被折叠?



