ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Virtuoso数模混合LVS实战:网表修改、Box与soft connect排查指南

Virtuoso数模混合LVS实战:网表修改、Box与soft connect排查指南 1. Virtuoso数模混合版图LVS为什么总是卡在你最想不到的地方干版图设计这行尤其是碰到数模混合芯片LVS这块硬骨头估计每个人都啃过几回。之前在社区里看到不少帖子在问Virtuoso里LVS报错怎么处理、Calibre LVS规则文件怎么配、网表怎么改、Box怎么用——这些问题我在实际项目里基本全踩过一遍所以把自己的处理思路和避坑经验整理一下希望能帮到正在被LVS折磨的同行。先说说我为啥要专门写数模混合版图。纯数字版图的LVS其实相对好办标准单元库是经过验证的后端流程也成熟跑LVS主要靠工具自动处理。反观数模混合芯片模拟部分有大量不对称结构、差分对、电流镜还要跟数字逻辑、IO、ESD结构混在一起电源地的连接关系经常绕来绕去。同样一套LVS流程放到数模混合设计里报错种类和排查难度直接翻倍。我印象最深的一次某个项目在LVS阶段连续加班两周最后发现问题是网表里一个电源pin的名字跟版图对不上导致几千个器件全部报not connected——这种低级错误才是真正的隐形杀手。这篇文章适合谁看刚接触Virtuoso版图设计、对Calibre LVS流程还不熟的新人以及有一定经验但碰到复杂数模混合LVS问题想找排查思路的工程师。我会从LVS比对的基本逻辑讲起把网表修改、Box黑盒处理、soft connect排查这几个常见难点逐一拆开最后分享一些我在项目里积累的高频错误排查技巧。LVS全称Layout vs Schematic本质上就是做两件事第一从版图里提取出器件和连接关系第二跟原理图导出的网表做比对看两者是否一致。听起来简单但实际执行的时候工具对版图的“理解”能力是有限的。它不会像人一样看出某个图形是一个MOS管而是靠规则文件里的器件识别语句根据图形层的叠加关系、尺寸大小、端子形状来判断。这就解释了为什么版图里画了一堆东西LVS却识别不出来或者识别出来的器件参数跟原理图对不上。很多刚入行的朋友一看到LVS报错就慌其实完全没必要。LVS的报错看似五花八门但绝大多数可以归为几类器件不匹配、节点不匹配、连接关系不一致、soft connect软连接、dummy器件干扰、网表本身的问题。把这几个大类吃透了排查效率会高很多。接下来的内容我就按这几个方向逐层展开。2. 网表修改动手之前先搞清楚你到底在改什么2.1 什么情况下必须动网表网表修改是数模混合LVS绕不开的一步。很多人一听到“改网表”就觉得是作弊或者偷懒其实不对。在真实项目里网表修改是一个非常正规且必要的步骤关键是你要清楚为什么改、改什么、改了之后会不会掩盖真正的问题。最常见的需要动网表的情况有这么几种第一种是原理图里的器件在版图里不存在物理实现。比如某些用于仿真调试的理想器件、无源器件模型或者只在测试模式下使用的虚拟负载原理图里有但版图里根本没有对应图形。这种情况下LVS必然会报extra net或者missing instance你需要在网表里把这些器件删掉或改成不参与比对的属性。第二种是网表里带了不影响的寄生结构。有些工艺库的PCELL在生成时会自动带一些寄生二极管、寄生电容的模型这些寄生在物理上真实存在但对功能没有影响。为了能让LVS跑干净规则文件通常会对这些器件做“过滤”或“合并”处理而过滤条件往往需要你修改网表把这些寄生器件从source netlist里摘出去。第三种是端口顺序或名字不一致。这种情况最坑。比如版图里某个模块的电源pin叫VDD但原理图模块的pin叫AVDDLVS比对时就会把所有跟这个pin相连的net全部判为mismatch。这种问题改版图往往工程量巨大但改网表只是一行sed命令的事性价比完全不同。2.2 网表修改的常用套路如果你用的是Calibre做LVS网表修改通常发生在source netlist层面。我的习惯是拿到从Virtuoso原理图导出的CDL网表之后先做一份“净网表”clean netlist然后在这个版本上做所有修改原始网表永远留底。在CDL网表里常见的修改操作有三个套路第一个套路是删除器件实例。在CDL里每个器件实例长这样XM0 VOUT VIN VDD GND nch w1u l0.18u m4如果要删掉它直接把这一行注释掉或者删掉就可以。但要注意如果你删了器件跟它相连的net如果变成了空节点LVS可能还会报extra net。所以删完器件之后要检查一下那些悬空的net该保留的保留该合并的合并。第二个套路是修改器件参数。最常见的是把某个电阻的阻值改掉或者把MOS管的finger数、m值改成跟版图一致。这种情况通常发生在原理图用的是理想模型但版图里实际尺寸因为匹配需求做了调整。改参数的时候要格外小心因为LVS规则文件里一般都有device tolerance容差设置如果改动幅度在容差范围内其实不改也行。第三个套路是net短接或重命名。比如模拟地AGND和数字地DGND在芯片内部是同一块金属连接但原理图里是两个独立net这种情况下LVS必然会报两个net不匹配。可行的处理方式是在网表里加一行短接语句或者把其中一个net的名字全局替换成另一个。这里有个注意点短接之前一定要确认版图里这两个区域确实是从物理上连通的不要为了跑LVS而强行短接否则后端提取寄生参数的时候会出大事。2.3 网表修改的实战细节说了理论放一段实操记录。假设现在有一个项目LVS报了这样一个错source netlist里有50个器件连在VBIAS这个net上但layout里提取出来的VBIAS只有48个器件。两边的差别是少了两个电容。翻开原理图发现这两个电容是外挂的片外电容根本不会画到版图里。处理方式很简单在CDL网表里找到这两个电容的定义把它们删掉或者改成注释。如果是Calibre更优雅的做法是在LVS规则文件里用device过滤语句让规则在比对时忽略特定类型的器件而不是直接改网表文件。过滤语句类似这样DEVICE CAP C(PP) ...不过这类语句的写法跟工艺库高度相关最好查阅你所在公司的LVS rule文档。如果是个人学习项目那就老老实实改网表一行注释搞定。再补充一个容易翻车的点。CDL网表里经常有*.INCLUDE、*.GLOBAL之类的语句这些是spice网表的通用语法。用Virtuoso导出网表之后最好用文本编辑器打开看一眼确认最终的网表内容符合预期。我遇到过一次导出网表时subckt定义里漏了pin声明导致整个模块被当成一个黑盒子LVS报出来的结果完全没法看。这种问题不用急回到Virtuoso里重新导一次检查导出选项特别是“Top Cell Name”和“Export from Schematic”的勾选状态。2.4 到底是改网表还是改版图碰到LVS不匹配的时候很多人的第一反应是“我改一下版图让它跟原理图对上”这固然是正路但有时候性价比极低。举个例子如果版图在布线时把某两个器件的源漏接到了同一个net而原理图上是分开的两个net你去改版图要把一整块金属重画风险很大但改网表只需要把两个net短接一分钟搞定。这里的关键判断标准是**这个差异是否反映了真实的物理连接**如果版图里两个net确实是物理连通的只是原理图画法不同那改网表是合理的如果版图里两个net根本不连通仅仅是为了消掉LVS报错而强行短接那就属于掩耳盗铃后面抽寄生PEX的时候大概率会暴露。我个人处理这种问题的顺序是先看版图确认物理事实再决定改哪边。版图是对的改网表网表是对的改版图。永远不要两头糊弄。3. Box机制把已验证的模块“关进黑盒”3.1 Box到底是什么能解决什么问题Box这个概念我最早接触的时候也是一头雾水。简单说Box就是在LVS比对时将某个模块的内容全部遮蔽只保留它的端口连接关系模块内部的器件和连接不做比对。你可以把它理解成考试的时候老师告诉你“这道大题不用写过程只要答案对就行”。为什么需要Box在数模混合芯片里你很可能直接调用了某个已经经过验证的IP比如PLL、SRAM、ADC/DAC的核心或者使用了工艺厂提供的标准单元库。这些模块在交付之前就已经通过了完整的LVS验证在你的顶层芯片里再跑一次LVS纯属浪费时间——而且更麻烦的是这些模块内部可能用了很多特殊的处理方式顶层LVS规则反而会误报。Box的另一个用途是性能优化。一个数模混合芯片的版图动辄几个GB的GDS如果每一层都做完整比对Calibre跑一次可能要几个小时。把已經验证过的数字标准单元库、内存块设成Box跑一轮LVS的时间能缩短到原来的三分之一甚至更少这在项目紧张的时候极为宝贵。3.2 Box在Calibre里的设置方式在Calibre LVS中Box的设置方式有两种一种是在规则文件里硬编码另一种是在运行LVS时通过GUI或命令行参数动态指定。下面分别说一下。规则文件里设置Box你会在LVS rule file通常是.cal或.svrf文件里看到类似这样的语句LAYOUT BOX SRAM SOURCE BOX SRAM当然针对不同模块可能需要用不同的Box规则。比如你想将版图里叫SRAM的模块设为Box但source netlist里对应模块名不同可以用更精细的通配符写法LAYOUT BOX SRAM* SOURCE BOX SRAM*需要注意的是一旦某个模块被BoxLVS比对时将只检查该模块的pin数量、pin名字是否与source一致模块内部任何问题都不会暴露。所以Box操作是“信则灵”的操作——你确认这个模块本身是没问题的才能放心把它黑盒掉。在Calibre Interactive的GUI里设置Box也很方便。打开LVS菜单后在Inputs→Netlist标签页里通过设置Netlist Import / Netlist Box或Layout Box选项来指定Box模块名。跑批量的项目脚本时还有一种方式是直接在命令行里传参数calibre -lvs -hier -spice rule.cal rule.sp top.gds关于-hier参数要说一句它是开启层次化LVS的关键。如果没有开-hierBox很多时候不会生效工具会把所有层次展平后再做比对Box就毫无意义了。3.3 Box的常见使用场景我在项目里用Box用得最多的场景有三个。第一个是数字标准单元库。现在很多数模混合芯片里的数字部分都是用综合工具自动生成的门级网表再用自动布局布线工具物理实现。这部分模块的LVS在数字后端流程里已经验证过了顶层只需确认数字模块的端口和电源地连接正确所以对它开Box是标准操作。第二个是模拟IP核。比如PLL、Bandgap、LDO这些已经经过硅验证的模拟模块它们内部的模拟器件连线非常敏感顶层LVS工具在解析这些结构时容易因为层次关系产生误报。为了避免这种误报通常会开Box只比对端口。这个操作在业界非常普遍而且流片厂在tapeout review时也是认可的。第三个是IO单元和ESD保护结构。IO cell通常来自工艺厂或第三方库其内部结构包含大量特殊器件如ggNMOS、SCR等这些器件在常规LVS规则里可能没定义或者识别参数特别容易出错。把这些IO单元整体Box掉可以省去大量解析麻烦。3.4 Box的副作用与使用禁忌Box虽好但副作用也很明显Box了就可能漏掉真正的问题。最典型的翻车案例是某个数字模块的底层出线短路到相邻模块的电源但数字模块被Box了LVS判断它能通过结果流片回来芯片功耗异常。所以使用Box必须要有纪律。我的建议是只在顶层或特定层次使用Box底层比对永远全开。设Box前先跑一次部分比对确认这个模块本身LVS是干净的。Box的模块名尽量用精确匹配。用通配符一次Box掉一片同名模块时要格外注意是不是有同名的意外模块被误伤。关键信号路径上的模块不要Box。如果你要验证的是一个新设计的模拟IP千万不要为了“快点跑完”把它设成Box否则等于没验。另外Box设置还有个边界问题。比如你把某个模块设成Box但这个模块内部有一个pin在版图上没有连出来LVS在检查Box模块的pin连接时会报“Port not connected”或者“Short”之类的错误。这时候别急着怀疑Box设置先从版图上确认那个pin是不是确实被上层金属盖住了或者只是视觉上看着没连实际是通的。4. 高频LVS错误排查实录从soft connect到隔离环4.1 soft connect数模混合版图的头号公敌如果让我给数模混合LVS的错误频率排个名soft connect绝对是第一名。什么叫soft connect简单说就是两个net之间没有直接的金属连接但通过衬底、阱或者器件寄生形成了导电通路。在LVS眼里这会造成让工具误以为两个net是同一个节点。最典型的soft connect场景是这样的模拟电路的VSS和数字电路的GND本来应该分开但它们在版图上都用了P型衬底作为参考地而P衬底本身是连通的于是Calibre在提取连接关系时就会认为VSS和GND是同一个net报出soft connect错误。这个问题的根源是版图隔离措施不到位。正确做法是在版图上给模拟区域和数字区域分别加隔离环guard ring模拟区域用N阱或深N阱做隔离让模拟地只在本区域内连接。如果版图设计阶段没有做隔离到了LVS阶段再去处理往往只能靠改网表或者用特殊开关来规避。4.2 如何在Calibre里定位soft connectCalibre报soft connect的时候会在结果文件里给出具体位置。通常在report里你会看到类似这样的信息ERROR: Soft connect between net VSS and net GND Path: VSS - substrate resistor - GND这里的路径信息是关键。它会告诉你两个net是通过什么器件连起来的比如P衬底的寄生电阻、N阱的寄生二极管等。定位到具体位置之后回到版图里确认那个区域是不是真的隔离不干净。从实操角度我处理soft connect的顺序是这样的先看report确认是哪两个net发生了soft connect。打开Virtuoso版图用highlight功能把这两个net相关的所有图形标记出来。找到两个net的公共区域检查是否有guard ring是否有N阱或深N阱隔离。如果没有隔离加隔离环重新提取LVS。如果确认物理上是隔离的但LVS仍报soft connect检查衬底接触孔的连接方式是否正确以及规则文件里对substrate的提取设置是否过严。在某些工艺里规则文件会对衬底网进行合并强制让所有P衬底都成为同一个net。这种情况下如果模拟地和数字地都打在P衬底上即使你在版图上画了隔离环它们最终还是会在衬底层“相遇”。针对这种情况除了深N阱隔离几乎没有别的物理手段这也是数模混合设计尽量用深N阱工艺的原因之一。4.3 器件识别问题电流镜匹配、反相器与dummy除了soft connect器件识别问题也是LVS报错的重灾区。数模混合版图里最常见的就是电流镜匹配和CMOS反相器相关的识别错误。先说电流镜匹配。在版图设计里电流镜通常用两到四个完全相同的MOS管并联实现讲究的是“共质心”(common centroid)对称布局。但LVS眼中没有“对称”这个概念它只关心你版图里画出来的这些MOS管规格参数是否和网表一一对应。如果原理图里是一个宽长比很大的MOS管但版图里你把它拆成了四个并联的小管LVS如果不做“器件合并”处理就会报extra instance。解决办法是在LVS规则文件里开启device folding或叫instance merge的功能让工具把并联的同尺寸器件合并成一个再与source比对。再说CMOS反相器。反相器电路本身很简单一个NMOS一个PMOS但在数模混合版图里反相器的电源地连接经常会被LVS误判原因在于反相器的PMOS阱N阱往往直接接到VDD而如果这个区域有多个N阱同时存在工具可能会把阱连接关系提取错。这类错误排查时要特别关注阱接触孔和衬底接触孔的排布画这些接触孔的时候不要怕多打接触孔越多阱电位越稳定LVS越不容易出幺蛾子。dummy器件是另一个经典问题。为了匹配性电流镜两端往往会加dummy管版图里有但原理图网表里没有。如果不做处理LVS就会报extra device。业界通行的做法有几种一是网表里也加上dummy器件不过这种方式会让网表变得很脏二是利用LVS规则文件里的dummy device过滤功能前提是dummy要有明显的标记层比如“dummy layer”用特定层次画上规则文件里写语句忽略该层次上的器件识别。我推荐第二种既保持网表干净又能在LVS结果里体现“这些是dummy是有意放置的”。4.4 器件参数不匹配LVS报告怎么读才高效LVS跑完会生成一个报告通常叫lvs.report或类似名字。很多人一打开看到几十页mismatch列表就开始头大其实掌握读报告的套路之后可以很快定位到核心问题。报告的核心信息集中在两个地方一个是摘要部分一个是mismatch明细。摘要部分会有类似CORRECT VERSUS SCHEMATIC 或 INCORRECT如果不正确会列出几类问题的数量比如matched devices、extra devices、missing devices、bad connections之类的统计。看这些数字的时候我心里会有一个大概的判断优先级先看是不是有大量器件都没匹配上如果是说明网表层面就有大问题如果是局部几个器件不匹配重点看是尺寸问题还是连接问题。mismatch明细部分通常会给出具体的instance名字、net名字和坐标。比如X.Y.NMOS_NOT_MATCHED Layout: M1 (W2u L0.5u) Source: M1 (W2u L0.18u)这种一眼就能看出是参数不一致回到版图和原理图里核实即可。还有一个高效技巧用Calibre RVE工具打开报告时可以直接点报错条目跳转到对应版图位置同时高亮相关net。这个功能能省大量手工对比的时间。很多人不知道RVE里还能直接显示报错器件的坐标可以用来快速在Virtuoso里probe到具体位置。4.5 隔离环设计LVS前应该做好的功夫最后单独说隔离环。前面提到soft connect的解决办法跟隔离环密切相关。在模拟版图设计初期如果能把隔离环画正确后面LVS会顺利很多。隔离环的根本目的是隔离不同区域的衬底电位。常见的做法是在模拟区域周围画一圈P注入和P阱接触孔连接到模拟地再在外面套一圈N注入和N阱连接到模拟电源或特定的隔离net。里圈防的是模拟区域内部衬底电压的波动外圈防的是数字区域的衬底噪声注入。画隔离环时的注意点隔离环必须闭合不能有缺口。LVS不会直接检查“隔离环是否闭合”但soft connect会间接暴露这个问题。隔离环的接触孔要密集排列间距不要拉太大。工艺上接触孔本身就是衬底电位和金属连接之间的“桥”孔太稀会导致衬底电位不均LVS能过但实际性能会打折。隔离环跟周围器件的间距要满足DRC规则同时要考虑latency效应别为了隔离牺牲太多面积。我见过不少项目因为隔离环画得不规范LVS阶段不断报soft connect反复排查还是搞不定。最后拿掉隔离环重新画一遍反而干净了。所以隔离环这件事真的是“les功夫做在前面后面才省心”。5. 数模混合LVS的流程化实战从工程组织到批处理5.1 一套可以复用的LVS工程目录结构说到工程组织很多个人和小团队在做LVS时完全没有规范规则文件存一个地方网表在另一个地方GDS路径还要手输每次跑LVS都像打游击。这种习惯放在数模混合项目里会出大问题因为网表版本、GDS版本、规则版本一变结果就完全不可信了。我个人的习惯是每个项目建一个专门的LVS目录里面固定放几个子目录lvs/ ├── rule/ # 存放LVS规则文件及其版本记录 ├── source/ # 存放从原理图导出的CDL网表以及修改后的版本 ├── layout/ # 存放GDS或OA数据库的导出文件 ├── results/ # 存放每次运行的报告、日志、临时文件 └── scripts/ # 存放运行脚本、Box配置文件等这种结构虽然简单但能保证每次跑LVS用的文件都是“有据可查”的。特别是当你需要回溯“这个报告是哪一版网表跑出来的”时文件路径和修改时间一目了然。5.2 Virtuoso与Calibre联动的标准流程实际项目中最常见的LVS操作流程是这样的在Virtuoso里打开版图然后启动Calibre Interactive。启动之后Calibre会读取当前版图作为layout source但source netlist通常需要手动指定指向你之前导出的CDL网表。在Calibre Interactive的界面里有以下几个关键设置项Layout选择要从当前版图提取还是从指定GDS提取。如果版图很大建议用GDS文件可以避免Virtuoso卡死。Netlist指定source netlist路径通常就是那个CDL文件。Rules指定LVS rule file路径。Outputs设置报告输出路径。设置完之后点Run LVS就可以开跑。过程中如果想看实时日志看Run Directory里的*.log文件即可。这里有一个小经验跑大版图时建议把Calibre的Run Directory放到SSD盘上临时文件读写速度会直接影响整体耗时。我试过在机械硬盘上跑一个40G左右的GDSLVS跑了快两个小时换到SSD之后时间直接降到四十分钟左右。这个差距在项目迭代后期非常明显。5.3 运行脚本与Box配置的批量化管理如果同一个设计要反复跑多轮LVS用GUI点来点去效率太低。更好的做法是写一个shell脚本把Calibre命令封装起来。举一个最简单的例子#!/bin/bash # 定义变量 RULE./rule/calibre_lvs.rule SPICE./source/top_clean.sp GDS./layout/top.gds OUT./results # 跑LVS calibre -lvs -hier -spice $SPICE -spiceout $OUT/lvs.sp -log $OUT/lvs.log \ -lvsreport $OUT/lvs.report $RULE $GDS这个脚本看起来简单但配合不同的Box配置可以衍生出很多版本。比如你可以在脚本里加一个变量来控制Box开关BOX_NAME${BOX:-box $BOX}然后在跑批量验证时用不同BOX_NAME跑同一份GDS对比结果。批量脚本还有一个好处可以把整个验证流程固定下来从“自动导入最新网表”到“自动跑LVS”再到“输出报告”全部自动化。这样每次改动版图后只要重跑一遍脚本大大减少了人为操作带来的失误。5.4 如何验证你改的网表真的改对了修改网表之后很多人直接拿去做LVS跑出mismatch就一脸懵——到底是版图错还是网表错这里分享一个我常用的验证思路如果时间允许先不做任何Box也不做网表“优化”用原始网表跑一次LVS拿到一个“baseline结果”。然后每做一步网表修改就跑一次LVS观察错误数量是否有规律变化。这个方法在调试阶段非常有用能让你清楚地看到每一处修改对最终结果的影响。虽然这个流程比较耗时但调试早期多花几轮时间往往能避免后期为了“消灭最后一个报错”而乱改一通。我当时在处理那个电源pin名字不一致的问题时就是靠这个baseline对比法在第二轮就精准锁定了问题。6. 数模混合LVS的个人实战体会与进阶建议先说一个我踩过最深的坑。之前做某个数模混合芯片LVS跑出来报了大概三十几个bad connection全部集中在数字区域和模拟区域的接口处。起初以为是接口信号连接错了查了整整两天换了各种网表修改方案都不见好。后来突然想到会不会是顶层连接时数字模块的电源域跟模拟模块的电源域在网表里用了同一个名字但版图里是互相隔离的去网表里一查果然——两个模块的VDD在source里是同一个net但在layout里因为隔离策略不同物理上被分开了。这种情况改网表是没用的必须改版图把两个VDD真正连起来或者确认它们在芯片外部是短接的在顶层netlist加一个短接语句。这件事给我的教训是LVS报错的本质是“版图提取的连接关系”和“网表描述的连接关系”不一致。排查时不要只盯着局部器件参数更要站在整个电源地网络、信号域划分的角度来看。数模混合设计如果电源域划分不清晰LVS阶段必然会反复踩坑。再说一些日常习惯层面的建议。第一版图画的时候就要时刻想着LVS而不是等画完了再回来查。比如加dummy的时候顺手加标记层隔离环画的时候顺手检查闭合性这些都能让后续LVS阶段省大量时间。第二建议把项目的LVS规则文件读一遍不用逐行精读但至少要了解里面有没有开device merge、有没有先例性的Box配置、过滤规则是怎么写的。很多时候你以为的“LVS报错”其实是规则文件里某项开关没开。第三碰到搞不定的LVS问题不要反复地“瞎试”而是把问题和你的排查过程写下来做成笔记。我自己的经验是很多问题写清楚的过程本身就找到了答案。最后一个小技巧在做完所有LVS修正、最终report显示CORRECT之后建议再多跑一次带PEX寄生提取的验证确认提取出来的寄生参数不会影响电路性能。这是因为有些LVS能过的连接在寄生提取阶段可能会暴露大电容或大电阻导致后仿结果异常。这一步放在LVS之后、tapeout之前能再帮你排掉一批隐患。数模混合版图的LVS说到底是个“逻辑严谨性”的活儿。工具不会骗你它只是把你画的东西和原理图描述的东西做了一次硬核对。你越早理解这个比对的本质越能少走弯路。希望这篇指南能帮你在Virtuoso和Calibre的海洋里少淹几次顺利跑出干净的LVS结果。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表