4. 组合逻辑延迟:门延迟 + 线延迟,关键路径怎么找?

好,咱们今天聊点实在的。组合逻辑延迟,说白了就是信号从输入到输出,在组合逻辑里兜一圈花了多少时间。这个时间要是太长,你的芯片就跑不快。

我刚开始做数字设计那会儿,总觉得时序问题就是寄存器没摆好。后来有一次,一个简单的加法器链,怎么优化都跑不到目标频率。最后发现,问题出在中间几级组合逻辑上。嗯,从那以后,我对组合逻辑延迟就特别上心。

4.1 组合逻辑延迟的组成:门延迟 + 线延迟

一个组合逻辑路径的延迟,主要由两部分组成:门延迟和线延迟。很多人只盯着门延迟看,忽略了线延迟,这在深亚微米工艺下会吃大亏。

延迟类型 来源 影响因素 我踩过的坑
门延迟 逻辑门(AND、OR、MUX等)本身的开关时间 晶体管尺寸、负载电容、输入转换时间(slew) 曾经以为换大驱动力的门就能解决一切,结果功耗爆炸
线延迟 互连线(金属层)上的寄生RC 线长、线宽、线间距、金属层、温度 有一次综合后时序全红,查了半天是顶层走线绕了半个芯片

关键认知:在28nm以下的工艺节点,线延迟占比往往超过50%。你优化了半天门延迟,可能不如把一根长线缩短10%来得有效。

举个例子,一个简单的2输入AND门,在某个工艺库下,其门延迟可能是20ps。但如果这个AND门的输出要驱动一个很长的走线(比如跨过半个模块),线延迟可能轻松超过100ps。你想想看,这时候优化门延迟还有多大意义?

4.2 关键路径(Critical Path)的概念

关键路径,就是整个设计里延迟最长的那条组合逻辑路径。它决定了你的芯片能跑多快。说白了,它就是整个系统的短板。

为什么叫“关键”?因为这条路径一旦满足时序,其他所有路径大概率都能满足。STA工具在做时序分析时,主要精力就是花在找这条路径上。

我的习惯:每次做完综合,第一件事就是打开时序报告,直接看Worst Negative Slack(WNS)对应的那条路径。那条路径就是你的关键路径,也是你优化的首要目标。

关键路径通常有以下特征:

  • 逻辑级数深:从起点到终点,经过了太多级逻辑门。比如一个32位加法器,进位链可能长达32级。
  • 扇出大:一个门的输出要驱动很多个负载,导致输出转换时间变慢,延迟增加。
  • 走线长:物理距离远,线延迟大。
  • 负载重:驱动大电容,比如要驱动多个模块的输入。

4.3 如何识别关键路径?

识别关键路径,不能靠肉眼去代码里数门。我们有更科学的方法。我个人习惯分三步走:

  1. 跑STA(静态时序分析):这是最直接的方法。工具会报告所有路径的slack值,slack最小的那条就是关键路径。
  2. 看时序报告:找到WNS对应的路径,工具会详细列出路径上每个单元的延迟、线延迟、转换时间。
  3. 结合物理信息:在布局布线后,打开GUI工具,高亮显示这条路径。看看它是不是真的绕了远路。

避坑指南:我曾经犯过一个错误——只看综合后的时序报告。综合阶段没有物理信息,线延迟是估算的。结果布局布线后,关键路径完全变了,因为实际走线比估算长得多。所以,一定要以布局布线后的STA结果为准。

下面这张图,是我自己总结的识别关键路径的流程,你可以参考一下:

关键路径识别流程 RTL设计完成 逻辑综合 STA分析(综合后,线延迟估算) 布局布线 STA分析(布线后,真实线延迟) 关键点 • 综合后STA只能做参考 • 布线后STA才是最终判决 • 关键路径可能在这两步之间变化

4.4 实战:读懂一条关键路径报告

光说理论不行,咱们看个实际的例子。假设你有一条路径,STA报告如下(简化版):

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

  Point                                                   Incr       Path
  --------------------------------------------------------------------------
  clock CLK (rise edge)                                   0.00       0.00
  clock network delay (propagated)                        0.50       0.50
  reg_A/CLK (DFF)                                         0.00       0.50 r
  reg_A/Q (DFF)                                           0.35       0.85 r
  U1/A (AND2)                                             0.12       0.97 r
  U1/Z (AND2)                                             0.18       1.15 r
  U2/A (OR2)                                              0.00       1.15 r
  U2/Z (OR2)                                              0.22       1.37 r
  U3/A (INV)                                              0.00       1.37 r
  U3/Z (INV)                                              0.15       1.52 f
  net_route_delay (wire)                                  0.80       2.32 f
  reg_B/D (DFF)                                           0.00       2.32 f
  data arrival time                                                  2.32

  clock CLK (rise edge)                                   5.00       5.00
  clock network delay (propagated)                        0.50       5.50
  clock uncertainty                                      -0.20       5.30
  reg_B/CLK (DFF)                                         0.00       5.30 r
  library setup time                                     -0.10       5.20
  data required time                                                 5.20
  --------------------------------------------------------------------------
  data required time                                                 5.20
  data arrival time                                                 -2.32
  --------------------------------------------------------------------------
  slack (MET)                                                        2.88

你看这个报告,我带你快速扫一遍:

  • Startpoint/Endpoint:路径起点是reg_A,终点是reg_B。
  • Incr列:每个单元或走线的延迟增量。
  • Path列:累计延迟。
  • net_route_delay:线延迟0.80ns,占了总路径延迟(2.32ns)的34%。这个比例已经不低了。
  • Slack:2.88ns,说明这条路径还有余量,不是关键路径。

如果slack是负的,比如-0.5ns,那这条路径就是你的关键路径,必须优化。

我的小技巧:看报告时,重点关注两个地方:一是线延迟占比,如果超过40%,优先考虑物理优化(比如加buffer、换高层金属);二是逻辑级数,如果超过15级,优先考虑逻辑优化(比如retiming、插入流水线)。

4.5 总结一下

组合逻辑延迟,门延迟和线延迟都要管。关键路径就是那个最长的路径,找到它,优化它,你的时序问题就解决了一大半。识别关键路径,别靠猜,靠STA工具,靠看报告,靠结合物理信息。

嗯,这一节就到这里。记住,关键路径是你的敌人,也是你的朋友——它告诉了你,芯片的瓶颈到底在哪。