2、拥塞的根源:逻辑综合阶段的拥塞预估不足、标准单元库的驱动强度选择不当、时钟树综合(CTS)引入的局部拥塞

各位好,我是做后端的老王。今天咱们聊聊拥塞的根源。

很多人一看到拥塞,第一反应就是「布局布线没做好」。其实不然。我做了十几年芯片,见过太多案例——拥塞的种子,早在逻辑综合阶段就埋下了。说白了,你后端的痛苦,有一半是前端「送」来的。

2.1 逻辑综合阶段的拥塞预估不足

逻辑综合(Synthesis)阶段,工具会把 RTL 代码映射成门级网表。这个阶段,工具会做面积、时序、功耗的优化。但有个问题——它不太关心物理上的「挤不挤」。

为什么会这样?因为综合工具用的是「线负载模型」(Wire Load Model),它假设所有连线都一样长、都一样宽。这跟实际物理布局差太远了。你想想看,一个 7nm 的芯片,金属层有十几层,不同层的电阻电容差好几倍。综合工具哪知道这些?

我个人习惯,在综合阶段就会做一件事:打开物理感知综合(Physical-Aware Synthesis)。现在的 Design Compiler 或 Genus 都支持这个功能。它会读入一个粗略的 floorplan,提前预估一下哪些区域可能会「打架」。

关键点:综合阶段的拥塞预估,不是看「面积利用率」,而是看「局部单元密度」和「连线复杂度」。

我在项目中遇到过这样一个案例:一个 AI 加速器芯片,综合报告显示面积利用率只有 65%,看起来挺宽松。结果一跑布局,直接爆出 30 多个拥塞热点。后来一查,是综合工具把一堆高扇出的逻辑「堆」在了同一个区域。这就是典型的预估不足。

避坑指南:我曾经在综合脚本里加了一行 set_congestion_effort high,结果拥塞热点减少了 40%。别小看这个选项,它会让综合工具多花 20% 的时间去「摊平」逻辑。

2.2 标准单元库的驱动强度选择不当

标准单元库里有各种驱动强度的 cell,从 X1、X2 一直到 X16、X24。驱动强度越大,cell 面积越大,能驱动的负载也越大。但很多人有个误区——以为驱动越大越好。

其实不是。驱动强度大的 cell,它的输入电容也大。你用一个 X16 的 buffer 去驱动一个负载,结果它自己就成了一个「大胖子」,占地方不说,还会把周围的走线通道堵死。

我建议的做法是:在综合阶段,对驱动强度做上限约束。比如,对于普通逻辑路径,限制最大使用 X8;对于时钟路径,可以放宽到 X16。这样既能保证时序,又不会让 cell 太大。

驱动强度 面积 (um²) 输入电容 (fF) 适用场景
X1 0.5 1.2 低负载、短连线
X4 1.2 2.8 中等负载、常规路径
X16 3.8 8.5 高负载、时钟树
X24 5.6 12.3 极长连线、大扇出

你看这个表格,X24 的面积是 X1 的 10 倍还多。如果你在综合阶段不加限制,工具为了「偷懒」——它觉得用一个大驱动 cell 比用多个小驱动 cell 更省事——就会疯狂选大 cell。结果呢?布局阶段一片狼藉。

注意:不要一刀切地禁用大驱动 cell。时钟路径、复位路径、以及一些高扇出的控制信号,确实需要大驱动。关键是要「按需使用」。

2.3 时钟树综合(CTS)引入的局部拥塞

时钟树综合,嗯,这个环节是拥塞的「重灾区」。为什么?因为时钟树要平衡所有触发器的时钟延迟,它会在芯片里「长」出一棵大树。这棵树的枝干——也就是时钟 buffer——会占用大量的布线资源。

我记得有一次做一颗 28nm 的芯片,时钟频率 1.2GHz。CTS 做完之后,我一看时钟 buffer 的数量——好家伙,占了总 cell 数量的 18%!这些 buffer 密密麻麻地分布在芯片中间,把走线通道堵得死死的。

为什么会这样?因为 CTS 工具为了追求极致的时钟 skew,会插入大量的 buffer 来「拉平」延迟。这些 buffer 往往集中在芯片的「重心」位置——也就是所有触发器的几何中心附近。这就造成了局部拥塞。

我个人的经验是:在 CTS 之前,先做一次拥塞分析。看看哪些区域已经比较挤了,然后给 CTS 工具设置「禁止区域」或「低密度区域」。这样时钟 buffer 就不会往那些地方扎堆。

核心逻辑:CTS 引入的拥塞,本质上是「时序平衡」和「物理空间」之间的矛盾。你越想平衡 skew,就需要越多 buffer;buffer 越多,空间就越挤。

下面这张图,是我总结的拥塞根源分析框架。你可以看看,这三个因素是怎么相互影响的。

拥塞根源分析框架 逻辑综合预估不足 物理感知缺失 驱动强度选择不当 大cell占用空间 CTS局部拥塞 buffer扎堆 布局阶段拥塞爆发 局部密度超标、布线资源不足 结果:时序恶化、面积增大、功耗上升 反馈到综合阶段

你看这个图,三个根源最终都会汇聚到布局阶段的拥塞爆发。而且,拥塞问题还会反过来影响综合阶段的决策——这是一个恶性循环。所以,解决拥塞的关键,是在综合阶段就「掐断」根源。

一个小技巧:我习惯在综合完成后,跑一个快速的布局(Fast Placement),看看有没有明显的拥塞热点。如果有,就回头调整综合策略。这一步只花 10 分钟,但能省掉后面几天的 debug 时间。

好了,这一章的内容就到这里。记住:拥塞不是布线的「锅」,而是从综合阶段就开始积累的问题。下一章我们会聊聊如何在布局阶段「拆解」这些拥塞。

可可精品资料库