第4章:时序报告解读——slack、transition、capacitance、clock skew、data path与clock path分析

各位同学,咱们今天聊点实在的。时序报告,说白了就是STA工具给你的一张「成绩单」。你设计做得好不好,能不能跑起来,全在这张报告里。我见过不少工程师,跑完PrimeTime,看到一堆数字就头大,直接问我「这报告到底怎么看?」。嗯,今天我就带你把这份报告从头到尾捋一遍。

4.1 先看slack——这是你的「生死线」

Slack,就是时序余量。正数代表你还有富余,负数代表你已经违规了。我个人习惯,拿到报告第一件事就是看最差的负slack(WNS,Worst Negative Slack)。

核心公式:

slack = required_time - arrival_time

setup slack为正,说明数据到得比要求早;hold slack为正,说明数据到得比要求晚。

我在项目中遇到过一种情况:WNS只有-50ps,但TNS(Total Negative Slack)却很大,达到-5000ps。这说明什么?说明不是单一路径有问题,而是整片区域都有毛病。这时候你光修一条路径没用,得从全局找原因。

我的经验:WNS在-100ps以内,通常可以通过小规模ECO修复;超过-200ps,你可能得考虑调整floorplan或者重新综合了。

4.2 Transition和Capacitance——别让信号「变形」

Transition,就是信号从0到1或者从1到0的跳变时间。Capacitance,就是负载电容。这两个参数,直接决定了你的路径延迟。

为什么会这样?你想想看,一个信号如果跳变太慢,就像一个人走路拖拖拉拉,后面的逻辑门就得等它。等来等去,setup就崩了。

参数 典型违规值 常见原因
Transition > 0.5ns(取决于工艺) 驱动能力不足、线太长
Capacitance > 库文件规定的max_capacitance 扇出太大、走线过长

我曾经在一个28nm的项目里,发现一条路径的transition达到了0.8ns。查了半天,原来是一个buffer驱动了32个负载。嗯,这种问题,加两级buffer树就能解决。

注意:Transition违规往往比Capacitance违规更隐蔽。因为Capacitance超标,工具会直接报DRC错误;但Transition超标,有时候只是路径延迟变大,你以为是setup问题,其实根因是transition太差。

4.3 Clock Skew——时钟的「时间差」

Clock skew,就是同一个时钟到达不同寄存器的时刻差异。说白了,时钟信号在芯片上跑,不可能同时到达每个地方,总有个先后。

我个人习惯,把clock skew分成两类:

  • Positive skew:捕获时钟比发射时钟晚到。这对setup有利,对hold有害。
  • Negative skew:捕获时钟比发射时钟早到。这对hold有利,对setup有害。

你想想看,如果一条路径的setup slack是负的,你可以试着让捕获时钟晚到一点,也就是引入positive skew。但别高兴太早,hold可能会因此变差。

实战技巧:在PrimeTime里,用report_timing -skew可以单独看clock skew对路径的影响。我一般会对比「with skew」和「without skew」两种情况,看看skew到底贡献了多少。

4.4 Data Path vs Clock Path——两条腿走路

一条时序路径,由两部分组成:data path和clock path。很多人只看data path,忽略了clock path,这是大忌。

Data path:从发射寄存器的Q端,经过组合逻辑,到捕获寄存器的D端。

Clock path:从时钟源,经过各种buffer、门控单元,到寄存器的CK端。

我记得有一次,一个项目的setup总是修不好。我盯着data path看了半天,延迟已经压到极限了。后来我仔细看了clock path,发现捕获时钟路径上多了一个不必要的buffer。去掉之后,skew改善了,setup也过了。

我的建议:看报告时,别只盯着data path的延迟。把clock path的延迟也列出来,看看是不是有「时钟路径过长」或者「时钟路径上插了太多东西」的问题。

4.5 实战:手把手读一份时序报告

咱们拿一个实际例子来说。假设你看到这样一段报告:

Startpoint: reg_A (rising edge-triggered flip-flop)
Endpoint:   reg_B (rising edge-triggered flip-flop)
Path Group: clk
Path Type:  max (setup)

  Point                                   Incr       Path
  ------------------------------------------------------------
  clock clk (rise edge)                   0.0000     0.0000
  clock network delay (propagated)        0.2000     0.2000
  reg_A/CK (DFFQ_X1)                      0.0000     0.2000 r
  reg_A/Q (DFFQ_X1)                       0.1500     0.3500 r
  U1/Z (INV_X1)                           0.0800     0.4300 f
  U2/Z (NAND2_X1)                         0.1200     0.5500 r
  U3/Z (INV_X2)                           0.0900     0.6400 f
  reg_B/D (DFFQ_X1)                       0.0000     0.6400 f
  data arrival time                                   0.6400

  clock clk (rise edge)                   1.0000     1.0000
  clock network delay (propagated)        0.2500     1.2500
  reg_B/CK (DFFQ_X1)                                1.2500 r
  library setup time                      -0.0500    1.2000
  data required time                                  1.2000
  ------------------------------------------------------------
  data required time                                  1.2000
  data arrival time                                   0.6400
  ------------------------------------------------------------
  slack (MET)                                         0.5600

你看,这份报告里:

  • Data path延迟:0.64ns
  • Clock path延迟:发射端0.20ns,捕获端0.25ns
  • Clock skew:0.25 - 0.20 = 0.05ns(positive skew)
  • Slack:0.56ns,完全满足

如果slack是负的,我会先看transition。比如U2/Z的transition是不是太大?再看capacitance,是不是扇出太多?最后看clock skew,是不是捕获时钟路径太长?

避坑指南:我曾经遇到一个案例,报告里slack是正的,但芯片流片回来就是跑不到目标频率。后来发现,是因为clock path上的OCV(On-Chip Variation)没考虑。所以,看报告时别忘了检查是不是用了set_clock_uncertainty,以及有没有开启OCV分析。

4.6 总结一下

时序报告解读,说白了就是四个字:追根溯源。看到负slack,别急着修,先搞清楚是data path太慢,还是clock path有问题,还是transition/capacitance拖了后腿。

我个人习惯,每次拿到报告,先看WNS和TNS,再看最差路径的transition和capacitance,最后对比clock skew。这样一圈下来,问题基本就定位了。

嗯,今天就聊到这儿。下一章咱们讲ECO修复的实战技巧,到时候我会拿几个真实案例出来,手把手教你怎么修。