2. LVS输入文件体系

LVS(Layout Versus Schematic)并不是一个“点一下按钮就出结果”的黑盒工具,它本质上是一次基于规则的图论比对:把版图提取出的器件与连接关系,和原理图网表描述的器件与连接关系,分别转换成同一种内部图结构,再逐节点、逐器件做匹配。要让这次比对成立,Calibre 必须同时拿到五类输入:版图数据、原理图网表、工艺规则文件、控制文件,以及一个组织这些文件的运行目录。理解它们的角色和相互关系,是排查 LVS 报错的第一课。

五类输入的分工

版图 GDS 是几何描述。它只告诉工具“某层上有一个矩形、某层上有一条路径”,并不直接说明这是 MOS 管还是电阻。Calibre 通过规则文件里的 LAYER 映射和器件识别语句,从这些几何图形中“提取”出器件与网络,形成版图侧的网表。因此 GDS 的层号、数据类型(datatype)必须与规则文件中的层定义严格对应,否则会出现“器件提取不到”或“多提取出寄生器件”的问题。

原理图网表 是电路描述。它通常由 Virtuoso、HSPICE 等工具导出为 SPICE 格式,明确给出器件类型、实例名、端口连接和参数(如 W/L、M 因子)。LVS 关心的是连接拓扑,参数比对(如 W/L 是否一致)通常由 LVS 选项或后续的寄生参数检查控制。网表里的器件模型名必须能通过规则文件中的 DEVICE 语句映射到版图提取出的器件类型,否则会出现“器件类型不匹配”。

工艺规则文件(通常以 .cal 或规则集形式存在)是 LVS 的“翻译字典”和“判定标准”。它包含:层定义与派生层、器件识别与提取语句、器件端子定义、器件属性提取、以及连接性判定规则。规则文件由工艺厂或 PDK 提供,一般不应随意修改;若确需修改,必须清楚每一处改动对提取结果的影响。

控制文件(runset)是“运行指令”。它告诉 Calibre:输入 GDS 是哪个、源网表是哪个、规则文件是哪个、输出报告写到哪里、采用哪些 LVS 选项(如 LVS REPORT、LVS SPICE、大小写敏感、电源地名称等)。控制文件通常由工程师根据项目定制,是日常调试中最常改动的部分。

运行目录是“工作台”。它决定了相对路径的解析基准、中间文件的落盘位置、日志与报告的归档方式。一个清晰的运行目录能让复现和回溯变得容易,而混乱的目录往往是“昨天能跑、今天报错”的根源。

LVS 输入文件体系与运行目录组织 运行目录 /proj/blockA/lvs/ 版图数据 blockA.gds 几何图形 / 层号+datatype 顶层单元名、端口 → 由规则文件提取器件 原理图网表 blockA.spi / .cdl 器件类型、实例名、端口 W/L、M 因子等参数 → 由规则文件映射器件 工艺规则文件 lvs_rule.cal LAYER 层定义与派生层 DEVICE 器件识别与端子 连接性判定规则 控制文件 runset lvs_runset 指定 GDS / 网表 / 规则 LVS 选项与报告路径 电源地、大小写等设置 Calibre LVS 引擎 版图侧网表 vs 原理图侧网表 拓扑比对 + 器件匹配 输出 lvs.rep 输出与日志 lvs.rep(比对报告) lvs.log / 中间提取网表 目录组织建议: gds/ netlist/ rule/ runset/ work/ report/ 相对路径以 runset 所在目录为基准解析

运行目录的组织方式

一个可复现的 LVS 运行目录,通常按“输入—规则—控制—输出”分层。下面是一个可直接参考的目录结构示例:

/proj/blockA/lvs/
├── gds/
│   └── blockA.gds
├── netlist/
│   └── blockA.spi
├── rule/
│   └── lvs_rule.cal
├── runset/
│   └── lvs_runset
├── work/
│   ├── blockA.lvs.db
│   └── extracted.spi
└── report/
    ├── lvs.rep
    └── lvs.log

这样组织的好处是:runset 中所有路径都可以写成相对路径,例如 LAYOUT PATH "../gds/blockA.gds"、SOURCE PATH "../netlist/blockA.spi"、LVS REPORT "../report/lvs.rep"。当整个项目目录被复制或归档时,路径关系保持不变,不会因为绝对路径失效而报“文件找不到”。

建议把 work/ 和 report/ 视为可再生成的中间产物,不要手工编辑;真正需要版本管理的是 gds/、netlist/、rule/ 和 runset/ 四类输入。

控制文件中的关键设置

控制文件是连接五类输入的“胶水”。一个典型的 runset 片段如下(示例参数,实际以项目为准):

// lvs_runset 示例
LAYOUT PATH "../gds/blockA.gds"
LAYOUT PRIMARY "blockA"
LAYOUT SYSTEM GDSII

SOURCE PATH "../netlist/blockA.spi"
SOURCE PRIMARY "blockA"
SOURCE SYSTEM SPICE

LVS REPORT "../report/lvs.rep"
LVS REPORT OPTION S
LVS POWER NAME "VDD" "VSS"
LVS GROUND NAME "VSS"
LVS CASE YES

其中 LAYOUT PRIMARY 与 SOURCE PRIMARY 必须指向同一个顶层单元名,否则 Calibre 会直接报“顶层单元不匹配”。LVS POWER NAME 和 LVS GROUND NAME 用于告诉工具哪些网络是电源地,避免把电源网络当作普通信号参与比对。LVS CASE YES 表示大小写敏感,若原理图网表与版图提取结果的大小写习惯不同,需要谨慎设置。

常见输入类报错与定位

当 LVS 无法正常启动时,问题往往不在比对算法,而在输入文件本身。下面这张对照表可以帮助快速定位:

报错现象 可能原因 检查点
Cannot open layout file GDS 路径错误或文件不存在 runset 中 LAYOUT PATH 相对路径基准
Top cell not found LAYOUT PRIMARY 与 GDS 顶层名不一致 用版图工具查看 GDS 顶层单元名
No device extracted 层号/datatype 与规则文件不匹配 规则文件 LAYER 定义与 GDS 层映射
Device type mismatch 网表器件模型名无法映射 规则文件 DEVICE 语句与网表模型名
Power/Ground short 电源地名称未正确声明 LVS POWER NAME / GROUND NAME
不要一遇到 LVS 报错就修改规则文件。规则文件来自 PDK,改动可能影响所有项目的提取一致性。优先检查 runset 路径、顶层名、电源地声明和网表导出设置,这些是最高频的输入类问题。

输入体系的一致性检查

在正式跑 LVS 之前,建议按以下顺序做一次输入一致性检查:

  1. 层映射检查:确认 GDS 中使用的层号、datatype 在规则文件中有对应定义,且派生层(如 COMP = DIFF AND POLY)逻辑正确。
  2. 顶层名检查:GDS 顶层单元名、网表顶层子电路名、runset 中两个 PRIMARY 必须完全一致(含大小写)。
  3. 器件映射检查:网表中的器件模型名(如 nch_mac、pch_mac)能在规则文件的 DEVICE 语句中找到对应提取规则。
  4. 电源地检查:确认 VDD、VSS 等全局网络已在 runset 中声明,且网表中这些网络名与版图提取结果一致。
  5. 路径检查:所有相对路径以 runset 所在目录为基准,确认 ../gds/、../netlist/ 等目录真实存在。