1. 数模混合版图LVS的核心痛点与整体思路
数模混合芯片的版图验证,是很多版图工程师从纯数字或纯模拟转过来之后最容易翻车的地方。纯数字版图跑LVS,流程相对标准化,规则清晰,工具自动化程度高;纯模拟版图跑LVS,规模小、器件少,手工排查也能搞定。但一旦把模拟模块和数字模块塞进同一个顶层,再叠加上电源域划分、衬底隔离、Deep N-Well、Guard Ring这些工艺要素,LVS报错就会变得非常“不讲道理”——明明版图连对了,网表也对得上,工具就是给你报出几百个软连接错误,或者器件识别不出来。
这篇内容围绕Virtuoso平台下数模混合版图的LVS验证展开,重点讲清楚三件事:第一,网表层面怎么改、为什么要改;第二,Box(黑盒)功能在什么场景下用、怎么用才不出问题;第三,从实际项目中总结出来的避坑经验。适合已经有一定版图基础、正在接触数模混合项目的工程师,也适合想系统梳理LVS验证思路的读者。
先给一个整体判断:数模混合LVS的核心矛盾在于“模拟部分要求精确匹配,数字部分要求高效通过”。这两个诉求在验证策略上是冲突的。模拟模块希望LVS把每个器件都识别得清清楚楚,连W/L、M因子、衬底连接都不能错;数字模块动辄几万甚至几十万个器件,如果每个都让LVS去逐一比对,验证时间会爆炸。所以整个LVS策略的设计,本质上是在“验证精度”和“验证效率”之间找平衡点。这个平衡点怎么找,就是下面要展开的内容。
2. 网表修改:为什么改、改什么、怎么改
2.1 数模混合LVS中网表修改的本质逻辑
很多刚接触数模混合LVS的工程师会有一个疑问:为什么不能直接拿原始网表去跑LVS,非要改来改去?答案在于,LVS的比对逻辑是“版图提取网表”和“原理图网表”之间的结构比对。数字模块经过综合、布局布线之后,原理图网表和版图提取网表之间往往存在大量“形式不同但功能等价”的差异。比如:
- 数字标准单元在原理图中可能是一个个独立的实例,但在版图提取时,工具可能把多个并联的单元合并成一个多finger器件;
- 电源和地的连接方式在数字域中通常通过电源环和电源条实现,提取出来的网表里会出现大量重复的电源网络节点;
- 衬底连接在数字标准单元中通常是隐式的(通过阱和衬底接触自动连接),但提取网表会显式列出每一个衬底节点。
这些差异如果不处理,LVS就会报出大量“虚假错误”。网表修改的目的,就是把这些“形式差异”在比对之前消除掉,让LVS只关注真正的连接错误。
2.2 网表修改的常见操作与具体步骤
网表修改通常分为三个层面:器件层面、网络层面和层次层面。
器件层面的修改,最典型的是MOS管的并联合并。比如原理图中两个W=1u的NMOS并联,版图提取出来可能是一个W=2u的NMOS。这时候需要在网表中把两个器件合并,或者使用LVS选项中的“device matching”规则来处理。具体操作上,可以在Calibre的LVS规则文件中加入LVS REDUCE SERIES MOS或LVS REDUCE PARALLEL MOS等选项,让工具自动完成合并。但要注意,这些选项不能随便开,开了之后可能会掩盖真正的器件尺寸错误。
网络层面的修改,最常见的是电源和地网络的别名处理。数字模块中,VDD和VDD_CORE可能是同一个网络的不同叫法,但LVS会认为它们是两个独立的网络。这时候需要在网表中加入LVS POWER NAME和LVS GROUND NAME的映射关系,或者在网表中直接用connect语句把两个网络短接。实际操作中,我通常会在网表开头加一段:
connect VDD VDD_CORE connect VSS VSS_CORE这样LVS在比对时就会把这两个网络视为同一个节点。
层次层面的修改,主要涉及Box的使用,这个后面会专门展开。这里先提一点:如果某个子模块已经单独验证过LVS,在顶层验证时可以用Box把它“黑盒化”,只保留端口连接关系,不比对内部器件。这样可以大幅减少顶层LVS的比对量。
2.3 网表修改中的注意事项与实操心得
网表修改最容易踩的坑是“改过头”。我见过有工程师为了让LVS通过,在网表里加了一大堆connect语句,把本来不该短接的网络也短接了,结果LVS是过了,但芯片回来之后发现电源和地真的短了。这种错误在LVS阶段完全看不出来,因为网表已经被改得“面目全非”。
所以网表修改有一条铁律:每一条修改都必须有明确的理由,并且要能追溯到原理图或版图的实际连接关系。具体来说,我建议这样做:
- 修改前先备份原始网表,所有修改在副本上进行;
- 每一条
connect或器件合并操作,都在注释中写明原因和对应的原理图页码或版图坐标; - 修改完成后,用LVS的“netlist compare”功能单独跑一次网表比对,确认修改后的网表和原始网表在功能上等价。
另外,网表修改的时机也很重要。我通常建议在第一次跑LVS之前就先做一轮网表清理,把明显的电源别名、衬底连接等问题处理掉,而不是等LVS报了几百个错误之后再回头改。先清理再验证,效率会高很多。
3. Box功能:数模混合LVS的效率利器
3.1 Box功能的适用场景与核心价值
Box功能在Virtuoso和Calibre中都有对应的实现方式,核心思想是把一个已经验证过的子模块当成“黑盒”来处理。在顶层LVS时,工具只检查这个子模块的端口连接是否正确,不检查内部器件。这样做的好处非常直接:顶层LVS的比对量可以降低一个甚至几个数量级。
什么场景下适合用Box?我总结了几条判断标准:
- 子模块已经单独跑过LVS并且通过了,内部连接关系可信;
- 子模块的规模较大(比如数字模块几万个器件),顶层LVS如果展开比对会非常慢;
- 子模块的端口定义清晰,端口数量可控,不会因为端口遗漏导致顶层连接错误被掩盖。
反过来,如果子模块本身LVS还没过,或者端口定义还在变动中,那就不适合用Box。因为Box会掩盖子模块内部的错误,如果子模块本身有问题,顶层LVS过了也没意义。
3.2 在Virtuoso中配置Box的具体操作
在Virtuoso环境下配置Box,通常有两种方式:一种是在原理图层面用LVS Box属性标记,另一种是在Calibre的LVS规则文件中用LVS BOX语句指定。
原理图层面的操作相对直观。在Virtuoso的Schematic Editor中,选中需要Box化的子模块实例,打开属性编辑器,找到LVS Box或类似的属性字段,将其设置为TRUE或YES。这样在生成网表时,工具会自动把这个子模块标记为Box。但要注意,不同工艺库和不同版本的Virtuoso,这个属性的名称和位置可能不一样,有的在CDF参数里,有的在Instance属性里,需要根据实际环境确认。
Calibre规则文件层面的操作更灵活,也更常用。在LVS规则文件中加入:
LVS BOX <cell_name>其中<cell_name>是要Box化的子模块名称。如果有多个子模块需要Box化,可以写多行。另外,还可以用LVS BOX LIST指定一个文件,文件中每行一个模块名,适合模块数量较多的情况。
配置完成后,重新跑LVS,工具会在日志中显示哪些模块被Box化了。我通常会在LVS日志中搜索BOX关键字,确认Box列表和预期一致。
3.3 Box使用中的常见陷阱与规避方法
Box用起来简单,但坑不少。我踩过的最典型的一个坑是:Box化的子模块端口在版图提取网表中被工具自动重命名了,导致顶层LVS报端口连接错误。比如原理图中端口叫DATA_IN<0>,版图提取出来变成了DATA_IN_0_,LVS就认为这两个端口对不上。
解决这个问题的办法是在LVS规则文件中加入端口名称的映射规则,或者用LVS PORT RENAME语句做批量重命名。更稳妥的做法是,在Box化之前先确认版图提取网表的端口命名规则,然后在原理图网表中做对应的调整。
另一个常见问题是Box的层次边界不清晰。比如一个子模块内部还有子模块,Box化的时候只Box了最外层,内部子模块的器件还是被提取出来参与比对,结果LVS报出一堆“多余器件”错误。这时候需要确认Box的层次范围,必要时用LVS BOX的层次选项指定Box的深度。
还有一个容易被忽略的点:Box化之后,子模块的电源和地连接关系不会被检查。如果子模块内部有电源域划分,Box化之后顶层LVS无法发现电源域之间的短路或断路。所以对于有复杂电源域设计的模块,Box化之后还需要单独做一次电源域检查,或者用LVS POWER DOMAIN相关的规则来补充验证。
4. 数模混合LVS的完整实操流程
4.1 从原理图到网表的准备阶段
整个LVS流程的起点是原理图。在数模混合项目中,原理图通常分为模拟部分和数字部分,可能在不同的工具中完成(比如模拟用Virtuoso Schematic,数字用其他综合工具)。不管用什么工具,最终都需要导出成LVS工具能识别的网表格式。
从Virtuoso导出网表,通常用CDL(Circuit Description Language)格式。导出时需要注意几个关键设置:
- 端口顺序:确保导出的端口顺序和版图提取网表的端口顺序一致,否则LVS会报端口不匹配;
- 器件模型名称:确认CDL中的器件模型名称和LVS规则文件中的模型名称一致,比如
nmos和nch的区别; - 全局网络:确认VDD、VSS等全局网络在CDL中被正确标记为全局网络,否则LVS会把它们当成普通网络处理。
导出完成后,我通常会先做一轮网表检查,用文本编辑器打开CDL文件,确认器件数量、端口数量、全局网络定义等关键信息。这一步花不了几分钟,但能避免后面大量的调试时间。
4.2 LVS规则文件的配置与调试
LVS规则文件是整个验证流程的核心。对于数模混合项目,规则文件需要在标准LVS规则的基础上增加一些针对性的配置。以下是我常用的配置项和说明:
| 配置项 | 作用 | 注意事项 |
|---|---|---|
LVS POWER NAME | 指定电源网络名称 | 需要同时指定模拟和数字的电源名称 |
LVS GROUND NAME | 指定地网络名称 | 注意区分模拟地和数字地 |
LVS BOX | 指定Box化模块 | 模块名必须和网表中的一致 |
LVS REDUCE PARALLEL MOS | 自动合并并联MOS | 可能掩盖器件尺寸错误,慎用 |
LVS ISOLATE SHORTS | 隔离短路错误 | 有助于定位短路位置 |
LVS REPORT MAXIMUM | 设置报告的最大错误数 | 建议设为0,报告所有错误 |
规则文件配置完成后,先跑一次“干跑”(dry run),不比对网表,只检查规则文件语法和版图提取是否正常。确认无误后再进行完整的LVS比对。
4.3 LVS结果分析与错误定位
LVS跑完之后,结果分析是最耗时的环节。Calibre的LVS结果通常包含几个部分:错误摘要、错误详情、网表比对结果。我的分析顺序通常是:
- 先看错误摘要:确认错误总数和错误类型分布。如果错误数超过1000,通常说明网表层面有系统性问题,比如电源网络没对齐、端口命名不一致等,需要先解决这些系统性问题;
- 再看错误详情:从第一个错误开始,逐个分析。Calibre的RVE(Results Viewing Environment)工具可以高亮显示版图中的错误位置,非常方便;
- 最后看网表比对结果:确认版图提取网表和原理图网表的器件数量、网络数量是否一致。
对于数模混合项目,最常见的错误类型和对应的排查方向如下:
| 错误类型 | 常见原因 | 排查方向 |
|---|---|---|
| 软连接错误 | 电源网络未对齐、衬底连接缺失 | 检查电源别名和衬底连接 |
| 器件不匹配 | 器件尺寸错误、模型名称不一致 | 检查CDL和规则文件的模型定义 |
| 端口不匹配 | 端口顺序或命名不一致 | 检查CDL导出设置和版图端口 |
| 多余器件 | Box化不完整、层次边界不清 | 检查Box配置和层次范围 |
| 短路错误 | 版图实际短路 | 用RVE定位短路位置 |
4.4 实操中的效率技巧与经验总结
在多次数模混合LVS项目中,我总结了几条能显著提升效率的技巧:
第一,分模块验证再顶层集成。不要一上来就跑顶层LVS,先把模拟模块和数字模块分别验证通过,再用Box方式做顶层集成。这样错误定位的范围小很多,调试效率高。
第二,善用LVS的增量比对功能。Calibre支持增量LVS,只比对上次LVS之后发生变化的模块。对于大型数模混合项目,增量比对可以节省大量时间。
第三,建立错误模式库。把每次LVS遇到的错误和解决方法记录下来,形成自己的错误模式库。下次遇到类似错误时,可以直接查库,不用从头分析。我自己的错误模式库已经积累了上百条记录,覆盖了大部分常见问题。
第四,定期清理网表。随着项目推进,网表会不断修改,积累大量临时性的connect语句和器件合并操作。建议每隔一段时间做一次网表清理,把不再需要的修改删掉,保持网表的可读性和可维护性。
5. 常见问题与排查技巧实录
5.1 软连接错误(Soft Connect)的排查与解决
软连接错误是数模混合LVS中最常见的错误类型。所谓软连接,是指版图中两个网络在物理上没有直接连接,但通过衬底或阱间接连通。LVS工具默认会检查软连接,如果发现软连接关系与原理图不一致,就会报错。
排查软连接错误,首先要确认版图中的衬底和阱连接是否正确。在数模混合项目中,模拟模块和数字模块通常有不同的衬底连接策略:模拟模块可能用独立的衬底接触环,数字模块可能用共享的衬底网络。如果两者的衬底连接方式不一致,LVS就会报软连接错误。
解决方法通常有两种:一种是在LVS规则文件中关闭软连接检查(LVS SOFT CONNECT选项),但这会掩盖真正的衬底连接错误;另一种是在网表中显式声明衬底连接关系,让LVS知道哪些软连接是预期的。我通常推荐第二种方法,因为更安全。
5.2 器件识别错误的常见原因与处理
器件识别错误通常表现为LVS报“器件不匹配”或“器件未识别”。常见原因包括:
- 器件模型名称不一致:CDL中的模型名称和LVS规则文件中的名称不匹配。比如CDL中写的是
nmos_rf,规则文件中定义的是nmos,LVS就识别不了; - 器件参数不完整:CDL中缺少W、L、M等关键参数,LVS无法正确识别器件;
- 器件版图与原理图结构不一致:比如原理图中是单个器件,版图中是多个器件并联,但网表中没有做合并处理。
处理这类错误,我通常先用Calibre的LVS DEVICE报告功能,查看工具识别到的器件列表和参数,然后和CDL中的器件逐一比对。差异点通常就是问题所在。
5.3 Box化后顶层LVS报错的典型场景
Box化之后顶层LVS报错,最常见的原因是端口连接问题。具体表现为:
- 端口名称不匹配:版图提取网表的端口名称和原理图网表的端口名称不一致;
- 端口顺序不匹配:端口名称一致但顺序不同,LVS按位置比对时就会报错;
- 端口数量不匹配:版图提取网表多出或少了端口,通常是因为版图中的端口标记不完整。
解决这类问题,我通常会在LVS规则文件中加入端口映射规则,或者在导出CDL时调整端口顺序。另外,建议在Box化之前先用LVS PORT报告功能确认端口列表,确保版图和原理图的端口定义完全一致。
5.4 排查技巧速查表
| 问题现象 | 可能原因 | 快速排查方法 |
|---|---|---|
| LVS报大量软连接错误 | 衬底连接不一致 | 检查衬底接触环和阱连接 |
| 器件数量不匹配 | 并联器件未合并 | 检查LVS REDUCE选项 |
| 端口不匹配 | 端口命名或顺序不一致 | 用LVS PORT报告比对 |
| Box化后报多余器件 | Box层次范围不对 | 检查LVS BOX的层次选项 |
| LVS跑不完或超时 | 比对量过大 | 用Box化减少比对量 |
| 电源网络报短路 | 电源别名未处理 | 检查LVS POWER NAME配置 |
提示:每次修改网表或LVS规则文件后,建议先跑一次快速LVS(只检查语法和提取),确认无误后再跑完整LVS。这样可以避免因为语法错误浪费大量时间。
5.5 独家避坑经验分享
最后分享几条我在实际项目中踩过的坑和总结的经验:
坑一:网表修改没有版本管理。有一次项目中期,我改了一版网表,LVS过了,但后来发现改错了,想回退却找不到原始版本。从那以后,我养成了用Git管理网表和LVS规则文件的习惯,每次修改都有记录,随时可以回退。
坑二:Box化之后忘了更新。子模块修改后重新验证通过了,但顶层LVS用的还是旧的Box配置,结果顶层LVS过了,但实际芯片里子模块是错的。后来我养成了习惯:每次子模块LVS通过后,立即更新顶层的Box配置和网表,确保顶层和子模块同步。
坑三:忽略了LVS日志中的警告信息。LVS日志中除了错误信息,还有一些警告信息,比如“器件参数超出范围”、“网络名称冲突”等。这些警告通常不会导致LVS失败,但可能暗示潜在问题。我现在每次LVS后都会把警告信息也过一遍,确认没有遗漏。
坑四:电源域检查不充分。数模混合项目中,电源域划分复杂,Box化之后顶层LVS无法检查子模块内部的电源域连接。我现在的做法是,除了顶层LVS,还会单独跑一次电源域检查(用LVS POWER DOMAIN相关规则),确保电源域之间的隔离和连接都正确。
这些经验看起来都是小事,但在实际项目中,往往就是这些小事导致芯片回来之后发现功能异常。LVS验证的目标不是“让工具不报错”,而是“确保版图和原理图真正一致”。这个理念贯穿整个验证流程,也是我写这篇内容的初衷。