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、条件判断把规则分块组织,并按签核阶段调用。
这四层的关系可以用下面的结构图表示:层定义提供“词汇”,变量提供“数值”,规则语句构成“句子”,模块化则把这些句子组织成“章节”。
二、层定义:从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 路径、变量引用和层名都正确,再投入完整版图运行。这一步通常只需几秒到几十秒,却能避免因拼写错误导致数小时的无效运行。