ARTICLE DETAIL

资讯详情

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

Innovus数字后端实战:Floorplan与Powerplan核心技巧及TCL自动化

Innovus数字后端实战:Floorplan与Powerplan核心技巧及TCL自动化 1. 数字后端实战指南Innovus LAB Day3 核心内容拆解1.1 这个项目到底在做什么数字后端设计这个方向入门门槛说高不高说低也不低。很多人在跑完综合、拿到网表之后面对Innovus的图形界面会突然不知道下一步该干什么。LAB Day3这个阶段核心就两件事Floorplan布局规划和Powerplan电源规划。这两个步骤做得好不好直接决定了后面Place、CTS、Route能不能顺利收敛甚至决定了芯片能不能signoff。我见过太多项目前期Floorplan随手一划Powerplan随便一打结果到Route阶段IR-drop爆炸、congestion红成一片回头再改成本高得离谱。所以Day3这个节点是整个后端流程里性价比最高的投入点——你在这里多花两个小时推敲后面能省两天甚至两周的debug时间。这篇文章面向的是刚接触Innovus的在校学生、转岗工程师以及已经会跑flow但没真正理解Floorplan/Powerplan底层逻辑的初中级后端工程师。我会把LAB里那些照着敲命令能跑通、但不知道为什么这么敲的地方全部拆开讲清楚包括TCL脚本怎么写、参数怎么算、坑在哪里。1.2 为什么Floorplan和Powerplan要放在一起讲很多人把Floorplan和Powerplan当成两个独立步骤先做完Floorplan再做Powerplan。这个理解不算错但会丢掉一个关键点Powerplan的ring和stripe走向会反过来约束Floorplan的macro摆放和channel宽度。举个实际例子。假设你有一个SRAM macro阵列Floorplan阶段你把两个macro背靠背贴着放中间只留了5um的channel。等到Powerplan阶段你发现这个channel里要穿一条VDD stripe加一条VSS stripe每条宽度2um加上spacing和enclosure5um根本塞不下。这时候你只有两个选择要么把macro推开重新floorplan要么把stripe绕到别的地方导致IR-drop变差。所以正确的做法是在Floorplan阶段就要预判Powerplan的需求。你要知道大概会打几条stripe、ring的宽度是多少、macro的power pin在哪个方向然后把这些空间预留出来。这就是为什么LAB把这两个内容放在同一天——它们本质上是同一个决策的两个侧面。1.3 学完这篇你能掌握什么具体来说读完这篇并跟着操作一遍你应该能做到独立完成一个block-level的Floorplan包括die/io boundary定义、core margin计算、macro摆放和halo设置理解floorplan阶段的关键约束文件怎么写包括floorplan.tcl和io file独立完成Powerplan包括power ring、power stripe、followpin的规划和实现会用TCL脚本自动化这些流程而不是纯靠GUI点知道怎么检查Floorplan和Powerplan的质量包括congestion map、IR-drop预估、connectivity检查避开新手最常踩的十几个坑下面进入正题。2. Floorplan核心技巧与实操细节2.1 Floorplan的本质给后续所有步骤定规矩Floorplan说白了就是在一块给定的面积里决定各个功能模块放在哪里、占多大地方、之间留多少空隙。听起来简单但它本质上是在解一个多目标优化问题面积die size越小成本越低但太小会导致congestion和IR-drop恶化时序关键路径上的模块要放得近减少wire length功耗高功耗模块要分散避免局部过热布线要给routing留足够的channel特别是metal layer的走向要提前规划电源power network要能覆盖所有标准单元和macro且IR-drop在预算内这四个目标经常互相冲突。你把macro挤在一起省面积congestion就上去了你把它们散开缓解congestionwire length又长了时序就差了。所以Floorplan没有最优解只有在当前项目约束下的合理折中。我的经验是新手做Floorplan最容易犯的错是只盯着面积看。拿到一个block第一反应是能不能再压小一点然后把utilization推到0.85甚至0.9。结果Place阶段congestion爆炸Route阶段short满天飞。正确的思路应该是先保证可实现性再在可实现的前提下优化面积。2.2 准备工作Floorplan之前必须确认的输入在打开Innovus之前有几样东西你必须先确认好否则后面全是返工。第一是网表netlist。确认综合后的网表是干净的没有unresolved reference没有assign语句残留或者已经处理过没有latch inference的warning。这些在综合阶段看起来是小问题到后端会变成大麻烦。第二是时序约束SDC。Floorplan阶段虽然不做时序优化但你需要知道clock的频率、IO的timing budget这些会影响你的模块摆放决策。比如一个跨clock domain的路径如果两个模块离得太远后面CTS阶段skew很难控。第三是物理库LEF。确认所有用到的macro、standard cell、IO pad的LEF都齐全特别是macro的pin位置和方向。我遇到过一次SRAM的LEF里pin在左边但实际datasheet上pin在右边结果powerplan全打错了方向返工了一整天。第四是工艺信息。包括metal stack、via规则、min width/spacing、density rule。这些决定了你power stripe能打多宽、ring能打几层。确认完这些你可以开始写floorplan的TCL脚本了。2.3 Die与Core区域定义margin怎么算Innovus里定义die和core区域的基本命令是# 初始化设计 init_design # 读取floorplan约束 loadFPlan ./floorplan/block.fp # 或者手动定义die和core floorPlan -site core_site -r 1.0 0.7 5.0 5.0 5.0 5.0floorPlan命令里那几个参数分别是aspect ratio宽高比、core utilization、以及四个方向的marginleft bottom right top。margin怎么定这是新手最常问的问题。margin的本质是给power ring和IO routing留空间。一般来说如果power ring打2层比如M7和M8每层ring宽度2um加上spacing和enclosure每边大概需要8-10um如果还有IO pad或者signal feedthrough再额外加5-10um所以典型的core margin在10-20um之间但这不是死数。我一般会先按10um做一版然后看powerplan打完之后ring到core的距离还剩多少如果太挤就加大margin重新来。反过来如果margin太大浪费面积就适当压缩。utilization怎么定这个更关键。core utilization standard cell面积 / core面积。对于block-level设计设计类型推荐utilization说明控制逻辑为主0.70-0.75组合逻辑多congestion风险高数据通路为主0.75-0.80规整度高可以推高一点含大量macro0.50-0.65macro占面积std cell区域要留够高频设计0.65-0.70时序紧张需要更多routing资源我个人的习惯是先按0.70做跑完Place看congestion和timing再决定要不要调整。不要一上来就冲0.80那是给自己找麻烦。2.4 Macro摆放不是摆进去就行Macro摆放是Floorplan里最考验经验的部分。几个核心原则原则一数据流方向决定相对位置。如果macro A的输出要送到macro B那它们应该相邻且pin对着pin。你可以画一张数据流图把主要的数据通路标出来然后按这个图来摆。原则二halo要留够。Halo是macro周围禁止放standard cell的区域。为什么要留halo因为macro的pin需要routing空间而且macro边缘的std cell如果贴太近pin access会很困难。一般halo在2-5um具体看工艺和pin密度。# 设置macro halo addHaloToBlock 3 3 3 3 -allBlock原则三channel宽度要算清楚。两个macro之间的channel要能容纳穿过这个channel的net数量 × 每条net需要的track数power stripe的宽度一些余量一个粗略的估算公式channel_width ≈ (net_count × track_pitch) / metal_layer_count power_width 2um原则四orientation要统一。Macro的orientationR0, R90, MX, MY等会影响pin的位置和power rail的方向。同一个row里的macro最好用相同的orientation否则power rail对不上followpin很难打。2.5 实操心得Floorplan阶段必须做的三个检查做完Floorplan不要急着往下走先做这三个检查检查一congestion预估。用reportCongestion或者跑一个快速的global route看有没有明显的hotspot。如果有调整macro位置或者加大channel。检查二connectivity检查。用checkPlace确认所有instance都放好了没有overlap没有出界的。检查三power connectivity。用checkPGConnectivity确认所有power pin都能连上没有floating的。这三个检查花不了十分钟但能帮你提前发现80%的问题。3. Powerplan核心技巧与实操细节3.1 Powerplan的目标让每个cell都能喝到电Powerplan的本质是构建一个从pad/ring到每个standard cell的power delivery network。这个网络要满足两个条件connectivity每个cell都连上和IR-drop电压降在预算内。IR-drop的预算一般是VDD的5%-10%。比如1.0V的VDDIR-drop预算就是50-100mV。这个预算要分配给整个networkring、stripe、followpin、via每一段都有电阻加起来不能超预算。3.2 Power Ring外围的第一道防线Power ring是围绕core区域的一圈或多圈metal负责把power从pad引到core内部。# 创建power ring addRing -spacing {0.5 0.5} -width {2.0 2.0} -layer {top M8 bottom M8 left M7 right M7} \ -offset {5.0 5.0 5.0 5.0} -center 1 -type core_rings \ -nets {VDD VSS}几个关键参数layer一般用最上面两层厚metal因为电阻小。M8走horizontalM7走vertical这样ring的四个边能连起来。widthring宽度取决于电流大小。粗略估算I P/V然后根据metal的current density limit算宽度。一般2-5um。spacingVDD和VSS之间的间距看工艺的min spacing rule一般0.5-1um。offsetring到core边界的距离。注意事项ring的四个角一定要连上否则power network是断的。Innovus默认会连但如果你手动改过layer要检查一下。3.3 Power Stripe把电送到每个角落Stripe是从ring往core内部延伸的metal条负责把power均匀分布到整个core。# 创建power stripe addStripe -nets {VDD VSS} -layer M7 -direction vertical \ -width 1.5 -spacing 0.5 -set_to_set_distance 30 \ -start_from left -start_offset 10 -switch_layer_over_obs 1 addStripe -nets {VDD VSS} -layer M8 -direction horizontal \ -width 2.0 -spacing 0.5 -set_to_set_distance 30 \ -start_from bottom -start_offset 10stripe间距怎么定这取决于IR-drop预算和followpin的电阻。一般来说stripe间距越小IR-drop越好但routing资源占用越多。典型的间距在20-50um之间。我的经验是先按30um打一版跑IR-drop分析如果超标就加密到20um如果余量很大就放宽到40um。不要一上来就按最密的打那样会浪费大量routing track。stripe宽度怎么定同样取决于电流。但要注意stripe太宽会占用太多routing资源太窄又会导致电阻大。一般1-3um比较常见。3.4 Followpin最后一公里的连接Followpin是沿着standard cell row走的power rail负责把stripe的电送到每个cell的power pin。# 创建followpin addFollowPin -nets {VDD VSS} -layer M1 -width 0.1 -spacing 0.1Followpin一般在M1层因为standard cell的power pin就在M1。宽度由cell的rail宽度决定一般是0.1-0.2um。关键点followpin必须和stripe连上否则cell就没电。Innovus会自动在交叉点打via但你要用checkPGConnectivity确认没有断点。3.5 实操心得Powerplan的五个避坑要点坑一stripe打在macro上面。如果stripe穿过macro会占用macro内部的routing资源导致macro的signal出不来。解决办法是用-switch_layer_over_obs 1让stripe在遇到macro时换层或者手动调整stripe位置避开macro。坑二via打不够。Stripe和followpin的交叉点需要打via但有时候Innovus默认打的via数量不够导致电阻大。可以用setPGViaRule增加via数量。坑三ring和stripe没连上。检查ring的layer和stripe的layer是否有重叠如果没有重叠就不会自动打via。坑四IR-drop分析没做。Powerplan做完一定要跑IR-drop分析用analyzePowerGrid或者Voltus/Redhawk。不要凭感觉觉得应该没问题。坑五忘了signal EM。Power network的EM检查同样重要特别是高电流的stripe。用verifyPowerVia和verifyPowerGrid检查。4. TCL脚本自动化让重复劳动滚蛋4.1 为什么要用TCL而不是GUIGUI点起来直观但有几个致命问题不可复现、不可版本管理、不可批量处理。你今天点了一遍明天换个block又要重新点而且点错了很难查。TCL脚本可以存到git里可以参数化可以一次跑十个block。Innovus的TCL接口非常完整几乎所有GUI操作都有对应的命令。我的习惯是先用GUI探索找到合适的参数后把命令记录下来写成脚本。4.2 Floorplan和Powerplan的TCL脚本模板下面是一个我常用的脚本框架# # Floorplan Powerplan Script # Author: [your name] # Date: [date] # # --- 参数定义 --- set DIE_WIDTH 1000 set DIE_HEIGHT 800 set CORE_MARGIN 15 set UTILIZATION 0.70 set RING_WIDTH 2.0 set STRIPE_WIDTH 1.5 set STRIPE_PITCH 30 # --- 初始化 --- init_design # --- Floorplan --- floorPlan -site core_site -r 1.0 $UTILIZATION \ $CORE_MARGIN $CORE_MARGIN $CORE_MARGIN $CORE_MARGIN # --- Macro摆放 --- # 这里根据具体设计写place_inst命令 # place_inst macro_A 100 200 R0 # place_inst macro_B 300 200 R0 # --- Halo设置 --- addHaloToBlock 3 3 3 3 -allBlock # --- Power Ring --- addRing -spacing {0.5 0.5} -width $RING_WIDTH \ -layer {top M8 bottom M8 left M7 right M7} \ -offset {5 5 5 5} -center 1 -type core_rings \ -nets {VDD VSS} # --- Power Stripe --- addStripe -nets {VDD VSS} -layer M7 -direction vertical \ -width $STRIPE_WIDTH -spacing 0.5 \ -set_to_set_distance $STRIPE_PITCH \ -start_from left -start_offset 10 -switch_layer_over_obs 1 addStripe -nets {VDD VSS} -layer M8 -direction horizontal \ -width $STRIPE_WIDTH -spacing 0.5 \ -set_to_set_distance $STRIPE_PITCH \ -start_from bottom -start_offset 10 # --- Followpin --- addFollowPin -nets {VDD VSS} -layer M1 -width 0.1 -spacing 0.1 # --- 检查 --- checkPlace checkPGConnectivity reportCongestion # --- 保存 --- saveDesign ./db/floorplan_powerplan.enc这个脚本可以直接改参数复用。关键是把所有可变参数提到最上面方便调整。4.3 常见TCL报错与排查报错一cant read xxx: no such variable原因变量没定义或者拼写错误。检查变量名确认在引用之前已经set过。报错二Error: Cannot find site core_site原因LEF里没有定义这个site或者LEF没读进来。检查read_lef是否执行成功。报错三Error: Net VDD not found原因网表里没有VDD这个net或者名字不对。用reportNet确认power net的名字。报错四Error: Layer M8 does not exist原因工艺里没有M8或者LEF里没定义。检查metal stack。5. 常见问题与排查技巧实录5.1 Floorplan阶段常见问题速查表问题现象可能原因排查方法解决方案Place后congestion严重utilization太高/channel太窄reportCongestion降低utilization或加大channelMacro出界坐标算错/orientation不对checkPlace重新计算坐标Power pin连不上halo太小/pin方向不对checkPGConnectivity加大halo或调整orientation时序违例多关键模块距离太远reportTiming调整macro位置Die面积浪费margin太大/utilization太低目视检查压缩margin或提高utilization5.2 Powerplan阶段常见问题速查表问题现象可能原因排查方法解决方案IR-drop超标stripe太稀/宽度不够analyzePowerGrid加密stripe或加宽EM违例电流密度超限verifyPowerGrid加宽stripe或增加viaFloating power pinfollowpin没连上stripecheckPGConnectivity检查via是否打上Stripe穿过macro没设switch_layer目视检查加-switch_layer_over_obsRing断开layer不连续目视检查检查ring的layer设置5.3 独家避坑技巧技巧一Floorplan之前先画一张草图。在纸上或者用drawing工具把die、macro、主要数据流画出来。这比直接在Innovus里拖拽效率高得多。技巧二Powerplan的stripe间距用黄金比例。我一般按core宽度的1/20到1/30来定stripe间距。比如core宽1000umstripe间距就定30-50um。这个经验值在多数设计里都适用。技巧三IR-drop分析要分区域看。不要只看全局平均值要看worst case在哪个区域。往往是某个角落的cell离stripe太远导致IR-drop大。技巧四保存多个版本。Floorplan和Powerplan阶段会反复调整每改一版就saveDesign一个不同的名字。我一般用fp_v1, fp_v2, pp_v1这样的命名。这样改坏了可以随时回退。技巧五用GUI做探索用TCL做固化。新手容易陷入纯GUI或纯TCL的极端。正确的做法是先用GUI快速试几种方案找到感觉后把命令导出成TCL然后基于TCL做精细调整。6. 从LAB到实战下一步该练什么6.1 建议的练习路径如果你刚学完LAB Day3建议按这个顺序练习复现LAB不看答案自己从头跑一遍遇到问题查文档改参数把utilization从0.70改到0.80看congestion怎么变换设计找一个不同规模的block用同样的脚本跑一遍加约束加入timing constraint看Floorplan怎么调整做对比同一个设计做两版Floorplan对比Place后的timing和congestion6.2 进阶方向Floorplan和Powerplan只是后端流程的开始。接下来你需要深入的是Placement怎么用place_opt优化时序和congestionCTSclock tree怎么建skew怎么控Routing怎么用nanoroute做detail routingSignoffSTA、IR-drop、EM、DRC的完整检查流程每一个方向都够你钻研几个月。但Floorplan和Powerplan是基础中的基础这两个做不好后面全是坑。6.3 面试中常被问到的点数字后端面试里Floorplan和Powerplan是高频考点。常见问题包括你怎么决定core utilizationMacro摆放的原则是什么Power ring的宽度怎么算IR-drop超标怎么排查Floorplan阶段怎么预估congestion这些问题的答案都在前面的内容里。但面试官想听的不是标准答案而是你的实际经验。所以平时做项目的时候要多想为什么把踩过的坑记下来面试的时候就是最好的素材。我个人在实际操作中的体会是Floorplan和Powerplan这两个步骤经验比理论重要但理论能帮你少走弯路。刚开始做的时候多问自己几个为什么这么放、为什么这么打慢慢就形成直觉了。到后来你打开一个block看一眼网表和面积大概就知道该怎么floorplan了。这个直觉不是天生的是几十个项目喂出来的。最后再分享一个小技巧每次做完Floorplan和Powerplan把关键参数和决策理由记在一个文档里。比如这次utilization用0.72因为组合逻辑占比高、stripe间距用25um因为IR-drop预算紧。积累多了你就有了自己的经验数据库下次遇到类似设计直接查表就行。
返回列表