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

在Calibre物理签核流程中,送入DRC/LVS/ERC引擎的从来不是“一张平面图”,而是一份带有层次结构、层号语义、文本标注和引用关系的版图数据库。数据准备阶段的核心任务,是把设计端交付的GDSII或OASIS文件,转换成签核工具能够正确解释、且与规则文件层号定义严格对齐的输入。这一步做错,后续所有检查结果都不可信。

层次化数据与cell引用:签核工具如何“看懂”版图

GDSII和OASIS本质上都是层次化格式。一个版图由若干cell组成,每个cell内部可以放置基本图形(多边形、路径、矩形),也可以引用其他cell的实例(SREF/AREF)。Calibre在读取时并不会先把所有层次展平,而是保留层次树,按需在规则驱动下进行层次化处理。理解这一点,对判断数据准备是否正确至关重要。

以一个典型模块为例:顶层cell TOP 引用 CORE 和 IO_RING;CORE 内部又多次引用标准单元 STD_CELL_A。若 STD_CELL_A 在版图中被引用2000次,展平后会产生2000份重复图形;而层次化处理只需在cell定义处检查一次,再通过引用关系传播结果。Calibre的层次化引擎正是利用这种复用性来压缩运行时间与内存。但前提是:cell引用必须合法,不能出现循环引用(A引用B,B又引用A),否则工具在展开层次时会报错或陷入死循环。

实际操作中,常用 calibre -drc -hier 相关选项控制层次处理深度。若规则文件使用了 LAYOUT PATH 和 LAYOUT PRIMARY,必须确保 LAYOUT PRIMARY 指定的顶层cell名称与GDS/OASIS中的实际cell名完全一致,大小写敏感。一个常见错误是:设计者导出的GDS顶层cell叫 TOP_CHIP,而规则文件里写的是 top_chip,Calibre会直接报“primary cell not found”。

GDS/OASIS层次化数据与层号映射处理链 设计端交付 layout.gds 或 layout.oas Calibre读取与层次解析 LAYOUT PRIMARY = TOP_CHIP LAYOUT PATH = ./layout.gds 保留cell引用树,按需展平 层号映射 GDS layer/datatype → 规则层名 LAYER MAP 语句 文本标签处理 TEXT layer 标注 pin name / net name LVS时与网表比对 TEXT DEPTH 控制层次 数据合并与拆分 多GDS合并:cell名冲突 拆分:按模块/区域输出 BOOLEAN / MERGE 操作 保持层号一致性 输出与验证 生成签核用数据库 检查cell引用完整性 层号映射覆盖率100% 文本标签可读性验证 关键检查点 ① 顶层cell名一致 ② 无循环引用 ③ 层号映射无遗漏 ④ 文本标签层正确 数据准备正确性直接决定DRC/LVS结果可信度

层号映射:GDS layer/datatype与规则层名的对齐

GDSII用两个整数描述一个层:layer number和datatype。例如 layer 1 datatype 0 通常表示N阱,layer 2 datatype 0 表示多晶硅。但不同工艺厂、不同设计项目可能使用完全不同的编号约定。Calibre规则文件里不会直接写“layer 1 datatype 0”,而是用可读的层名,如 NWELL、POLY、ACTIVE。两者之间的桥梁就是 LAYER MAP 语句。

一个典型的映射写法如下:

LAYER MAP 1 DATATYPE 0  NWELL
LAYER MAP 2 DATATYPE 0  POLY
LAYER MAP 3 DATATYPE 0  ACTIVE
LAYER MAP 4 DATATYPE 0  CONTACT
LAYER MAP 5 DATATYPE 0  METAL1
LAYER MAP 10 DATATYPE 0 TEXT

如果GDS中某个图形使用了 layer 6 datatype 0,而规则文件里没有对应的 LAYER MAP,Calibre会忽略该层,或者在某些严格模式下报“unmapped layer”警告。更隐蔽的问题是datatype不匹配:设计端把 layer 5 datatype 1 当作METAL1的填充图形,而规则只映射了 layer 5 datatype 0,填充图形就会被漏掉,导致密度检查结果偏乐观。

实操中,建议在数据准备阶段先运行一次层号统计。可以用Calibre的 calibre -drc -hier -layerstat 或第三方工具(如KLayout的layer info)导出GDS中实际出现的所有layer/datatype组合,再与规则文件的 LAYER MAP 列表逐项比对。一个可复用的检查表如下:

检查项方法通过标准
GDS实际层号列表KLayout layer info / calibre layerstat导出完整列表
规则文件LAYER MAP覆盖grep "LAYER MAP" rulefile每个GDS层号都有对应映射
datatype一致性逐项比对layer+datatype组合无遗漏、无错配
文本层映射确认TEXT层号与规则一致LVS可读取pin/net名

文本标签:LVS的“名字”从哪来

版图中的文本标签通常放在专门的TEXT层上,用于标注pin名、net名、cell名或器件参数。LVS引擎在提取网表时,会读取这些文本,并与原理图网表进行名称比对。如果文本层映射错误,或者文本被放在了错误的层次深度,LVS可能报出大量“unmatched net”或“unmatched pin”。

Calibre中控制文本读取的关键语句包括 TEXT LAYER 和 TEXT DEPTH。TEXT LAYER 指定哪个层是文本层;TEXT DEPTH 控制文本在层次树中的可见深度。例如 TEXT DEPTH 0 表示只读取顶层文本,TEXT DEPTH 10 表示向下读取10层。如果设计者在标准单元内部标注了pin名,但 TEXT DEPTH 设为0,这些pin名就不会被LVS识别。

另一个常见问题是文本的“附着”关系。版图中的文本通常需要与某个图形(如METAL1上的pin)在空间上重叠或邻近,LVS才能把文本名赋给对应的net。如果文本被放在空白区域,即使层号正确,LVS也无法建立名称关联。数据准备阶段可以用Calibre的 LAYOUT TEXT 相关检查,或手动在版图工具中确认文本与图形的重叠关系。

数据合并与拆分:多源GDS的整合策略

实际项目中,顶层版图往往由多个来源合并而成:数字模块来自综合布局布线工具,模拟模块来自手工版图,IP核来自第三方GDS,IO ring来自工艺厂。这些GDS文件可能使用不同的层号约定、不同的cell命名规则,甚至不同的单位(1μm vs 1nm)。合并时若处理不当,会出现cell名冲突、层号错乱、单位不一致等问题。

合并操作通常有两种方式:一是用Calibre的 LAYOUT MERGE 或 BOOLEAN 语句在规则文件中完成;二是用版图工具(如Virtuoso、KLayout)先做物理合并,再导出单一GDS。前者适合规则驱动的自动化流程,后者适合需要人工干预的复杂合并。无论哪种方式,合并后必须重新检查:

  • 所有cell名是否唯一,冲突的cell是否已重命名;
  • 各单位是否统一(建议统一为1nm或1μm,与规则文件一致);
  • 层号映射是否仍然覆盖所有合并后的层;
  • 文本标签是否在合并后仍然与图形保持正确的空间关系。

拆分则常用于将大版图按模块或区域切分,分别进行DRC/LVS以缩短单次运行时间。拆分时要注意边界处的图形完整性:如果切割线穿过一个晶体管,拆分后的两个部分都无法通过LVS。因此拆分通常按层次边界或空白区域进行,并在拆分后对每个子块单独运行签核,最后再对顶层做一次整体检查。

数据准备阶段的一个实用习惯:在正式运行Calibre之前,先用 calibre -drc -hier -layout 仅做版图读取和层号解析,不执行规则检查。观察日志中是否有“unmapped layer”、“primary cell not found”、“text layer not defined”等警告。这些警告往往比后续DRC报出的几何错误更早暴露数据问题。
OASIS格式虽然比GDSII更紧凑、支持更多数据类型,但部分旧版Calibre或旧规则文件可能对OASIS的某些扩展特性支持不完整。如果设计端交付的是OASIS,建议先确认Calibre版本和规则文件是否明确支持OASIS读取,必要时可先用工具转换为GDSII再送入签核,但转换过程本身也可能引入层号或文本丢失,需逐项验证。

总结来说,版图数据准备不是简单的“把GDS喂给Calibre”,而是一次需要逐项核对的工程操作。层次化数据要保证cell引用合法、顶层cell名匹配;层号映射要保证GDS layer/datatype与规则层名一一对应;文本标签要保证层号正确、深度足够、与图形有正确的空间关联;合并拆分要保证cell名、单位、层号、文本在操作前后一致。这些检查做到位,后续的DRC/LVS结果才具备签核意义。