从规则检查到时序收敛:数字芯片STA实战 - 第1节

一、什么是静态时序分析?

静态时序分析,英文叫 Static Timing Analysis,简称 STA。

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

你可能会问:为什么叫「静态」?

因为它不需要输入激励信号。它不像仿真那样,要跑一堆 testbench 去验证功能。STA 是直接分析所有可能的路径,检查每条路径的延迟是否满足时序要求。它覆盖了所有路径,而不是靠你写几个 case 去碰运气。

核心一句话:STA 就是检查从每个触发器的时钟端到下一个触发器的数据端,信号能不能在规定时间内到达。

STA 到底在检查什么?

我习惯把 STA 要检查的东西分成三类:

  • 建立时间(setup time):数据必须在时钟沿到来之前稳定下来。如果数据到得太晚,触发器就可能采到错误的值。
  • 保持时间(hold time):数据在时钟沿之后还要保持一段时间。如果数据变化太快,也会出问题。
  • 时钟偏差(clock skew):时钟到达不同触发器的时间不一样。这个偏差会影响 setup 和 hold 的余量。

嗯,这里要注意:setup 和 hold 是 STA 最基础的两个检查项。我在项目中遇到过很多次,前端工程师觉得功能仿真过了就万事大吉,结果 STA 一跑,setup 违例一大堆。为什么?因为仿真只跑了有限的 case,而 STA 把所有路径都扫了一遍。

二、STA 在数字 IC 设计流程中的位置

数字芯片设计流程,我把它分成几个阶段。STA 不是到最后才做的,它贯穿了整个流程。

数字IC设计流程与STA位置 RTL设计 Verilog/VHDL 逻辑综合 DC/Genus 布局布线 Innovus/ICC2 静态时序分析 PrimeTime/STA 迭代优化 时序签核 Signoff STA在综合后、布局布线后、签核前都要做 每次迭代都要重新跑STA,确保时序收敛 💡 STA不是一次性的工作,而是贯穿整个后端流程的「守门员」

STA 在流程中的具体位置

我按实际项目经验,把 STA 出现的节点列出来:

设计阶段 STA 做什么 我踩过的坑
RTL 设计后 初步时序预算,检查约束是否合理 曾经有个项目,RTL 阶段没做 STA,综合时才发现约束写错了,浪费了两周
逻辑综合后 检查综合后的网表是否满足时序 综合后的 STA 结果往往偏乐观,因为还没考虑布线延迟
布局后 检查 placement 是否合理,有没有长线 有一次布局后 STA 发现一条路径延迟超标,原因是两个 cell 放得太远了
时钟树综合后 检查 clock skew 是否在可接受范围内 时钟树没做好,hold 违例一堆,最后不得不插 buffer 修
布线后 最精确的 STA,考虑实际 RC 参数 布线后的 STA 才是最真实的,前面的都是「预演」
签核前 最终 STA,跑所有 corner,确保万无一失 签核前一定要跑多 corner,我见过只跑典型 corner 流片回来翻车的

STA 和功能仿真的区别

很多新手会混淆这两个概念。我简单说一下:

  • 功能仿真:验证逻辑对不对。比如加法器算出来 1+1 是不是等于 2。
  • STA:验证时序对不对。比如加法器在 1GHz 下能不能稳定输出结果。

功能仿真过了,不代表 STA 能过。反过来,STA 过了,也不代表功能是对的。两者是互补关系。

我的建议:功能仿真和 STA 要并行做。不要等仿真全跑完了再开始 STA。我习惯在综合后就开始跑 STA,哪怕只是粗略检查一下约束文件有没有写错。

三、STA 的基本概念

讲几个 STA 里最基础的概念。这些你后面每章都会用到。

时序路径

STA 把设计里的路径分成四类:

  1. 输入到寄存器:从输入端口到触发器的数据端
  2. 寄存器到寄存器:从触发器的时钟端到下一个触发器的数据端
  3. 寄存器到输出:从触发器的时钟端到输出端口
  4. 输入到输出:从输入端口直接到输出端口(组合逻辑路径)

其中,寄存器到寄存器的路径是最常见的,也是 STA 检查的重点。

时序弧

每个标准单元(比如与门、或门、触发器)内部都有时序弧。它描述了输入到输出之间的延迟关系。

举个例子:一个与门,从输入 A 到输出 Y 有一个上升沿延迟和一个下降沿延迟。这两个延迟可能不一样。STA 工具会分别计算。

注意:不同工艺角下,同一个单元的延迟可能差 2-3 倍。所以 STA 必须在多个 corner 下跑。我曾经在 slow corner 下 setup 过了,结果 fast corner 下 hold 违例了。这就是为什么一定要跑多 corner。

约束文件

STA 不是凭空分析的。它需要你告诉它:时钟频率是多少?输入信号什么时候到?输出信号什么时候要?

这些信息写在约束文件里,通常是 SDC 格式(Synopsys Design Constraints)。

一个最简单的约束文件长这样:

# 创建时钟,频率 500MHz
create_clock -name clk -period 2.0 [get_ports clk]

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

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

嗯,这里要注意:约束文件写错了,STA 结果就是错的。我见过有人把时钟周期写成了 2ns,实际应该是 1ns,结果 STA 全过了,流片回来跑不到 1GHz。

四、STA 的输入输出

STA 工具需要哪些输入?输出什么?我列个表:

输入 说明
门级网表 综合或布局布线后的网表,.v 或 .verilog 格式
工艺库 标准单元的时序信息,.lib 格式
约束文件 SDC 文件,定义时钟、延迟等
寄生参数 布线后的 RC 参数,.spef 格式(可选,但推荐)
输出 说明
时序报告 列出所有违例路径,包括 setup/hold 余量
时序汇总 整体时序情况,WNS、TNS 等指标
违例路径列表 具体哪些路径有问题,方便定位和修复

五、为什么 STA 这么重要?

我直接说结论:没有 STA,你不敢流片。

你想想看,一颗芯片几百万甚至上亿个晶体管,功能仿真只能覆盖一小部分 case。但 STA 可以覆盖所有路径。它告诉你:每条路径都满足时序要求。

我在项目中遇到过最惨的一次:前端工程师说功能仿真全过了,STA 也跑了,但只跑了典型 corner。结果流片回来,高温低压下芯片直接罢工。为什么?因为高温下单元延迟变大,setup 违例了。而典型 corner 下 setup 是过的。

从那以后,我养成了一个习惯:STA 必须跑所有 corner,而且每个 corner 都要看 setup 和 hold。

总结一下:STA 是数字芯片设计流程中不可或缺的一环。它从 RTL 阶段就开始介入,一直持续到签核。它检查的是芯片能不能在目标频率下稳定工作。没有 STA,你的芯片就像没有安全带的赛车——跑得快,但随时可能翻车。

好了,这一章就到这里。STA 的概念和位置你心里有数了。下一章我们开始讲 STA 的核心——时序路径和时序弧,到时候我会拿实际项目里的例子给你看。


可可精品资料库