从规则检查到时序收敛:数字芯片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 不是到最后才做的,它贯穿了整个流程。
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 把设计里的路径分成四类:
- 输入到寄存器:从输入端口到触发器的数据端
- 寄存器到寄存器:从触发器的时钟端到下一个触发器的数据端
- 寄存器到输出:从触发器的时钟端到输出端口
- 输入到输出:从输入端口直接到输出端口(组合逻辑路径)
其中,寄存器到寄存器的路径是最常见的,也是 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 的核心——时序路径和时序弧,到时候我会拿实际项目里的例子给你看。
可可精品资料库