ARTICLE DETAIL

资讯详情

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

StarRC增量ECO流程:版图寄生提取从8小时压缩到40分钟

StarRC增量ECO流程:版图寄生提取从8小时压缩到40分钟 最近这半年我把团队里一个两百万门级SoC的版图寄生提取时间从平均七八个小时压到了四十分钟以内。靠的不是加机器而是把StarRC的incremental ECO flow真正用明白了。芯片到了MPW前/tapeout前的ECO冲刺阶段版图几乎每天都会改一版要么前端改了RTL要么后端修了几百条hold violation要么只是金属层微调了几根线。每一版改动之后都需要重新提寄生参数、重新出SPEF、重新跑PT时序。如果每次都全量提取一颗百万门级设计在先进工艺下跑七八个小时是家常便饭一天只能转一个版本节奏完全被拖死。StarRC的ECO_MODE就是干这个用的它允许你在上一版全量提取结果的基础上只重新提取ECO发生变化区域里的寄生参数其余未变化部分直接复用旧的提取结果。听起来很像“增量编译”——本质思路确实接近但寄生提取里的“增量”远比编译要复杂挖得越深越能发现里面都是坑。这篇就把StarRC incremental ECO flow从原理到实战完整拆一遍重点放在ECO_MODE的用法、新旧数据库匹配、结果验证和排错上。1. 为什么后端工程会把提取时间压到ECO_MODE上1.1 ECO场景的现实压力每晚都要出新时序报告先看一个非常典型的后端节奏。晚上八点前端交了一版ECO网表后端在Innovus/ICC2里place ECO cell、ECO route十一点之前跑完DRC/LVS的局部验证然后开始提寄生目标是明早九点之前给出新版本的签核时序。中间真正留给寄生提取和PT的时间窗口可能只有五六个小时。这个窗口对全量提取来说就是灾难。一颗150万到200万实例的芯片7nm下12层金属全量StarRC提取在32核机器上基本要跑到6到10小时内存占用动不动超过100GB。算力强的团队可以堆机器但很多团队并没有那么多license和大内存机器唯一的出路就是让工具少算。StarRC incremental ECO flow正是为此设计的。假设今晚的ECO只是换了800个cell的驱动强度、加了几百个delay buffer对整颗芯片几百万条net来说真正物理上变化的区域占比不到1%。这种情况下却要花七八个小时重新计算全部寄生纯属浪费。ECO_MODE让StarRC只对“变化区域”做全精度的重新提取其他未变net直接读上一版SPEF里的结果。实测下来常规时序ECO几百到几千cell能把这个环节压到1至2小时内存也能省下30%到40%。这意味着每天晚上能多跑两轮ECO验证项目组整体节奏完全不一样了。1.2 哪些ECO适合增量提取哪些不适合不是说所有ECO都适合走增量选型错了反而比全量还慢。适合走ECO_MODE的场景共同点是“改动范围小、区域相对集中、不涉及整芯片布局重构”驱动强度调整/VT更换只是换cell类型物理位置不变几何变化极其局部增量收益最明显。常规时序ECO修hold加buffer/decap、修setup换低VT cell改动几百到几千个instance。金属ECOmetal fix在后端工具里手动eco route了几十条线或者改了某几层金属shape。局部功能ECO某一个模块内的逻辑替换模块范围不大。不适合走ECO_MODE的场景大范围功能ECO导致几万个cell增删或重新摆放。floorplan或者芯片原点发生整体移动。时钟树结构被推翻重做因为影响的sink面太广。顶层power/ground网络大改。ECO变化涉及net数量超过全芯片总net数的8%到10%。我一般会在脚本里先做个ECO diff统计如果变化的instance数量超过全芯片instance总数的5%或者受影响的net数量超过总量的一成直接放弃增量老老实实跑全量。这个比例不一定适合所有工艺节点但作为初始阈值很稳。2. 先弄清ECO_MODE的原理增量提取到底“增”在哪2.1 全量提取是基准没有基准就没有增量寄生提取的本质是把版图上的金属形状、via、接触孔、衬底关系翻译成电阻电容网络再按标准寄生格式SPEF输出给时序工具。StarRC做这件事时会基于工艺文件TLU里的模型参数对每一条net的几何图形做场求解或者模式匹配计算最终得到线电阻、对地电容、耦合电容。全量提取没有任何捷径整个芯片每条net都要算一遍。ECO_MODE能提速的前提是存在一份“可信的、完整的旧版全量提取结果”。StarRC必须知道上一个版本的寄生长什么样才能判断哪些能复用、哪些必须重算。所以任何增量ECO flow的第一步都是先做一版完整全量提取并妥善保存结果——这版结果不仅仅是拿来对比基线用的它还是后续所有增量ECO的数据源。很多人一开始不懂这个逻辑直接把ECO后的版图丢给StarRC、又没保留旧寄生库结果工具根本找不到可复用的数据要么报错要么默默做了全量提取运行时间纹丝未动还以为ECO_MODE没用。2.2 StarRC如何识别“变化”区域StarRC做增量提取时会同时拿到旧版设计数据和新版设计数据在内存里做几何比对instance的坐标、大小、层次关系是否一致net的拓扑结构是否一致金属线的形状、宽度、via位置是否一致cell内部pin的形状是否发生变化。凡是完全一致的部分标记为unaffected寄生结果可以直接复用。凡是出现新增、删除、替换、移动、改线的部分标记为affected必须重新计算寄生参数。这里有个最容易误解的地方一条net只要有一个via位置变动StarRC通常会把整条net标记为受影响而不是只重算那个via附近的寄生。原因是线电阻是一条net上的串联积分某个局部shape变了整条线从driver到receiver的RC分布都可能变局部patch很难拼出一个精确结果。更麻烦的是耦合电容。一条net形状变化会影响它旁边一堆net看到的电容。所以StarRC不仅要重提“变化的那条net”往往还要把变化区域周围一圈的“邻居net”也纳入重新提取范围否则提取出来的耦合电容会失真后面PT做signal integrity分析时会有偏差。这条“受影响邻居圈”的判定是ECO_MODE精度和速度的核心平衡点。圈划小了速度快但耦合电容误差大圈划大了精度高但运行时间蹭蹭往上涨。2.3 ECO_MODE两种模式ECO和OLD怎么选StarRC配置里ECO_MODE常见有两个值ECO和OLD。我不打算背手册只说我在项目里的理解和用法。ECO模式——如果我没理解错它的侧重点是“以新版版图为骨架把旧库里未变化部分的寄生结果嫁接过来”。也就是说StarRC对新版版图做一次完整扫描遇到和旧库完全匹配的instance/net就直接引用旧寄生数据遇到变化的就全精度重新提取。只要改动足够小大部分net都是直接引用所以速度最快。OLD模式——更偏保守旧库的完整数据会被加载为一个基底工具只对受影响区域做覆盖式重提然后把新结果写回旧库最后输出完整SPEF。这种模式对边界处理更稳健但旧库要整体载入内存内存占用更高而且运行时间略长。我的使用习惯是快速回归、改动量小几千cell以内用ECO模式。正式签核、改动规模偏大上万cell用OLD模式。心里没底、第一次跑增量时先用OLD模式把流程跑通看一遍差异再切ECO模式提速。重点提醒不同StarRC版本对ECO_MODE子选项的定义和字段名不完全一致有的版本字段写法都变了强烈建议对照自己安装版本的手册确认。但选型思路是通用的——改动越小越激进改动越大越保守。2.4 为什么增量提取不是“只提变化区域”不少工程师把增量提取想象成“在旧SPEF上局部打补丁改几个数字”这其实是个危险的理解。寄生不是孤立的。一条net的几何变化可能导致周边十几条net的耦合电容变化如果只改这条net而不管邻居后面PT报出来的一条path上可能同时包含新旧两种不一致的寄生数据时序结果会有系统性偏差。另外还有一层ECO修hold时插入的buffer要挂在电源网络上。虽然单个buffer对IR drop影响微乎其微但如果ECO面积较大、电源网络变化较广严格意义上电源网络也需要更新。不过大多数signoff flow默认忽略电源网络寄生更新只把它当作IR分析的一项输入。所以在配置ECO_MODE之前必须理解StarRC一定要重提的是受影响net本身受影响邻域内的耦合关系。这也是为什么增量提取的收益会随ECO面积增大而快速衰减。3. 从全量到ECO增量完整操作流程3.1 第一次全量提取时就要想好“留给ECO”很多人是在ECO之后才开始想“怎么用增量”这是错误顺序。第一次全量提取时就要为后续ECO做好准备。需要妥善保存的文件清单完整的SPEF文件每个corner一份StarRC的输出日志提取版本和警告信息旧版DEF/版图数据库旧版网表当时使用的TLU工艺文件和层映射文件StarRC配置文件本身。我建议每个ECO版本的文件按版本号归档而不是把新旧文件覆盖在同一个目录下。因为增量ECO的匹配和验证经常需要把旧版数据和新版数据放在同一个环境里对比归档混乱会直接导致后续排错困难。多corner场景下每个corner的全量结果都要单独保存命名里带上corner名。ECO运行时每个corner对应自己的旧库绝不能混。3.2 ECO完成后的配置与命令写法ECO完成后拿到新DEF/新网表开始配置增量提取。下面给一个经典配置格式的示意注意StarRC版本不同字段名可能有差异实际以本地版本手册为准# star_eco.cfg —— 增量提取配置示例 *OLD_SPEF /path/prev_ff_0p80v_125c.spef *ECO_MODE ECO *NETLIST_FILE /path/top_eco.v *TLUPLUS_FILE /path/tluplus_ff_0p80v_125c.tlu *TLUPLUS_MAP_FILE /path/layermap_tluplus.map *OUT_SPEF /path/top_eco_ff_0p80v_125c.spef *OUTPUT_LOG /path/star_eco_ff.log运行命令和全量提取基本一样关键变化就是配置里多了旧SPEF的指向并且ECO_MODE被显式打开。有些版本支持命令行传参与配置配合使用写法类似starxtract -config star_eco.cfg -out_dir ./rc_out跑起来之后一定要盯着log观察几个数字识别出多少个变化instance识别出多少个变化net有多少条net直接复用了旧寄生是否有warning提示匹配失败。如果log里显示变化net数量为0说明StarRC根本没有把新旧版本区分开输出结果要么是旧版要么是错误数据。我遇到过好几次原因是新旧DEF文件名都叫top.def.gz跑的时候工具读了旧文件表面跑得很顺畅实际在拿上一版结果应付差事。3.3 验证输出SPEF不是简单看一眼增量提取跑完不能只看log里报“ECO done”就认为万事大吉。SPEF的质量验证是ECO_MODE流程里绝对不能省的一步。第一步检查SPEF头部。*DESIGN名称、*DATE时间戳、corner标签确认真的是新版本生成的文件而不是旧文件被复制过来。第二步看总电容和总电阻的量级。和上一版全量SPEF做对比如果新版总电容比旧版低了20%以上大概率是大量net没匹配上旧库、寄生被漏掉。第三步算净覆盖率。拿新版网表里的net list去比对SPEF里的*D_NET覆盖率低于99.5%就要查原因。这个脚本可以自己写逻辑不复杂但价值极高。第四步抽检变化区域周边的10到20条net用小范围全量提取做一次对照RC总值偏差应该在几个百分点以内。偏差过大说明ECO_MODE的邻域圈划得不够要调整配置。第五步也是最终验证把新旧SPEF分别喂给PT对比ECO前后非改动区域的path delay偏差。正常情况偏差应在0.1%到0.5%以内超过1%就得回头查提取。3.4 与PT的ECO时序闭环增量提取之后PT端的验证要形成一个闭环。读入ECO后的网表读入新SPEF约束用ECO前基线SDC如果有约束改动需同步更新然后至少出三份报告ECO前基线时序ECO后增量SPEF时序ECO后全量SPEF时序有时间就做没时间至少抽关键path。增量结果和全量结果在ECO区域外的path delay应该很接近在ECO区域内允许有合理偏差。如果两条path差得离谱不要着急调约束或者改网表先回StarRC做全量复验确定问题在提取侧还是逻辑侧。我在项目里养成了固定动作每次增量提取完脚本自动挑最差的十条path把增量SPEF和上版全量SPEF的path delay做成对比表。偏差超过0.5%就自动标红触发人工review。这个习惯帮我抓住了好几次因为旧库匹配异常导致的静默错误。4. 容易踩的坑与排查链路4.1 匹配失败旧结果找不到或对不上这是ECO_MODE最常遇到的问题现象是log报“Cannot find old DB”或者跑完后SPEF的net覆盖率极低。排查思路按顺序走确认旧SPEF路径可读文件没被归档到别的机器上。确认新旧设计顶层模块名一致大小写都要一致。确认网表里bus信号的命名规则一致比如data[0]在不同工具里可能被写成data0或者data_0_这些差异都会被匹配逻辑视为不同net。最关键的一步确认新旧DEF的芯片原点(die origin)是否一致。很多工具在ECO后再导DEF时如果操作时不小心移动了origin整个芯片所有坐标整体平移StarRC按几何位置去匹配旧库就会全部失败。确认两个版本用的是同一套TLU工艺文件和映射文件改工艺文件后旧库本身就不能再复用了。坐标平移这个问题最容易静默发生因为版图工具上看起来一切正常但几何坐标全变了。我自己吃过一次大亏ECO后忘了固定chip origin跑出来的增量SPEF在PT里全线乱掉最后追了半天才发现是坐标问题。4.2 变化区域太大增量退化还多花时间ECO_MODE能提速的根本前提是“大部分没变”。一旦变化区域大到某个临界点增量模式反而比全量更慢——因为它既要扫描对比新旧数据又要做merge还得处理边界全是额外开销。log里如果出现类似“ECO range exceeds thresholdfalling back to full extraction”的warning说明工具自己已经判断该退化成全量了。如果没有这个warning但运行时间异常长手动算一下变化net占比超过10%就别等了直接停掉改全量配置重跑。我现在的脚本里直接写了门控逻辑ECO diff报告里的变化net比例超过8%自动跳过增量、直接生成全量配置。把判断交给自动化远比每次手工判断稳妥。4.3 时钟网络必须单独对待时钟树上的ECO是特殊的。哪怕只多插了一个buffer影响的绝不只是附近一条net而是整棵clock tree的到达时间因为sink多了一个负载中间buffer的驱动需求变了skew和insertion delay都会受影响。所以在增量ECO flow里我强烈建议把时钟网络和普通数据网络分开对待时钟树相关的instance/net发生了ECO不参与增量复用直接全量重提数据通路的ECO才走ECO_MODE增量。具体做法是在ECO阶段就记录改动清单分类标记哪些是时钟树改动、哪些是数据路径改动。如果时钟树相关改动出现我会在增量提取完成后单独对时钟树做一次全量提取对比验证。这个额外开销通常可控因为时钟树面积不大但换来的安全性很高。4.4 常见问题对照表把我在实际运行中频繁遇到的现象、原因、处理方法整理成一份对照表方便后面排查。现象可能原因处理方法log中Cannot find old DB旧SPEF路径错误/归档丢失检查完整保存清单与路径输出SPEF总电容比全量低20%以上大量net未匹配旧库做net覆盖率统计考虑全量复验merge后出现0R节点新旧网表层次映射异常检查name mapping与总线命名规则运行时间接近甚至超过全量变化区域过大/邻居圈过大检查ECO diff直接改全量SPEF里耦合电容出现重复旧库与新增net重叠检查是否重复载入旧SPEFPT报parasitics not found网表net名与SPEF net名不一致检查netlist版本与SPEF一致性5. 我对ECO_MODE的实际评估什么时候用什么时候别用5.1 真实收益数据与机器配置参考以我这边的实测数据为例。设计规模约200万实例7nm工艺12层金属。机器配置32核2.6GHz内存128GB。全量提取约7到8小时内存约90GB。常规时序ECO修hold加了约800个buffer/decap影响约2000条netECO_MODE约1小时内存约70GB。中等规模ECO换了几万个cell的VT增量约4到5小时优势明显缩小。大规模ECO整模块逻辑替换增量跑了6小时还没完停掉改全量全量4小时结束。这个数据可以很直观地说明ECO_MODE的收益曲线是陡峭的改动越小越香改动大了根本不划算。另外还有一个隐性收益增量提取的内存占用更低意味着可以在更小的机器上跑对大机器license不够的团队也是缓解。5.2 我建议的工程落地方式增量ECO flow要想长期稳定运转不能靠人工判断每次要不要走增量要把判断逻辑沉淀进脚本和流程里。我现在建议团队的标准做法是ECO merge完成后先自动跑ECO diff统计输出变化的instance数、net数、影响面积比例。根据阈值自动选择全量或增量变化net小于8%走ECO_MODE超过阈值直接全量。增量跑完自动做三项检查SPEF是否新旧一致、net覆盖率是否达标、TOP10关键path与上版全量对比偏差是否小于0.5%。归档旧SPEF、新SPEF、ECO diff报告、覆盖率报告全部按版本打包和数据库版本绑定。这套流程里最花心思的是把“结果验证”写进自动化。一开始团队里也有人嫌麻烦觉得多跑几个脚本浪费时间但经历过一次静默漏提之后所有人都默认把这步加进去了。最后再分享一个小技巧。增量ECO的merge逻辑依赖新旧数据的一致性而芯片的顶层命名、总线格式、坐标原点这些“元信息”在不同工具链里最容易漂移。我的建议是在项目一开始就把这些规则固定下来写进设计约束里而不是等到ECO阶段才去对齐。这一条能做到位ECO_MODE的匹配成功率会高出一大截。
返回列表