4. 静态时序分析(STA)基础:时序弧、建立时间与保持时间、时序路径分类

静态时序分析,说白了就是检查你的芯片能不能跑在目标频率上。我刚开始做后端时总觉得这步可有可无,直到有一次流片回来芯片死活上不了高频……嗯,从那以后我再也不敢跳过 STA 了。

STA 不需要像动态仿真那样灌入大量测试向量,它通过穷举所有可能的时序路径,告诉你哪条路径最慢、哪条路径最快。今天我们就来拆解 STA 的三个核心概念:时序弧、建立/保持时间、以及路径分类。

4.1 时序弧:信号传播的“骨架”

时序弧(Timing Arc)定义了信号从一个引脚到另一个引脚的延迟关系。你可以把它想象成标准单元内部的一条“小路”。

常见的时序弧有四种:

  • 组合弧(Combinational Arc):输入到输出的纯组合逻辑延迟,比如 AND 门的 A→Z。
  • 建立/保持弧(Setup/Hold Arc):时钟引脚到数据引脚的时序约束,比如 DFF 的 CK→D。
  • 恢复/移除弧(Recovery/Removal Arc):异步复位/置位信号与时钟之间的关系。
  • 时钟弧(Clock Arc):时钟引脚到输出引脚的传播延迟,比如 CK→Q。

关键点:每个标准单元库的 .lib 文件里,都定义了这些弧的延迟查找表(NLDM 或 CCS 模型)。STA 工具就是靠这些表来计算路径延迟的。

我在项目中遇到过一个问题:某个定制单元没有定义时序弧,结果 STA 报告里那条路径的延迟直接显示为 0。排查了半天才发现是库文件漏了弧定义。所以,拿到新库后第一件事就是检查时序弧是否完整。

4.2 建立时间与保持时间:寄存器的“脾气”

寄存器不是什么时候都能正确采到数据的。它有两个硬性要求:

概念 定义 违反后果
建立时间(Setup Time) 时钟有效沿到来之前,数据必须保持稳定的最短时间 数据采错,功能失效
保持时间(Hold Time) 时钟有效沿到来之后,数据必须保持稳定的最短时间 数据被“冲掉”,时序混乱

你想想看,建立时间违反通常发生在路径太长、组合逻辑太多的时候;保持时间违反则往往是因为路径太短、数据跑得太快。我早期做 28nm 项目时,一条保持时间违反修了整整两周——最后发现是时钟树综合时插了太多 buffer,导致局部时钟偏斜过大。

个人习惯:我一般在综合阶段先修建立时间,因为它的余量受 PVT 影响更大。保持时间留到后端物理实现阶段再修,用 delay cell 或加长走线就能解决。

4.3 时序路径分类:STA 的“地图”

STA 把所有路径分成四类。记住这四类,你就掌握了 STA 的全局视图。

  1. 输入到寄存器(Input to Register):从芯片输入端口到第一个寄存器的 D 端。
  2. 寄存器到寄存器(Register to Register):从 launch 寄存器的 CK 端到 capture 寄存器的 D 端。这是最核心的路径。
  3. 寄存器到输出(Register to Output):从最后一个寄存器的 CK 端到芯片输出端口。
  4. 输入到输出(Input to Output):纯组合路径,从输入端口直接到输出端口。

为什么这么分?因为每种路径的约束方式不同。比如输入到寄存器的路径,你需要设置 input delay;寄存器到寄存器的路径,全靠时钟周期约束。

下面这张图展示了这四类路径的关系:

STA 时序路径分类图 STA 时序路径分类 输入端口 寄存器1 (launch) 组合逻辑 寄存器2 (capture) 输出端口 路径1 路径2 路径3 路径4(纯组合) 时钟源 说明: 路径1(输入→寄存器)需设置 input delay;路径2(寄存器→寄存器)由时钟周期约束;路径3(寄存器→输出)需设置 output delay;路径4(输入→输出)为纯组合路径。

4.4 时序约束:给 STA 定“规矩”

STA 不是凭空分析的,它需要你告诉它时钟长什么样、输入输出延迟是多少。常用的约束文件是 SDC(Synopsys Design Constraints)。

一个典型的 SDC 片段长这样:

# 创建时钟
create_clock -name clk -period 10.0 [get_ports clk]

# 设置输入延迟
set_input_delay -clock clk -max 2.0 [get_ports data_in]

# 设置输出延迟
set_output_delay -clock clk -max 3.0 [get_ports data_out]

# 设置伪路径
set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]

注意:我曾经见过一个团队把 input delay 设反了——把 2ns 设成了 -2ns,结果 STA 报告显示所有路径都满足,流片回来却完全不能工作。所以,约束文件一定要做交叉检查。

4.5 建立时间与保持时间的计算公式

这两个公式是 STA 的核心,建议你记牢:

检查项 公式 说明
建立时间 Tlaunch + Tcomb + Tsetup ≤ Tcapture + Tperiod 数据必须在时钟沿之前到达并稳定
保持时间 Tlaunch + Tcomb ≥ Tcapture + Thold 数据必须在时钟沿之后保持稳定

其中:

  • Tlaunch:发射时钟路径延迟
  • Tcomb:组合逻辑路径延迟
  • Tsetup / Thold:寄存器的建立/保持时间要求
  • Tcapture:捕获时钟路径延迟
  • Tperiod:时钟周期

避坑指南:我曾经在 7nm 项目上遇到一条保持时间违反,公式算出来明明满足,但 STA 报告就是报错。后来发现是 OCV(片上工艺偏差)导致的——两个寄存器的时钟路径在不同 corner 下延迟差异太大。所以,实际项目中一定要考虑 OCV 和 derate 因子。

4.6 常见 STA 违例及修复思路

STA 跑完后,你通常会看到两类违例:

  • Setup Violation:路径太慢。修复方法包括:减小组合逻辑级数、使用高驱动强度的单元、优化时钟 skew(让 capture 时钟来得更晚)。
  • Hold Violation:路径太快。修复方法包括:插入 delay cell、加长走线、优化时钟 skew(让 capture 时钟来得更早)。

嗯,这里要注意:修 setup 和修 hold 有时是矛盾的。你为了修 setup 把路径变短了,可能就引入了 hold 问题。所以,我一般先保证 setup 收敛,再回头修 hold。

好了,STA 的基础概念就讲到这里。记住时序弧、建立/保持时间、路径分类这三块,后面的章节我们会深入每个细节。