第二章: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 常见违例类型分类

根据我的经验,违例可以分成三大类:

  1. Setup违例(最常见)
    • 原因:路径太长、组合逻辑太多
    • 解法:插寄存器、优化逻辑、降频
  2. Hold违例(最头疼)
    • 原因:路径太短、时钟偏斜太大
    • 解法:插延迟单元、调整时钟树
  3. Transition/Capacitance违例
    • 原因:驱动能力不足、扇出太大
    • 解法:换大驱动单元、复制逻辑
我的习惯:拿到一份新设计的STA报告,我第一件事就是看违例总数。如果setup违例超过100条,我会先怀疑约束是不是写错了。如果hold违例超过10条,我会先检查时钟树。这个习惯帮我省了不少排查时间。

2.5 知识体系总览

下面这张图,是我自己总结的STA工具入门知识体系。你想想看,是不是这个理?

STA工具入门知识体系 STA工具 SDC约束 报告解读 PrimeTime Tempus create_clock set_input/output_delay set_false_path Setup报告 Hold报告 Transition报告 常见违例类型 Setup违例(路径太长) Hold违例(路径太短) Transition违例(驱动不足)

这张图把STA工具入门的核心内容串起来了。从左到右:先选工具,再写约束,最后看报告。违例类型是贯穿始终的线索。

总结一下:STA工具入门,说白了就是三件事——会用工具、会写约束、会看报告。别被那些花里胡哨的选项吓到,抓住setup和hold这两个核心,你就掌握了STA的命门。

可可精品资料库