Property errors found / Circuits do not match:netgen LVS 报告速读与三类根因
更新时间:2026-10-25。排错速查页,属于开源 EDA 排错系列。OpenLane 跑到 signoff 的 LVS 步(flow.tcl 的 STEP 39)或者单独调 netgen 比对两份 SPICE 网表,结尾甩出一句
Netlists do not match.——几百个器件里到底哪一级对不上,报告又长又啰嗦,新手常常翻到一半放弃。这篇给一套速读法。LVS 器件识别原理见 LVS 器件识别与提取,环境没装好的先看 OpenLane Docker 排错。
答案块(赶时间先看这里)
- 报错原文:
Property errors found in one or more circuits.或结尾Final result: Netlists do not match. - 环境:OpenLane 流程产物(sky130A),用 netgen 单独比对版图抽取网表与参考网表
- 根因三类:器件参数(W/L)不一致、实例引脚顺序错位、子电路层级被打平或改名
- 修复:把对不上的那处改回与参考网表一致(本实验是把被对调的两个引脚还原),重跑 netgen
- 验证:结尾出现
Final result: Circuits match uniquely.
本文要回答的问题
- netgen 报告那么长,哪些段是噪音、哪些段是证据?
- 为什么器件数、net 数两边都一样,还是
do not match? - 器件参数、引脚顺序、子电路层级这三类根因各有什么判别特征?
Circuits match uniquely和match(不带 uniquely)有什么区别?
一、报错原文与现象
复现方式:先用 OpenLane 完整跑通一个小计数器设计(42 步全流程,含 STEP 39 的 LVS),拿到版图抽取的 SPICE 网表;然后故意把网表里一个实例的两个引脚对调,再单独调 netgen 与未改动的参考网表比对:
Circuit 1 contains 97 devices, Circuit 2 contains 97 devices.
Circuit 1 contains 94 nets, Circuit 2 contains 94 nets.
Final result:
Netlists do not match.这张实录最值得记住的恰恰是这个「数字全对、结论不匹配」的画面:合并后两边都是 97 个器件、94 条 net,计数层面挑不出任何毛病,但 Final result 依然是 do not match。这说明 LVS 不是数个数,而是做图同构匹配——器件类型、参数、连接关系、层级结构全部要一一对应,任何一个维度错了都是 mismatch。所以排查时不要被「器件数相同」安慰到,那只是排除了「少器件/多器件」这一类最简单的根因。
二、报告速读:三段结构,中间一大段是噪音
netgen 报告按固定三段展开,会读的人只看两头:
中段那几百行 Circuit xxx contains 0 device instances. 是黑盒标准单元的正常摘要——netgen 只比对到单元边界,不钻进单元内部,所以看到全是 0 不用慌。真正要盯的是中段里有没有某个子电路只在一边出现(层级问题的前兆),以及尾部的合并计数和终判。Property errors found 则更进一步:netgen 会把参数对不上的器件逐个列在 .out 文件里(W/L 值各是多少),顺着名字回版图或网表里改即可。
尾部还有一行容易被忽略:Circuit was modified by parallel/series device merging.。这是 netgen 把并联/串联的器件先合并再比对(版图里常把一个宽管画成多个并联指条),所以你会看到合并前 228 个器件、合并后 97 个的两套计数。读计数时认准合并后那一套,拿合并前的数去和别处对账只会自寻烦恼。另外比对前务必确认两份网表的顶层名一致(本实验两边都叫 small_counter),顶层名给错会直接进入「子电路对不上」的假象。
三、三类根因的判别与修法
器件数相同但 mismatch 的情形,收敛到三类根因,判别特征和修法各不相同:
颜色按角色分:红是终判与三类根因、蓝是排查动作(三个检查入口)、橙是修复、绿是收敛。三类的判别口诀:有 Property errors 行 → 参数类,常见于版图里器件尺寸画错或参数提取偏差;参数全对但 net 连不上 → 引脚类,本实验就是这类——SPICE 网表里子电路调用按位置传参,两个引脚一对调,器件数不变、参数不变,但连接图完全不同构,短路类的连接问题进一步定位见 LVS short 定位法;中段出现单边子电路 → 层级类,一边 flatten 一边没 flatten、或者综合把层次名改了,判别与处理展开见 LVS 层级不一致排查。
四、修复验证:还原引脚后重跑
把被对调的两个引脚还原、重跑同一条 netgen 命令,尾部结论翻转:
Circuit 1 contains 97 devices, Circuit 2 contains 97 devices.
Circuit 1 contains 94 nets, Circuit 2 contains 94 nets.
Final result:
Circuits match uniquely.注意 uniquely 这个词:它表示两边不仅同构,而且匹配方式唯一——不存在「多种对法都能对上」的歧义。只写 Circuits match(没有 uniquely)时说明存在等价但不同的映射,多数情况是设计里有完全对称的结构(比如两条一样的缓冲链),一般可接受但值得留意。至此 LVS 收敛,设计可以进入签收的下一环节(DRC / 天线检查),完整环节划分见 物理验证与 GDS 出口。
实验环境
- 机器/系统:云主机 16C32G / Ubuntu 22.04(eda-golden-v1 镜像,预装 OpenLANE 2023 版流程 + netgen,PDK sky130A)
- 工具版本:Netgen 1.5.255(efabless/openlane 镜像 d054702b 内嵌,2023-07-12 编译)
- 日期:2026-10-24
- 完整命令:先
make -C /tmp/eda-golden/labs/openlane-small run跑通 42 步 OpenLANE 全流程产出版图网表(见 prep 记录),再docker run --rm -v /tmp/errlog-evidence:/tmp/errlog-evidence -v /home/ubuntu/.volare:/home/ubuntu/.volare efabless/openlane:d054702b2cce04761cc2bc598f6b95c9d8ca7c6c-amd64 netgen -batch lvs <网表A> small_counter <网表B> small_counter /home/ubuntu/.volare/sky130A/libs.tech/netgen/sky130A_setup.tcl <输出.out>(坏网表复现一次、还原后验证一次)
这一篇在知识体系里的位置
本篇是开源 EDA 排错簇中「物理验证」节点的速查页:上游原理是 LVS 器件识别与提取(netgen 怎么从版图认出器件)与 物理验证与 GDS 出口(LVS 在 signoff 里的位置);横向展开的两个姊妹问题是 LVS 层级不一致排查 和 LVS short 定位法;时序侧的 signoff 对照见 slack (VIOLATED) 排查——LVS 管「连得对不对」,STA 管「跑不跑得到频率」,两道闸都要过。
一句话总结
Netlists do not match(含 Property errors found)的本质是版图网表与参考网表的图同构匹配失败,器件数/net 数相同不代表匹配;速读只看头尾——头部确认比对对象,尾部拿终判与失配清单;根因收敛为三类:有 Property errors 行是器件参数不一致、参数全对是引脚顺序错位、中段出现单边子电路是层级打平,各自对应改参数、还原连接、统一层级,重跑看到 Circuits match uniquely 才算收敛。