4、时序报告解读:如何看懂 setup slack 和 hold slack,常见的 violation 类型

好,咱们进入正题。时序报告,说白了就是 STA 工具给你的一张「成绩单」。你设计的电路能不能跑在目标频率上,全看这张报告怎么说。我刚开始学 STA 时,看到满屏的数字和路径,头都大了。后来带我的老工程师跟我说了一句话,我记到现在——「别怕,你就盯着两个数看:setup slack 和 hold slack。」

4.1 什么是 slack?正负代表什么?

Slack 这个词,直译是「松弛」。你可以把它理解为「余量」。

举个例子。你要求数据在 10ns 内到达,结果它 8ns 就到了。那 slack 就是 +2ns,说明时间很充裕。反过来,如果它 11ns 才到,slack 就是 -1ns,说明超时了,这就是 violation。

所以:

  • 正 slack:时序满足要求,有富余
  • 负 slack:时序不满足,出问题了

嗯,这里要注意。setup slack 和 hold slack 的「正负」含义是一样的,但它们的计算方式不同。咱们一个一个看。

4.2 Setup slack 怎么看?

Setup slack 检查的是「数据能不能在时钟沿到来之前稳定下来」。说白了,就是怕数据跑得太慢。

计算公式长这样:

setup slack = 时钟周期 - (数据路径延迟 + 建立时间 + 时钟偏斜)

我习惯在报告里直接搜「slack」这个关键词。工具会把所有路径按 slack 值从小到大排序。最差的那条路径,就是你的「瓶颈」。

举个例子,假设时钟周期是 10ns:

路径 数据路径延迟 建立时间 时钟偏斜 Setup slack
Path A 7.2ns 0.3ns 0.5ns +2.0ns ✅
Path B 9.1ns 0.3ns 0.5ns +0.1ns ⚠️
Path C 9.8ns 0.3ns 0.5ns -0.6ns ❌

Path C 的 slack 是负的,说明这条路径太长了。我在项目中遇到过类似情况,查了半天发现是综合时没加合理的约束,工具把逻辑推得太远了。

重点:setup violation 通常意味着路径延迟太大。解决办法包括:插入流水线、优化组合逻辑、降低时钟频率(但这是下策)。

4.3 Hold slack 怎么看?

Hold slack 检查的是「数据能不能在时钟沿之后保持足够长的时间」。说白了,是怕数据跑得太快。

计算公式:

hold slack = 数据路径延迟 - (保持时间 + 时钟偏斜)

你想想看,setup 和 hold 其实是「一慢一快」两个极端。setup 怕慢,hold 怕快。

继续用上面的例子:

路径 数据路径延迟 保持时间 时钟偏斜 Hold slack
Path A 7.2ns 0.2ns 0.3ns +6.7ns ✅
Path B 0.5ns 0.2ns 0.3ns 0.0ns ⚠️
Path C 0.3ns 0.2ns 0.3ns -0.2ns ❌

Path C 的 hold slack 是负的。数据路径太短了,保持不住。我曾经调试过一个 hold violation,查来查去发现是时钟偏斜太大,导致数据被「冲」掉了。

注意:hold violation 比 setup violation 更难修。因为 setup 可以通过降频临时解决,但 hold 是物理上的问题,必须加 buffer 或者调整时钟树。

4.4 常见的 violation 类型

在实际项目中,我总结了几种最常见的 violation 类型:

  1. Setup violation(建立时间违例)
    • 原因:路径太长、组合逻辑太深、时钟频率太高
    • 表现:slack 为负,且通常出现在高频路径上
    • 修复:插入寄存器、优化逻辑、调整约束
  2. Hold violation(保持时间违例)
    • 原因:路径太短、时钟偏斜太大、数据路径延迟太小
    • 表现:slack 为负,且通常出现在短路径上
    • 修复:插入 buffer、调整时钟树、增加延迟
  3. Recovery/Removal violation(恢复/移除时间违例)
    • 原因:异步复位/置位信号的时序问题
    • 表现:复位信号释放时间不满足要求
    • 修复:同步复位、调整复位路径
  4. Clock gating check violation(时钟门控检查违例)
    • 原因:时钟门控信号不稳定
    • 表现:门控时钟出现毛刺
    • 修复:加锁存器、调整门控逻辑

我的经验:拿到时序报告后,先看最差的 5 条路径。如果全是 setup violation,说明你的设计可能太「激进」了。如果全是 hold violation,说明时钟树可能有问题。如果两者都有,嗯...那就要好好排查了。

4.5 如何快速定位问题路径?

工具生成的报告通常很长,几百上千条路径都有。我一般这么做:

  • 先看 slack 最差的路径,它代表了设计的「短板」
  • 再看路径的起点和终点,判断是哪个模块出了问题
  • 最后看路径上的延迟分布,找到最耗时的逻辑单元

举个例子,报告里可能会这样写:

Startpoint: u_core/u_alu/reg_a (rising edge-triggered flip-flop)
Endpoint:   u_core/u_alu/reg_b (rising edge-triggered flip-flop)
Path Group: clk_core
Path Type:  setup

  Delay    Time   Description
---------------------------------------------------------
  0.00    0.00   clock clk_core (rise edge)
  0.50    0.50   clock network delay (propagated)
  0.00    0.50   clock reconvergence pessimism
  0.00    0.50   u_core/u_alu/reg_a/CK (DFF)
  0.30    0.80   u_core/u_alu/reg_a/Q (DFF)
  2.10    2.90   u_core/u_alu/add_inst/A (ADD)
  3.40    6.30   u_core/u_alu/add_inst/Y (ADD)
  1.20    7.50   u_core/u_alu/mux_inst/O (MUX)
  0.80    8.30   u_core/u_alu/reg_b/D (DFF)
  0.30    8.60   library setup time
  0.50    9.10   clock network delay (propagated)
  0.00    9.10   clock reconvergence pessimism
---------------------------------------------------------
  -0.60  -0.60   slack (VIOLATED)

看到没?最耗时的部分是加法器(ADD),占了 3.4ns。这就是瓶颈。我当时遇到类似情况,直接把加法器改成了流水线结构,slack 从负变正。

4.6 知识体系图

下面这张图帮你理清时序报告的核心逻辑:

时序报告解读核心逻辑 时序报告 Setup Slack Hold Slack 正 Slack ✅ 时序满足 负 Slack ❌ 时序违例 Setup Violation Hold Violation Recovery/Removal Clock Gating Check 加流水线 / 优化逻辑 加 Buffer / 调整时钟树

这张图把时序报告的核心逻辑串起来了。你从报告入手,先看 slack 的正负,再判断是 setup 还是 hold 的问题,最后定位到具体的 violation 类型和修复方法。

我个人习惯在项目初期就跑一次 STA,哪怕设计还没完全做完。早点发现 setup/hold 问题,后面改起来成本低得多。别等到所有模块都集成完了再跑,那时候改一条路径可能牵动半个芯片。

好了,关于时序报告的解读就聊到这儿。记住,slack 是你的朋友,不是敌人。它帮你提前发现问题,而不是等流片回来再后悔。