第1章:时序报告解读——读懂PrimeTime/STA工具的时序报告、关键路径分析、WNS与TNS

各位同学,咱们今天聊聊时序报告。说实话,我见过太多工程师,跑完STA就把报告扔一边,只看个pass/fail。这太浪费了。一份时序报告,就像芯片的体检单,里面藏着大量信息。你读懂了,就能精准定位问题;读不懂,就只能瞎猜。

我刚开始做芯片那会儿,也吃过这个亏。有一次项目时序收敛阶段,报告显示所有路径都满足约束,结果流片回来,芯片在高频下就是不稳定。后来一查,原来是报告里有一条路径的slack虽然为正,但margin太小,温度一高就崩了。从那以后,我养成了一个习惯:每份时序报告,必须逐行细读。

1.1 时序报告长什么样?

PrimeTime的时序报告,说白了就是一张表格。它告诉你每条路径的起点、终点、延迟、约束,以及最重要的——slack值。咱们先看一个典型的报告片段:

********************************************************************************
  Startpoint: reg_A (rising edge-triggered flip-flop clocked by clk)
  Endpoint:   reg_B (rising edge-triggered flip-flop clocked by clk)
  Path Group: clk
  Path Type:  max (setup)
********************************************************************************
  Point                                                   Incr       Path
  ------------------------------------------------------------------------
  clock clk (rise edge)                                   0.000      0.000
  clock network delay (propagated)                        0.200      0.200
  reg_A/CK (sff1)                                         0.000      0.200 r
  reg_A/Q (sff1)                                          0.150      0.350 r
  net_1 (wire)                                            0.300      0.650 r
  U1/A (nand2)                                            0.100      0.750 r
  U1/ZN (nand2)                                           0.120      0.870 f
  net_2 (wire)                                            0.250      1.120 f
  U2/A (inv)                                              0.080      1.200 f
  U2/ZN (inv)                                             0.100      1.300 r
  net_3 (wire)                                            0.200      1.500 r
  reg_B/D (sff1)                                          0.000      1.500 r
  ------------------------------------------------------------------------
  data arrival time                                                  1.500

  clock clk (rise edge)                                   2.000      2.000
  clock network delay (propagated)                        0.200      2.200
  clock uncertainty                                      -0.050      2.150
  reg_B/CK (sff1)                                         0.000      2.150 r
  library setup time                                     -0.100      2.050
  data required time                                                 2.050
  ------------------------------------------------------------------------
  data required time                                                 2.050
  data arrival time                                                 -1.500
  ------------------------------------------------------------------------
  slack (MET)                                                        0.550
********************************************************************************

嗯,这段代码看着有点长,但别怕。咱们拆开来看,其实就三部分:路径信息、数据路径延迟、时钟路径延迟。

1.2 关键路径分析——找到真正的瓶颈

什么叫关键路径?就是slack最小的那条路径。它决定了你的芯片能不能跑在目标频率上。我习惯的做法是:先看WNS(Worst Negative Slack),也就是最差的那条路径的slack值。如果WNS是负的,说明芯片肯定跑不到目标频率。

但光看WNS还不够。你想想看,如果WNS是-0.5ns,但只有一条路径,那问题不大,修掉就行。可如果TNS(Total Negative Slack)很大,比如-100ns,那就说明有大量路径都违规了。这时候,你可能需要重新审视你的约束,或者调整整个设计的架构。

核心概念速查:

  • WNS(Worst Negative Slack):所有路径中最差的负slack值。代表芯片的“木桶短板”。
  • TNS(Total Negative Slack):所有负slack路径的slack值之和。代表整体时序违例的严重程度。
  • FEP(Failing Endpoints):违例的终点数量。告诉你有多少个寄存器需要关注。

我曾经接手过一个项目,WNS只有-0.2ns,看起来不严重。但TNS高达-80ns,FEP有3000多个。这意味着什么?意味着有3000多个寄存器都处在临界状态。修起来工作量巨大。后来我们不得不重新做floorplan,把关键模块挪得更近一些。

1.3 如何读懂路径延迟?

报告里的Incr列,表示每个单元的延迟增量。Path列是累计延迟。你看上面那个例子,数据路径从reg_A的时钟引脚到reg_B的数据引脚,总共花了1.5ns。

这里有个小技巧:我一般会重点关注那些Incr值特别大的点。比如某个wire延迟0.3ns,或者某个cell延迟0.15ns。这些就是潜在的优化点。如果一条路径上,大部分延迟都花在走线上,那说明布局布线有问题。如果大部分延迟都花在逻辑单元上,那说明逻辑级数太多,需要做retiming或者插入流水线。

我的个人习惯:

拿到报告后,我会先按slack排序,找出最差的10条路径。然后逐条看它们的延迟分布。如果发现某条路径的走线延迟占比超过40%,我会立刻去检查floorplan。如果逻辑延迟占比高,我会去检查综合脚本,看看是不是没做retiming优化。

1.4 时钟路径 vs 数据路径

报告里有两段:data arrival time和data required time。前者是数据实际到达的时间,后者是数据必须到达的时间。slack就是两者的差值。

你注意看,data required time的计算里,包含了clock uncertainty和library setup time。clock uncertainty是时钟抖动和余量,library setup time是寄存器本身的建立时间要求。这两个值,很多人容易忽略。我见过有人把clock uncertainty设成0,结果流片回来芯片跑不起来。记住,clock uncertainty不是摆设,它代表了真实芯片中的时钟不确定性。

1.5 实战:如何快速定位问题?

好了,理论讲完了,咱们来点实际的。假设你拿到一份报告,WNS是-0.3ns,TNS是-15ns,FEP是120个。你会怎么做?

我的步骤是这样的:

  1. 先看WNS路径:找到那条最差的路径,分析它的延迟分布。是走线太长?还是逻辑级数太多?
  2. 再看TNS分布:如果TNS集中在少数几条路径上,那好办,逐个修。如果TNS分散在大量路径上,那可能是全局问题,比如时钟树没做好,或者约束太紧。
  3. 检查FEP:如果FEP数量很大,但每个违例都不严重(slack在-0.1ns以内),那可能是工艺角问题,或者OCV(片上偏差)设置太悲观。
  4. 对比不同corner:我习惯同时看best case和worst case的报告。如果worst case违例严重,但best case没问题,那说明是温度电压的影响。如果两个corner都违例,那可能是设计本身的问题。

注意:千万不要只看一个corner的报告。我见过有人只看了worst case,修了半天,结果在best case下又出现了hold违例。时序分析一定要全面,setup和hold都要看,多个corner都要跑。

1.6 知识体系总览

为了让你更直观地理解本章的内容,我画了一张图。它展示了时序报告解读的核心逻辑:从原始报告出发,经过关键路径分析,最终定位到WNS和TNS,然后指导我们进行优化。

时序报告解读知识体系 PrimeTime 时序报告 包含路径延迟、约束、slack等信息 报告解析 数据路径延迟 时钟路径延迟 约束检查 关键路径分析 找出slack最小的路径,分析延迟分布 核心指标:WNS / TNS / FEP WNS:最差负slack | TNS:总负slack | FEP:违例终点数

这张图清晰地展示了时序报告解读的流程:从原始报告出发,经过解析和关键路径分析,最终聚焦到WNS、TNS和FEP这三个核心指标。每个环节都有对应的优化策略。

1.7 小结

好了,这一章的内容就到这里。记住,时序报告不是用来存档的,它是你优化设计的指南针。读懂了它,你就能精准地找到问题所在,而不是盲目地到处乱修。

下一章,咱们会深入讨论setup和hold violation的区别,以及如何针对性地修复。但在此之前,我建议你找一份真实的时序报告,按照今天讲的方法,自己动手分析一遍。实践出真知,这话一点不假。

可可精品资料库