概述
Floorplan 是数字后端设计中最关键的步骤之一,它决定了芯片的物理布局,直接影响后续的时序、功耗和面积(PPA)指标。
环境准备
首先加载必要的工艺库和设计文件:
# 加载工艺库
set_var LP_LIBRARY_FILE ./lib/tech_libraries.lp
set_var MW_REFERENCE_LIBRARY_FILE ./lib/std_cells.ref
# 打开设计数据库
open_db ./db/chip_design.db
# 设置 Floorplan 模式
set_fp_mode -reset
set_fp_mode -auto_type conversion
IO 规划
IO 单元的摆放需要考虑以下因素:
- 信号完整性:高速接口靠近芯片边缘
- 电源完整性:电源/地 IO 均匀分布
- 布局对称性:对于对称设计,IO 应对称摆放
# 定义芯片尺寸 (单位:微米)
initialize_floorplan \
-width 800 \
-height 800 \
-start_coords {0 0} \
-site core_site
# 摆放 IO PAD
place_ioPads -random
宏单元摆放
宏单元(Macro)的摆放策略:
- 数据分析路径:将关联紧密的宏放在一起
- 时序优化:关键路径的模块靠近 I/O
- 电源规划:大电流模块靠近电源引脚
# 获取设计中的宏单元
set macros [get_cells -hier -filter "is_hierarchical == false && ref_name =~ *mem*"]
# 按照层次分组摆放
foreach_in_collection macro $macros {
set loc [get_location $macro]
place_cell -legalize $macro $loc
}
电源网络设计
电源网络是 Floorplan 的核心部分,需要提前规划:
# 创建电源网络
create_power_strap \
-layer METAL5 \
-width 2.0 \
-spacing 10.0 \
-offset 5.0
# 添加电源环
add_power_ring \
-layer_top METAL6 \
-layer_bottom METAL6 \
-layer_left METAL5 \
-layer_right METAL5 \
-width 3.0 \
-spacing 1.0
常用脚本模板
以下是一个完整的 Floorplan 脚本模板:
#!/usr/bin/tclsh
proc run_floorplan { args } {
set options {
{chip_width "800"}
{chip_height "800"}
{core_margin "10"}
}
array set params [concat $options $args]
puts "Starting Floorplan with dimensions: $params(chip_width) x $params(chip_height)"
initialize_floorplan \
-width $params(chip_width) \
-height $params(chip_height) \
-start_coords {0 0}
place_ioPads -random
place_macros -auto
create_power_network
puts "Floorplan completed successfully"
}
run_floorplan -chip_width 1000 -chip_height 1000
常见问题
1. 宏单元无法摆放
如果遇到宏单元摆放失败,检查:
- 是否有设计规则冲突
- 宏单元与 IO PAD 的间距是否足够
- 电源网络是否完整
2. 电源网络阻抗过高
优化方法:
- 增加电源网络宽度
- 减小电源网络间距
- 添加更多的电源 VIA
总结
Floorplan 是一个迭代的过程,需要根据后续分析的反馈不断调整。建议:
- 先做粗略规划,再精细化
- 保留足够的绕线资源
- 及时进行 DRC 检查
参考资料
- ICC2 User Guide
- 工艺库文档