4、DRC规则文件解析(下):复杂规则编写技巧
好,咱们接着聊。上一节我们把DRC规则文件的基础语法和常用命令过了一遍,今天要上点硬菜了——条件规则、派生层运算、变量与循环。这些才是真正让DRC规则变得灵活、强大的核心。
说实话,我刚入行那会儿,看到几百行的规则文件就头大。后来带我的老工程师跟我说了一句话,我到现在还记得:「规则文件不是写出来的,是算出来的。」嗯,这句话我琢磨了很久才真正理解。
4.1 条件规则:让规则「长眼睛」
什么叫条件规则?说白了就是:满足某个条件才执行这条检查。比如,只有金属层厚度大于某个值,才检查它的最小间距。
我见过不少新手,喜欢把所有规则写死。结果工艺一换,整个文件得重写。你想想看,这多累啊。
条件规则的核心语法:
// 条件规则示例
IF ( METAL_THICKNESS > 0.3 ) {
// 厚金属的间距规则
M1.SPACE = 0.18
} ELSE {
// 薄金属的间距规则
M1.SPACE = 0.12
}
我在一个28nm的项目里遇到过这么个事:某条规则在低温下没问题,高温下就炸了。后来我加了个温度条件,问题就解决了。你看,条件规则就是这么用的。
我的习惯:条件规则里尽量用工艺参数,别用硬编码的数字。这样换工艺时,改一个参数文件就行。
4.2 派生层运算:从基础层「变」出新层
派生层,就是通过布尔运算、几何运算从已有层生成的新层。这是DRC规则里最灵活、也最容易出错的地方。
常见的运算有这些:
| 运算类型 | 运算符 | 说明 | 示例 |
|---|---|---|---|
| AND | AND | 两个层相交的部分 | GATE = POLY AND ACTIVE |
| OR | OR | 两个层合并 | CONTACT = VIA1 OR VIA2 |
| NOT | NOT | 从一个层减去另一个层 | POLY_ACTIVE = POLY NOT ACTIVE |
| SIZE | SIZE | 扩大或缩小 | M1_ENLARGE = M1 SIZE 0.1 |
| GROW | GROW | 各向同性扩大 | M1_GROW = M1 GROW 0.05 |
注意:派生层运算的顺序很重要。先做AND再做SIZE,和先做SIZE再做AND,结果完全不同。我吃过这个亏,有一次把规则写反了,结果检查出来一堆假错。
举个例子,检查多晶硅栅的延伸长度:
// 派生层定义
GATE = POLY AND ACTIVE
POLY_EXT = POLY NOT GATE
// 检查多晶硅在栅外的延伸
EXTENSION {
LAYER = POLY_EXT
MIN = 0.2
MAX = 0.5
}
你看,通过派生层,我们把复杂的几何关系拆解成了简单的运算。这就是DRC规则的精髓。
4.3 变量与循环:让规则「活」起来
变量和循环,是DRC规则文件里最容易被忽视,但也是最强大的工具。
变量定义:
// 定义变量
DEFINE MIN_SPACE_M1 0.12
DEFINE MIN_WIDTH_M1 0.14
DEFINE MAX_DENSITY_M1 0.7
// 使用变量
M1.SPACE = MIN_SPACE_M1
M1.WIDTH = MIN_WIDTH_M1
M1.DENSITY = MAX_DENSITY_M1
我个人习惯把所有工艺参数都定义成变量,放在文件最前面。这样改工艺时,只需要改变量值,不用动后面的规则逻辑。
循环结构:
有些DRC工具支持循环,比如对多个金属层执行相同的检查:
// 循环示例(伪代码)
FOR EACH LAYER IN {M1, M2, M3, M4} {
LAYER.SPACE = 0.12
LAYER.WIDTH = 0.14
LAYER.AREA = 0.01
}
嗯,这里要注意:不是所有DRC工具都支持循环。Calibre支持,但有些老工具不支持。写之前先确认一下工具的能力。
避坑指南:我曾经在一个项目里,用循环写了20层金属的规则,看起来很美。结果跑DRC时发现,某层金属的工艺参数跟其他层不一样。循环一跑,全错了。从那以后,我养成了一个习惯:循环只用于完全相同的规则,有差异的层单独写。
4.4 实战:一个完整的复杂规则示例
来,我们看一个实际项目中会用到的规则片段。这个例子综合了条件规则、派生层和变量:
// ========== 变量定义 ==========
DEFINE MIN_SPACE_THICK 0.18
DEFINE MIN_SPACE_THIN 0.12
DEFINE GATE_EXT_MIN 0.2
DEFINE GATE_EXT_MAX 0.5
// ========== 派生层 ==========
GATE = POLY AND ACTIVE
POLY_EXT = POLY NOT GATE
CONTACT_ACTIVE = CONTACT AND ACTIVE
CONTACT_POLY = CONTACT AND POLY
// ========== 条件规则 ==========
IF ( METAL_THICKNESS > 0.3 ) {
// 厚金属规则
M1.SPACE = MIN_SPACE_THICK
M2.SPACE = MIN_SPACE_THICK
} ELSE {
// 薄金属规则
M1.SPACE = MIN_SPACE_THIN
M2.SPACE = MIN_SPACE_THIN
}
// ========== 检查规则 ==========
// 多晶硅延伸检查
EXTENSION {
LAYER = POLY_EXT
MIN = GATE_EXT_MIN
MAX = GATE_EXT_MAX
}
// 接触孔到有源区检查
ENC {
LAYER1 = CONTACT_ACTIVE
LAYER2 = ACTIVE
MIN = 0.05
}
这个例子看起来简单,但包含了我们刚才讲的所有技巧。你想想看,如果不用变量和派生层,这个规则文件得写多长?
4.5 知识体系图
下面这张图,是我自己总结的DRC复杂规则编写的心法。你看一眼,就能明白今天讲的内容是怎么串起来的:
这张图把今天的内容串起来了。你看,条件规则、派生层运算、变量与循环,这三者不是孤立的。在实际项目中,它们经常组合使用。比如,用变量控制条件规则的阈值,用派生层作为循环的输入。
我的建议:刚开始写复杂规则时,别追求一步到位。先写一个能跑的版本,然后逐步优化。我见过太多人一上来就想写「完美」的规则,结果卡在中间出不来。
好了,今天的内容就到这。DRC规则文件的编写,说到底是一门「拆解」的艺术——把复杂的物理检查拆解成简单的逻辑运算。你掌握了这个思路,再复杂的规则也不怕。
可可精品资料库