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还是OASIS
Innovus里做完布线后,最终版图一般以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或者10000,Calibre读进来以后所有坐标都会按比例缩放,轻则器件尺寸偏差,重则整层金属错位,报出来的short和open完全不讲道理。所以每次导出后,我建议用Calibre RVE或者Klayout快速打开GDS,量一下标准单元的尺寸和金属线宽,确认没有比例问题再继续。
1.2 网表数据:门级网表不是拿来就能用
P&R工具输出的网表,通常是带PG pin信息的Verilog。这里要特别留意,Innovus里写网表时,有没有把电源地信息带出去。没加的话,Calibre拿到手就是一个没有电源地引脚的黑盒子,LVS第一关就挂。很多团队会在Innovus里用saveNetlist加-includePowerGround,然后在顶层网表里保留VDD/VSS端口,这样Calibre才能把单元内部的pg连接关系映射上。
但实际项目中,我还会配合CDL网表一起用。数字标准单元的CDL网表通常是foundry提供的,里面包含每个cell的MOS管级连接关系。Calibre跑LVS时,如果源端只给一个verilog网表,它无法知道单元内部的晶体管是怎么连的;只有把verilog转换成SPICE格式,再挂上标准单元的CDL,Calibre才能做真正的器件级比对。换句话说,数字后端的LVS不是简单比“线和线”是否连通,而是比“晶体管和晶体管”是否匹配。这也是为什么很多LVS规则文件里既要SOURCE netlist,还要DEVICE MAP。
1.3 层次与flat的决定提前做
LVS可以跑hier,也可以跑flat。Innovus导出GDS时,如果用了-keepData或者保留了hierarchy,Calibre也能跑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 object:
dbGet [dbGetInstByName biasnw].pgTerms -this然后用返回的object id配合highlight命令去高亮。这个操作在做电源域检查时特别有用,尤其是常开电源和可关断电源混合的设计里。你要确认某个标准单元的pg term到底连到哪一根电源rail上,光学上靠肉眼在版图里翻,效率极低;用dbGet查term名,再在版图里高亮那一小段金属,一眼就能看清。
2.3 别忘了verilog转spice这一步
有时候Calibre LVS需要的是netlist.sp(SPICE格式网表)。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可能半小时就出结果。所以最重要的是在P&R阶段就想好:哪些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里没有正确接到VDD,Calibre就会报出一片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没有覆盖衔接,它就认为断开。所以,P&R工具里连通,不等于物理版图连通。建议在signoff前,用Calibre跑一个带dummy fill的最终GDS,一切以Calibre结果为准。
另外,Innovus里的verifyConnectivity更多是检查PG网络有没有悬空或者短路,它对几何尺寸的检查不像Calibre那么严格。如果final GDS里有一小段金属线连到了不该连的net上,Calibre一定会报出来。这类问题不要怀疑是工具bug,绝大多数时候就是物理世界多了或者少了一块图形。
5.2 文本网表和SPICE网表之间的器件映射
数字库的CDL网表里,器件名字往往跟Verilog module名字不一致。比如Verilog里叫INVX1,CDL里可能叫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,不要盲目改rule;Calibre的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阶段就可以提前规避,这才是排查流程真正值钱的地方。