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% | 极少使用,除非工艺非常成熟 | 大概率绕线失败 |
在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引脚规划主要分两步:
- 定义IO Pad的位置:用
set_io_pin_constraint指定引脚在芯片边界上的位置。 - 设置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
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这些,个头大、引脚多,摆不好整个芯片就废了。宏单元摆放的核心原则就三条:
- 靠近相关逻辑:比如SRAM要靠近读写控制逻辑,PLL要靠近时钟树。
- 留出走线通道:宏单元之间要留够绕线资源,别堵死。
- 对齐电源网络:宏单元的电源引脚要跟电源条带对齐,否则供电不足。
在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}
4.5 知识结构图:Floorplan核心逻辑
下面这张图,把Floorplan的四个核心参数串起来了。你看一遍,应该就能理解它们之间的关系。
4.6 本章小结
Floorplan这四个参数,每一个都牵一发动全身。利用率设高了,面积省了但绕线难;IO引脚摆错了,封装厂要骂娘;PG网络没铺好,IR Drop教你做人;Macro摆得乱,后面Place和Route全白干。
我个人建议,每次跑Floorplan之前,先把这四个参数在纸上画一遍,想清楚它们之间的trade-off。别急着敲命令,磨刀不误砍柴工。