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 违例时,不能只把它当作独立问题处理。
报告解读:从一行 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 可能自然收敛。
一个可复用的报告解读检查表
| 检查项 | Setup 关注点 | Hold 关注点 | Transition 关注点 |
|---|---|---|---|
| slack 符号 | 负值,越负越严重 | 负值,越负越严重 | slew 超过限值 |
| 路径组 | 确认时钟域与工艺角 | 确认是否同域短路径 | 确认引脚类型 |
| 数据路径 | 逻辑级数、驱动、线长 | 是否几乎无逻辑 | 负载电容、扇出 |
| 时钟路径 | 偏斜、uncertainty | 偏斜方向 | 时钟树缓冲能力 |
| 约束检查 | 多周期/伪路径 | 短路径约束 | max_transition 设置 |
实际定位时,建议先用 report_timing -max_paths 20 -nworst 5 抓出最严重的若干条路径,再按路径组和工艺角分类。对每条违例路径,记录起点、终点、slack、数据路径延迟和时钟要求,形成一张“违例路径清单”。这张清单是后续修复和回归验证的依据,也能避免在多个工艺角之间反复切换时丢失上下文。
最后强调报告解读中的两个关键习惯:第一,始终确认当前报告对应的工艺角(corner)和电压温度条件,不同 corner 下同一路径的 slack 可能完全不同;第二,始终区分“约束问题”和“物理问题”。约束写错会让工具报出虚假违例,而物理问题必须通过综合、布局布线或单元替换来解决。把这两点分清,时序签核的定位效率会明显提升。