4. 物理设计中的面积优化:布局规划(Floorplan)对面积的影响、标准单元密度控制、宏单元(Memory/IP)的摆放策略

好,咱们进入物理设计阶段。很多人觉得时序收敛是后端工程师的核心技能,这话没错。但我想说,面积优化才是真正体现功力的地方。你想想看,时序跑不过可以插buffer、可以调整驱动强度,但面积一旦做大了,那就是真金白银的损失——芯片成本直接飙升。

布局规划(Floorplan)阶段,说白了就是给芯片画个"户型图"。这个阶段做得好,后面省心一大半。我见过太多项目,Floorplan随便搞搞,结果后面修时序修到崩溃,面积还爆了。嗯,这里面的门道,我慢慢跟你聊。

核心观点:Floorplan决定了芯片面积的"天花板"。后续所有优化,都是在Floorplan划定的框框里跳舞。框框画大了,后面再怎么折腾也省不了多少面积。

4.1 布局规划对面积的影响

布局规划到底怎么影响面积?我总结了三句话:

  • 核心面积利用率——你给标准单元留了多少"空地"
  • 宏单元摆放密度——Memory和IP怎么塞进去
  • 电源网络规划——供电走线占了多少面积

先说说核心面积利用率。这个指标通常用core_utilization = (标准单元面积 + 宏单元面积) / 核心区域总面积来表示。我个人习惯把利用率控制在65%~75%之间。为什么?

利用率太低,芯片面积浪费,成本高。利用率太高,比如超过85%,你想想看,标准单元挤在一起,绕线资源不够,时序收敛会非常痛苦。我在一个28nm的项目里试过把利用率推到82%,结果绕线阶段一堆short,修了整整两周才搞定。从那以后,我再也不敢把利用率压得太极限。

这里有个经验值供参考:

工艺节点 建议利用率范围 备注
28nm及以上 70%~80% 绕线资源相对充裕
16nm/12nm 65%~75% 绕线层增多但规则更复杂
7nm及以下 55%~65% 先进工艺绕线约束极多

你可能会问:为什么先进工艺利用率反而要更低?说白了,工艺越先进,绕线规则越变态。7nm的via规则、最小间距规则,比28nm复杂了不止一个数量级。留出更多空间给绕线,其实是给时序收敛留余地。

4.2 标准单元密度控制

标准单元密度控制,这个我得多说两句。很多新手工程师容易忽略这个,觉得只要把利用率控制在合理范围就行。其实不然。

密度控制的核心是局部密度,不是全局密度。什么意思?你全局利用率70%,但某个区域塞了太多标准单元,局部密度可能达到90%以上。这个区域就会成为绕线的"瓶颈",时序也会很难看。

我建议的做法是:

  1. 设置密度上限——在Floorplan阶段,用工具命令设置局部密度上限。比如在Innovus里用setPlaceMode -maxDensity 0.75。
  2. 密度热点分析——Place之后,一定要跑密度热点图(Density Hotspot Map)。看到红色区域,就要想办法"疏散"。
  3. 手动调整——如果某个模块密度太高,可以考虑给它多划一点区域,或者把部分逻辑移到其他区域。

小技巧:我曾经在一个项目中,发现某个模块的局部密度达到了92%。我试着把这个模块的边界往外扩了5%,密度降到了78%,结果绕线时间缩短了40%,时序也收敛了。有时候,多给一点点空间,回报是巨大的。

另外,标准单元的密度控制还要考虑时钟树综合(CTS)。CTS阶段会插入大量clock buffer,这些buffer会显著增加局部密度。所以,在Place阶段就要为CTS预留空间。我一般会在密度上限上再减5%~10%,专门留给clock buffer。

4.3 宏单元(Memory/IP)的摆放策略

宏单元的摆放,可以说是Floorplan中最考验经验的部分。Memory和IP不像标准单元那样可以随便放,它们有固定的形状、尺寸和pin位置,放错了地方,后面修都修不回来。

我总结了几条原则:

  • 沿核心边界摆放——Memory尽量放在核心区域的边缘,把中间区域留给标准单元。这样标准单元的绕线路径更短,时序更容易收敛。
  • 对齐pin方向——Memory的pin通常集中在某一侧。摆放时要让pin朝向标准单元区域,减少绕线绕远路。
  • 留出绕线通道——两个Memory之间要留出足够的绕线通道。我一般至少留出2~3个track的宽度。
  • 避免形成"孤岛"——不要把Memory摆成一个封闭的环,把标准单元区域围在中间。那样标准单元的信号出不去,绕线会非常痛苦。

注意:我曾经在一个项目中,把两个大Memory并排放在核心区域中间,结果它们之间的绕线通道只有1个track宽。后面绕线阶段,那个区域成了"重灾区",short和DRC violation多到让人崩溃。最后不得不重新做Floorplan,浪费了整整一周时间。

对于IP模块,策略略有不同。IP通常有固定的电源要求、时钟要求和时序约束。摆放时要注意:

  • 靠近电源pad——大功耗IP要靠近电源pad,减少IR drop。
  • 时钟路径最短——IP的时钟输入pin要尽量靠近时钟源,减少时钟skew。
  • 隔离敏感区域——模拟IP要远离数字模块的开关噪声区域。

下面我画了一张图,展示宏单元摆放的几种策略对比:

宏单元摆放策略对比 策略1:沿边界摆放(推荐) MEM1 MEM2 标准单元区域 pin朝向 策略2:中间摆放(不推荐) MEM1 MEM2 标准单元区域 窄 ✅ 绕线通道充裕,时序易收敛 ❌ 绕线通道狭窄,易出short 策略3:留出绕线通道 MEM MEM 绕线通道 ≥ 2~3 track 策略4:避免形成孤岛 MEM MEM MEM MEM 孤岛 图:宏单元摆放策略对比——好的摆放让绕线更顺畅,差的摆放处处是坑

最后,我想强调一点:Floorplan不是一次性的工作。我习惯的做法是:先做一个粗放的Floorplan,跑一遍Place和Route,看看时序和绕线情况。发现问题后,再回来调整Floorplan。这样迭代2~3轮,基本就能得到一个比较优的方案。

避坑指南:我曾经在一个项目中,为了省面积,把Memory之间的绕线通道压缩到了1个track。结果绕线阶段,那个区域成了"重灾区",short和DRC violation多到让人崩溃。最后不得不重新做Floorplan,浪费了整整一周时间。所以,该留的空间一定要留,不要为了省面积而牺牲绕线资源。

好了,关于布局规划对面积的影响、标准单元密度控制和宏单元摆放策略,我就聊这么多。这些经验都是我在实际项目中一点点积累出来的,希望能帮你少走一些弯路。

可可精品资料库