第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命令 启动PrimeTime 加载库文件(.db) 读取网表(.v/.vhdl) 读取SDC约束 create_clock set_input_delay/output_delay set_false_path/multicycle_path set_clock_uncertainty/latency report_timing report_constraint report_clock report_analysis_coverage 核心流程:启动工具 → 加载库/网表 → 读SDC → 跑Report → 分析结果 记住:约束是基础,report_timing是核心,覆盖率是保障

这张图把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里看出问题在哪。

可可精品资料库