数模混合芯片后端LVS验证:从Innovus到Calibre的版图与网表一致性检查 1. 从Innovus到Calibre先把数据流捋清楚做数字后端的人几乎没有不被LVS折磨过的。后端流程跑到最后Innovus里时序收敛、DRC干净本以为可以下班了结果Calibre一跑LVS满屏的short和open瞬间打回原形。今天这篇就把我自己从Innovus到Calibre的LVS错误排查流程完整拆开讲一遍包括数据准备、命令脚本、报告解读、几种高频错误的定位思路以及一些平时文档里不会写的坑。不论你是刚接触数字后端的学生还是在项目里被LVS虐过几次的工程师这篇应该能帮你少走不少弯路。LVS全称是Layout vs Schematic说白了就是拿版图去对比原理图。数字后端里“原理图”往往是综合后的门级网表“版图”则是Innovus布局布线后导出的GDS。Calibre只是那个当裁判的工具。很多LVS错误其实根源不在Calibre而是Innovus导出数据时就没准备干净。所以第一步先把里面的数据流搞清楚。1.1 版图数据到底用GDS还是OASISInnovus里做完布线后最终版图一般以GDS或OASIS格式导出。GDSII虽然是老格式但Calibre支持得最稳妥OASIS文件更小实际项目里也有人用。不过别贪便宜如果PDK提供的pipo/runset默认是GDS或者Calibre规则文件里指定的layer map基于GDS层号那就老老实实出GDS。在Innovus的命令行里一句streamOut就能搞定但参数一旦写错后面LVS全盘皆输。这里有一个容易被忽略的点GDS的导出单位。Innovus里默认的database unit通常跟工艺库一致但streamOut时指定-units非常重要。很多工程师习惯性写-units 1000代表输出数据单位是0.001微米也就是1纳米。如果写错成100或者10000Calibre读进来以后所有坐标都会按比例缩放轻则器件尺寸偏差重则整层金属错位报出来的short和open完全不讲道理。所以每次导出后我建议用Calibre RVE或者Klayout快速打开GDS量一下标准单元的尺寸和金属线宽确认没有比例问题再继续。1.2 网表数据门级网表不是拿来就能用PR工具输出的网表通常是带PG pin信息的Verilog。这里要特别留意Innovus里写网表时有没有把电源地信息带出去。没加的话Calibre拿到手就是一个没有电源地引脚的黑盒子LVS第一关就挂。很多团队会在Innovus里用saveNetlist加-includePowerGround然后在顶层网表里保留VDD/VSS端口这样Calibre才能把单元内部的pg连接关系映射上。但实际项目中我还会配合CDL网表一起用。数字标准单元的CDL网表通常是foundry提供的里面包含每个cell的MOS管级连接关系。Calibre跑LVS时如果源端只给一个verilog网表它无法知道单元内部的晶体管是怎么连的只有把verilog转换成SPICE格式再挂上标准单元的CDLCalibre才能做真正的器件级比对。换句话说数字后端的LVS不是简单比“线和线”是否连通而是比“晶体管和晶体管”是否匹配。这也是为什么很多LVS规则文件里既要SOURCE netlist还要DEVICE MAP。1.3 层次与flat的决定提前做LVS可以跑hier也可以跑flat。Innovus导出GDS时如果用了-keepData或者保留了hierarchyCalibre也能跑hier。但这里有个经典问题如果GDS顶层已经把IP或者macro展平了网表却还是带层次的两边对不上就会报出一堆无厘头的“extra cell”或“missing cell”。所以我的习惯是先确认GDS的层次结构再决定LVS用hier还是flat不要让两边各说各话。层次化LVS最大的好处是定位快。某个block出错时直接进到那个block的hierarchy里看不用在一整块die上大海捞针。但它的前提是版图层次和网表层次一一对应。Innovus里有时会为了做时序优化自动改变某些cell的boundary或者用ecoDefineModule把部分逻辑折叠这种操作都会影响Calibre对层次的理解。所以每次ECO之后我都强烈建议重新导出一次GDS并且把saveNetlist和streamOut放在同一个状态下执行保证两边来源一致。2. Innovus导出数据的关键动作和参数坑Innovus到Calibre中间其实还隔着好几个转换环节。很多工程师习惯性地以为只要最后GDS没问题中间过程无所谓。但实际上导出GDS时少勾一个选项或者网表里少了一条PG声明都能让Calibre报告半天。下面几个动作是我每次跑LVS前必查的。2.1 streamOut命令的正确打开方式Innovus里导出GDS常见写法是类似这样streamOut $gds_name -mapFile $gds_map -libName $lib_name \ -units 1000 -mode ALL几个关键参数我都踩过坑逐个说一下。-mapFile必须指向与PDK匹配的layer map。不同工艺库的layer number和purpose number定义不一样有的库金属1在layer 31有的库却在layer 46。如果map文件里的层号和Calibre规则文件里的定义不一致LVS拿到手的图形就是乱的。尤其现在先进工艺里还有大量dummy fill层、well层、implant层map漏掉一层DRC可能还能过LVS就彻底对不上。-units 1000前面说过是数据库单位。这里再补充一下如果你看到GDS打开后所有坐标都变大或者变小了第一反应不要是去怀疑Calibre先回Innovus查streamOut时的units设置。-mode ALL的作用是把所有定义过的layer都输出而不是只输出当前visible的层。有一次我为了省时间在GUI里简化显示只开了Metal1到Metal4结果streamOut时忘了改回ALL导出的GDS里高层金属全没了Calibre跑出来open错误多到报告文件几十页。从那以后我就把这个参数写死在脚本里不允许任何人手动改。2.2 保存netlist时如何保留PG信息以及biasnw的pg term选中问题Innovus里保存网表我一般在顶层这样写saveNetlist $netlist_name -includePowerGround -excludeLeafCell-includePowerGround决定了输出的verilog里每个instance的pg pin会不会被写出来。有些工艺库的PG pin名字不是VDD/VSS而是类似VDDCE、VSSE、VDDPST这种。Calibre跑LVS的时候需要把网表和版图两边的pg pin映射到统一的电源地名称上。所以这里最好再联合CDL网表一起用因为很多模拟IP只有CDL数字部分用verilog转成CDL后再比对是业界最常见的做法。有朋友问过在Innovus里怎么选中标准单元名字为biasnw的pg term。这个问题看着小实际排查电源连接时还挺关键。如果你只是想在图形界面里高亮某个cell的电源端子可以用dbGet先查一下dbGet [dbGetInstByName biasnw].pgTerms.name结果会打印这个标准单元所有的pg term名字比如VDD、VSS、VBN、VBP等。如果要选中/高亮可以用类似highlight -inst biasnw但要想精确高亮某个pg term建议直接用editSelect或selectObj配合dbGet得到的term objectdbGet [dbGetInstByName biasnw].pgTerms -this然后用返回的object id配合highlight命令去高亮。这个操作在做电源域检查时特别有用尤其是常开电源和可关断电源混合的设计里。你要确认某个标准单元的pg term到底连到哪一根电源rail上光学上靠肉眼在版图里翻效率极低用dbGet查term名再在版图里高亮那一小段金属一眼就能看清。2.3 别忘了verilog转spice这一步有时候Calibre LVS需要的是netlist.spSPICE格式网表。Innovus本身不直接输出CDL但你可以用v2lvs把verilog转成spice格式。常见命令v2lvs -f $verilog -o $spice_out -s $spice_cdl -i VDD VSS这里-s指定标准单元的CDL网表-i声明电源地端口。如果没有这一步Calibre比对的时候就不知道单元内部器件的连接关系只能看到黑盒子LVS照样过不了。这里要特别提醒v2lvs转换时如果单元名在CDL里找不到它会在输出里留下一个warning但不会报error。很多工程师看到warning就直接忽略结果跑到Calibre里才发现一堆missing device。因此转换完以后一定要打开SPICE网表抽查几个常用标准单元确认里面真的包含了MOS管级的定义而不是只有SUBCKT的空壳。3. Calibre LVS规则与运行方式数据准备完之后才轮到Calibre正式上场。Calibre的命令和规则文件看起来唬人其实核心逻辑很简单读版图读源网表做图形提取再做器件比对。但在实际项目里有几个细节会直接影响LVS能不能过以及错误好不好查。3.1 一个最基础的LVS命令Calibre LVS的规则文件一般由PDK提供叫xxx.lvs.rul或者calibre.lvs.rul。实际项目里通常还会再包一层wrapper脚本把不同层次的gds、netlist、celllist统一管理起来。最朴素的命令行是calibre -lvs -hier -spice netlist.sp -design top.gds rule_file也可以把rule_file里的LAYOUT和SOURCE改好直接calibre -lvs rule_file。我更推荐后者因为rule文件里通常会有LAYOUT PRIMARY、LAYOUT PATH、SOURCE PRIMARY、SOURCE PATH这些变量用一个wrapper统一传参比每次手动敲一大堆命令舒服得多。另外Calibre版本也可能是个坑。老项目可能还在用Calibre 3.48之类的版本新PDK或新的cell library有时候要求更高版本才能正确解析。换版本之后如果LVS结果突然不一样先看规则文件头部写的CALIBRE_VERSION要求别上来就怀疑自己改错了。特别是某些新工艺的层次定义较复杂3.48这种比较老的版本可能无法正确识别部分扩展层导致提取出的device类型和实际不符。3.2 电源地识别与soft connect到底什么鬼Calibre识别电源地靠的是LVS规则里的LVS POWER NAME和LVS GROUND NAME。数字后端里通常就是VDD和VSS。但这里有一个隐藏的雷区soft connect。所谓soft connect就是版图里两个电源地网络之间不是通过金属直接短接而是通过某个器件的衬底、阱区或者电阻性连接形成的弱连接。比如PMOS的N阱如果跟VDD没有完全断开或NMOS的P衬底跟VSS之间通过其他路径藕断丝连Calibre就会报SOFT CONNECT。这个错误在混合信号设计里极其常见尤其是电源域多、有deep nwell隔离的芯片。我见过不少工程师一看到soft connect就慌以为芯片要漏电废掉。其实未必。ESD保护二极管、某些IO结构、甚至标准单元里的tap cell都可能形成正常的soft connect。这时候要去读Calibre的report看它具体报的是哪两个网络之间、经过哪些器件。如果是一些常开的保护结构那就需要在规则文件里用LVS SOFT CONNECT的声明告诉Calibre忽略特定连接。但如果是电源域之间非预期的漏电路径那就必须回到Innovus去改PG规划否则芯片功耗和可靠性都会出问题。3.3 Hier和Flat到底怎么选跑LVS时-hier和-flat的选择本质上是一个“定位速度”和“准确性”的权衡。层次化LVS跑得快、定位准但它要求版图层次和网表层次对得上。如果Innovus导出GDS时把子模块展平了Calibre的hier LVS会把内部所有cell都列出来网表里却只有一个实例自然对不上。扁平化LVS则把所有层次都拍平虽然跑得慢但不会因为层次问题误报。我的经验是跑LVS之前先用calibre -lvs -flat跑一遍把全局性错误清理掉等整体连通性没大问题了再用-hier做精细化比对和报告。当然如果设计规模很大flat可能跑一晚上hier可能半小时就出结果。所以最重要的是在PR阶段就想好哪些block保留边界哪些可以展平。一般顶层只放floorplan boundary和power ring子模块全部保留hierarchy这样Calibre跑hier LVS的效果最好。4. LVS错误排查实战从报告到定位工具跑完只是开始真正的重头戏是看报告、找错误。很多新人一打开LVS report就懵满屏密密麻麻的英文不知道从哪一行看起。我在这里把最常用的排查逻辑整理出来。4.1 LVS报告要看哪些字段Calibre LVS运行完会生成.lvs.report打开后先看摘要。摘要里最重要的是INCORRECT数量和CORRECT数量。如果CORRECT是0说明整个版图和网表根本不是一回事如果只是有几个net报short/open那还算好修。报告里常见字段包括CELL COMPARISON单元级对比结果NET COMPARISON网络对比结果DEVICE COMPARISON器件数量对比数字后端最常见的是net mismatch也就是版图网表和逻辑网表之间的连线关系不一致。要区分“网络名对不上”和“网络真的连错”这两件事。前者往往是命名规则不一致比如网表里叫VDD版图里叫AVDD后者则是物理连接确实有问题需要回版图去修。4.2 常见错误类型和排查优先级排查LVS错误我自己的优先级是先看器件数量。如果SPICE网表里有1000个NMOS版图里却提取出来990个那先找少掉或多余的器件。通常是某些cell在版图里被当作dummy或ECO时被替换了。再看短路和开路。短路问题的经典定位方法是用Calibre RVE打开报错的net把所有连接金属高亮出来肉眼找异常图形。如果short的net是两个电源地网络优先怀疑cell的行电源rails、阱连接或者顶层电源环。开路问题要检查via是否缺失、金属线是否断开。数字后端里很多open是因为DRC已经修了但LVS又发现via被fill挡了这里可以用Calibre先跑一遍DRC把via enclosure问题修掉再跑LVS。排查时不要像无头苍蝇一样从第一个错误开始。先把错误分类统计一下如果short集中在电源地说明PG规划有问题如果open集中在某一层金属说明那一层有布线或fill问题如果device数量不对先确认标准单元库CDL有没有挂错。4.3 soft connect错误的排查清单碰到SOFT CONNECT我的固定排查顺序是先看报错的位置是不是标准单元阵列区域。如果是多半是std cell的行电源和阱连接之间的关系没处理好。打开版图编辑工具高亮报错网络看是否有电阻性连接路径。如果连接路径是经过一个电阻尝试判断这个电阻是不是dummy res或者guard ring。确认设计有没有I/O和ESD器件。ESD保护结构往往天然形成soft connect必须用规则排除。假如是power domain之间的隔离没有做就回Innovus去检查addRing、addStripe、tap cell和dnwell的覆盖是否完整。这里说一个比较隐蔽的场景有些工艺库里标准单元的N阱连接和电源rail之间会有一层hvt/implant的层次切换如果那一层在Innovus里没有正确接到VDDCalibre就会报出一片soft connect。这种问题往往不是一颗两颗而是整个模块几百个cell一起报错。处理方式也不是去改每颗cell而是回Innovus修正PG net的连接关系重新生成GDS。4.4 复盘一次PG short的定位过程有次项目里所有模块LVS都过了唯独顶层报VDD和VSS短路。Calibre报告里只生成了一个short的net但高亮出来是整块die的VDD和VSS范围巨大。我采用二分法先把版图切成左右两半分别跑LVS发现左边不短、右边短再把右边上下切一层层缩小范围。最后发现是某个power switch单元里VDD和VSS的row tap之间隔了一段浮空的metal fill这段fill既没接VDD也没接VSS却把两个rail在某个层次上搭桥了。从DRC角度它是干净的因为metal fill和runoff rule没违规但LVS把它当成了导通的金属。解决办法很简单在Calibre提取时加一个金属密度填充层的exclude或者回Innovus里给那一层设routeType禁止fill。这种问题只靠LVS报告没法一眼看出必须结合版图图像去做空间定位。所以做后端的人图形界面工具不能只会开报告RVE的可视化高亮一定要熟练能省下大量排查时间。5. 常见问题与避坑技巧速查最后再整理几个我在多个项目里反复遇到的问题以及对应的排查方式。这部分更像是一个速查表建议收藏下次跑LVS时对照着看。5.1 Innovus和Calibre结果对不上不只一个朋友问过我明明Innovus里verifyConnectivity全绿怎么Calibre LVS就是报错原因多半在数据转换环节。Innovus里的pg连接关系是抽象的比如through via、tap cell它知道有连接但Calibre只看几何图形如果金属层和via没有覆盖衔接它就认为断开。所以PR工具里连通不等于物理版图连通。建议在signoff前用Calibre跑一个带dummy fill的最终GDS一切以Calibre结果为准。另外Innovus里的verifyConnectivity更多是检查PG网络有没有悬空或者短路它对几何尺寸的检查不像Calibre那么严格。如果final GDS里有一小段金属线连到了不该连的net上Calibre一定会报出来。这类问题不要怀疑是工具bug绝大多数时候就是物理世界多了或者少了一块图形。5.2 文本网表和SPICE网表之间的器件映射数字库的CDL网表里器件名字往往跟Verilog module名字不一致。比如Verilog里叫INVX1CDL里可能叫INVX1但内部PMOS/NMOS的模型名又不同。Calibre判断器件是否匹配靠的是LVS DEVICE TYPE和LVS MODULE NAME。如果映射不对就会报一堆property mismatch或device mismatch。这时候去看rule文件里有没有DEVICE MAP没有的话自己加一行把两边对应上。还有一种情况是同一颗cell在网表里出现在两个不同的library中但物理版图其实是同一个layout。Calibre在对比时会把它们当成两个不同的cell导致cell count对不上。解决方法是在LVS BOX里把这两个library的cell都加入比较名单或者统一网表里的library name。5.3 LVS通过率的流程规范跑过几个项目后我总结出几条可以减少LVS痛苦的规矩在Innovus里每做完一次ECO顺手重新导出GDS和网表保证两边同版本。输出前在Innovus里跑check_pg_pg和check_pg_terminal尽早暴露pg问题。GDS导出后不要直接跑大LVS先用Calibre的-drc跑一遍基本DRC把短线和缺层问题过滤掉。保持网表和GDS层次一致别一边是hier一边是flat。每个block单独跑完LVS再上顶楼否则顶层一堆错误无法定位。这些规矩看着简单真正执行起来却需要耐心。很大程度上LVS不是比谁工具用得熟而是比谁的数据管理更规范。5.4 版本和license的小杂谈Calibre 3.48在有些公司还在用但新工艺节点下建议尽量跟着PDK的要求走。版本太老可能导致某些层次信息解析错误也会出现莫名其妙的“missing cell”。另外LVS跑挂了先看log不要盲目改ruleCalibre的log里会明确写是哪一步出错比如layout extraction failed还是source netlist read failed。先把输入数据排查干净再谈规则修改。有人喜欢一上来就怀疑license问题其实license只会在开始阶段报feature not found很少跑到一半fail。如果log里出现大面积timeout或者database busy那才是license或者计算节点的问题。LVS跑挂了不要慌按log从后往前读通常真正的原因就在最后几行。我个人在实际操作中的体会是LVS错误排查最难的不是修错误本身而是把Innovus和Calibre两边的数据模型差距搞清楚。很多坑只要你在导出数据时多花十分钟检查后面就能少熬一个通宵。最后再分享一个小技巧每轮LVS跑完把报告里的错误分类统计一下比如short多少、open多少、soft connect多少记录到项目周报里。连续几轮之后你就会发现自己项目的“LVS高危区域”在哪下次在Innovus阶段就可以提前规避这才是排查流程真正值钱的地方。