4. 静态时序分析基础

静态时序分析——STA,说白了就是检查你的芯片能不能在目标频率下稳定工作。我刚开始做数字设计那会儿,总觉得这步不过是走个过场,直到有一次流片回来,芯片死活跑不上500MHz……嗯,从那以后我再也不敢跳过STA了。

你想想看,RTL写完了,综合网表也出来了,但你怎么知道所有路径都来得及把数据传过去?靠仿真?仿真只能覆盖你写的testcase,但实际芯片里成千上万条路径,总有你没想到的组合。STA就是把这些路径一条一条拎出来,用数学方法算清楚。

4.1 核心概念:建立时间与保持时间

STA的基础就两个时间概念——建立时间(setup time)和保持时间(hold time)。我当年在课堂上背公式背得滚瓜烂熟,真正理解还是在项目里被时序问题虐过之后。

  • 建立时间(Tsetup):数据必须在时钟有效沿之前到达并稳定的最短时间。如果数据到得太晚,寄存器就抓不到正确值。
  • 保持时间(Thold):时钟有效沿之后,数据必须保持稳定的最短时间。如果数据变化太快(比如路径太短),也会出问题。

一个简单的计算模型:

数据从寄存器A的时钟沿出发,经过组合逻辑到达寄存器B。

要求:Tclk→q + Tcomb + Tnet ≤ Tclk - Tsetup

这就是setup检查的时序不等式。hold检查类似:Tclk→q + Tcomb_min ≥ Thold

4.2 时序路径分类

STA工具会把所有路径分成四类,每类检查方式略有不同。我在做第一个复杂SoC项目时,就因为漏了一条输入到寄存器的假路径,白费了两周调试时间。

路径类型起点终点常见约束
输入到寄存器芯片输入引脚内部寄存器set_input_delay
寄存器到寄存器内部寄存器内部寄存器时钟周期约束
寄存器到输出内部寄存器芯片输出引脚set_output_delay
输入到输出芯片输入引脚芯片输出引脚set_max_delay

其中寄存器到寄存器是最核心的,也是最容易理解的——一个时钟沿把数据打进A,下一个时钟沿B必须收到。路径延迟不够会hold违例,太长则setup违例。

4.3 Slack:时序裕量

STA报告里最显眼的数字就是slack。正数表示时序还有余量,负数说明这条路径已经“撑不住了”。我有个习惯:查看报告时第一眼先看worst negative slack(WNS),如果WNS是负的,这活儿还没完。

实用小习惯:我个人建议在做完第一次STA后,先检查WNS和TNS(total negative slack)。TNS能告诉你违例的“总量”,如果TNS很大但WNS不严重,可能是很多路径都差一点点,这时候整体优化更有效;如果WNS很负,得先找那条“最慢的路”。

4.4 时序约束:让工具知道你的要求

STA工具不会自己猜你要跑多快。你得用SDC(Synopsys Design Constraints)文件告诉它。最常用的几条命令,我写在下面:

# 定义时钟,周期10ns(100MHz)
create_clock -name clk -period 10 [get_ports clk]

# 设置输入延迟(相对时钟沿)
set_input_delay -clock clk 2.0 [get_ports data_in]

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

# 定义虚假路径(不用担心这条路径的时序)
set_false_path -from [get_pins inst_A/reg_Q] -to [get_pins inst_B/D]

# 多周期路径(允许两个时钟周期完成)
set_multicycle_path -setup 2 -from [get_pins slow_path_reg/Q]

我以前犯过一个错:忘记给复位信号设false path,结果工具花大量时间优化复位路径,反而影响了关键功能路径。嗯,这个坑印象很深。

4.5 从RTL布局到STA的流程

在我们的RTL布局自动化校验工具链里,STA是承上启下的一环。布局完成之后生成网表和寄生参数,STA读入这些数据,加上库文件和你的约束,输出时序报告。比如下面这张流程图:

静态时序分析基本流程 RTL布局后网表 寄生参数(SPEF) 工艺库文件 时序约束(SDC) STA工具计算 输出时序报告 slack≥0? 通过 返回修改布局

4.6 避坑指南

说到这里,分享几点我在项目里摔过的跟头:

  • 不要忽略hold违例。我见过很多同学只盯着setup看,觉得hold是后端的事。但如果在预布局阶段hold就违例了,说明路径太短,很可能跟时钟歪斜有关,这时候改RTL或调整约束还来得及。
  • 时钟组定义要完整。如果芯片有多个时钟域,漏掉set_clock_groups的话,工具会分析跨时钟域路径,产生一堆假违例信息,淹真实问题。
  • 养成检查报告的习惯。我建议每次跑完STA都看一眼“unconstrained paths”数量。如果非0,说明有些时钟或端口没约束,容易漏掉关键路径。

曾经有一次:我在做一款AI加速芯片,综合后STA报告全是绿的,WNS有正0.2ns,觉得稳了。结果芯片回来后根本跑不了150MHz。后来发现——我忘了给异步复位信号设false_path!工具把复位路径当成正常路径优化,把复位树的延迟做得很大,影响了其他路径的真实slack。从那以后,我习惯在SDC开头就把所有异步信号和测试接口先设好false path。

4.7 小结一下

静态时序分析不是玄学,它就是一条一条路径的加减法。你给它正确的约束、完整的库、准确的寄生参数,它告诉你哪里快哪里慢。在我们的RTL布局自动化校验流程中,STA就像质检员——布局完了,先过STA这一关,不过关就回去改。这样反复几次,才能保证最终流片OK。