3. 时序报告解读基础

时序签核的第一步不是修,而是读。Tempus 输出的标准时序报告里,每一行都对应一条真实的时序路径,而理解这些行的关键,是先把 setup/hold、slack、arrival、required、clock path、data path 这六个概念串成一条完整的因果链。本章不追求覆盖报告的所有字段,而是聚焦于"看到一行报告,能判断它为什么违例、违例发生在哪一段"。

一、setup 与 hold:两种检查,两种约束方向

数字电路中的时序检查本质上只有两类。setup(建立时间)检查的是数据能否在捕获时钟沿到来之前足够早地稳定下来;hold(保持时间)检查的是数据在捕获时钟沿之后能否保持足够久,不被同一沿过早冲掉。两者方向相反:setup 违例意味着数据到得太晚,hold 违例意味着数据到得太早。

在 Tempus 报告中,setup 检查通常写作 setup 或 max_delay,hold 检查写作 hold 或 min_delay。一个容易混淆的点是:setup 分析走的是最慢路径(max),hold 分析走的是最快路径(min)。因此同一条物理路径,在 setup 和 hold 两种分析模式下可能得到完全不同的结论,这不是矛盾,而是分析模式不同。

二、arrival 与 required:一条路径的两个端点

要理解 slack,必须先理解 arrival 和 required 这两个量。

arrival time(到达时间)是数据实际到达捕获触发器 D 端的时间。它从发射触发器的时钟沿出发,经过发射时钟路径、组合逻辑、互连线,最终到达捕获端。arrival 是"数据实际走了多久"。

required time(要求时间)是数据最晚(setup)或最早(hold)必须到达的时间。它由捕获时钟沿、捕获时钟路径延迟以及触发器的 setup/hold 时间共同决定。required 是"数据被允许的最晚/最早边界"。

slack 就是两者的差:

setup slack = required_time - arrival_time
hold  slack = arrival_time - required_time

注意两个公式的减数顺序不同。setup 中 required 在后、arrival 在前,slack 为正表示数据比要求更早到,安全;hold 中 arrival 在后、required 在前,slack 为正表示数据比要求更晚到,安全。slack 为负即违例,负得越多越严重。

三、clock path 与 data path:违例到底出在哪一段

一条完整时序路径可以拆成四段:发射时钟路径(launch clock path)、数据路径(data path)、捕获时钟路径(capture clock path),以及触发器自身的 setup/hold 约束。Tempus 报告会把这几段分别列出,这正是定位问题的关键。

如果 slack 为负,需要判断是 arrival 太大还是 required 太小。arrival 大,通常意味着数据路径太长(组合逻辑级数多、线延迟大)或发射时钟路径偏慢;required 小,通常意味着捕获时钟路径偏慢或时钟不确定性(uncertainty)设置偏大。反过来,hold 违例常见于数据路径太短、时钟偏斜(skew)方向不利,或捕获时钟路径比发射时钟路径快太多。

下面这张图把一条 setup 路径的四段结构和 slack 的构成关系画在一起,便于对照报告逐段阅读。

一条 setup 路径的四段结构与 slack 构成 发射触发器 Launch FF 发射时钟路径 launch clock path 组合逻辑 + 互连线 data path 捕获触发器 Capture FF 捕获时钟路径 capture clock path 时间轴对照: arrival time(数据实际到达) required time(数据最晚允许到达) slack = required − arrival 正值安全,负值违例 读报告时的判断顺序 ① 看 slack 正负 → 是否违例 ② 看 arrival 是否偏大 ③ 看 required 是否偏小 ④ 定位到具体 clock/data 段 ⑤ 再决定修哪一段

四、读懂 Tempus 标准报告的一行

Tempus 的 report_timing 输出通常包含路径起点、终点、路径类型、各段延迟、arrival、required 和 slack。下面是一段典型的 setup 报告片段(示例数据,用于说明字段含义):

Path 1: setup check
  Startpoint: u_reg_a/Q (rising edge-triggered flip-flop)
  Endpoint:   u_reg_b/D (rising edge-triggered flip-flop)
  Path Group: clk
  Path Type:  max

  Point                          Incr      Path
  ------------------------------------------------------
  clock clk (rise edge)          0.000     0.000
  u_reg_a/CK (FF)                0.120     0.120   r
  u_reg_a/Q (FF)                 0.250     0.370   r
  u_comb1/Z (NAND2)              0.180     0.550   r
  u_comb2/Z (NOR2)               0.220     0.770   f
  u_reg_b/D (FF)                 0.000     0.770   f
  ------------------------------------------------------
  data arrival time                        0.770

  clock clk (rise edge)          1.000     1.000
  clock uncertainty             -0.050     0.950
  u_reg_b/CK (FF)                0.100     1.050   r
  library setup time            -0.080     0.970
  ------------------------------------------------------
  data required time                       0.970

  slack (MET)                              0.200

逐段读:data arrival time = 0.770 是数据从发射沿到捕获端 D 的实际累计延迟;data required time = 0.970 是捕获沿(1.000)减去 uncertainty(0.050)、加上捕获时钟路径延迟(0.100)、再减去 setup 时间(0.080)后的结果。两者相减得 slack = 0.200,为正,报告标注 MET。

如果 slack 变成 −0.150,说明 required 比 arrival 小了 0.150。此时应回到路径明细里看:是 u_comb2/Z 的 0.220 太大,还是 u_reg_b/CK 的 0.100 偏小,抑或 uncertainty 的 0.050 设置过紧。不同原因对应完全不同的修复手段——前者加缓冲或改逻辑,后者查时钟树或约束。

五、hold 报告的读法差异

hold 报告的字段结构与 setup 相同,但方向相反。hold 的 required time 通常等于捕获沿加上捕获时钟路径延迟,再加上 hold 时间;arrival 仍是从发射沿算起的数据到达时间。slack = arrival − required,为正表示数据没有来得太早。

一个常见误区是把 setup 的 slack 公式套到 hold 上。记住:setup 关心"晚",hold 关心"早";setup 用 required − arrival,hold 用 arrival − required。两者符号约定不同,但"正为安全、负为违例"是一致的。

读报告时建议固定一个顺序:先看 slack 正负判断是否违例,再看 arrival 和 required 谁偏离预期,最后回到路径明细定位到具体是哪一段 clock path 或 data path 贡献了异常延迟。这个顺序能避免一上来就盯着某一行延迟数字猜测原因。

六、把概念落到判断上