第二章:静态时序分析基础

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

2.1 STA 的基本概念

静态时序分析(Static Timing Analysis,STA)是一种穷举式的时序验证方法。它不需要输入激励,而是通过分析电路中所有可能的路径,来检查是否满足时序约束。

我个人习惯把 STA 理解为「芯片的体检报告」。它不关心功能对不对,只关心信号能不能在规定时间内到达。你想想看,功能再正确,信号跑不到,那也是白搭。

核心要点:STA 是静态的、穷举的、基于路径的时序验证方法。它不依赖测试向量,所以覆盖率是 100%。

2.2 时序弧与路径分组

时序弧(Timing Arc)是 STA 中最基本的单元。它描述了两个节点之间的延迟关系。比如一个反相器,从输入到输出就有一条时序弧。

我在项目中遇到过一种情况:新手把组合逻辑的时序弧搞混了,结果 STA 报了一堆假路径。嗯,这里要注意——时序弧分为三种:

  • 组合时序弧:从输入到输出的纯组合路径
  • 时序时序弧:从时钟到输出的寄存器路径
  • 建立/保持时序弧:从数据输入到时钟触发的路径

路径分组(Path Group)则是把相似的路径归到一起。常见的分组方式有:

分组名称 说明 典型约束
input_to_reg 输入端口到寄存器 input_delay
reg_to_reg 寄存器到寄存器 时钟周期
reg_to_output 寄存器到输出端口 output_delay
input_to_output 输入端口到输出端口 组合延迟

为什么要分组?因为不同路径的约束条件不一样。我曾经见过一个团队把所有路径放在一个组里,结果优化时顾此失彼,修了这边坏了那边。

2.3 建立时间与保持时间检查

建立时间(Setup Time)和保持时间(Hold Time)是 STA 的核心检查项。说白了,建立时间检查的是「信号来得够不够早」,保持时间检查的是「信号待得够不够久」。

公式其实很简单:

建立时间检查:T_data_path + T_setup <= T_clock_path + T_period
保持时间检查:T_data_path >= T_clock_path + T_hold

我建议你记住一个口诀:建立看周期,保持看延迟。建立时间不够,降频可以解决;保持时间不够,降频也没用,只能改电路。

避坑指南:我曾经在一个 28nm 的项目中,保持时间违例 0.2ns,觉得问题不大就 tapeout 了。结果芯片在低温下频繁出错。后来才知道,保持时间对 PVT 很敏感,低温下延迟变小,违例会更严重。

实际项目中,建立时间违例通常通过插入缓冲器、调整逻辑深度来解决。保持时间违例则通过插入延迟单元、增加路径长度来修复。嗯,这里有个小技巧:修复保持时间时,尽量用专门的延迟单元,别用普通缓冲器,否则 PVT 特性不好控制。

2.4 时钟域与跨时钟域分析

现代芯片里通常有多个时钟域。每个时钟域有自己的时钟源、频率和相位。跨时钟域(Clock Domain Crossing,CDC)分析是 STA 中最容易出问题的地方。

你想想看,两个不同频率的时钟,它们的边沿关系是不确定的。如果直接用一个时钟域的信号去采另一个时钟域的信号,就可能出现亚稳态。

常见的 CDC 处理方式有:

  • 两级同步器:最基础的方法,用两个寄存器打两拍
  • 握手协议:通过 req/ack 信号进行同步
  • 异步 FIFO:用格雷码指针实现跨时钟域数据传输

我个人习惯在 CDC 路径上加上 false_path 约束,告诉 STA 工具不用检查这些路径的时序。但要注意——加了 false_path 不代表可以不管 CDC,你仍然需要做 CDC 验证。

经验之谈:我曾经在一个项目中,设计师把异步 FIFO 的读指针和写指针搞反了,结果 STA 没报错,功能仿真也没问题,但芯片跑起来数据全乱。后来我们加上了 CDC 检查工具,才把这个问题堵住。

知识体系总览

下面这张图展示了本章的核心知识结构,我把它画成了 SVG,方便你理解各个概念之间的关系:

静态时序分析基础 STA 基本概念 时序弧与路径分组 建立/保持时间检查 时钟域与 CDC 穷举式验证 不依赖测试向量 组合/时序/建立保持弧 4 种路径分组 Setup:T_data + T_setup ≤ T_clk + T_period Hold:T_data ≥ T_clk + T_hold 两级同步器 握手协议 / 异步 FIFO 核心思想:穷举所有路径,检查时序约束 建立时间看周期,保持时间看延迟

这张图把 STA 的四个核心模块串在了一起。从基本概念出发,到具体的时序弧和路径分组,再到建立保持时间的检查公式,最后是跨时钟域的处理方法。每个模块之间都有联系,不能孤立地看。

本章小结:STA 是芯片后端设计的基石。理解时序弧、路径分组、建立保持时间检查,以及跨时钟域分析,是做好时序收敛的前提。我建议你在实际项目中多跑几次 STA,把报出来的违例一个个看过去,慢慢就会形成直觉。


公众号:蓝海资料掘金营,微信deep3321