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 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 -drc -hier -layout 仅做版图读取和层号解析,不执行规则检查。观察日志中是否有“unmapped layer”、“primary cell not found”、“text layer not defined”等警告。这些警告往往比后续DRC报出的几何错误更早暴露数据问题。
总结来说,版图数据准备不是简单的“把GDS喂给Calibre”,而是一次需要逐项核对的工程操作。层次化数据要保证cell引用合法、顶层cell名匹配;层号映射要保证GDS layer/datatype与规则层名一一对应;文本标签要保证层号正确、深度足够、与图形有正确的空间关联;合并拆分要保证cell名、单位、层号、文本在操作前后一致。这些检查做到位,后续的DRC/LVS结果才具备签核意义。