ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数字后端Floorplan与Powerplan实战:Innovus完整流程与避坑指南

数字后端Floorplan与Powerplan实战:Innovus完整流程与避坑指南 做过几年数字后端的人回头看Floorplan和Powerplan往往是最能体现一个后端工程师功力深浅的地方。有些人跑完Innovus LAB Day3觉得Floorplan不就是定个尺寸、摆几个macro、把stripe打上嘛没什么技术含量。但实际上你后边CTS时钟树综合好不好做、绕线拥塞不拥塞、IR drop压不压得住、甚至ECO阶段加buffer有没有空间八成在Floorplan这一步就已经注定了。这篇文章我打算把Day3的完整流程从头到尾拆开每一段都说说背后的设计逻辑和实际操作中容易踩的坑争取让零基础的读者也能把Floorplan和Powerplan这条线彻底搞明白顺带把面试里最常问的那几个点也一并解决掉。1. 内容整体设计与思路拆解1.1 为什么Floorplan是整个后端的定海神针先聊一个很实际的问题Floorplan到底在解决什么芯片版图是一张“图纸”上面要放标准单元、宏单元memory、IP、IO Pad和电源网络而Floorplan就是给这张图“圈地”和“摆家具”的阶段。你住过那种户型很差的房子就会懂墙不能拆、梁不能动、水管不能改装修再怎么花心思住着都别扭。芯片也一样Floorplan阶段把macro乱摆、把利用率顶到95%后面CTS和绕线的工具再聪明也救不回来。我见过的很多项目第一版Floorplan都是直接拍脑袋定的Core利用率取个75%macro随手拖到边上然后就开始跑place。等到跑完place看到congestion map一片红或者CTS之后发现buffer链绕了大半个芯片才回头去调Floorplan一来一回浪费好几个工作日这在tapeout进度压力下是非常致命的。所以Day3这套实验的核心价值不是教会你敲几条命令而是培养一种“先想清楚再动手”的习惯。做Floorplan之前你脑子里至少要有这么几个问题的答案芯片的die size和core利用率是怎么定出来的为什么要留余量芯片里有哪几个大的macro它们之间有没有数据流关系该不该靠近摆放IO Pad的位置和pin assignment是否符合封装方案有没有和顶层走线冲突Powerplan的mesh要打几层、打多宽、via怎么放IR drop才能压住而不浪费绕线资源这几个问题在Lab里都有对应的操作但很多人只是把脚本跑完就算交差根本没琢磨过每个参数背后的含义。下面我把这套思路理清楚再讲具体怎么实操。1.2 经典“先规划后实施”的后端流程后端设计从网表进来开始基本流程是数据准备data setup→ Floorplan → Powerplan → Placement → CTS → Routing → 签核signoff。Day3覆盖的Floorplan和Powerplan处在最前面的位置相当于还没开始盖楼先打地基。Floorplan阶段做的事情可以概括成三件一是定边界die/core area二是摆宏单元macro placement三是布电源网络power planning。顺序上有先后依赖但实际做的时候是一个反复迭代调整的过程。比如你先定了电源mesh的宽度和间距再去摆macro结果发现某个stripe正好压在macro的pin上或者macro把某个power stripe的轨道完全挡死那就得回头改Floorplan或者调整stripe。Powerplan本身又分好几个层级最底下是标准单元的power railM1层沿着row方向中间是横向或纵向的power stripe高层金属宽且密最上面是连接IO Pad的power ring围绕core的环形电源线以及连接各层之间的via array。Powerplan的目标就是构建一张足够低阻抗的“电网”让电流从焊盘流到每一个标准单元的VDD/VSS pin时压降IR drop控制在可接受范围内。在Innovus里这些步骤分别对应floorPlan、addRing、addStripe等命令。我先说清楚它们各自管什么再把完整操作串起来。2. 核心细节解析与实操要点Innovus里的Floorplan命令与参数2.1 初始化与基础设置进入Innovus之后第一步是把设计数据读进来。通常用init_design命令把LEF、DEF、网表、时序库都加载好。这里面LEF是物理库定义了每一层金属的规则和标准单元的物理外形DEF则是当前版图状态包括单元的初始位置和net连接关系。我建议在创新项目里先把所有库文件和约束都检查一遍尤其是Tech LEF和Cell LEF的版本要匹配不然后边读入DEF时会报一堆dangling layer的错。实际操作中很多人跳过这个检查结果跑到一半发现M1宽度规则不对又得回头改数据很浪费时间。初始化完成后第一件正事是看design size。用report_design或直接读log都能看到当前die的面积和core利用率。如果没有预设的die size通常的做法是先用自动模式让工具根据网表和库信息估算一个初始面积floorPlan -r 0.75 0.8 5 5 5 5这里的-r表示按比例方式0.75是目标core利用率即标准单元和macro的面积占core总面积的比例0.8是宽高比aspect ratio后面四个数字是最小间距边界左侧、右侧、顶部、底部的core margin。这个命令的意思是让工具按网表总面积反推一个core的宽高再留出四周各5微米的空白。很多刚上手的人不理解利用率这个数到底怎么选。这里有一个经验值对于普通逻辑设计0.65~0.75是比较稳的区间如果有大量高驱动单元或者复杂的时钟结构最好留到0.6左右。为什么因为后边的CTS会插入大量buffer和inverter如果利用率太高这些新加的单元没有地方放只能硬挤最终导致congestion和DRC问题。利用率低一点后边的日子会好过很多。当然利用率太低也有问题die面积大了成本就高而且信号线变长时序可能更差。所以这是一个平衡取舍。2.2 手工调整die和core边界如果你的项目对芯片尺寸有硬性要求比如封装规定了die大小就不能用自动模式得手动指定。Innovus里可以这样写floorPlan -d 1250 1250 10 10 10 10-d后面是die的宽和高单位微米后面四个数字是core的左右上下边距。这样设置之后die就不是自动估算的了如果你给的宽高比和实际core面积差太多工具会警告但不会拦住你所以自己要心里有数。这里有一个细节很容易被忽略die的宽高最好符合工艺厂对 scribe line 和 seal ring 的间距要求否则后边做芯片级整合chip integration时会被顶层的同事喷。我不是每家公司都有顶层团队把关但在先进工艺节点这个约束通常来自封装team他们给的“die size budget”会在项目开始时定好所以Floorplan阶段一定要先拿到这个数字再动手。2.3 macro placement的核心原则macro摆放是Floorplan阶段最讲究人工经验的环节。工具确实有自动摆macro的功能ameba、auto-place-macro之类但好的后端工程师通常先自己摆一遍再用工具的结果做对比。摆macro的核心原则有几条我按重要性排个序第一关联模块要靠近。如果一个memory的端口频繁被某个逻辑块访问那它们之间的距离越短越好否则线延迟和拥塞都会恶化。这一点在做multi-voltage domain或复杂SoC时尤其明显每个模块的floorplan zone要尽量紧凑不要让数据线跨越大半个芯片。第二macro别挡住标准单元的row。macro通常是几百微米见方的矩形如果摆得不好会把一整片标准单元的放置区域挖掉一个大洞导致旁边的cell只能绕远路放局部congestion瞬间拉高。第三macro的pin方向要和信号流向匹配。memory的port往往集中在某一侧这一侧要朝向逻辑那一边这样信号线可以直出不用绕弯。实际操作中我会先把所有macro列一个清单标注每个macro的大致尺寸、pin位置、连接到的逻辑模块然后用place_macro或直接在GUI里拖动边摆边看右上角的congestion预估和utilization分布。Innovus里摆macro有一个特别好用的辅助功能就是显示macro之间的连接关系connectivity把net的粗细和方向画出来这样即便是新手也能很快找到哪些macro该靠近。摆完macro之后一定要做一次check_floorplan看有没有macro和macro重叠、macro和IO pad冲突、macro把power stripe路径阻断等问题。这个检查看起来简单但能省下后边大把debug时间。2.4 IO pad与pin assignment的重要性如果不是纯core-limited的设计也就是IO数量足够少不限制die面积IO pin的位置通常由封装方案提前定好。Innovus里IO约束可以通过.io文件读入比如loadIoFile -file top.io.io文件里定义了每个IO pin的net名、所在的金属层、坐标和方向。读取之后要注意看有没有重叠或间距不满足规则的报错。如果封装给的是BGA ball map这一步就是把ball map转成die边沿上的pin位置通常由package engineer和前端一起决定。很多后端工程师容易忽略IO pin对Floorplan的反向影响如果某个高速接口的pin全部集中在die的一侧那对应的逻辑模块最好也放在那一边否则信号要从一头飞到另一头时序和SI都很难收敛。所以我的习惯是拿到IO file之后先画一个“pin分布热力图”再决定macro怎么摆而不是先摆macro再硬塞IO。3. Powerplan深度实操从规则计算到stripe铺设3.1 电源网络设计的核心目标低阻抗、低IR dropPowerplan要解决的问题用一句话说就是让芯片上每一处标准单元的电源pin和地pin之间的电压差在瞬态电流最大的时候仍然保持在spec范围内。这个“电压差”就是IR drop压降先进工艺里通常要求VDD的IR drop控制在3%~5%以内再高就会影响时序甚至直接导致功能错误。想象一下用一根很细的水管给整个小区供水每家每户同时开水龙头末端水压就不够了。电源网络也是同样的道理stripe就是加粗的水管via就是接口打得不够多不够粗末端电压就塌了。要判断电源网络是否达标不能等版图全部画完再去“亡羊补牢”而是在规划阶段就算清楚。核心的计算公式是R ρ × L / A电阻反比于金属截面积。截面积由宽度和厚度决定厚度是工艺给的金属层越高通常越厚唯一你能灵活控制的主要是宽度其次是打孔数量。所以Powerplan的规划本质就是选择金属层组合、stripe宽度、stripe间距和via方案把电源网络的等效电阻压到足够低。3.2 确定stripe的宽度和间距那么stripe到底该打多宽、隔多远第一步是看该工艺的电流密度EM, Electromigration规则。金属层能承受的最大电流密度是固定的单位通常是mA/μm。把总电流估算出来后总宽度就有了下限。一个简化的估算方法是先算出整个core的平均功耗再除以供电电压得到总电流。例如某个模块功耗2WVDD0.8V那个总电流就是2.5A。如果选用的顶层金属每微米宽度能承受1mA电流那至少需要2500μm宽的金属。这个宽度通常不会用一整块来实现而是分摊到若干条stripe上。比如打40条stripe每条至少62.5μm宽再留一点裕量取70μm。间距的考量则和标准单元的电源轨道有关。标准单元的row方向通常和M1 supply rail平行高层stripe的方向会和它垂直或平行视金属层方向而定stripe之间不能间距过大否则cell通过via连接到高层stripe的路径太长中间的水平IR drop会增加。经验上两个stripe之间间距一般在40~70μm左右。先进工艺里如果库里已经定义了follow pin和power via的规则具体数值要严格对照DRC rule deck来做不能拍脑袋。3.3 用Innovus命令完成Powerplan铺设在Innovus里Powerplan的主要命令是addRing和addStripe。先说addRing——这个命令在core外围画一圈电源环是连接IO到内部stripe的“总干线”addRing -nets {VDD VSS} -type core_rings \ -layer {top M6 bottom M6 left M5 right M5} \ -width 10 -spacing 1.5 -offset 10layer指定各方向的金属层注意要交替使用横向和纵向层否则转角处无法连接。width是环的宽度spacing是到core边界的最小间距。这里10μm对我来说是比较常规的起步宽度如果功耗高还可以加宽。然后是addStripe这是给core内部打横竖方向的电源条addStripe -nets {VDD VSS} -layer M6 \ -direction vertical \ -width 4 -spacing 1.5 \ -set_to_set_distance 50 \ -start_from left \ -start_offset 10 -stop_offset 10这里的set_to_set_distance就是两条stripe之间的中心距width是stripe宽度start_from left表示从core左边界开始排布。打横线同理换一下layer和direction就行addStripe -nets {VDD VSS} -layer M5 \ -direction horizontal \ -width 4 -spacing 1.5 \ -set_to_set_distance 50 \ -start_from bottom \ -start_offset 10 -stop_offset 10注意横竖stripe交叉的地方需要靠via连接通常用addViasToStripe或者由工具自动补齐阵列via。例如addViasToStripe -nets {VDD VSS} -layer M5 -stripe_layer M6 \ -to_via_layer M6 -via_array_size {3 3}这个命令告诉工具在M5和M6交叉的位置打一个3×3的via阵列让电流可以垂直流动。via阵列的个数和尺寸直接决定了上下层之间的导通能力如果打少了这里就是一个等效大电阻IR drop会集中恶化在此处。3.4 Powerplan与标准单元轨道连接有了高层stripe和ring之后还差一层和标准单元直接接触的“最后一公里”——标准单元的VDD/VSS pin是通过M1轨道follow pin连接的因此需要让高层stripe的信号“降”到M1通常途经M2、M3等层。Innovus提供connectPG命令来建立这种连接或者使用SRASmart Rail Analysis工具自动补齐。最基本的做法是设置via的规则让标准单元行每隔一定距离自动从高层stripe跳到M1轨上。这一步的细节非常容易出问题。很多刚做Powerplan的人看到高层stripe打好了就以为大功告成跑IR分析发现压降超标其实问题就出在高层到M1的连接上via密度不够或者via的位置恰好落在macro内部导致一大片主逻辑区电源供应不足。你还得专门检查stripe是否避开了macro的 blockage 区域或者至少保证macro内部的PG pin能至少通过IR分析验证。4. 实操过程与完整验证从Floorplan到Powerplan一步步跑通4.1 完整脚本示例与步骤说明下面我给出一个完整的Innovus脚本段涵盖从初始化到Powerplan的核心操作。这不是唯一的写法但足够稳定适合零基础做第一个练手项目时直接参考。# Step 0: init design init_design -files {top.conf} # Step 1: initial floorplan # 目标core利用率75%, 四周留5um margin floorPlan -r 0.75 0.8 5 5 5 5 # Step 2: 手动调整macro位置也可直接在GUI里拖 # 这里放一个memory到core左下区域坐标单位um place_macro -name mem0 -location {100 100} -orientation R0 # 检查macro placement check_floorplan # Step 3: IO pin assignment # 如果使用已有的IO文件就直接load loadIoFile -file top.io # Step 4: core power ring addRing -nets {VDD VSS} -type core_rings \ -layer {top M6 bottom M6 left M5 right M5} \ -width 10 -spacing 1.5 -offset 10 # Step 5: vertical stripes on M6 addStripe -nets {VDD VSS} -layer M6 \ -direction vertical \ -width 4 -spacing 1.5 \ -set_to_set_distance 50 \ -start_from left \ -start_offset 10 -stop_offset 10 # Step 6: horizontal stripes on M5 addStripe -nets {VDD VSS} -layer M5 \ -direction horizontal \ -width 4 -spacing 1.5 \ -set_to_set_distance 50 \ -start_from bottom \ -start_offset 10 -stop_offset 10 # Step 7: 添加M5-M6连接via阵列 addViasToStripe -nets {VDD VSS} -layer M5 -stripe_layer M6 \ -to_via_layer M6 -via_array_size {3 3} # Step 8: 检查PG连接 check_pg_connectivity summary_report -no_html每一步我都建议单独跑完先看一眼结果再进下一步。尤其check_pg_connectivity必跑这一条会告诉你哪些标准单元的PG pin还没接到电源网络上。如果报告里有大量warning先别急着往后走回头检查stripe和ring是否落在正确的layer、是否跨越了macro blockage。4.2 不同场景下的方案对比我把常见场景的Powerplan选择做个对照方便大家按需取用场景推荐金属层stripe宽度间距备注低功耗IoT芯片M5/M62~4μm60μm功耗低stripe可以稀疏一些省出绕线资源高性能计算模块M6/M7或更高层8~15μm40~50μm电流大stripe要宽而密同时注意EM规则模拟混合信号顶层厚金属10~20μm30μm模拟区通常对IR drop和噪声很敏感建议单独加粗注意这些只是起步值。真正定方案要结合IR分析结果迭代先用预估参数打一遍跑analyze_rail或者第三方IR tool看看最差压降位置然后局部加宽stripe或补充via。这个过程听起来费时间但比事后在布线阶段返工要便宜得多。4.3 如何验证Floorplan和Powerplan是否合格验证可以从三个层面看第一个层面是几何检查。check_floorplan有没有DRC违例macro之间是否重叠stripe和pin是否有短路风险。这些都是“低级”错误但一旦出现会连锁导致后边所有步骤白跑。第二个层面是时序可行性。Floorplan阶段还没有真实的时钟树和数据路径delay但你可以通过report_congestion或trial_route先看congestion的分布。如果某个区域红色预警最好在place之前就调macro或改stripe密度而不是等到绕线阶段再来挑战工具极限。第三个层面是电源完整性。Innovus里可以用analyze_rail做静态IR drop分析输入是电源网络和功耗估计.saif或.def里的功耗信息。重点看VDD/VSS的压降热点一般要求稳态IR drop个别热点不超过3% VDD动态IR drop则要看具体情况。如果某个区域翻红常见的对策有三板斧在该区域上方加宽或加密stripe、增加via阵列尺寸、调整macro位置让出电源通道。5. 常见问题与排查技巧实录5.1 “Powerplan打完了IR drop还是超标”怎么办这个场景我见过太多次了。新手最容易犯的错是以为stripe打得越多越好于是整片芯片铺得密密麻麻结果IR drop确实没问题了但绕线资源被占得一塌糊涂后边route阶段满屏DRC一样哭。正确的排查顺序应该是先确认IR drop超标的区域是哪一类热点。如果是集中在某个高功耗macro附近那问题多半是macro周围的via不够或者macro的PG pin没有充分和stripe对接解决方案是加密via阵或让macro周围多绕一圈power ring。如果是整片区域均匀超标那说明基础stripe方案整体偏弱考虑加宽stripe或缩小间距。如果只是角落超可能是power ring到那边路径太长可以加一条局部feed stripe。尽量不要一上来就把全芯片的stripe都加粗加密不仅浪费面积而且会导致标准单元区域被割裂placement quality明显下降。5.2 macro摆完之后发现挡住了绕线通道摆macro这事挺考验“空间想象力”的。哪怕是画过很多芯片的人也会遇到把自己绕晕的情况macro摆得很整齐但几个macro之间刚好留出一条又长又窄的缝隙后边的net全堵在那congestion直接爆炸。遇到这种情况不要死磕先用Innovus的GUI把macro边界和congestion map叠在一起看确认是哪几块macro围出的瓶颈区。通常的解决思路是把其中一个macro旋转90度或镜像改变pin方向可能就把通道方向理顺了把几个macro之间的间距拉开一点虽然看起来浪费了面积但如果能明显改善拥塞这个面积是值得的把macro改成L形或阶梯形布局不要整整齐齐排成一排好让信号流更自然。记住Floorplan的美观不是目标时序和可布线性才是。宁可看起来“乱”一点只要工具跑得顺那就是好Floorplan。5.3 从Lab Day3延伸innovus eco buffer tree给我们的启示很多人做完Day3会问Floorplan和Powerplan跟后边的ECO到底有什么关系这个问题我特别想聊。ECOEngineering Change Order工程变更是指在后端设计后期甚至tapeout前因为功能修改或时序修复而做的局部改动。和ECO最相关的Floorplan因素就是“裕量”。如果你在Floorplan阶段把利用率卡得死死的、留的空白区域特别少到了ECO阶段要加buffer修时序你会发现自己完全找不到地方放buffer。而eco buffer tree这个操作恰恰是Innovus里专门用来在现有布局上自动加buffer树的命令。它能不能顺利执行取决于你的版图里有没有足够的“塞buffer”的空间。这也是为什么我在前边反复强调利用率别顶太高——现在的麻烦往往就是当初Floorplan阶段给自己挖的坑。反过来Powerplan对ECO也有影响。ECO阶段新加的buffer、inverter也需要电源连接如果它们落在一个PG连接不完整的位置修时序修到一半还会冒出新的IR drop问题那就真的是按下葫芦浮起瓢。所以Day3做扎实的另一个隐性好处是给未来的ECO阶段留足退路。5.4 常见错误速查表问题现象可能原因快速解法check_pg_connectivity报大量unconnected pinstripe或ring层级选择不对或via阵列缺失检查M1~M6的连接关系补connectPG或SRA后边place时congestion一片红利用率过高或macro摆放遮挡了row降低core利用率调整macro位置IR drop集中在特定macro角落macro周围via密度不够添加更密的via阵列或局部补stripe摆好macro后IO走线距离过长macro与IO pin方向不匹配结合IO file重新规划macro朝向和位置DRC报告出现stripe短路不同net的stripe使用同一层太近检查addStripe的spacing参数或换层错开5.5 给零基础读者的一条实操建议如果你是第一次接触Innovus别急着追求把整个flow一遍跑完或者做出一个多么漂亮的Floorplan。我建议你先把Lab Day3的脚本从头到尾敲一遍哪怕只是照抄也要保证每一步都理解“这命令是干嘛的”。然后刻意做一些“反向实验”比如把利用率改成0.9跑一遍看看congestion会怎么恶化再比如把stripe间距改成100μm跑一遍IR看看压降有多夸张。这种“故意做错”的过程往往比一次成功更能帮你建立对Floorplan和Powerplan的直觉。在面试里面试官问“你知道Floorplan要注意什么吗”真正想听的绝对不是你能背出多少条命令而是你有没有经历过“因为Floorplan没做好后续CTS或绕线出了什么问题你是怎么排查和解决的”。你现在多花一点时间把原理和思路搞清楚面试时能讲出来的深度完全不一样。
返回列表