Calibre LVS 未解析单元:Unresolved cells / Could not resolve cell 速查
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列,总入口见 开源 EDA 报错排错中心。Calibre nmLVS 说的「未解析单元」(unresolved cell)不是网表读入期的语法报错,而是版图与 source 两侧网表都已生成、开始比对时,某个 cell 名字在它该出现的一侧对不上定义:要么 source 网表里引用了一个没 include 进来的子电路或 IP,要么版图抽出了它不认识的器件与 text,要么两侧都有定义却因 hcell、尺寸、电源声明对不上而被当成黑盒。它和读入期的「Subcircuit is not defined」是两个阶段的病,后者见 Calibre 未定义符号;文件本身打不开、PRIMARY 对不上见 Calibre 模块/单元找不到。
本文要回答的问题
- LVS 报告里的
UNRESOLVED CELLS段到底在说什么,为什么 LVS 还能跑完? Could not resolve cell是 source 网表缺东西,还是版图/GDS 缺东西?- 电源地 text 标得好好的,为什么单元还是解析不了?
- hcell 列表起什么作用,缺了它为什么同尺寸单元被当黑盒?
- 第三方 IP 本来就该是黑盒,怎么和「真的漏了定义」区分开?
一、LVS 报告原文与现象
未解析单元的报错分两处冒出来:transcript 里的单行信息,以及 .lvs.report 末尾固定的汇总段。先认出形态,再决定查哪一侧。
1. transcript 读入与建库期的单行信息:
Error: Could not resolve cell "demo_ip" referenced by instance "u_top/u_ip".
Warning: Cell "CELL_A" appears in layout but has no source definition.
Warning: Unrecognized device type treated as ideal; properties ignored.Could not resolve cell 指向 source 侧引用查无定义;appears in layout but has no source definition 反过来,是版图抽出了 source 侧不存在的单元;treated as ideal 最值得警惕——Calibre 没丢弃它,而是把器件当理想元件继续比对,LVS 可能给你一个带隐患的结果。
2. LVS 报告的 UNRESOLVED CELLS 汇总段:
UNRESOLVED CELLS
Source Layout
Cell Name Freq Ports Freq Ports
------------------------ ---------- ----------
demo_ip 1 6 0 0
CELL_A 0 0 4 3
filler_x2 1 0 1 0读这张表只看两列频次:只在 Source 列出现(如 demo_ip),是版图侧缺这个单元的定义或它没被抽出来;只在 Layout 列出现(如 CELL_A),是 source 网表里缺对应子电路;两侧都出现但仍列在这里(如 filler_x2),最微妙——名字或端口对不上,典型是大小写、hcell 或电源 text 问题。未解析单元的连带后果报告里也会直接写:INCORRECT PORTS ON UNRESOLVED CELLS(端口表对不齐)、大量 unmatched 器件与网名,甚至整层层次被拍平后错位。器件从版图里被抽出来的完整机制见 LVS 器件识别与抽取。
二、原因速查表
| 报告现象 | 可能原因 | 处置 |
|---|---|---|
| 单元只在 Source 列有频次 | GDS 里缺该 cell,或 LAYOUT PATH 没把含它的库给全 | 补 LAYOUT PATH/库文件,确认 GDS 层次未被打坏 |
| 单元只在 Layout 列有频次 | source 网表漏 .INCLUDE/.LIB,IP 或 IO 子电路没挂 | runset 与网表头部核对 include 序列,补齐片段 |
| 两侧都有频次仍未解析(其一) | .SUBCKT 名大小写或端口顺序/数量不一致 | 逐字符对名字与端口表,改 source 侧导出 |
| 电源/地相关单元解析不了 | 未用 LVS POWER NAME/SUPPLY 声明电源网,text 落不到网上 | 补电源声明,核对 text 层与 LVS TEXT 映射 |
| 标准单元大面积当黑盒 | hcell 列表缺失或与当前 PDK 版本不匹配 | 挂 PDK 配套 hcell,核对单元名逐字一致 |
| 同一单元名解析到两个定义 | 版本库混用,新旧两套单元同时在路径里 | 清理 SOURCE/LAYOUT PATH,只留一套库 |
| 器件被当 ideal,参数不参与比对 | CDF 参数/property 缺失,器件识别文件不配套 | 对 PDK 版本补属性映射与 device 规则 |
| 层次边界以下整段对不上 | 层级单元未展开(hierarchical boundary) | 核对展开开关与 GDS 结构,必要时展平该层次 |
三、逐条排查展开
第一步:先在 UNRESOLVED CELLS 段定性,别上来就翻网表。 速查表那张频次分布就是分诊台:单侧有频次是「缺」,双侧都有是「对不上」。这一步决定后面所有动作的方向——把双侧对不上的问题当成缺文件去补 include,只会越补越乱。定完性再看报告给的完整层次实例名(如 u_top/u_ip),它直接告诉你断在第几层。
下面这张决策树按「频次落在哪侧」分叉,任何一条命中就在对应通道修,修完干净目录重跑:
读这张图抓住「频次定侧」:红色入口只做一件事——看单元落在哪张网表;三个蓝色分支互串会误诊,版图侧缺单元去补 GDS 与识别规则,source 侧缺定义去补 include 与库路径;最右边的双侧分支占实际工单的多数,它修的全是「对不上」而非「没有」:.SUBCKT 名字、电源 text、hcell。橙色叶节点统一以干净目录重跑收口,未解析单元计数归零才算修完。
第二步:source 侧缺定义——查 include 序列与库路径。 SPICE 是顺序语言,.SUBCKT demo_ip ... 与 PDK model 必须在例化之前被文本流读到。最常见的漏法是网表头部只 include 了 model,没挂 IO/IP 供应商给的子电路片段;其次是 .LIB 工艺角名与当前 deck 不配套。最小判据仍是 grep——在实际被读入的全部网表片段里搜报错名,搜得到看顺序,搜不到回数字侧或 IP 交付包里补:
grep -rn '.SUBCKT demo_ip' netlist/ ip_lib/
grep -rn 'demo_ip' run/*.lvs.reportSOURCE PATH 给的是目录还是文件、通配符有没有把新库目录漏掉,也要在 runset 里核一遍。读入期就报「not defined」的同族问题归 Calibre 未定义符号,本篇的 Could not resolve cell 特指比对期这一层。
第三步:电源 text 与 LVS 控制语句——高频且隐蔽的一类。 电源地在版图里通常只是 text 标注,Calibre 要靠 SVRF/runset 里的控制语句才知道「这个 text 名是一张电源网」。没声明时,接到电源 text 上的引脚无法连网,依赖电源端口配对的单元(filler、tap、IO)立刻端口失配,掉进未解析清单。要核的三处:text 写的层/purpose 与 LVS TEXT 映射一致;电源网名用 LVS POWER NAME(或 deck 约定的 SUPPLY 语句)声明且大小写与 text 逐字相同;全局电源没有被局部网名遮蔽。这类问题的特征是报错单元集中在 well/tap/filler/IO 几类,逻辑单元反而正常。
第四步:hcell 与「两侧都有却对不上」。 hcell 列表告诉 LVS「这些单元名在 source 与 layout 两侧指同一个物理单元,允许黑盒比对」。列表缺失、挂错 PDK 版本、或单元名差一个后缀(FILLER_X2 对 filler_x2),同名同尺寸的单元就无法配对,被当未解析黑盒。处置是用 PDK 随版本发布的 hcell 文件,不自己攒;换工艺角或 PDK 版本时 hcell 必须一起换。另一个常被忽略的成因是版本库混用——SOURCE/LAYOUT PATH 里同时挂着新旧两套库,同一个名字解析到两版定义,端口数不同就未解析。把路径里废弃库目录删掉,比在 hcell 里打补丁正确。CDF 参数/property 缺失导致器件被当 ideal 的,现象是单元解析了但器件类型与参数不参与比对,需对 PDK 版本补器件识别文件,机制见 LVS 器件识别与抽取。
第五步:区分「该存在的 IP 黑盒」与「真漏定义」。 第三方硬 IP(PLL、PHY、IO cell)交付时本来就只有端口表、没有晶体管级内部——它们应该以黑盒形式出现在两侧并通过比对。判断标准:该单元在 hcell 或 IP 交付清单里有登记,且两侧端口表一致,属于正常黑盒,不用展开;若单元名不在任何交付清单里、或端口频次对不平,才是真漏了定义,回数字侧/版图侧补齐。把正常 IP 强行展平去找内部器件,反而会制造一批新的未解析器件。
四、预防与纪律
- 网表交付带清单:IP/IO 子电路片段、PDK model、
.LIB角名、hcell 文件四项分开列明,LVS 报未解析时照清单 grep,五分钟定性缺哪份。 - 电源声明随 deck 固定:
LVS POWER NAME/SUPPLY 语句与 text 层映射写进项目标准 runset,不靠人手每次加,text 改名与控制语句改名放在同一个变更里评审。 - PDK 整套换、路径不留旧库:deck、器件识别文件、hcell、model 按工艺厂声明的配套版本一起切,SOURCE/LAYOUT PATH 不允许新旧目录并存。
- IP 黑盒清单化:交付时列出允许黑盒比对的单元名与端口表,排查时先对清单,不把正常黑盒当缺陷追。
- 改一处、干净目录重跑、只认未解析计数:修对根因后 UNRESOLVED CELLS 会成片消失;报告里仍有计数就不算修完,
CORRECT之外的结论都要回看这段。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中 Calibre「找不到」系列的第三层:总入口见 开源 EDA 报错排错中心;文件/PRIMARY 级找不到归 Calibre 模块/单元找不到,读入期符号缺失归 Calibre 未定义符号,本篇管 LVS 比对期的未解析单元;上游机制是 LVS 器件识别与抽取,完整验证流程与 run 目录组织见 Calibre 物理验证实操。
一句话总结
Calibre LVS 报未解析单元,先看报告 UNRESOLVED CELLS 段的频次落在哪侧:只在 Source 是版图/GDS 缺定义,补 LAYOUT PATH、层映射并展开层次边界;只在 Layout 是 source 网表缺引用,补 .INCLUDE/.LIB 并保证定义先于例化;两侧都有却对不上,逐字符核 .SUBCKT 名与端口、LVS POWER NAME/SUPPLY 电源 text、PDK 配套 hcell,并清掉混挂的旧版本库;IP 黑盒凭交付清单与端口表正常放过,真漏定义才回对应侧补齐,修完干净目录重跑到未解析计数归零。