ICC 实战指南——LAB2:Floorplan 与电源网络规划深度解析
1. 从零开始理解Floorplan的核心价值第一次接触芯片物理设计时我最困惑的就是为什么需要Floorplan这个步骤。直到亲眼见过一个糟糕的布局导致芯片无法布线的情况后才真正明白它的重要性。Floorplan就像盖房子前的建筑图纸决定了每个功能模块住在芯片的哪个区域直接影响着后期布线能否顺利完成。在ICC工具中做Floorplan主要解决三个关键问题芯片形状和尺寸怎么定宏单元如RAM、PLL放在哪里标准单元的大致区域如何划分我习惯用这个类比芯片尺寸就像选户型宏单元摆放是家具布置标准单元区域划分则是规划每个房间的功能区。实际操作中我们通常先用initialize_floorplan命令创建初始布局再通过create_floorplan调整参数。记得有个项目因为没考虑IO pad的电源需求后期不得不把芯片尺寸扩大15%。所以现在我做Floorplan时一定会先确认核心面积利用率通常70%-80%比较安全宏单元之间的通道宽度至少3倍布线层间距电源网络预留空间约占芯片高度10%-15%2. 宏单元摆放的实战技巧与避坑指南宏单元摆放绝对是Floorplan中最考验经验的部分。新手常犯的错误是把所有宏单元沿芯片边缘排列结果导致中心区域布线拥堵。我常用的策略是先大后小先外后内——先把最大的宏单元定位在角落中等尺寸的沿边摆放小的可以放在核心区域。通过place_macro命令操作时这几个参数特别关键place_macro -name RAM1 -orient R180 -llx 100 -lly 150 -halo {5 5 5 5}这里的-halo参数我强烈建议不要省略它给宏单元周围留出的空白区域能显著降低布线难度。去年有个项目因为没设置halo后期不得不手动调整了20多个宏单元位置。实测发现这些摆放原则最有效内存模块尽量靠近使用它的逻辑单元模拟模块要远离数字噪声源高频模块优先放在电源网络稳定的区域相同方向的宏单元最好对齐摆放利于电源规划3. 电源网络规划的全流程拆解电源规划(PG Network)是很多工程师容易轻视的环节但它的好坏直接决定芯片能不能正常工作。我习惯把电源网络分成三个层级来构建电源环(Power Ring)、电源条带(Power Straps)和标准单元电源轨(Power Rails)。先用这段Tcl脚本创建基础电源环create_pg_ring_pattern ring_pattern \ -layers {M5 M6} -widths {5 5} -spacings {2 2} -offsets {2 2} set_pg_strategy ring_strategy \ -pattern {{name: ring_pattern} {nets: {VDD VSS}}} -core compile_pg -strategies ring_strategy这里有个容易踩的坑金属层选择。有次我用M1/M2做电源环结果发现后期布线资源严重不足。现在我的经验法则是电源环用最高两层金属如M6/M7电源条带用中间层金属如M3-M5电源轨用底层金属M1/M2电源网络密度也需要特别注意。太稀疏会导致IR drop问题太密集又会占用布线资源。我通常保持电源条带间隔不超过50um电源轨间隔与标准单元高度一致电源环宽度根据电流需求计算通常5-10um4. 电源连接的特殊情况处理当设计中有模拟模块或IO单元时电源连接就需要特殊处理。有次项目因为没给PLL单独供电导致时钟抖动严重。现在我的checklist里一定会包含给模拟模块创建独立的电源域IO单元要用connect_pg_net手动连接电源深睡眠模块需要电源开关控制这是连接IO电源的典型脚本connect_pg_net -net VDDIO [get_pins -hier */VDD] connect_pg_net -net VSSIO [get_pins -hier */VSS]对于多电压域设计一定要先用create_power_domain划分区域再用create_pg_grid为每个域生成独立的电源网络。有个低功耗项目就因为漏掉了这个步骤导致后期ECO花了整整两周时间。5. Floorplan与时序收敛的关联分析很多人不知道Floorplan的质量会直接影响后期时序收敛。通过report_timing命令可以提前发现潜在问题。我总结出这些经验规律关键路径模块间距超过2mm需要插入缓冲器时钟源到末端skew大于50ps要考虑重新布局高扇出网络所在区域要预留布线通道有个视频处理芯片的项目通过调整Floorplan就把时序违例减少了70%。具体做法是用group_path将相关时序路径模块物理靠近对高频总线采用数据流导向的布局为时钟树预留中央走廊区域建议在完成Floorplan后立即运行check_timing -early report_constraint -all_violators这样可以尽早发现时序隐患。6. 实用调试技巧与性能优化当遇到布线拥塞问题时我常用的诊断命令是report_congestion -grcb -by_layer如果发现某区域拥塞度超过5%就需要调整宏单元halo值增加电源条带间隔优化标准单元密度有个移动处理器项目通过以下优化将布线通过率从83%提升到99%将内存模块从横置改为竖置在拥堵区域增加filler cell重新规划电源网络走线最后分享一个查看电源网络质量的命令verify_pg_nets -check_opens -check_shorts运行这个能提前发现95%以上的电源连接问题。