第2章:STA工具入门:PrimeTime/SDC基础、report_timing命令详解、常用report命令
好,咱们直接进入正题。上一章聊了STA是什么,这一章咱们得动手了。工具嘛,就是PrimeTime,业界标准,没得选。我刚开始用的时候也觉得命令行好烦,但用久了你会发现——真香。
2.1 PrimeTime与SDC基础
PrimeTime是Synopsys家的静态时序分析工具。说白了,它就是个“时序裁判”。你给它网表、库、约束,它告诉你:你的设计能不能跑在目标频率上。
我个人习惯,拿到一个新设计,第一件事就是跑一遍PrimeTime,看看有没有明显的时序问题。别等到后端都做完了才发现,那代价就大了。
SDC是啥?Synopsys Design Constraints,时序约束文件。你告诉工具:时钟长什么样、输入输出延迟多少、哪些路径是假的。没有SDC,PrimeTime就是个瞎子。
核心要点:SDC是STA的灵魂。约束写错了,分析结果就是错的。我曾经见过一个项目,因为SDC里时钟周期写错了,导致芯片流片回来完全不能用...嗯,那叫一个惨。
一个典型的SDC文件长这样:
# 创建时钟
create_clock -name clk -period 10 [get_ports clk]
# 设置输入延迟
set_input_delay -clock clk -max 5 [get_ports data_in]
# 设置输出延迟
set_output_delay -clock clk -max 5 [get_ports data_out]
# 设置伪路径
set_false_path -from [get_clocks rst_clk] -to [get_clocks data_clk]
# 设置多周期路径
set_multicycle_path -setup 2 -from [get_pins regA/Q] -to [get_pins regB/D]
你想想看,这些命令其实就是在告诉工具:哪些路径要查,怎么查。我建议初学者先把create_clock和set_input_delay/set_output_delay搞明白,这仨占了80%的约束工作。
2.2 report_timing命令详解
report_timing是PrimeTime里最常用的命令,没有之一。你跑完STA,第一件事就是用它看结果。
基本用法:
pt_shell> report_timing
这样会输出所有路径中最差的那条。但实际工作中,我们通常要加一堆选项:
pt_shell> report_timing -from [get_pins regA/CK] -to [get_pins regB/D] -nworst 5 -delay_type max
这条命令的意思是:从regA的时钟端到regB的数据端,报出最差的5条路径,只看setup(max delay)。
常用的选项我列一下:
| 选项 | 说明 | 我的建议 |
|---|---|---|
-from |
指定起点 | 一般用get_pins指定寄存器时钟端 |
-to |
指定终点 | 一般用get_pins指定寄存器数据端 |
-nworst |
报出最差的N条路径 | 我习惯用5或10,太多看不过来 |
-delay_type |
max(setup)或min(hold) | 别搞混了,setup用max,hold用min |
-path_type |
full_clock/full_path/short | 调试时用full_clock,日常用full_path |
小技巧:我每次看report_timing的输出,第一眼先看slack。正数说明没问题,负数就是有问题。然后看data path和clock path的延迟,判断是组合逻辑太大还是时钟偏斜太大。
输出结果长这样:
Startpoint: regA
(rising edge-triggered flip-flop clocked by clk)
Endpoint: regB
(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
regA/CK (DFF) 0.00 0.50 r
regA/Q (DFF) 0.35 0.85 r
...
regB/D (DFF) 0.00 5.20 r
data arrival time 5.20
clock clk (rise edge) 10.00 10.00
clock network delay (propagated) 0.60 10.60
clock uncertainty -0.10 10.50
regB/CK (DFF) 0.00 10.50 r
library setup time -0.05 10.45
data required time 10.45
----------------------------------------------------------
data required time 10.45
data arrival time -5.20
----------------------------------------------------------
slack (MET) 5.25
看到slack是5.25,正的,说明这条路径没问题。如果slack是负的,那就得修了。
注意:slack为正不代表整个设计没问题。report_timing只报最差路径。我建议你跑完所有路径的检查,别只看一条。
2.3 常用report命令
除了report_timing,PrimeTime还有一堆report命令。我挑几个最常用的说说。
report_constraint
这个命令用来检查所有约束是否都满足了。包括setup、hold、max_transition、max_capacitance等等。
pt_shell> report_constraint -all_violators
这条命令会列出所有违反约束的路径。我每次跑完STA,第一件事就是跑这个。如果有violator,再去看具体的report_timing。
report_clock
查看时钟信息。包括时钟周期、波形、skew、latency等。
pt_shell> report_clock -skew -attributes
时钟问题是最容易出问题的。我曾经遇到过一个案例,两个时钟域之间的路径一直报violation,查了半天发现是时钟定义错了,一个用了上升沿,一个用了下降沿。嗯,这种低级错误,犯过一次就记住了。
report_timing -group
按路径组报时序。每个时钟域就是一个路径组。
pt_shell> report_timing -group clk -nworst 10
这样只看clk这个时钟域下的路径。我习惯把每个时钟域都单独看一遍,特别是跨时钟域的路径,容易出问题。
report_analysis_coverage
这个命令告诉你,你的约束覆盖了多少路径。如果覆盖率低,说明有些路径没被检查到。
pt_shell> report_analysis_coverage
重要:覆盖率低于90%就要小心了。我建议至少做到95%以上。那些没被覆盖的路径,可能就是芯片出问题的根源。
2.4 知识体系图
下面这张图,是我自己总结的STA工具入门知识体系。你照着这个思路学,不会乱。
这张图把STA工具入门的三个核心模块串起来了。你照着这个顺序学,先搞懂PrimeTime怎么启动和加载文件,再学SDC怎么写,最后学会怎么看report。嗯,就是这么个流程。
2.5 避坑指南
最后,我分享几个自己踩过的坑:
- 时钟没定义全:有一次我漏了一个时钟,结果那个时钟域下的所有路径都没被检查。后来芯片出了问题,查了三天才发现。所以,跑完STA一定要看report_analysis_coverage。
- SDC里写错了时钟周期:10ns写成了1ns,结果所有路径都报violation。我当时还纳闷,怎么设计这么差?后来发现是约束写错了。嗯,这种错误,犯一次就够了。
- report_timing只看一条路径:最差的那条修好了,结果第二条又冒出来了。我建议用-nworst 10,一次看10条,心里有数。
我的习惯:每次跑完STA,我会先跑report_analysis_coverage看覆盖率,再跑report_constraint -all_violators看有没有违反,最后用report_timing -nworst 10看具体路径。三步走,稳得很。
好了,这一章就到这里。工具这东西,多用就熟了。下一章咱们聊怎么分析时序报告,到时候我会教你怎么从report里看出问题在哪。