3. 时序签核问题定位

时序签核报告里最常见的三类违例是建立时间(Setup)违例、保持时间(Hold)违例和过渡时间(Transition)违例。它们看起来都表现为“时序不满足”,但根因、修复方向和签核优先级完全不同。定位的第一步不是急着改约束或改综合脚本,而是先把报告读对:确认违例发生在哪条路径、哪个时钟域、哪个工艺角,以及违例量是正还是负。

先统一符号约定。在 Synopsys PrimeTime 的 report_timing 输出中,slack 为负表示违例,负得越多越严重;slack 为正表示满足。Setup 检查的是数据到达时间(arrival)必须早于捕获时钟的建立要求(required),即 arrival < required;Hold 检查的是数据在捕获沿之后必须保持足够稳定,即 arrival > required。Transition 违例则与时钟沿无关,它衡量的是某个引脚上信号电平跳变(slew)是否超过库单元或约束允许的最大值。

三类违例的根因分类

建立时间违例的本质是“数据路径太慢”或“捕获时钟太早”。常见根因包括:组合逻辑级数过多、驱动能力不足导致长线延迟大、时钟树偏斜(skew)不利、时钟不确定性(uncertainty)设置过紧、以及跨时钟域路径被错误地按同步路径约束。保持时间违例的本质是“数据路径太快”或“捕获时钟太晚”,典型根因是数据路径几乎没有组合逻辑、时钟偏斜方向不利、以及同一时钟域内短路径未被合理约束。

过渡时间违例则更偏物理与电气层面:输出负载电容过大、驱动单元太弱、输入信号本身 slew 太差被逐级放大、以及高扇出网络未做缓冲。它常常是建立/保持违例的“上游原因”——slew 差会直接抬高单元延迟,进而恶化 setup。因此看到 transition 违例时,不能只把它当作独立问题处理。

时序违例根因定位关系图 从报告现象 → 路径特征 → 根因方向 → 修复手段 Setup 违例 slack < 0,数据到达晚于要求 Hold 违例 slack < 0,数据变化早于要求 Transition 违例 slew > max_transition 路径特征 • 组合逻辑级数多 • 长线/高扇出 • 时钟偏斜不利 • 跨时钟域误约束 路径特征 • 数据路径几乎无逻辑 • 同域短路径 • 时钟偏斜方向不利 • 复位/扫描路径 路径特征 • 负载电容过大 • 驱动单元太弱 • 输入 slew 差 • 高扇出未缓冲 根因方向 逻辑太慢 / 时钟太早 约束过紧 / 偏斜不利 根因方向 逻辑太快 / 时钟太晚 短路径未约束 / 偏斜不利 根因方向 电气驱动不足 负载/扇出过大 插流水 / 加缓冲 / 调偏斜 加延迟单元 / 修约束 / 调偏斜 换强驱动 / 加缓冲 / 降负载

报告解读:从一行 slack 到完整路径

以一条 setup 违例为例,报告通常给出 Startpoint、Endpoint、Path Group、Path Type 和 slack。假设某路径报告显示 slack (VIOLATED) : -0.42ns,路径组为 clk_main,起点是 u_core/reg_a/CK,终点是 u_core/reg_b/D。此时应重点看三件事:数据路径延迟(data arrival)、捕获时钟要求(data required)、以及两者之间的差值构成。

如果 data arrival 明显偏大,而 required 正常,说明是数据路径慢,优先查组合逻辑级数和单元驱动。如果 required 偏小,说明捕获时钟来得太早,可能是时钟树偏斜或 uncertainty 设置过紧。如果两者都正常但 slack 仍为负,则要检查是否有多周期路径(multicycle path)或 false path 未被正确约束。

Hold 违例的读法相反:重点看数据路径是否“太快”。若某条 hold 路径 slack 为 -0.15ns,且数据路径上只有一级缓冲甚至直连,那么根因大概率是短路径延迟不足。此时不能靠“加逻辑”解决,而应在数据路径上插入延迟单元,或调整时钟树使捕获沿相对延后。

过渡时间违例的定位要点

Transition 违例在报告中通常以 max_transition 或 max_capacitance 形式出现。定位时先看违例引脚是输入还是输出:输出引脚违例多与负载电容和驱动能力有关;输入引脚违例多与上游信号 slew 差有关。一个实用判断是:如果某条 setup 违例路径上同时存在 transition 违例,应优先修 transition,因为 slew 改善后单元延迟会下降,setup 可能自然收敛。

定位顺序建议:先看 transition,再看 setup,最后看 hold。原因是 transition 违例往往是电气层面的“上游病因”,修好它可能同时缓解 setup;而 hold 违例通常需要在时序基本收敛后再集中处理,避免反复迭代。

一个可复用的报告解读检查表

检查项 Setup 关注点 Hold 关注点 Transition 关注点
slack 符号 负值,越负越严重 负值,越负越严重 slew 超过限值
路径组 确认时钟域与工艺角 确认是否同域短路径 确认引脚类型
数据路径 逻辑级数、驱动、线长 是否几乎无逻辑 负载电容、扇出
时钟路径 偏斜、uncertainty 偏斜方向 时钟树缓冲能力
约束检查 多周期/伪路径 短路径约束 max_transition 设置

实际定位时,建议先用 report_timing -max_paths 20 -nworst 5 抓出最严重的若干条路径,再按路径组和工艺角分类。对每条违例路径,记录起点、终点、slack、数据路径延迟和时钟要求,形成一张“违例路径清单”。这张清单是后续修复和回归验证的依据,也能避免在多个工艺角之间反复切换时丢失上下文。

常见误区:看到 setup 违例就直接加流水线,看到 hold 违例就直接加延迟,看到 transition 违例就只换驱动。实际上三类违例经常互相牵连,尤其是 transition 差会同时恶化 setup 和 hold。定位时应先确认根因层级,再选择修复手段,避免“头痛医头”导致问题转移。

最后强调报告解读中的两个关键习惯:第一,始终确认当前报告对应的工艺角(corner)和电压温度条件,不同 corner 下同一路径的 slack 可能完全不同;第二,始终区分“约束问题”和“物理问题”。约束写错会让工具报出虚假违例,而物理问题必须通过综合、布局布线或单元替换来解决。把这两点分清,时序签核的定位效率会明显提升。