第四节:时序报告解读——PrimeTime/Tempus报告结构、关键路径分析、slack直方图与分布、最差路径(Worst Negative Slack)定位

各位同学,大家好。我是你们的后端芯片设计讲师。今天我们来聊聊一个非常实际的话题——时序报告解读。

说实话,我见过不少工程师,跑完PrimeTime或者Tempus,看到一堆数字就头大。其实,时序报告就像医生的体检单。你得知道哪些指标是关键的,哪些是虚惊一场。今天我就带大家把这份“体检单”彻底看懂。

一、PrimeTime/Tempus报告结构——先搞清楚“体检单”长什么样

不管是PrimeTime还是Tempus,它们的报告结构其实大同小异。我习惯把报告分成三个层次来看:

  • 顶层摘要:告诉你整体情况——有没有违例?最差slack是多少?
  • 路径报告:详细列出每一条路径的延迟、转换时间、负载等信息。
  • 汇总统计:比如slack直方图、违例路径数量等。

举个例子,PrimeTime的典型报告开头是这样的:

****************************************
Report : timing
        -max_paths 10
        -nworst 1
        -path_type full_clock
Design : my_chip
Version: P-2019.03-SP1
Date   : Mon Mar 15 10:23:45 2024
****************************************

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

  Point                                    Incr       Path
  ------------------------------------------------------------
  clock clk (rise edge)                    0.0000     0.0000
  clock network delay (propagated)         0.5000     0.5000
  reg_A/CLK (DFFQ_X1)                     0.0000     0.5000 r
  reg_A/Q (DFFQ_X1)                       0.3500     0.8500 r
  net_123 (net)                           0.1200     0.9700 r
  U1/A (NAND2_X1)                         0.0800     1.0500 r
  U1/ZN (NAND2_X1)                        0.1500     1.2000 f
  net_456 (net)                           0.1000     1.3000 f
  U2/A (INV_X1)                           0.0500     1.3500 f
  U2/ZN (INV_X1)                          0.1200     1.4700 r
  net_789 (net)                           0.0900     1.5600 r
  reg_B/D (DFFQ_X1)                       0.0000     1.5600 r
  data arrival time                                   1.5600

  clock clk (rise edge)                    2.0000     2.0000
  clock network delay (propagated)         0.5000     2.5000
  clock uncertainty                       -0.1000     2.4000
  reg_B/CLK (DFFQ_X1)                     0.0000     2.4000 r
  library setup time                      -0.0800     2.3200
  data required time                                  2.3200
  ------------------------------------------------------------
  data required time                                  2.3200
  data arrival time                                   -1.5600
  ------------------------------------------------------------
  slack (MET)                                         0.7600

看到没?报告分成了上下两部分。上半部分是数据路径,下半部分是时钟路径。中间用一条横线隔开。我最开始看报告时,总搞不清“data arrival time”和“data required time”到底谁减谁。后来我总结了一个口诀:required - arrival = slack。正数就是满足,负数就是违例。

小技巧:我习惯在报告里先看“slack”那一行。如果是负数,再看“data arrival time”和“data required time”的差值,就能快速定位问题出在数据路径还是时钟路径。

二、关键路径分析——找到真正的“瓶颈”

关键路径,说白了就是整个设计里最慢的那条路。但这里有个坑:最慢的不一定是最重要的。

我在项目中遇到过这样的情况:一条路径slack是-0.5ns,另一条是-0.3ns。按理说应该先修-0.5ns的。但仔细一看,-0.5ns那条路径是测试模式下的,而-0.3ns是功能模式下的。你想想看,测试模式下的违例,只要不影响功能测试,优先级其实可以放低。所以,分析关键路径时,一定要结合路径的实际工作场景。

PrimeTime里,我们可以用report_timing命令来抓关键路径。常用的选项有:

  • -max_paths 10:显示最差的10条路径
  • -nworst 1:每个端点只显示最差的一条
  • -path_type full_clock:显示完整的时钟路径
  • -group clk:只看某个时钟域

我个人习惯先看-max_paths 100,然后根据slack值排序。如果发现某条路径的slack特别差,我会再用-path_type full_clock_expanded把时钟路径也展开,看看是不是时钟偏斜(skew)在作怪。

三、Slack直方图与分布——从宏观把握全局

只看最差路径是不够的。你得知道整个设计的时序“健康度”。Slack直方图就是干这个的。

PrimeTime里生成直方图的命令很简单:

report_timing -histogram -max_paths 10000 -group clk

输出结果大概长这样:

Slack       Path Count
----------------------
-0.50 to -0.40:   2
-0.40 to -0.30:   5
-0.30 to -0.20:  12
-0.20 to -0.10:  28
-0.10 to  0.00:  45
 0.00 to  0.10:  60
 0.10 to  0.20:  55
 0.20 to  0.30:  40
 0.30 to  0.40:  30
 0.40 to  0.50:  20

看到这个分布,你就能判断:是只有少数几条路径违例,还是整个设计都偏慢。如果违例路径集中在-0.1到0.0之间,那说明设计基本没问题,只是需要微调。但如果违例路径从-0.5开始就有一大堆,那就要考虑是不是时钟周期设得太紧,或者综合策略有问题了。

重点:我一般会关注两个指标——WNS(最差负slack)和TNS(总负slack)。WNS告诉你最差的那条路有多差,TNS告诉你所有违例路径的总和。如果WNS很小但TNS很大,说明有很多路径接近违例,需要大面积优化。如果WNS很大但TNS很小,那可能只是个别路径有问题,定点修复就行。

四、最差路径(Worst Negative Slack)定位——找到“罪魁祸首”

好了,现在我们知道整个设计的时序状况了。接下来就是找到最差的那条路径,然后修复它。

PrimeTime里定位最差路径,我常用的命令是:

report_timing -max_paths 1 -nworst 1 -path_type full_clock -group clk

这条命令会输出整个设计里slack最差的那条路径。然后我会仔细看路径上的每一个cell和net,找出延迟最大的那一段。

举个例子,假设报告里显示:

  U1/ZN (NAND2_X1)                        0.1500     1.2000 f
  net_456 (net)                           0.1000     1.3000 f
  U2/A (INV_X1)                           0.0500     1.3500 f
  U2/ZN (INV_X1)                          0.1200     1.4700 r
  net_789 (net)                           0.0900     1.5600 r

这里U1/ZN到U2/A的延迟是0.15ns,但net_456的延迟只有0.10ns。说明问题可能出在U1这个cell上,而不是连线。我会检查U1的驱动能力是不是不够,或者它的输入转换时间是不是太大。

避坑指南:我曾经遇到过一个案例,最差路径的slack是-0.8ns,但路径上所有cell的延迟看起来都正常。后来我仔细一看,发现是时钟路径上的一个buffer被优化掉了,导致时钟偏斜异常。所以,不要只盯着数据路径,时钟路径也要检查。

另外,Tempus用户也别担心。Tempus的命令和PrimeTime基本一致,只是有些选项名称不同。比如PrimeTime的report_timing在Tempus里是report_timing,但-histogram选项可能变成-histogram。具体可以查一下工具手册。

五、知识体系结构图

为了让大家更直观地理解时序报告解读的流程,我画了一张图:

时序报告解读知识体系 1. 报告结构(PrimeTime/Tempus) 顶层摘要 路径报告 汇总统计 2. 关键路径分析 最差路径(WNS) 路径分组(时钟域) 工作模式区分 3. Slack直方图与分布 WNS(最差负slack) TNS(总负slack) 分布趋势判断 宏观到微观

这张图把时序报告解读分成了三个层次:先看报告结构,再分析关键路径,最后用直方图做宏观判断。每一步都有对应的工具命令和分析方法。

好了,关于时序报告解读,我就讲到这里。记住,读报告不是目的,目的是找到问题并修复它。下一节我们会讲如何根据报告里的信息,制定修复策略。到时候我会分享一些我实际项目中的案例,保证干货满满。

可可精品资料库