
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管的并联合并。比如原理图中两个W1u的NMOS并联版图提取出来可能是一个W2u的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_IN0版图提取出来变成了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导出网表通常用CDLCircuit 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的RVEResults 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规则文件中定义的是nmosLVS就识别不了器件参数不完整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验证的目标不是“让工具不报错”而是“确保版图和原理图真正一致”。这个理念贯穿整个验证流程也是我写这篇内容的初衷。