3. 版图数据准备与GDS/OASIS处理

物理验证的输入并不是“版图”这个概念本身,而是从版图编辑器或版图数据库导出的版图交换文件。Calibre、PVS、ICV 等验证工具并不直接读取 Virtuoso 的 OpenAccess 数据库,而是读取 GDSII 或 OASIS 这类平面化交换格式。因此,签核流程的第一步不是跑 DRC,而是把数据“喂对”。大量所谓“工具误报”,追根溯源其实是数据准备阶段的问题:层次被展平、文本层丢失、cell 名被截断、坐标被取整、OASIS 压缩选项不兼容等。

GDSII 与 OASIS 的差异与选择

GDSII 是 1978 年定型的格式,结构简单、兼容性最好,但有两个硬伤:一是单个文件不能超过 4 GB(受记录长度与坐标 32 位限制),二是 cell 名最长 32 字符。先进工艺的全芯片版图动辄几十 GB,GDSII 往往需要切分。OASIS 是 2004 年推出的替代格式,支持 64 位坐标、任意长度 cell 名、内置压缩与重复结构引用,文件通常比 GDSII 小 5~20 倍,且支持增量读取。

选择原则很直接:成熟工艺、与第三方 IP 交换、需要给封装/测试环节时,优先 GDSII 保证兼容;先进节点全芯片、内部流转、需要控制文件体积时用 OASIS。但要注意,OASIS 的 CBLOCK 压缩、REPETITION 重复结构和 XYABSOLUTE/XYRELATIVE 模式如果与验证工具的读入设置不匹配,会出现图形错位或漏读,这是 OASIS 最典型的坑。

读入与层次化处理

Calibre 读入版图的核心命令是 LAYOUT PATH 与 LAYOUT PRIMARY、LAYOUT SYSTEM。一个典型的 DRC 运行集开头如下:

LAYOUT PATH "chip_top.oas"
LAYOUT PRIMARY "chip_top"
LAYOUT SYSTEM OASIS
DRC RESULTS DATABASE "drc_results.gds" GDSII
DRC MAXIMUM RESULTS ALL
DRC SUMMARY REPORT "drc.summary" REPLACE

这里 LAYOUT PRIMARY 指定顶层 cell,工具从它开始向下遍历层次。层次化处理的关键在于:验证工具默认保留层次,对每个 cell 只检查一次,再通过层次引用复用结果,这是全芯片 DRC 能在数小时内完成的原因。如果误用了展平选项(如 Calibre 的 FLATTEN 或某些流程中的 -flatten),全芯片会被展开成上亿个多边形,内存暴涨且运行时间成倍增加。

但层次化也有代价:跨层次的图形关系(如 A cell 中的金属与 B cell 中的通孔)在层次化检查中需要工具自动做层次提升(hierarchy promotion)。如果某个 cell 被 DONT_TOUCH 或 BLACKBOX 处理,其内部图形不参与检查,跨层次规则就可能漏检。因此,对标准单元、SRAM、IP 宏,要明确哪些是黑盒、哪些需要展开检查。

版图数据准备与验证读入链路 版图数据库 OpenAccess / CDB Virtuoso Layout 导出交换文件 strmout / write_oasis 层映射表 (Layermap) 文本标注保留 cell name 映射 GDSII / OASIS chip_top.gds chip_top.oas 物理验证工具 Calibre / PVS / ICV LAYOUT SYSTEM LAYOUT PRIMARY 层次化遍历 层次提升检查 黑盒处理 数据完整性检查 • 顶层 cell 是否存在 • 层号/数据类型是否匹配 • 文本层是否保留 • cell 引用是否完整 验证结果 • DRC/LVS 结果库 • 误报 vs 真实违规 • 层次化结果映射回版图 数据问题反馈修正

文本标注与 cell name 映射

文本标注(text label)在版图中通常放在 text 层,用于标注 pin 名、net 名、器件名。LVS 依赖这些文本做 net 对应,如果导出时把文本层过滤掉,LVS 会报大量“net 不匹配”。导出时必须在 layermap 中显式保留文本层,例如:

# layer_name  layer  datatype  purpose
text        131    0         label
MET1        31     0         drawing
MET1_pin    31     1         pin

cell name 映射是另一个高频问题。GDSII 限制 32 字符,Virtuoso 中形如 INV_X2_5V_DRIVE_STRENGTH_HIGH 的 cell 名会被截断成 INV_X2_5V_DRIVE_STRENGTH_HIG,导致两个不同 cell 截断后重名,工具读入时发生覆盖。解决办法是在导出前用 strmout 的 -map 选项做名称映射,或改用 OASIS 避免长度限制。若必须用 GDSII,应建立一份 cell name 映射表,把长名映射为短名并保证唯一性。

数据完整性检查清单

在正式跑 DRC/LVS 之前,建议先做一轮轻量级数据检查,避免把数据问题误判为设计违规。以下检查项可直接用于流程脚本:

检查项 检查方法 常见问题
顶层 cell 存在性 读入后查询 top cell 名 PRIMARY 名拼写错误,工具报空版图
层号/数据类型 对比 layermap 与工艺文件 层号偏移,图形落到错误层
文本层保留 统计 text 层图形数量 文本被过滤,LVS net 不匹配
cell 引用完整性 检查是否有未定义引用 缺失 cell,工具报 unresolved reference
坐标范围 统计 bbox 与预期 die 尺寸对比 坐标取整或单位错误,版图偏移
OASIS 压缩兼容性 用工具读入并对比图形数 CBLOCK 不兼容,图形漏读
一个实用技巧:在 Calibre 中先用 calibre -drc -hier 做一次仅统计图形数量的快速运行,确认读入的 polygon 数与版图数据库中的统计值一致,再跑完整规则。这一步通常只需几分钟,却能提前暴露大部分数据问题。

避免数据问题导致误报

误报的典型来源有三类。第一类是层映射错误:工艺文件要求 MET1 在 31/0,但导出时映射到了 31/1,工具在 31/0 上找不到图形,报“missing layer”或大量 spacing 违规。第二类是文本丢失:LVS 中 device 的 terminal 无法通过文本识别,报“unmatched net”。第三类是层次化黑盒设置不当:把需要检查的 IP 设成黑盒,跨层次规则漏检,反而在后续 signoff 阶段才暴露。

处理原则是:先确认数据,再怀疑规则。每次更换工艺节点、更换导出脚本、更换验证工具版本后,都应重新跑一遍数据完整性检查。把数据检查做成流程中的固定步骤,而不是出问题后的补救措施,才能真正减少“工具误报”带来的无效迭代。