3. 静态时序分析(STA)核心:PrimeTime工具使用、建立时间与保持时间分析、时序路径分类
静态时序分析,说白了就是检查你的芯片能不能跑在目标频率上。我刚开始做设计时总觉得这步可有可无,直到有一次流片回来芯片死活上不了高频……嗯,从那以后我再也不敢跳过 STA 了。
今天咱们聊聊 PrimeTime 这个工具。它是 Synopsys 家的 STA 主力,业界标准。你想想看,后端流程里但凡跟 timing 沾边的事,最后都得靠它拍板。
3.1 PrimeTime 工具使用
PrimeTime 不是跑仿真的,它不关心功能对不对。它只做一件事:把所有路径的延迟算一遍,然后跟你的约束比。我个人习惯在布局布线后跑两轮——一轮 setup,一轮 hold。
3.1.1 基本流程
- 读入网表(
read_verilog或read_db) - 加载工艺库(
read_lib) - 施加约束(
read_sdc) - 运行分析(
update_timing/report_timing)
核心命令示例:
# 读入网表和库
read_verilog post_route.v
current_design CHIP_TOP
link_design
# 施加时序约束
read_sdc constraints.sdc
# 更新时序并报告
update_timing -full
report_timing -nworst 10 -delay_type max > setup.rpt
report_timing -nworst 10 -delay_type min > hold.rpt
这里有个坑——update_timing 必须跑,不然报告是空的。我曾经见过新人跑完 read_sdc 直接 report_timing,结果啥也没出来,急得满头汗。
3.1.2 常用报告命令
| 命令 | 用途 | 我常用的参数 |
|---|---|---|
report_timing | 报告路径延迟 | -nworst 10 -delay_type max |
report_constraint | 检查约束违例 | -all_violators |
report_clock | 查看时钟属性 | -skew -transition |
report_analysis_coverage | 分析覆盖率 | -summary |
小技巧: 用 report_timing -group 按时钟域分组报告,能快速定位跨时钟域问题。我每次做 ECO 修复时都这么干。
3.2 建立时间与保持时间分析
这两个概念是 STA 的命根子。建立时间(setup)管的是数据能不能在时钟沿之前稳定到达;保持时间(hold)管的是数据在时钟沿之后能不能稳住不动。
3.2.1 建立时间(Setup Time)
公式很简单:
setup slack = T_cycle - T_clk2q - T_logic - T_setup - T_skew
如果 slack 是负数,说明路径太慢,数据来不及在时钟沿前准备好。我在项目中遇到过最头疼的 setup 违例,往往是组合逻辑太深,或者 fanout 太大。
3.2.2 保持时间(Hold Time)
hold slack = T_clk2q + T_logic - T_hold - T_skew
保持时间违例通常发生在数据路径太短的时候。嗯,你没看错——太短也不行。比如两个寄存器直接连在一起,中间没有组合逻辑,hold 就容易出问题。
避坑指南: 我曾经在 28nm 项目上遇到 hold 违例,原因是时钟树综合时把 skew 做得太小,导致数据路径上的延迟不够。后来加了 buffer 才解决。记住:hold 违例比 setup 更难修,因为它跟频率无关,只能加延迟。
3.3 时序路径分类
PrimeTime 把路径分成四类。我习惯用 report_timing -group 来区分它们。
| 路径类型 | 起点 | 终点 | 典型场景 |
|---|---|---|---|
| 输入到寄存器 | 输入端口 | 寄存器 D 端 | 片外信号进入芯片 |
| 寄存器到寄存器 | 寄存器 CK 端 | 寄存器 D 端 | 核心逻辑路径 |
| 寄存器到输出 | 寄存器 CK 端 | 输出端口 | 数据输出到片外 |
| 输入到输出 | 输入端口 | 输出端口 | 纯组合路径 |
你想想看,大部分违例都出在「寄存器到寄存器」这条路径上。但输入到输出那条纯组合路径,如果约束没写对,PrimeTime 会报出离谱的负 slack。
3.4 知识结构图
下面这张图把 STA 的核心逻辑串起来了。我每次给新人培训都拿它当提纲。
3.5 实战建议
- 先修 setup,再修 hold:setup 跟频率相关,hold 跟工艺相关。我一般先跑 setup,把频率跑上去,再回头修 hold。
- 别忽略 clock skew:skew 对 setup 和 hold 的影响是相反的。我曾经在 40nm 项目上因为 clock tree 没做好,setup 和 hold 同时违例,折腾了两周。
- 多用
report_analysis_coverage:它能告诉你哪些路径没被覆盖到。如果覆盖率低于 90%,你的约束可能有问题。
个人习惯: 每次跑完 STA,我都会先看 report_constraint -all_violators,然后按违例类型分组。setup 违例看最差的 10 条,hold 违例看最差的 5 条。这样能快速定位问题。
好了,STA 的核心就这些。记住:工具是死的,分析思路是活的。PrimeTime 只是帮你算数字,真正决定芯片能不能跑起来的,是你对时序路径的理解。