第二章:STA工具入门——从零开始读懂时序报告
静态时序分析,说白了就是检查你的芯片能不能跑在目标频率上。我刚开始做设计时总觉得这步可有可无,直到有一次流片回来芯片死活上不了高频……嗯,从那以后我再也不敢跳过STA了。
这一章,咱们聊聊STA工具怎么用。别怕,工具只是手段,核心是理解它背后的逻辑。
2.1 主流STA工具:PrimeTime vs Tempus
目前业界主流的STA工具就两个:Synopsys的PrimeTime和Cadence的Tempus。我两个都用过,各有千秋。
| 特性 | PrimeTime | Tempus |
|---|---|---|
| 厂商 | Synopsys | Cadence |
| 市场占有率 | 约70%(老牌霸主) | 约30%(近年崛起) |
| 脚本语言 | Tcl(原生支持) | Tcl(兼容性好) |
| 速度 | 中等,但稳定 | 快,多线程优化好 |
| 报告可读性 | 详细,但冗长 | 简洁,重点突出 |
| 我的推荐 | 新手入门首选 | 老手效率之选 |
个人经验:我建议新手先用PrimeTime。为什么?因为它的报告虽然啰嗦,但信息全。等你把PrimeTime的每一行报告都读懂了,再用Tempus就是降维打击。
2.2 SDC约束文件——STA的灵魂
SDC(Synopsys Design Constraints)文件,就是告诉工具你的设计要跑多快、输入输出长什么样。没有SDC,STA就是瞎子摸象。
一个最基本的SDC长这样:
# 创建时钟
create_clock -name clk -period 10 [get_ports clk]
# 设置输入延迟
set_input_delay -clock clk -max 2.0 [get_ports data_in]
# 设置输出延迟
set_output_delay -clock clk -max 3.0 [get_ports data_out]
# 设置伪路径
set_false_path -from [get_clocks rst_clk] -to [get_clocks clk]
嗯,这里要注意:create_clock的-period单位是纳秒。10ns对应100MHz。我见过有人写成10ps,结果工具报了一堆违例,查了半天才发现是单位搞错了。
2.3 报告解读——setup/hold报告怎么看?
STA工具会生成两种核心报告:setup报告和hold报告。说白了,setup检查的是“信号来得太晚”,hold检查的是“信号变得太快”。
2.3.1 Setup报告解读
一个典型的setup违例报告长这样:
Startpoint: reg1/CK (rising edge-triggered flip-flop clocked by clk)
Endpoint: reg2/D (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: max
Point Incr Path
---------------------------------------------------------------
clock clk (rise edge) 0.00 0.00
clock network delay (propagated) 0.50 0.50
reg1/CK (DFF) 0.00 0.50 r
reg1/Q (DFF) 0.35 0.85 r
net1 (wire) 0.12 0.97 r
U1/A (AND2) 0.08 1.05 r
U1/Z (AND2) 0.15 1.20 r
net2 (wire) 0.10 1.30 r
reg2/D (DFF) 0.00 1.30 r
data arrival time 1.30
clock clk (rise edge) 10.00 10.00
clock network delay (propagated) 0.50 10.50
clock uncertainty -0.10 10.40
reg2/D (setup time) -0.05 10.35
data required time 10.35
data required time 10.35
data arrival time -1.30
---------------------------------------------------------------
slack (MET) 9.05
关键点:看最后一行
slack。正数表示满足,负数表示违例。上面这个例子slack=9.05ns,说明余量很大。
我曾经遇到一个项目,slack只有-0.02ns。当时觉得就20ps,应该没问题吧?结果流片回来,高温下就是跑不稳。从那以后,我给自己定了个规矩:setup slack至少留50ps余量。
2.3.2 Hold报告解读
Hold报告和setup报告结构类似,但检查的是最短路径:
Startpoint: reg1/CK (rising edge-triggered flip-flop clocked by clk)
Endpoint: reg2/D (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: min
Point Incr Path
---------------------------------------------------------------
clock clk (rise edge) 0.00 0.00
clock network delay (propagated) 0.50 0.50
reg1/CK (DFF) 0.00 0.50 r
reg1/Q (DFF) 0.20 0.70 r
net1 (wire) 0.08 0.78 r
reg2/D (DFF) 0.00 0.78 r
data arrival time 0.78
clock clk (rise edge) 0.00 0.00
clock network delay (propagated) 0.50 0.50
clock uncertainty 0.10 0.60
reg2/D (hold time) 0.05 0.65
data required time 0.65
data required time 0.65
data arrival time -0.78
---------------------------------------------------------------
slack (MET) 0.13
避坑指南:我曾经在hold分析上吃过亏。setup违例可以通过降频临时解决,但hold违例是硬伤——频率再低也没用。所以,我建议先修hold,再修setup。
2.4 常见违例类型分类
根据我的经验,违例可以分成三大类:
- Setup违例(最常见)
- 原因:路径太长、组合逻辑太多
- 解法:插寄存器、优化逻辑、降频
- Hold违例(最头疼)
- 原因:路径太短、时钟偏斜太大
- 解法:插延迟单元、调整时钟树
- Transition/Capacitance违例
- 原因:驱动能力不足、扇出太大
- 解法:换大驱动单元、复制逻辑
我的习惯:拿到一份新设计的STA报告,我第一件事就是看违例总数。如果setup违例超过100条,我会先怀疑约束是不是写错了。如果hold违例超过10条,我会先检查时钟树。这个习惯帮我省了不少排查时间。
2.5 知识体系总览
下面这张图,是我自己总结的STA工具入门知识体系。你想想看,是不是这个理?
这张图把STA工具入门的核心内容串起来了。从左到右:先选工具,再写约束,最后看报告。违例类型是贯穿始终的线索。
总结一下:STA工具入门,说白了就是三件事——会用工具、会写约束、会看报告。别被那些花里胡哨的选项吓到,抓住setup和hold这两个核心,你就掌握了STA的命门。
可可精品资料库