ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

数字后端Function ECO全流程:从LAB验证到Tapeout的Innovus实战指南

数字后端Function ECO全流程:从LAB验证到Tapeout的Innovus实战指南 数字后端做到Function ECO这一步基本意味着芯片已经进入收尾阶段RTL冻结、网表迭代过好几轮、时序也差不多收敛了。这时候如果前端突然丢过来一个小改动——比如某个模块的逻辑要微调、某个信号要重新组合、某个功能要加个旁路——你不可能重新跑一遍完整的综合加PR流程那代价太大了。Function ECO就是干这个的在已有的物理布局和布线基础上只改动必要的逻辑和连线把功能变更落地同时尽量不破坏已经收敛的时序和物理状态。我做过好几个从LAB阶段一直跟到Tapeout的项目Function ECO几乎每次都会遇到少则两三轮多则七八轮。这篇就把Innovus里Function ECO的完整流程拆开讲清楚从LAB环境下的验证到最终Tapeout前的收尾每一步为什么这么做、容易在哪里翻车、怎么验证改对了都尽量说透。适合已经有一定数字后端基础、正在做或即将做Function ECO的工程师参考也适合想了解后端ECO全貌的前端设计者。1. Function ECO到底在改什么1.1 和Metal ECO的本质区别很多人一听到ECO就想到改金属层其实ECO分两大类Metal ECO和Function ECO。Metal ECO只动金属连线不改标准单元的逻辑功能通常靠spare cell或者gate array来实现改动小、风险低、周期短。Function ECO则不一样它需要真正改变电路的逻辑功能意味着可能要新增标准单元、删除标准单元、重新连接信号甚至改动组合逻辑的表达式。为什么这个区别重要因为Function ECO的复杂度高一个量级。Metal ECO你只需要在已有的spare cell里找合适的门改几根金属线就行Function ECO你得考虑新加的逻辑放在哪里、和周围单元的拥塞关系、新增连线对时序的影响、改动后的功能是否正确。换句话说Metal ECO是接线问题Function ECO是逻辑物理时序的三重问题。在实际项目里前端提ECO请求时有时候会明确说是Function ECO还是Metal ECO有时候只说改个逻辑。这时候你得自己判断如果只是把两个信号换个顺序、加个mux选择、改个使能条件那大概率是Function ECO如果只是把某根线从A点接到B点、或者把某个门的输出换个负载那可能是Metal ECO。判断错了后面全白做。1.2 为什么Function ECO在LAB阶段就要开始验证LAB这个词在数字后端语境里通常指的是一个受控的验证环境可能是FPGA原型验证平台也可能是仿真加速器或者是某种硬件仿真环境。Function ECO在LAB阶段验证的意义在于在流片之前用可编程硬件把改动后的逻辑跑一遍确认功能正确。为什么不在仿真里验证就完了因为仿真有它的局限。仿真跑的是RTL或者门级网表速度慢、覆盖有限而且仿真环境里的时序是理想化的。LAB环境跑的是接近真实的硬件能暴露一些仿真里看不到的问题比如跨时钟域的实际行为、复位序列的时序、上电初始化的状态。Function ECO改动的逻辑如果涉及这些敏感路径LAB验证就是最后一道防线。我个人的经验是Function ECO在LAB阶段验证通过之后心里才真正有底。仿真通过只是理论上对LAB通过才是实际上对。当然LAB验证也有代价需要把改动后的网表重新映射到LAB平台上这个过程本身也可能引入问题所以LAB验证和Innovus里的ECO实现要配合着做。1.3 从LAB到Tapeout的完整链路整个链路大致是这样的前端提出ECO请求后端在Innovus里实现Function ECO生成改动后的网表和DEF然后这个网表要送到LAB环境验证验证通过后回到Innovus做最终的时序收敛和物理验证最后Tapeout。这个链路里最容易出问题的环节是网表的一致性——Innovus里改完的网表和LAB环境里跑的网表必须是同一个版本否则验证通过也没意义。我见过一个项目Innovus里ECO改完了LAB也验证通过了结果Tapeout前发现LAB用的网表是ECO之前的版本等于白验证。这个坑的根源是版本管理没做好。所以从ECO开始到Tapeout每一个版本的网表、DEF、时序报告都要有明确的标记和归档不能靠记忆。2. Innovus里Function ECO的实现机制2.1 ECO文件的来源与格式Function ECO在Innovus里的入口通常是一个ECO文件这个文件可能来自前端综合工具也可能来自RTL改动后的重新综合还可能是手工写的。常见的格式有几种一种是Verilog ECO脚本用类似ecoAddRepeater、ecoDeleteRepeater、ecoChangeCell这样的命令描述改动另一种是网表diff前端把改动前后的网表对比生成一个差异文件还有一种是Tcl脚本直接调用Innovus的ECO命令。不管哪种格式核心信息都是一样的哪些单元要加、哪些要删、哪些连接要改。我一般会先把ECO文件读一遍理解改动的意图然后再动手。为什么要先读因为ECO文件有时候会有冗余操作比如先删一个单元再加一个同样的单元或者改了一根线又改回来。先读一遍能避免做无用功也能提前发现潜在的问题。提示拿到ECO文件后先别急着source。用文本编辑器打开看看改动的规模和类型。如果改动涉及几百个单元那可能不是Function ECO而是重新综合了这时候要重新评估流程。2.2 ecoPlace与ecoRoute的核心逻辑Innovus里Function ECO的核心命令是ecoPlace和ecoRoute。ecoPlace负责把新增的单元放到合法位置ecoRoute负责把新增的连线布通。这两个命令看起来简单但里面的参数和策略很讲究。ecoPlace的关键在于放置策略。新增的单元放在哪里直接影响后续的布线难度和时序。如果放在拥塞区域可能布不通如果放得太远时序会变差。Innovus的ecoPlace默认会考虑拥塞和时序但默认策略不一定适合所有情况。我一般会根据改动的性质调整如果改动是时序敏感的用-timingDriven如果改动区域已经很拥塞用-congestionDriven如果只是加几个无关紧要的缓冲器默认策略就够了。ecoRoute的关键在于布线层次和线宽。新增的连线如果走在已经拥挤的金属层上可能会引起DRC。Innovus的ecoRoute默认会尽量走短线、走低层但有时候低层已经满了就得往上走。我通常会先跑一遍ecoRoute看看DRC报告如果DRC太多再调整布线策略或者手动干预。2.3 新增单元的选择与替换Function ECO里新增单元的选择是个技术活。前端给的ECO文件里可能指定了单元类型比如加一个AND2X1但实际库里可能没有AND2X1只有AND2X2或者AND2X4。这时候你得选一个合适的替换。选大了浪费面积和功耗选小了驱动能力不够。我的经验是优先选驱动能力接近的。如果ECO文件指定的是X1库里只有X2和X4那选X2。如果指定的是X4库里只有X2和X8那看负载——负载轻选X2负载重选X8。另外还要看这个单元在时序路径上的位置如果是关键路径宁可选大一点保证时序如果是非关键路径选小一点省面积。还有一个容易忽略的点单元的pin排列。不同驱动能力的同一个逻辑门pin的位置可能不一样。如果新增单元要接到已有的网络上pin位置不对可能导致布线绕远。Innovus的ecoPlace会考虑这个但如果你手动放置就得注意。3. LAB验证与Innovus的协同3.1 LAB环境对网表的要求LAB环境跑的是硬件对网表的要求和仿真不一样。仿真可以容忍一些不物理的东西比如理想的时钟、无延迟的连线LAB环境不行它需要真实的时序信息。所以送到LAB的网表必须是经过Innovus处理、有时序信息的网表通常是门级网表加上SDF文件。SDF文件里包含了每个单元的延迟和每根连线的延迟。Function ECO改动之后新增的单元和连线也要有对应的延迟信息。Innovus在ecoRoute之后可以生成更新后的SDF这个SDF要一起送到LAB。如果SDF没更新LAB跑的还是旧时序验证结果就不可信。我遇到过一个情况ECO改完之后网表更新了但SDF忘了更新LAB验证通过了结果Tapeout后芯片在某个 corner 下时序违例。这个坑的教训是网表和SDF必须同步更新缺一不可。3.2 网表一致性检查的实操方法网表一致性检查听起来简单做起来容易漏。我的做法是分三步第一步比对网表文件的单元数量和类型第二步比对关键信号的连接关系第三步比对时序约束和SDF的对应关系。第一步可以用脚本做统计两个网表里每种单元的数量如果有差异说明ECO改动没完全同步。第二步要针对ECO涉及的信号检查它们在两个网表里的驱动和负载是否一致。第三步是检查SDF里的时序弧是否覆盖了所有新增的单元和连线。注意网表一致性检查不能只看文件大小或者行数必须做实质性的比对。我见过两个网表文件大小一样但内容不同的情况因为ECO改动恰好是替换了一个单元行数没变但单元类型变了。3.3 LAB验证通过后的回标流程LAB验证通过之后要把验证结果回标到Innovus里。这个回标不是简单的打个勾而是要确认LAB里跑的网表和Innovus里的网表是同一个版本然后把LAB验证的结论作为Tapeout的依据之一。回标的具体操作包括记录LAB验证的日期、网表版本号、SDF版本号、验证的测试用例和通过情况把这些信息归档到项目文档里在Innovus里标记这个版本为LAB验证通过。如果后续还有ECO改动这个标记就失效了需要重新验证。我个人的习惯是每次ECO改动后生成一个版本号比如eco_v1、eco_v2所有相关文件都用这个版本号命名。LAB验证通过后在版本号后面加_lab_pass。这样一眼就能看出哪个版本验证过了。4. 时序收敛与物理验证的收尾4.1 ECO后的时序修复策略Function ECO改完之后时序通常会变差因为新增的单元和连线引入了额外的延迟。这时候需要做时序修复。修复的策略取决于违例的严重程度如果只是小的setup违例可以通过调整单元驱动能力或者加缓冲器解决如果是大的违例可能需要重新布局或者调整时钟树。我一般会先跑一遍report_timing看看违例的路径和程度。如果违例集中在ECO改动区域附近那说明是局部问题局部修复就行如果违例扩散到其他区域那可能是ECO改动影响了全局的时序平衡需要更全面的分析。修复的时候要注意不要为了修时序而破坏功能。加缓冲器、换单元这些操作不能改变逻辑功能否则LAB验证就白做了。Innovus的时序修复命令默认会保持逻辑等价但如果你手动改就得自己保证。4.2 DRC与LVS的最终检查ECO改动之后DRC和LVS必须重新跑。DRC检查的是物理规则比如线宽、间距、通孔LVS检查的是版图和网表的一致性。Function ECO新增的单元和连线可能引入新的DRC违例也可能导致LVS不匹配。DRC违例常见的有新增连线太靠近已有连线导致间距违例新增通孔不符合工艺要求新增单元和周围单元的重叠。LVS不匹配常见的有新增单元的连接关系在版图和网表里不一致删除单元后版图里还有残留替换单元后pin连接错了。我的做法是ECO改完后先跑一遍DRC把违例修完再跑LVS确认版图和网表一致最后再跑一遍时序确认修复DRC和LVS的过程中没有引入新的时序问题。这个顺序不能乱因为修DRC可能动连线动连线可能影响时序。4.3 Tapeout前的最终签核清单Tapeout前的签核是个清单式的过程每一项都要确认。Function ECO相关的签核项包括ECO改动是否全部实现网表和SDF是否同步更新LAB验证是否通过时序是否收敛DRC和LVS是否干净功耗是否在预算内IR drop是否满足要求。这个清单看起来繁琐但每一项都是血泪教训换来的。我见过因为漏了一项导致Tapeout后芯片功能异常的案例也见过因为时序没收敛导致芯片降频的案例。Function ECO虽然改动小但它是流片前的最后改动一旦出错代价是整颗芯片。提示签核清单最好做成表格每项后面留签字栏谁确认谁签字。这样责任明确也不容易漏项。5. 那些年踩过的Function ECO坑5.1 单元替换导致的时序突变有一次ECO要求把一个缓冲器换成反相器对理论上延迟应该差不多但实际换完之后时序突然变差了很多。排查发现替换后的反相器对里第一个反相器的驱动能力选小了导致驱动后续负载时延迟增大。这个坑的教训是单元替换不能只看逻辑等价还要看电气特性。后来我的做法是替换单元时先查库里的时序表对比替换前后的延迟和驱动能力确认差异在可接受范围内再动手。如果差异大就调整替换方案比如换更大驱动能力的单元或者加缓冲器补偿。5.2 ECO区域拥塞导致的布线失败还有一次ECO新增了十几个单元都放在同一个区域结果ecoRoute跑完之后大量DRC违例根本修不完。原因是那个区域本来就很拥塞新增单元让拥塞雪上加霜。这个坑的教训是ECO放置要考虑区域拥塞不能只看时序。解决办法是把新增单元分散放置或者放到相对空闲的区域用稍长的连线换取布线可行性。Innovus的ecoPlace有拥塞驱动的选项但默认不一定开需要手动指定。如果改动量大还可以考虑先做局部去拥塞再放新增单元。5.3 LAB与Innovus网表版本错位前面提过网表版本错位的坑这里再展开说一下。那次是LAB验证通过了但Tapeout前发现LAB用的网表是ECO之前的版本。原因是LAB环境的网表更新流程和Innovus的ECO流程是两条线中间没有同步机制。这个坑的教训是版本管理要有强制同步点。后来我们的做法是ECO改完后由一个人负责生成统一的网表包包含网表、SDF、约束文件打上版本号同时发给LAB和Tapeout团队。LAB验证通过后在版本号上标记Tapeout团队只接受标记过的版本。这样就不会错位了。5.4 时序修复引入的功能改变这个坑最隐蔽。有一次时序修复时为了修一条违例路径工具自动把一个组合逻辑门的驱动能力换大了但换的时候选错了单元类型把一个AND门换成了OR门。逻辑功能变了但时序报告看起来是好的。幸好LAB验证发现了功能异常否则就流片了。这个坑的教训是时序修复后必须做逻辑等价性检查。Innovus有verify_eco之类的命令可以做这个检查但很多人会跳过。我的做法是每次时序修复后跑一遍形式验证确认逻辑没变。形式验证比仿真快而且覆盖更全。6. 从实战中沉淀的几条硬经验6.1 ECO改动要小步快跑Function ECO最忌讳一次改太多。改动越大引入问题的概率越高排查也越难。我的经验是如果ECO请求包含多个独立的改动尽量拆成多次ECO每次改一个验证一个再改下一个。这样即使出问题也能快速定位是哪个改动引起的。当然小步快跑也有代价就是ECO次数多每次都要走一遍流程。但相比一次大改动出问题后从头排查这个代价是值得的。我做过一个项目前端一次提了五个改动我们拆成五次ECO中间发现其中一个改动有时序问题单独修复了其他四个没受影响。如果一次全改可能五个都得回退。6.2 每次ECO都要有完整的验证闭环验证闭环的意思是改动、验证、确认三步缺一不可。改动是Innovus里的实现验证是LAB或者仿真确认是人工检查结果。很多人做完改动直接跑仿真仿真过了就认为OK跳过了人工确认。但仿真有可能因为激励不全面而漏掉问题人工确认能补上这个缺口。人工确认包括检查ECO文件里的每一项改动是否都实现了检查新增单元的连接关系是否正确检查时序报告里有没有异常检查DRC和LVS报告。这些检查看起来繁琐但能拦住大部分低级错误。6.3 文档和版本管理是生命线Function ECO从LAB到Tapeout中间涉及的版本、文件、报告非常多。如果没有好的文档和版本管理很容易乱。我的做法是每个ECO建一个目录里面放ECO文件、改动后的网表、SDF、时序报告、DRC报告、LVS报告、LAB验证结果。目录名用版本号比如eco_v3_lab_pass。另外每次ECO的关键决策要记录比如为什么选这个单元、为什么用这个放置策略、时序修复时改了什么。这些记录在后续排查问题时非常有用。我见过因为没有记录导致同样的问题重复出现的情况。6.4 和前端保持同步沟通Function ECO虽然是后端在做但改动的意图来自前端。如果对改动的理解有偏差做出来的东西可能不是前端想要的。所以从拿到ECO请求开始就要和前端保持沟通确认改动的意图、确认单元替换的可行性、确认验证的覆盖范围。我遇到过一次前端要求加一个mux我理解成二选一的mux结果前端要的是四选一的mux。幸好沟通及时没造成返工。这个教训是ECO请求里的模糊描述一定要问清楚不能靠猜。7. 写在最后Function ECO这个环节技术难度不算最高但琐碎程度和风险程度都很高。它考验的不是某个单点技能而是流程管理、细节把控、跨团队协同的综合能力。从LAB到Tapeout每一步都要稳每一个版本都要清晰每一次验证都要闭环。我个人的体会是做Function ECO宁可慢一点、细一点也不要图快。因为这是流片前的最后改动一旦出错前面所有的努力都可能白费。把每一次ECO都当成最后一次来做心态上重视操作上严谨流程上闭环基本就不会出大问题。另外工具是死的人是活的。Innovus的命令和选项很多但核心逻辑就那么几条改动要合法、放置要合理、布线要可行、时序要收敛、功能要正确。抓住这几条剩下的就是熟练度和经验积累了。
返回列表