4. Floorplan 参数详解:核心面积利用率设置、IO 引脚规划、电源网络(PG)预布局、宏单元(Macro)摆放约束

Floorplan,说白了就是给芯片“画地皮”。你想想看,一块晶圆上要放多少东西——标准单元、宏单元、IO Pad、电源网络……怎么摆、摆多密,直接决定了这颗芯片能不能做出来、能跑多快、功耗高不高。

我刚开始做后端那会儿,总觉得Floorplan差不多就行,反正后面还有Place和Route可以调。结果有一次,一个28nm的项目,我图省事把利用率设得太高,结果标准单元挤得跟沙丁鱼罐头似的,绕线资源完全不够,最后ECO改了四版才收敛。嗯,从那以后我再也不敢小看Floorplan了。

这一章,咱们就掰开揉碎,把Floorplan里最关键的四个参数讲透。

4.1 核心面积利用率设置

核心面积利用率,英文叫Core Utilization,公式很简单:

利用率 = (所有单元总面积) / (核心区域总面积)

但实际设多少,这里头门道很深。

利用率范围 适用场景 风险点
50% - 60% 高性能、大宏单元多、绕线层少 面积浪费,成本高
60% - 70% 主流设计,平衡面积与绕线 需要预留绕线资源
70% - 80% 面积敏感、标准单元为主 绕线拥塞风险高
> 80% 极少使用,除非工艺非常成熟 大概率绕线失败
我的经验: 我个人习惯,第一次跑Floorplan时,利用率先设65%。如果后面绕线拥塞严重,再逐步降低到60%甚至55%。别一上来就追求极致面积,否则后面填坑的时间够你喝一壶的。

在OpenROAD里,设置利用率用这个命令:

# 设置核心利用率为65%
set_utilization -core_util 0.65

# 或者通过Tcl变量
set ::env(CORE_UTILIZATION) 65

4.2 IO 引脚规划

IO引脚怎么摆,这事儿得跟芯片封装一起考虑。你想想看,如果封装是BGA,那IO Pad最好均匀分布在芯片四周;如果是QFP,那引脚就得集中在两边。

我遇到过最坑的一次,是项目都快tapeout了,才发现IO引脚顺序跟封装基板不匹配,结果硬生生多花了两周改Floorplan。所以,IO规划一定要在项目初期就跟封装工程师对齐。

OpenROAD里,IO引脚规划主要分两步:

  1. 定义IO Pad的位置:用set_io_pin_constraint指定引脚在芯片边界上的位置。
  2. 设置IO Pad的方向:指定引脚是从左边、右边、上边还是下边引出。
# 设置IO引脚在芯片左侧,从第10层金属引出
set_io_pin_constraint -pin_name "data_in*" -region left -layer M10

# 设置IO引脚间距为10um
set_io_pin_constraint -pin_name "clk*" -min_distance 10
注意: IO引脚间距不能设得太小,否则封装厂那边没法打线。一般建议至少留5um以上的间距,具体看封装厂的设计规则。

4.3 电源网络(PG)预布局

电源网络,说白了就是给芯片“供电”的骨架。你想想看,如果电源网络没铺好,芯片内部某些区域的电压降(IR Drop)会很大,导致标准单元跑不动、时序崩掉。

PG预布局的核心是:先铺主干,再铺支干。主干就是芯片四周的电源环(Power Ring),支干就是内部的电源条带(Power Strap)。

在OpenROAD里,PG预布局通常用pdngen工具:

# 生成电源网络
pdngen -spec power_spec.tcl

# power_spec.tcl 内容示例
set power_nets "VDD VSS"
set power_pins "VDD VSS"
set power_rings {
  {layer M1 width 10 spacing 5}
  {layer M2 width 10 spacing 5}
}
set power_straps {
  {layer M3 width 5 spacing 10 pitch 100}
  {layer M4 width 5 spacing 10 pitch 100}
}
关键参数:
  • Ring宽度:一般10-20um,取决于电流需求。
  • Strap间距(Pitch):决定了电源网络的密度,一般50-200um。
  • Strap宽度:通常2-5um,太宽会浪费绕线资源。

我记得有一次,一个AI加速器芯片,电流需求特别大。我一开始Strap间距设了150um,结果IR Drop仿真直接飙到8%。后来把间距缩到80um,IR Drop才降到3%以内。所以,PG网络的设计一定要结合功耗分析结果来迭代。

4.4 宏单元(Macro)摆放约束

宏单元,比如SRAM、ROM、PLL这些,个头大、引脚多,摆不好整个芯片就废了。宏单元摆放的核心原则就三条:

  1. 靠近相关逻辑:比如SRAM要靠近读写控制逻辑,PLL要靠近时钟树。
  2. 留出走线通道:宏单元之间要留够绕线资源,别堵死。
  3. 对齐电源网络:宏单元的电源引脚要跟电源条带对齐,否则供电不足。

在OpenROAD里,宏单元摆放约束用set_macro_constraint:

# 将宏单元固定在芯片左上角
set_macro_constraint -macro_name "SRAM_0" -region {0 0 200 200}

# 设置宏单元之间的最小间距
set_macro_constraint -macro_name "SRAM_*" -min_distance 50

# 禁止宏单元放在芯片中心区域
set_macro_constraint -macro_name "PLL_0" -exclude_region {500 500 1000 1000}
避坑指南: 我曾经犯过一个错误——把两个大SRAM紧挨着放,结果它们之间的绕线通道只有10um宽。后面标准单元绕线时,那一片区域拥塞得一塌糊涂,最后不得不把其中一个SRAM挪开,重新跑Floorplan。所以,宏单元之间至少留50um的绕线通道,这是底线。

4.5 知识结构图:Floorplan核心逻辑

下面这张图,把Floorplan的四个核心参数串起来了。你看一遍,应该就能理解它们之间的关系。

Floorplan 核心参数关系图 Floorplan 核心面积利用率 50%-80% IO引脚规划 位置/方向/间距 PG预布局 Ring/Strap Macro摆放约束 位置/间距/对齐 核心逻辑 利用率决定面积大小 → IO引脚决定边界接口 → PG网络决定供电骨架 → Macro摆放决定内部布局 四个参数相互影响,需要迭代优化

4.6 本章小结

Floorplan这四个参数,每一个都牵一发动全身。利用率设高了,面积省了但绕线难;IO引脚摆错了,封装厂要骂娘;PG网络没铺好,IR Drop教你做人;Macro摆得乱,后面Place和Route全白干。

我个人建议,每次跑Floorplan之前,先把这四个参数在纸上画一遍,想清楚它们之间的trade-off。别急着敲命令,磨刀不误砍柴工。