
做数字后端的人都知道Innovus的Floorplan是整个物理设计的起点也是后面所有烦恼的来源。Floorplan没定好后面Place、CTS、Route全都要跟着遭殃轻则绕线拥塞重则时序收敛不了整个项目推倒重做也不是没见过。这篇博文我想从一个实际使用者的角度把Innovus里基础Floorplan的操作流程拆开揉碎讲一遍争取让刚接触数字后端的新手在5分钟内把一个能用的Floorplan框架搭起来顺带把floorplan流程里最容易踩的坑也列一列。这套内容不是从帮助文档里抄的是我自己在项目里一步一步点出来的经验。不管是学校刚出来准备做后端实习还是从其他工具转到Innovus的工程师这篇都适用。整篇文章以图形界面操作为主线命令给参考大家在看的时候可以打开自己的Innovus工具跟着走一遍体感会比只看文字好很多。1. Floorplan的核心思路与前期准备1.1 Floorplan到底在做什么很多新手拿到Innovus第一反应是我网表都读进来了直接点Place就行了为什么非要先做Floorplan这里我习惯用一个特别土的类比Floorplan就像是租场地办活动你得先把哪个区放舞台、哪个区放观众、门口在哪、电源从哪拉进来都想好然后再让人进场落座。如果一上来就把几千个人随便塞进去后面再想调座位就麻烦了。放到芯片里也一样。Floorplan阶段要确定几件大事芯片整体DIE面积做多大、Core区域怎么摆、各个模块落在什么位置、IO引脚安排在哪个边框、电源网络的主干怎么打。这些都是决定性的物理约束。你后面看到的Place、CTS能不能顺90%在Floorplan阶段就已经注定了。所以“5分钟搞定Floorplan”并不是说5分钟就把所有规划做得尽善尽美而是说用5分钟把一个合理的、可迭代的基础框架立起来让后续工作有抓手。这里也要澄清一个常见误区Floorplan不是一次性工作。项目初期你只需要定一个可用的框架随着时序评估、功耗评估、拥塞评估逐步深入Floorplan大概率是要来回改的。所以新手不要怕改好的后端工程师改Floorplan的次数可能比写RTL的还多。1.2 开工前必须备齐的四样东西在Innovus里做Floorplan不是双击图标把网表读进来就能干的。我见过太多人卡在第一步报错刷了一屏也不知道为什么。其实无非是缺文件或者文件格式不匹配。你需要提前确认四样东西都在。文件类型常见后缀作用综合网表.v / .vg / .svf描述电路逻辑连接关系约束文件.sdc时序约束、时钟定义、输入输出延迟物理库.lef / .tech.lef描述金属层、通孔、设计规则、macro尺寸时序库.lib /.db描述标准单元和宏单元的时序功耗模型这里尤其要强调物理库。新手最容易忽略的就是LEF文件有时候别人给你打包的资料里只有网表和SDC忘了LEF。在Innovus里没有LEF就意味着工具根本不知道金属层怎么走、单元长什么样你说要做电源环sroute工具直接一脸懵。所以拿到一个项目环境第一件事就是把init_design之前的库文件检查一遍宁可多花十分钟确认也不要等报错再回头查。1.3 从零启动Innovus的推荐姿势现在假设文件都齐了我们把Innovus跑起来。现代版本的Innovus一般直接在终端敲innovus就能进图形界面进去之后建议先建一个干净的workspace目录把网表、约束、库文件都放好或者设置好路径。我自己习惯在启动前把环境变量和库路径都写在脚本里避免每次切项目都要重新配置一遍。进去之后新手不要着急乱点菜单我推荐用MMMC方式把设计加载进来。简单写一个命令脚本内容大致是set init_mmmc_file ./mmmc.tcl set init_lef_file {./tech.lef ./stdcell.lef ./macro.lef} set init_verilog ./top.v set init_top_cell top set init_pwr_net VDD set init_gnd_net VSS init_design跑完init_design之后图形界面里就会看到网表里所有instance被摊在坐标系里这时候还没做物理规划布局上是杂乱的。别慌这是正常的。接下来就可以进入Floorplan操作了。如果这一步就报错优先排查mmmc.tcl里的时序库路径和LEF路径是否写对了后端项目里80%的启动失败都出在这一步。2. 5分钟完成基础Floorplan的实操流程2.1 用floorPlan命令一次定好DIE和Core设计加载完成之后第一件正事儿就是定Floorplan的整体轮廓。Innovus里最直接的方式是菜单Floorplan - Specify Floorplan...会弹出一个对话框让你填DIE面积和Core面积的相关参数。如果你更习惯用命令也可以敲floorPlan -r来做。一条很经典的命令格式长这样floorPlan -r 1.0 0.7 12 12 12 12这里面的参数不同版本略有差异我自己的习惯是把第一个1.0理解为长宽比第二个0.7是Core利用率后面四个12分别是Left、Bottom、Right、Top四个方向Core到DIE边缘的距离。你敲完这条命令版图上就会立刻出现两条嵌套的方框外面是DIE里面是Core。在GUI对话框里填数的时候也简单直接按设计需求填面积和利用率就行。如果你是第一次做某个芯片不知道面积该开多大可以参考综合报告里给出的cell总面积再除以计划利用率就能估算出Core面积。比如Cell总面积是1.4平方毫米计划利用率开0.7那么Core面积大约2平方毫米再留出IO区域和电源环区域DIE就会更大一圈。很多新手问我为什么不能把利用率开到90%省面积不好吗这里先卖个关子后面专门讲利用率的坑。现在你只需要记得新手保守一点利用率65%到70%是个相对安全的区间后面跑Place和Route会发现幸福很多。2.2 IO规划把引脚摆到该去的地方Floorplan轮廓定好之后第二步是处理IO引脚。IO引脚是芯片跟外界通信的窗口摆在哪里直接决定了后续封装和系统级走线的方便程度。Innovus图形界面里操作IO非常直观菜单入口一般在Place - Pin或者IO Pin面板里你可以看到网表里所有IO端口列出来然后在右侧版图上拖动摆放。实际操作中我会先做分组。比如一组高速接口它们最好扎堆放在同一侧并且靠近相关的硬核模块模拟电源引脚和数字电源引脚要分开避免开关噪声串扰时钟输入引脚要放在离时钟树源头近的地方减少时钟走线延迟。这些经验当时没人教我的话我大概率会随便摆后来做后仿真被IO delay折腾到怀疑人生才明白这里的门道。在5分钟快速流程里你不需要摆得百分百最优先把端口大致分到四条边上方向理顺让工具能完成芯片连接就行。如果你手里有现成的IO位置文件直接在Innovus里用loadIoFile加载效率最高也最不容易出错。之后排列顺序和精确位置再慢慢调。这里有一个我踩过很多次的坑IO pin一旦手动摆放之后千万不要再重新跑一次floorPlan -r因为很多版本的工具会把已经摆好的IO重新打散。如果你需要调整面积最好先保住IO文件重新生成Floorplan之后再加载回来。这种低级失误一次就够你记住好几年。2.3 电源连接与基础PG规划IO摆完之后马上要做的是电源规划。没有电源网络的Floorplan就像没有水管的大楼后面所有标准单元、宏单元都没有供电来源Place工具也会因为没有PG连接而拒绝往下走。第一步是建立全局电源连接关系让工具知道每个标准单元的VDD和VSS引脚对应到顶层哪些电源网络globalNetConnect VDD -type pgpin -pin VDD -inst * -override globalNetConnect VSS -type pgpin -pin VSS -inst * -override接下来打电源环。电源环围绕着Core区域走一圈为内部标准单元供电提供“主管道”。Innovus里可以用Add Ring工具或者命令addRing -nets {VDD VSS} -around core -width 2 -spacing 1 -layer {M5 M6}这里的-width和-spacing要根据工艺库里面金属层的电流密度和设计规则来定。电源环宽度太小会面临电迁移风险说白了就是金属线被大电流慢慢“吹断”这是可靠性问题不是功能问题后端工程师必须重视。电源环层选什么金属也讲究一般会用厚一点的顶层金属因为薄金属电阻大电压降会非常难看。最后是走标准单元电源rail也就是常说的sroute。在Innovus里操作是Route - Special Route或者命令sroute -nets {VDD VSS} -allowJogging true -allowLayerChange truesroute的作用是把每行标准单元的电源rail跟电源环连通你可以把它理解成小区里的支路水管每栋楼都接通了水才能真正送到各家各户。2.4 必要物理单元endcap与tapcell电源网络接好之后还有一件事很多新手容易漏给Standard Row填上endcap和tapcell。可能有人觉得这些小单元又不参与逻辑功能挪一步省点面积不好吗但这类物理单元是工艺制造和抗闩锁效应要求的不是可有可无的东西。Endcap通常放在每一行标准单元的末端用来在行尾形成符合设计规则的边界避免光刻和刻蚀的时候图案边缘变形影响良率。Tapcell则是把衬底和阱连接到电源地为MOS管的衬底提供偏置电压降低闩锁效应风险。在Innovus里可以快速加addEndCap -cell ENDCAP -prefix ENDCAP addTapCell -cell TAPCELL -prefix TAPCELL不同工艺库里的endcap和tapcell命名可能不一样具体单元名要看stdcell库里定义了哪些physical cell。加完这两步之后你去看版图会看到每行标准单元边缘多了一个小的填充单元这就是物理摆放的基础已经打好了。到了这一步一个基础Floorplan框架就可以算初步完成你可以保存设计跑一次check_floorplan看有没有物理规则冲突。时间上我粗略算一下读入设计大约半分钟定轮廓一分钟摆IO一分多钟电源规划一分多钟物理单元一两分钟5分钟是完全够用的。前提是文件准备齐全并且没有在犹豫该填什么参数的环节卡太久。3. 界面与参数背后的“为什么”3.1 为什么Floorplan要先定Core利用率很多新手填utilization这个参数的时候很随意反正填多填少看起来不都行吗实际上这个数字是Floorplan环节最关键的“指挥棒”之一。利用率本质上是Core区域里标准单元和宏单元总面积占Core区域总面积的比例它决定了留给绕线资源的通道有多宽。利用率开太高比如85%以上标准单元塞得满满当当逻辑门是都放得下了但线没地方走。芯片不是只摆元件就完事的元件之间还要大量金属线互连绕线资源不够就会造成congestion也就是拥塞。拥塞的结果就是Route阶段疯狂长噪声加绕线层也救不回来。利用率开太低比如40%芯片面积浪费严重成本直接上升时序也可能因为线拉太长而变差因为单元之间离得远寄生电容变大延迟变大。所以利用率是一个平衡艺术。我自己的经验是普通逻辑模块65%到70%起步含有大量RAM或大macro的模块要把macro面积先扣出来单独规划因为macro周围的通道区域要格外留宽。3.2 DIE到Core的距离不要瞎填floorPlan -r命令里那四个margin参数也就是DIE边界到Core边界之间的距离同样不是随便填的。这个环形区域主要用来放IO单元、电源焊盘、ESD结构也承担着从IO到Core内部的走线过渡功能。如果这个距离太小IO的出走线和内部逻辑的走线会挤在一起非常容易造成局部拥塞。如果太大芯片面积多出来一大圈成本白白增加。具体多大合适跟IO数量、电源pin需求、封装形式都相关。一般我会先按每个IO方向所需的出走通道数量估算留出足够但不夸张的空间。还有一个点容易忽略margin区域将来是要走电源环的。你在加电源环的时候addRing的宽度、间距、绕行圈数都会占用这个环形带的面积。如果一开始margin留得不够后面加完电源环发现IO出走通道被电源金属占满了再改Floorplan就非常痛苦。3.3 GUI里看清Floorplan的关键操作光把数字填对还不够你还得在图形界面里能“看懂”自己的Floorplan才行。Innovus的版图窗口信息量很大新手一打开经常看到一片杂乱的颜色不知道哪里是哪里。我通常第一件事是打开Display - Display Resource把标准单元层、金属层、pin层的显示开关调好只显示当前关心的层次。比如检查电源规划的时候就只打开VDD/VSS相关的金属层和pin层这样一眼就能看出电源环有没有闭合、sroute有没有漏掉某些行。检查模块摆放的时候就打开floorplan里macro的boundary层看看各个宏单元之间的相对位置是否合理。这种“分层查看”的习惯能让你在Floorplan阶段就发现很多潜在问题而不是等到Route之后对着congestion map发呆。另外建议大家养成用快捷键的习惯。Innovus里F适配全图Z放大ShiftZ缩小这些基本操作熟练之后操作效率能提升一大截。做后端本来就是个细活儿如果每一步都要去菜单里翻半天一天下来人会非常疲惫。4. 常见问题与排查技巧实录4.1 读库报错LEF跟lib对不上启动阶段最常见的报错就是LEF文件和lib文件不匹配。具体表现是工具报某个单元在LEF里找不到物理定义或者某个macro的尺寸和lib里描述不一致。大多数情况下是因为工艺库更新换代有人给了你新版的timing lib物理LEF却还是旧的。这种问题排查思路很简单先看报错里提到的单元名然后在LEF文件里搜这个单元是否存在再看两边对于pin的位置和数量描述是否一致。如果是全套库不匹配重新获取正确的LEF版本就好。千万不要自己手工去改LEF文件里的数值工具解析LEF是很严格的事情你手改一个数字后面可能引发一堆莫名奇妙的DRC错误。4.2 Floorplan定完了版图里却看不到东西新手经常遇到一个问题命令都执行成功但图形界面里还是空白一片或者只看到两个框里面什么单元都没有。第一次遇到我也慌了以为是工具坏了。其实大部分情况下只是显示设置把标准单元层和pin层隐藏了。解决办法是把视图做了F全图适配再看Display Resource里有没有显示所有cell层级。还有一种可能是你只加载了top网表没有把子模块展开Innovus里你可以选择看到hierarchical的block或者flatten后的instance切换显示层次就行。如果确认这些都没问题再检查init_design之后log里有没有warning提示很多instance没有放置区域。请在动手删数据之前先静下心看log这是我在新手阶段被训得最多的一句话但它真的救命。4.3 电源环和sroute的结果看起来不对劲电源环画出来之后自己先绕一圈看一遍。常见问题包括电源环没有闭合、某一层金属没有环、sroute只走了部分标准单元行或者VDD和VSS在某个位置发生了短路。这些在GUI里用高亮颜色检查非常直观。出现这类问题先检查globalNetConnect有没有设置完整。很多时候你会看到VDD有连接VSS没连接结果就是sroute只串了半套网络。另外还要检查有没有直接把电源地连接到macro周围的pin上有些macro的PG pin命名不是标准的VDD/VSS需要额外定义globalNetConnect的映射关系。处理电源问题的时候多花十分钟检查比事后跑IR drop发现一片红再去返工要划算太多。4.4 给后续Place和ECO留点余地Floorplan收尾的时候我强烈建议新手多考虑一步后续flow的衔接。你现在做的Floorplan不是只为了自己交差后面还要跑Place、CTS、Route甚至还有ECO。特别是ECO环节很多时候你只是要修一条时序路径但发现标准单元区域已经被塞满工具绕了半天都找不到合适的buffer位置这时候你才会后悔当初为什么没在Floorplan里多留一点宽松度。最近经常有人问innovus eco buffer tree相关的问题其实这个操作能不能做顺很大程度上依赖Floorplan阶段有没有留下足够的spare cell或者空白区域。所以新手在做Floorplan的时候心里就要有“给未来留余地”的概念利用率和区域划分不要抠得太紧宁可让芯片面积稍微大一点点也不要堵死后续所有优化空间。根据我个人经验做完一个基础Floorplan之后保存数据是一个必须养成的习惯因为Floorplan是后续所有物理设计动作的地基。我一般会在每个关键节点都存一个设计快照比如定完轮廓存一个摆完IO存一个加完电源网络再存一个。这样不管后面哪一步改崩了都有机会退回来比较。数字后端这个活儿辛苦是一方面能不能少走弯路是另一方面很多弯路都是从Floorplan阶段埋下的雷开始的。希望这篇关于Innovus Floorplan的实操记录能帮你把第一步走稳。