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复杂规则编写知识体系 DRC规则文件 条件规则 派生层运算 变量与循环 IF/ELSE 条件判断 工艺参数条件 温度/电压条件 AND/OR/NOT 布尔运算 SIZE/GROW 几何运算 运算顺序控制 DEFINE 变量定义 FOR EACH 循环 参数化规则 核心心法:灵活 + 可维护 + 可复用

这张图把今天的内容串起来了。你看,条件规则、派生层运算、变量与循环,这三者不是孤立的。在实际项目中,它们经常组合使用。比如,用变量控制条件规则的阈值,用派生层作为循环的输入。

我的建议:刚开始写复杂规则时,别追求一步到位。先写一个能跑的版本,然后逐步优化。我见过太多人一上来就想写「完美」的规则,结果卡在中间出不来。

好了,今天的内容就到这。DRC规则文件的编写,说到底是一门「拆解」的艺术——把复杂的物理检查拆解成简单的逻辑运算。你掌握了这个思路,再复杂的规则也不怕。

可可精品资料库