数字后端这行当里Floorplan和Powerplan是绕不过去的两道坎。你可以把综合出来的网表想象成一堆散落的乐高积木Floorplan就是决定这些积木怎么摆、摆在哪、留多少空隙而Powerplan则是给这些积木通上电、铺好供电网络。这两步做不好后面绕线再厉害也是白搭——时序收不住、IR Drop压得你喘不过气、Congestion堵得你想砸键盘。我见过太多新手拿到网表就急着跑place结果绕线阶段发现宏单元把布线通道堵死只能推倒重来。这篇内容就是把我自己在Innovus里从零做Floorplan和Powerplan的完整流程拆开揉碎讲清楚包括每一步为什么这么做、参数怎么定、哪些地方最容易翻车。不管你是刚入行的数字后端新人还是想从其他EDA工具转到Innovus的老手都能从里面找到可以直接抄作业的操作步骤和避坑经验。1. 动手之前把Floorplan的输入数据理清楚1.1 网表、时序约束和物理库到底怎么检查很多人拿到项目就急着打开Innovus敲命令结果跑到一半发现网表里少了某个模块、SDC里时钟定义写错了、物理库和逻辑库对不上。这种低级错误浪费的时间比认真检查多十倍。我的习惯是在启动Innovus之前先把三类输入数据过一遍。第一类是网表文件。用read_verilog读入之后别急着往下走先跑一个check_design看看有没有悬空端口、多驱动、黑盒。特别是从综合工具导出的网表有时候会残留一些assign语句或者未连接的端口这些在后续时序分析里会变成定时炸弹。我一般会重点关注顶层模块的端口方向是否正确以及是否有assign语句直接连接两个端口——这种在Innovus里需要特殊处理。第二类是时序约束文件。SDC里的create_clock、create_generated_clock、set_input_delay、set_output_delay这些基础约束必须完整。我踩过的一个坑是综合阶段用的SDC和PR阶段用的SDC不一致导致时钟周期对不上等发现的时候已经跑完place了。所以务必确认SDC里的时钟定义和项目规格书一致特别是多时钟域的项目每个时钟的周期、波形、相位关系都要核对。第三类是物理库和逻辑库的对应关系。.lef文件提供物理信息金属层、通孔、单元尺寸.lib文件提供时序和功耗信息。这两个库的单元名称必须一一对应否则Innovus找不到某个单元的物理视图就会报错。可以用check_library命令来验证重点看标准单元、宏单元、IO单元是否都有对应的物理视图。提示如果项目里用了Memory Compiler生成的SRAM记得把.lef、.lib、.db三种格式都准备好并且确认SRAM的引脚位置和方向与数据手册一致。1.2 为什么说Die Size和Core Size的确定是门艺术Die Size和Core Size的确定直接决定了芯片的成本和布线难度。Die Size越大芯片成本越高但布线资源越充裕Die Size越小成本越低但容易导致Congestion和IR Drop问题。这个平衡怎么找我的经验是从三个维度来估算。第一个维度是标准单元面积。综合报告里会给出标准单元的总面积但这个面积是理想情况下的。实际布局时标准单元之间需要留出布线通道通常需要乘以一个利用率因子。对于一般的数字模块初始利用率设在70%到75%比较稳妥。如果项目对面积要求苛刻可以尝试80%但要做好后面Congestion爆炸的心理准备。第二个维度是宏单元面积。SRAM、PLL、模拟IP这些宏单元的面积是固定的而且它们周围需要留出Hal o和布线通道。我一般会在宏单元周围留出5到10微米的Hal o具体取决于宏单元引脚的密度和布线层数。如果宏单元引脚很密Halo要适当加大。第三个维度是IO单元和电源环的占用。如果芯片有IO环IO单元本身占一圈面积电源环还要再占一圈。这部分面积在早期估算时容易被忽略等到Floorplan阶段才发现Core区域被压缩得不够用。综合这三个维度可以用一个简单的公式来估算Core面积Core Area (标准单元总面积 / 目标利用率) 宏单元总面积 预留布线通道面积。Die Size则在Core Size基础上加上IO环宽度和切割道宽度。这个估算不需要特别精确但必须留出足够的余量。1.3 宏单元摆放的底层逻辑数据流决定一切宏单元摆放不是随便找个空地塞进去就完事。宏单元的位置直接影响数据流的走向进而影响绕线长度和时序。我通常按照数据流方向来摆放宏单元输入端口附近的宏单元放在左边输出端口附近的放在右边中间的数据处理宏单元按流水线顺序排列。举个例子假设一个模块从左边接收数据经过SRAM缓存再经过运算单元处理最后从右边输出。那么SRAM应该放在靠近输入端口的位置运算单元放在SRAM和输出端口之间。这样数据从输入到输出走一条直线绕线最短时序最容易满足。除了数据流还要考虑宏单元之间的连接关系。如果两个宏单元之间有很多信号交互它们应该放得近一些。可以用Innovus的place_opt或者手动分析网表来识别高连接度的宏单元对。另外宏单元的朝向也很重要引脚朝向应该面向数据流的方向避免绕线绕远路。注意宏单元摆放时一定要留出足够的Halo和Channel。Halo是宏单元周围禁止标准单元摆放的区域Channel是宏单元之间用于布线的通道。Halo一般设5到10微米Channel根据布线层数和信号数量来定通常不小于10微米。2. 在Innovus里把Floorplan从图纸变成现实2.1 初始化设计从read_verilog到floorPlan命令启动Innovus之后第一步是读入设计。我习惯用脚本方式操作这样方便记录和复现。基本流程是read_verilog读网表read_lef读物理库read_lib读时序库read_sdc读约束然后set_top_module指定顶层模块。这些命令的顺序不能乱特别是read_lef必须在read_verilog之前或者同时进行否则Innovus无法识别单元的物理信息。读入设计之后用floorPlan命令来初始化Floorplan。这个命令有几个关键参数-r指定Core与Die的面积比-s指定Core的宽高比-d指定Die的尺寸。我一般先用-r和-s让Innovus自动算一个初始值然后再根据宏单元摆放情况手动调整。比如floorPlan -r 0.7 -s 1.0 -d 1000 1000表示Core面积占Die面积的70%宽高比1:1Die尺寸1000x1000微米。初始化之后用gui_start打开图形界面可以看到Die和Core的边界。这时候标准单元还没有摆放宏单元也还没有放进去。接下来就是手动摆放宏单元或者用脚本自动摆放。2.2 宏单元摆放的实操步骤与坐标计算手动摆放宏单元时我一般先在图形界面里把宏单元拖到大致位置然后用placeInstance命令精确设置坐标。比如placeInstance SRAM_0 100 200 R0表示把SRAM_0放在坐标(100, 200)处朝向为R0不旋转。Innovus支持多种朝向R0、R90、R180、R270、MX、MY、MX90、MY90等。朝向的选择取决于引脚位置和布线方向。坐标计算有个小技巧先确定宏单元的中心位置再根据宏单元的尺寸反推左下角坐标。比如一个SRAM的尺寸是100x200微米我想把它放在Core区域的左上角Core的左下角坐标是(10, 10)那么SRAM的左下角坐标可以设为(20, Core高度 - 200 - 20)。这样SRAM的顶部距离Core顶部20微米左边距离Core左边20微米留出了Halo。宏单元摆放完成后用checkPlace命令检查是否有重叠或者超出边界的情况。如果有重叠Innovus会报错并给出具体位置。调整之后再次检查直到没有错误为止。2.3 电源规划前的准备Pad和IO单元的摆放如果芯片有IO环Pad和IO单元的摆放要在Floorplan阶段完成。Pad的位置通常由封装决定不能随意更改。IO单元则放在Pad内侧通过placeInstance命令摆放。IO单元的电源引脚需要和Pad的电源引脚对齐方便后续电源规划。IO单元摆放时要注意电源和地的顺序。一般来说电源Pad和地Pad交替排列避免电源和地之间的噪声耦合。IO单元的信号引脚朝向Core区域方便与内部逻辑连接。如果IO单元有多个电源域还要考虑电源域之间的隔离。提示IO单元摆放完成后用checkPlace检查IO单元是否与Pad对齐以及IO单元之间是否有重叠。IO单元的电源引脚位置可以在.lef文件里查到。3. Powerplan给芯片铺一张可靠的供电网络3.1 Power Ring和Power Stripe的设计原则Power Ring是围绕Core区域的一圈电源环负责把Pad上的电源引到Core内部。Power Ring的宽度和层数取决于芯片的功耗和IR Drop要求。一般来说Power Ring用两层金属一层走电源一层走地。宽度根据电流大小来定电流越大Ring越宽。Power Stripe是Core内部的电源条负责把Power Ring上的电源分配到各个标准单元和宏单元。Power Stripe的间距和宽度需要仔细设计。间距太小布线资源被占用太多间距太大IR Drop可能超标。我一般先用一个初始值比如间距20微米、宽度2微米然后跑IR Drop分析根据结果调整。Power Stripe的层数也很关键。通常用高层金属比如M5、M6做纵向Stripe用中层金属比如M3、M4做横向Stripe形成一个网格。高层金属电阻小适合长距离供电中层金属电阻稍大但布线资源丰富适合局部供电。3.2 用addRing和addStripe命令生成电源网络Innovus里生成Power Ring用addRing命令。基本用法是addRing -nets {VDD VSS} -type core_rings -layer {top M5 bottom M5 left M6 right M6} -width 5 -spacing 2 -offset 1。这个命令会在Core周围生成一圈电源环VDD和VSS分别走不同的金属层宽度5微米间距2微米距离Core边界1微米。生成Power Stripe用addStripe命令。比如addStripe -nets {VDD VSS} -layer M4 -direction vertical -width 2 -spacing 20 -set_to_set_distance 40表示在M4层上生成纵向Stripe宽度2微米同组Stripe间距20微米不同组之间距离40微米。横向Stripe类似把-direction改成horizontal层改成M3。生成之后用verifyPowerVia检查电源Via是否完整。有时候Stripe交叉的地方Via没有自动生成需要手动添加。另外用checkPGConnectivity检查电源网络的连通性确保每个标准单元的电源引脚都能连接到Power Ring。3.3 IR Drop分析从结果反推Powerplan的调整方向IR Drop分析是验证Powerplan是否合格的关键步骤。Innovus里用analyzeIRDrop命令来跑IR Drop分析。分析之前需要准备好电源 Pad 的电流信息通常从功耗分析报告里获取。分析结果会给出每个节点的电压降如果某个区域的IR Drop超过规格一般是电源电压的5%就需要调整Powerplan。调整的方向有几个增加Power Stripe的宽度、减小Stripe间距、增加Stripe层数、优化宏单元的电源引脚连接。我一般先看IR Drop的热力图找到电压降最大的区域然后针对性地加宽该区域的Stripe或者增加Stripe密度。调整之后重新跑分析直到IR Drop满足规格。注意IR Drop分析需要准确的功耗信息。如果功耗估算不准IR Drop分析结果也没有参考价值。建议在Powerplan阶段用综合工具给出的功耗估算值等Place和Route完成后再用精确的功耗数据重新分析。4. 那些年我踩过的Floorplan和Powerplan的坑4.1 宏单元Halo不够导致Congestion爆炸这是我早期做项目时踩过的最大的坑。当时为了省面积把宏单元的Halo设得很小只有2微米。结果Place阶段标准单元倒是放进去了但Route阶段发现宏单元周围的布线通道完全不够用Congestion报告一片飘红。最后只能重新调整Floorplan把Halo加大到8微米重新跑Place和Route白白浪费了两天时间。这个坑的教训是Halo宁大勿小。宏单元周围的布线需求往往比预想的大特别是当宏单元引脚很多的时候。我现在的习惯是对于引脚密集的SRAMHalo至少设8微米对于引脚较少的模拟IPHalo可以设5微米。如果面积实在紧张可以考虑把宏单元放在Core边缘利用Die边缘的空间作为布线通道。4.2 Power Stripe间距过密导致布线资源枯竭另一个常见的坑是Power Stripe做得太密。有一次我为了追求低IR Drop把Stripe间距设成了10微米宽度3微米。结果IR Drop确实很好但布线阶段发现M4层几乎被Stripe占满了信号线没地方走。最后只能减少Stripe密度重新跑IR Drop分析好在调整后IR Drop仍然满足规格。这个坑的教训是Powerplan和Signal Routing要平衡。Stripe间距和宽度需要根据布线资源来定。一般来说M4层的Stripe覆盖率不要超过30%M5层不要超过40%。如果IR Drop实在压不下来可以考虑用更宽的Stripe但更大的间距或者增加Power Ring的宽度。4.3 电源域交叉导致的短路问题多电源域的项目里不同电源域的Power Ring和Stripe不能直接相连否则会短路。我遇到过一次两个电源域的Power Ring在Core边缘重叠了导致VDD和VDD2短路。后来在Power Ring之间加了隔离区问题才解决。这个坑的教训是多电源域项目里Powerplan要分域规划。每个电源域有自己的Power Ring和Stripe域与域之间留出隔离区。隔离区的宽度取决于电压差和工艺要求一般不小于5微米。另外跨电源域的信号需要加Level Shifter这个在Floorplan阶段就要预留位置。4.4 宏单元电源引脚连接遗漏宏单元的电源引脚往往在.lef文件里定义但有时候Innovus不会自动连接这些引脚到Power Ring。我遇到过一次SRAM的电源引脚没有连接到Power Stripe导致IR Drop分析时SRAM区域电压降特别大。后来用addPGPin命令手动连接才解决。这个坑的教训是Powerplan完成后一定要用checkPGConnectivity检查所有电源引脚的连通性。特别是宏单元要逐个确认电源引脚是否连接到Power Stripe。如果.lef文件里宏单元的电源引脚定义不完整需要手动补充。5. Floorplan和Powerplan的验证与交付5.1 用checkPlace和checkPGConnectivity做最终检查Floorplan和Powerplan完成后在进入Place之前必须做一轮完整的检查。checkPlace检查标准单元和宏单元是否有重叠、是否超出Core边界、是否有未摆放的单元。checkPGConnectivity检查电源网络的连通性确保每个电源引脚都能连接到Power Ring。除了这两个命令我还会用reportCongestion看一下Congestion的预估情况。虽然Place之前Congestion报告不太准确但如果某个区域预估Congestion很高说明Floorplan可能有问题需要提前调整。5.2 保存Floorplan和Powerplan的脚本与数据库检查通过后用saveDesign保存设计数据库方便后续恢复。同时把Floorplan和Powerplan的命令整理成脚本方便复现和修改。我习惯把脚本分成几个部分初始化部分读网表、读库、读约束、Floorplan部分Die Size、Core Size、宏单元摆放、Powerplan部分Power Ring、Power Stripe、检查部分checkPlace、checkPGConnectivity。脚本里的关键参数用变量定义比如set CORE_UTILIZATION 0.7、set HALO 8、set STRIPE_WIDTH 2。这样调整参数时只需要改变量值不用改命令本身。另外脚本里加上注释说明每个参数的含义和取值范围方便自己和同事后续维护。5.3 从Floorplan到Place的过渡需要关注哪些指标Floorplan和Powerplan交付后下一步是Place。在启动Place之前有几个指标需要关注。第一个是标准单元的利用率如果利用率超过80%Place阶段可能会出现Congestion问题。第二个是宏单元周围的Halo是否足够可以用reportCongestion预估。第三个是电源网络的IR Drop是否满足规格如果IR Drop超标Place阶段可能会更严重。如果这些指标都正常就可以启动Place了。Place阶段用place_opt命令Innovus会自动优化标准单元的位置。Place完成后再次检查Congestion和时序如果发现问题可能需要回到Floorplan阶段调整。提示Floorplan和Powerplan不是一次就能做好的通常需要迭代两到三轮。第一轮先搭一个基本框架Place和Route跑通之后再根据结果优化Floorplan和Powerplan。不要指望第一轮就做到完美。6. 一些让效率翻倍的小技巧6.1 用脚本批量摆放宏单元手动摆放宏单元很费时间特别是宏单元数量多的时候。我一般用脚本批量摆放。基本思路是先定义每个宏单元的目标位置和朝向然后用placeInstance命令逐个摆放。位置可以用相对坐标比如相对于Core的左下角或者右上角。脚本里可以用foreach循环遍历宏单元列表根据宏单元的类型和连接关系自动计算位置。比如输入端口附近的宏单元放在左边输出端口附近的放在右边。这样比手动摆放快得多而且容易调整。6.2 用GUI和命令行结合提高效率Innovus的GUI和命令行各有优势。GUI适合直观地查看布局和调整位置命令行适合批量操作和脚本化。我一般用GUI做初步摆放和检查用命令行做精确调整和批量操作。比如在GUI里把宏单元拖到大致位置然后在命令行里用placeInstance精确设置坐标。GUI里还有一个好用的功能是Highlight可以高亮显示某个网络或者某个单元。检查电源网络连通性时用Highlight把VDD和VSS网络高亮显示一眼就能看出哪里没有连接上。6.3 建立自己的Floorplan模板库不同项目的Floorplan有相似之处比如电源环的结构、Stripe的间距、宏单元的Halo大小。我习惯把常用的Floorplan配置整理成模板新项目直接套用只需要修改Die Size和宏单元位置。这样能省下不少时间。模板库可以按工艺节点分类比如28nm、16nm、7nm各有一套模板。每个模板里包含Power Ring的参数、Power Stripe的参数、Halo的默认值、常用命令的脚本。新项目启动时先选一个最接近的模板然后根据项目特点调整。6.4 与前端和综合工程师的沟通要点Floorplan和Powerplan不是后端工程师一个人的事需要和前端、综合工程师沟通。前端工程师了解数据流和模块功能能给出宏单元摆放的建议。综合工程师了解网表的结构和时序关键路径能给出利用率目标和时序约束的细节。我一般会在Floorplan开始前和前端、综合工程师开一个短会确认几个关键信息数据流方向、宏单元的连接关系、时钟频率和时序关键路径、功耗估算值。这些信息对Floorplan和Powerplan的设计至关重要。沟通清楚了后面返工的概率会小很多。6.5 常见问题速查表问题现象可能原因解决方法Place阶段Congestion严重宏单元Halo太小、利用率太高加大Halo、降低利用率、调整宏单元位置IR Drop超标Power Stripe太窄或太稀加宽Stripe、减小间距、增加Stripe层数电源网络不连通宏单元电源引脚未连接用addPGPin手动连接、检查.lef文件宏单元重叠坐标计算错误用checkPlace检查、调整坐标时序违例严重Floorplan不合理导致绕线太长调整宏单元位置、优化数据流方向布线资源不足Power Stripe覆盖率太高减少Stripe密度、调整Stripe层数这张表是我自己总结的每次项目里遇到问题就查一下大部分情况都能找到方向。当然具体问题还要具体分析不能完全照搬。6.6 关于Innovus版本和工艺节点的适配不同版本的Innovus在命令和功能上有差异。比如有些新版本支持自动Floorplan优化老版本没有。我一般会确认项目用的Innovus版本然后查对应的命令手册。另外不同工艺节点的设计规则不同比如金属层的电阻、电容参数、Via的规则。Floorplan和Powerplan的参数需要根据工艺节点调整。28nm及以上节点金属层电阻相对较大Power Stripe需要做得宽一些。16nm及以下节点金属层电阻小但布线资源更紧张Power Stripe的密度需要更精细地控制。这些经验需要在实际项目中慢慢积累没有一成不变的参数。6.7 如何快速定位Floorplan中的问题Floorplan做完后如果Place阶段出现问题怎么快速定位是Floorplan的哪个部分导致的我的方法是分区域排查。先把Core分成几个区域逐个区域检查Congestion和时序。如果某个区域问题特别严重就重点调整该区域的宏单元位置或者Power Stripe。另外用Innovus的reportCongestion命令可以生成Congestion热力图直观地看到哪些区域布线资源紧张。结合热力图和时序报告基本能定位到问题所在。定位之后调整对应的宏单元位置或者Power Stripe参数重新跑Place验证。6.8 一些容易被忽略的细节Floorplan和Powerplan里有一些细节容易被忽略但影响很大。比如宏单元的朝向如果引脚朝向不对绕线会绕远路。比如Power Ring的拐角处如果Via没有打满电流承载能力会下降。比如IO单元的电源引脚如果和Pad的电源引脚没有对齐电源规划会很麻烦。这些细节在项目初期可能看不出问题但到了Route阶段或者Signoff阶段就会暴露出来。我的习惯是在Floorplan和Powerplan完成后花半个小时把这些细节过一遍确认没有问题再进入下一步。这半个小时可能省下后面两天的时间。6.9 从项目复盘中积累Floorplan经验每个项目结束后我都会花时间复盘Floorplan和Powerplan的部分。哪些地方做得好哪些地方可以改进哪些参数需要调整。把这些经验记录下来形成自己的知识库。下一个项目遇到类似情况时就能快速找到解决方案。复盘的内容包括Die Size和Core Size的估算是否准确、宏单元摆放是否合理、Power Stripe的参数是否最优、IR Drop是否满足规格、Congestion是否可控。这些数据积累多了就能形成直觉新项目拿到手就能估个八九不离十。6.10 给新人的学习路径建议如果你是刚入行的新人我建议按这个路径学习Floorplan和Powerplan。先找一个简单的项目跟着教程走一遍完整流程理解每个命令的作用。然后找一个有经验的人带你做一遍实际项目学习他怎么决策、怎么调整。最后自己独立做一个项目遇到问题查手册、查资料、问同事把问题解决掉。学习过程中重点理解“为什么”而不是“怎么做”。命令的用法可以查手册但为什么这么设置参数、为什么这么摆放宏单元这些需要经验和思考。多问自己几个为什么进步会快很多。6.11 工具之外的软技能Floorplan和Powerplan做得好不好工具操作只是一部分更重要的是对设计的理解。你需要理解数据流、理解时序、理解功耗、理解工艺。这些知识不是工具能教你的需要平时多积累。多看前端的设计文档多和综合工程师交流多了解工艺的特点。另外沟通能力也很重要。Floorplan和Powerplan需要和多个角色协作前端、综合、封装、工艺。沟通清楚了信息对称了返工就少了。我见过很多项目延期不是因为技术问题而是因为沟通不畅导致的信息不对称。6.12 持续学习与社区交流数字后端这行技术更新快新工艺、新工具、新方法层出不穷。保持学习的心态很重要。我平时会关注一些技术社区和论坛看看别人遇到的问题和解决方案。有时候别人的一个技巧就能省下自己很多时间。另外参加一些技术会议和培训也有帮助。Cadence官方会定期举办Innovus的培训讲解新功能和最佳实践。这些培训内容往往比手册更实用因为讲师会分享实际项目中的经验。6.13 关于自动化脚本的思考随着项目复杂度提高手动操作越来越不现实。自动化脚本是必然趋势。我现在的项目里Floorplan和Powerplan的大部分操作都用脚本完成。脚本的好处是可复现、可调整、可批量处理。但脚本也不是万能的有些决策还是需要人工判断比如宏单元的位置、Power Stripe的密度。我的做法是脚本负责重复性的操作比如生成Power Ring、生成Power Stripe、检查连通性。人工负责决策性的操作比如确定Die Size、摆放宏单元、调整参数。两者结合效率最高。6.14 最后再分享一个实用技巧如果你在Floorplan阶段发现某个宏单元的位置怎么摆都不合适可以试试把它旋转90度或者180度。有时候换个朝向引脚位置就对了绕线就顺了。这个技巧看起来简单但很实用。我遇到过好几次宏单元横着摆怎么都不对竖着摆就解决了。另外宏单元之间的Channel宽度也可以动态调整。如果两个宏单元之间信号很多Channel就宽一些信号少Channel就窄一些。这样既能保证布线资源又不浪费面积。Innovus里可以用createObstruction命令来手动创建Channel或者用placeInstance的-channel参数来设置。好了关于Innovus里Floorplan和Powerplan的实战经验就分享到这里。这些内容都是我在实际项目中一点一点积累的有些是踩坑踩出来的有些是跟前辈学来的。希望对你有所帮助。如果你在操作过程中遇到什么问题欢迎一起交流讨论。数字后端这条路不好走但走通了还是很有成就感的。