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 如何识别关键路径?
识别关键路径,不能靠肉眼去代码里数门。我们有更科学的方法。我个人习惯分三步走:
- 跑STA(静态时序分析):这是最直接的方法。工具会报告所有路径的slack值,slack最小的那条就是关键路径。
- 看时序报告:找到WNS对应的路径,工具会详细列出路径上每个单元的延迟、线延迟、转换时间。
- 结合物理信息:在布局布线后,打开GUI工具,高亮显示这条路径。看看它是不是真的绕了远路。
避坑指南:我曾经犯过一个错误——只看综合后的时序报告。综合阶段没有物理信息,线延迟是估算的。结果布局布线后,关键路径完全变了,因为实际走线比估算长得多。所以,一定要以布局布线后的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工具,靠看报告,靠结合物理信息。
嗯,这一节就到这里。记住,关键路径是你的敌人,也是你的朋友——它告诉了你,芯片的瓶颈到底在哪。