3. 静态时序分析(STA)核心:PrimeTime工具使用、建立时间与保持时间分析、时序路径分类

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

今天咱们聊聊 PrimeTime 这个工具。它是 Synopsys 家的 STA 主力,业界标准。你想想看,后端流程里但凡跟 timing 沾边的事,最后都得靠它拍板。

3.1 PrimeTime 工具使用

PrimeTime 不是跑仿真的,它不关心功能对不对。它只做一件事:把所有路径的延迟算一遍,然后跟你的约束比。我个人习惯在布局布线后跑两轮——一轮 setup,一轮 hold。

3.1.1 基本流程

  1. 读入网表(read_verilog 或 read_db)
  2. 加载工艺库(read_lib)
  3. 施加约束(read_sdc)
  4. 运行分析(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 的核心逻辑串起来了。我每次给新人培训都拿它当提纲。

静态时序分析核心知识结构 静态时序分析(STA)核心知识结构 PrimeTime 工具 建立时间分析 保持时间分析 时序路径分类 T_cycle T_logic T_setup T_clk2q T_hold T_skew 输入→寄存器 寄存器→寄存器 寄存器→输出 核心公式: setup_slack = T_cycle - T_clk2q - T_logic - T_setup - T_skew

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 只是帮你算数字,真正决定芯片能不能跑起来的,是你对时序路径的理解。