3. 布局规划(Floorplan):芯片面积估算、IO规划、宏单元(Macro)摆放、电源网络规划、布局规划检查

各位同学,咱们今天聊聊布局规划。这步说白了,就是给芯片“画地皮”。你想想看,一块芯片就那么点大,里面要放几亿甚至几十亿个晶体管,怎么放、放哪里,直接决定了这颗芯片能不能做出来、性能好不好。

我个人习惯,拿到一个设计任务,第一件事不是急着跑脚本,而是先跟架构师、前端同事坐下来,把芯片的尺寸、IO数量、功耗预算这些关键参数敲定。这一步要是没想清楚,后面返工的代价可就大了去了。

3.1 芯片面积估算

面积估算,是布局规划的第一步。我见过不少新手,上来就拍脑袋说“这个芯片大概10平方毫米”,结果后端实现时发现根本塞不下。嗯,这里要注意,面积估算不是瞎猜,是有方法论的。

常用的估算方法有两种:

  • 基于门数估算:根据综合后的标准单元数量,乘以每个单元的平均面积,再加上宏单元(SRAM、PLL等)的面积,最后留出15%-20%的布线资源余量。
  • 基于同类设计缩放:如果你做过类似工艺、类似规模的设计,可以直接按比例缩放。比如之前N7工艺的某个模块是5平方毫米,现在换到N5,面积大概能缩小40%-50%。

关键点:面积估算时,一定要把“布线通道”和“电源网络”占用的面积算进去。我在一个28nm的项目中就吃过这个亏——当时只算了标准单元和宏单元的面积,结果布线阶段发现通道不够,硬生生把芯片尺寸扩大了10%。

给大家一个参考表格,是我在N7工艺下做的一个典型SoC的面积分解:

组件类型 面积占比 说明
标准单元 45% 逻辑门、触发器、MUX等
宏单元 30% SRAM、ROM、PLL、ADC等
布线通道 15% 金属层走线、时钟树、电源网络
其他 10% IO环、ESD保护、填充单元等

3.2 IO规划

IO规划,说白了就是给芯片“装门”。门装在哪里、装多少、怎么排列,直接影响芯片跟外部世界的通信质量。

我建议的IO规划流程是这样的:

  1. 确定IO类型和数量:GPIO、DDR、SerDes、模拟IO……每种IO的物理尺寸和电气特性都不一样。
  2. 分配IO位置:高速信号尽量放在芯片边缘的中间位置,远离拐角;模拟IO要跟数字IO隔开,避免噪声耦合。
  3. 考虑IO供电:每个IO bank都需要独立的电源和地,别忘了给IO环留出足够的电源引脚。

小技巧:我曾经在一个项目中,把DDR的IO放在了芯片的左上角,结果因为走线太长,时序怎么都修不干净。后来把DDR IO挪到了芯片底部,靠近DDR控制器,问题一下子就解决了。所以,IO规划一定要跟芯片内部的模块布局联动考虑。

3.3 宏单元(Macro)摆放

宏单元,比如SRAM、ROM、PLL这些,是芯片里的“大块头”。它们的摆放位置,直接影响整个芯片的时序和功耗。

我个人习惯的宏单元摆放原则:

  • 就近原则:宏单元要尽量靠近使用它的逻辑模块。比如CPU的L2 cache,一定要紧挨着CPU core。
  • 对齐原则:宏单元的边界最好对齐到某个网格上,方便后续的电源网络规划和标准单元摆放。
  • 留出通道:宏单元之间要留出足够的走线通道,特别是数据总线宽的宏单元(比如256bit的SRAM),通道宽度至少是宏单元高度的2-3倍。

举个例子,我在N5工艺的一个AI芯片项目中,摆放了32个SRAM宏单元。一开始我把它们排得密密麻麻,结果布线阶段发现通道完全不够用,信号线绕来绕去,时序一塌糊涂。后来重新调整,每个SRAM之间留出3um的通道,问题才解决。

注意:宏单元周围不要放太多标准单元!宏单元的电源网络通常比较密集,标准单元放多了,容易出现电源压降(IR Drop)问题。我一般会在宏单元周围留出一圈“禁置区”,宽度至少5um。

3.4 电源网络规划

电源网络,是芯片的“血管”。血管不通,芯片就没法正常工作。在先进工艺节点下,电源网络的设计越来越复杂,因为电流密度大、电压低,一点点电阻都会导致明显的压降。

电源网络规划的核心步骤:

  1. 确定电源网格结构:顶层用厚金属(如M9、M10)走宽线,底层用薄金属(如M1-M3)走细线,中间层做过渡。
  2. 计算电源线宽度:根据模块的功耗和电流密度,算出每条电源线需要多宽。公式很简单:宽度 = 电流 / (电流密度 × 金属厚度)。
  3. 添加去耦电容:在电源网络的关键节点(比如宏单元附近、时钟区域)添加去耦电容,抑制电源噪声。

我记得在N7的一个项目中,CPU core的电源线宽度算出来需要20um,但芯片面积有限,只能做到15um。怎么办?后来我在CPU core周围加了一圈去耦电容,把电源噪声压下去了,实际压降也控制在5%以内。嗯,有时候理论计算和实际工程之间,需要一点变通。

3.5 布局规划检查

布局规划做完之后,别急着往下走。先做一轮检查,把问题扼杀在摇篮里。我一般会检查以下几个方面:

  • 面积利用率:标准单元和宏单元的总面积,不能超过芯片面积的85%。超过这个数,布线阶段大概率会出问题。
  • IO对齐:所有IO是否都对齐到了芯片边界?有没有IO跟内部模块的电源网络冲突?
  • 宏单元间距:宏单元之间的通道宽度是否满足布线需求?特别是数据总线宽的宏单元。
  • 电源网络完整性:电源线宽度是否足够?有没有断头路?去耦电容是否覆盖了所有高功耗区域?

避坑指南:我曾经在一个项目中,布局规划检查时发现宏单元之间的通道只有1.5um,但实际需要2um。当时觉得“差不多就行了”,结果布线阶段信号线挤在一起,串扰严重,最后不得不重新做布局规划,浪费了两周时间。所以,检查时千万别“差不多”,该改就改。

好了,布局规划的内容就讲到这里。下一章咱们聊聊时钟树综合,这可是后端实现的“重头戏”。到时候我会分享一些在N5工艺下做时钟树的经验,保证让你少走弯路。