2. Calibre DRC规则文件结构解析

Calibre DRC规则文件(通常以 .cal 或 .rule 为扩展名)是签核流程的“源代码”。它并不是一堆零散命令的堆砌,而是一个具有明确层次结构的程序:从工艺层定义出发,经过变量与参数化,再由规则语句描述几何检查,最后通过模块化组织把成百上千条检查装配成可维护、可复用的签核套件。理解这个结构,是后续调试、裁剪和优化规则文件的前提。

一、规则文件的四层组成

一个典型的先进工艺DRC规则文件可以拆成四个层次,它们自上而下依次依赖:

  • 层定义层(Layer Definition):把GDS/OASIS中的层号(layer/datatype)映射为可读的工艺名,例如 M1、POLY、VIA1。
  • 变量与参数层(Variables & Parameters):集中管理尺寸、间距、密度阈值等可调数值,避免硬编码。
  • 规则语句层(Rule Statements):由 LAYOUT 系列命令构成的实际几何检查,如宽度、间距、包围、密度。
  • 模块与流程层(Modules & Flow):用 INCLUDE、#DEFINE、条件判断把规则分块组织,并按签核阶段调用。

这四层的关系可以用下面的结构图表示:层定义提供“词汇”,变量提供“数值”,规则语句构成“句子”,模块化则把这些句子组织成“章节”。

Calibre DRC 规则文件四层结构 ① 层定义层 Layer Definition LAYER M1 31 ; LAYER VIA1 51 ; LAYER POLY 17 将 GDS 层号/数据类型映射为工艺可读名,供后续规则引用 ② 变量与参数层 Variables & Parameters #DEFINE M1_MIN_W 0.032 ; #DEFINE M1_MIN_S 0.032 集中管理尺寸/间距/密度阈值,一处修改全局生效 ③ 规则语句层 Rule Statements LAYOUT WIDTH M1 < M1_MIN_W ; LAYOUT SPACE M1 < M1_MIN_S 由 LAYOUT 系列命令构成的实际几何检查 ④ 模块与流程层 Modules & Flow INCLUDE "m1.rules" ; #IFDEF DENSITY_CHECK ... #ENDIF 用 INCLUDE / 条件编译把规则分块,按签核阶段调用 依赖方向:上层为下层提供词汇与数值,下层为上层提供可执行检查

二、层定义:从GDS层号到工艺名

Calibre本身不认识“M1”或“POLY”,它只认识GDS中的层号与数据类型。层定义的作用就是建立映射。常见写法有两种:

LAYER M1 31
LAYER M1 31 0
LAYER VIA1 51
LAYER POLY 17
LAYER NWELL 1

第一行 LAYER M1 31 表示把层号31(默认数据类型0)命名为M1。若同一工艺层由多个层号组成,可以多次定义同名层,Calibre会自动做并集。例如某些工艺的M1由31/0和31/1共同构成,就写两行 LAYER M1 31 0 与 LAYER M1 31 1。

层定义通常放在文件最前面,且应集中成块,不要散落在规则中间。一个实用习惯是:按“衬底/阱→有源→多晶→金属→通孔→顶层”的顺序排列,便于人工核对。层定义一旦写错,后续所有规则都会作用在错误的图形上,因此签核前必须用 calibre -drc -hier 配合层提取结果做一次目视确认。

三、变量与参数:让规则可调、可复用

先进工艺的规则文件动辄数千行,如果每个尺寸都硬编码,改一个工艺角就要全文搜索替换。Calibre提供 #DEFINE 来定义变量:

#DEFINE M1_MIN_W 0.032
#DEFINE M1_MIN_S 0.032
#DEFINE M1_MIN_A 0.020
#DEFINE DENSITY_MIN 0.30
#DEFINE DENSITY_MAX 0.70

变量名建议采用“层名_规则类型_单位”的命名法,如 M1_MIN_W 表示M1最小宽度,VIA1_ENCLOSURE 表示通孔包围。这样在规则语句中引用时,读者一眼就能知道含义。变量还可以参与算术运算,例如 #DEFINE M2_MIN_S (M1_MIN_S * 1.2),实现层间尺寸的联动。

除了 #DEFINE,Calibre还支持通过命令行传入变量,例如 calibre -drc -hier -D M1_MIN_W=0.030,用于快速评估不同工艺角下的违规数量。这是签核工程中做“假设分析”的常用手段。

四、规则语句:检查的实际载体

规则语句是规则文件的“执行体”。最基础的几何检查包括宽度、间距、面积、包围、延伸等。以M1为例:

LAYOUT WIDTH M1 < M1_MIN_W
LAYOUT SPACE M1 < M1_MIN_S
LAYOUT AREA M1 < M1_MIN_A
LAYOUT ENCLOSURE VIA1 BY M1 < 0.005
LAYOUT EXTENSION M1 > POLY 0.010

每条语句都会在版图上产生一个错误标记(error marker),并输出到结果数据库。规则语句通常按层分组,同一层的宽度、间距、面积写在一起,便于阅读和调试。对于复杂规则,还会用到 AND、OR、NOT 等逻辑运算,以及 INSIDE、OUTSIDE、TOUCH 等空间关系。

五、注释与模块化:让规则文件可维护

Calibre使用 // 或 /* */ 作为注释符。注释不是装饰,而是签核工程的重要资产。建议在以下位置强制写注释:每个层定义块前说明该层对应的掩模版;每个变量组前说明其来源(设计规则手册章节号);每条复杂规则前说明检查目的和典型违规形态。

模块化组织主要靠 INCLUDE 和条件编译。典型做法是把规则拆成多个文件:

// main.cal
INCLUDE "layer_def.cal"
INCLUDE "variables.cal"
INCLUDE "m1.rules"
INCLUDE "m2.rules"
INCLUDE "via.rules"
INCLUDE "density.rules"

#IFDEF DENSITY_CHECK
INCLUDE "density_advanced.rules"
#ENDIF

这样,主文件只负责“装配”,具体规则放在各自模块中。当工艺从N5迁移到N4时,只需替换 variables.cal 和少数模块,而不必重写整个文件。条件编译则让同一套规则文件支持不同签核阶段:早期版本只跑关键层,最终签核打开全部检查。

模块化还有一个常被忽略的好处:INCLUDE 的路径可以是相对路径,配合版本管理工具(如Git)时,可以把公共层定义和变量抽成独立仓库,多个项目共享,避免各项目重复维护同一套工艺参数。

六、一个可参考的组织模板

综合以上四层,一个结构清晰的规则文件目录可以这样组织:

文件/目录职责典型内容
main.cal装配入口INCLUDE 各模块、条件编译开关
layer_def.cal层定义LAYER 语句集中块
variables.cal变量与参数#DEFINE 尺寸、密度阈值
rules/规则模块m1.rules、m2.rules、via.rules、density.rules
checks/签核阶段early.cal、final.cal,通过 #IFDEF 控制

在实际项目中,建议先用 calibre -drc -hier -precompile 对规则文件做一次语法预编译,确认所有 INCLUDE 路径、变量引用和层名都正确,再投入完整版图运行。这一步通常只需几秒到几十秒,却能避免因拼写错误导致数小时的无效运行。