3. DRC规则语法入门
DRC规则文件是物理验证工具与设计版图之间的“契约”。掌握标准规则语言(SVRF、TCL)的语法结构、核心关键字与操作符,是编写高效、可维护DRC脚本的基础。本章将系统梳理这两种主流语言的语法要素,并通过对比与图示帮助理解。
3.1 SVRF与TCL:两种主流规则语言概览
在EDA领域,SVRF(Standard Verification Rule Format)和TCL(Tool Command Language)是两大主流规则描述语言。SVRF是Mentor Graphics(现Siemens EDA)Calibre工具的原生语言,语法简洁、专为物理验证设计;TCL则是一种通用脚本语言,被Synopsys ICV等工具采用,灵活性更高。下表对比了二者的核心差异:
| 对比维度 | SVRF(Calibre) | TCL(ICV等) |
|---|---|---|
| 语言类型 | 领域专用语言(DSL) | 通用脚本语言 |
| 语法风格 | 声明式,关键字驱动 | 过程式,命令驱动 |
| 变量定义 | VARIABLE name value |
set name value |
| 层运算 | 内置层操作符(AND, OR, NOT等) | 通过命令调用层运算 |
| 规则检查 | WIDTH, SPACE, ENCLOSURE等关键字 |
check_width, check_space等命令 |
| 适用工具 | Calibre DRC/LVS | ICV, IC Validator |
选型建议:如果团队主要使用Calibre工具链,SVRF是首选;若需要更复杂的流程控制或与TCL生态集成,TCL更具优势。多数先进工艺节点同时提供两种语言的规则文件。
3.2 SVRF基本结构与关键字
SVRF规则文件由层定义、层运算和规则检查三大部分组成。其基本结构如下:
// ===== 1. 层定义 =====
LAYER M1 1000
LAYER M2 1001
LAYER VIA1 2000
// ===== 2. 层运算(派生层) =====
DERIVE M1_ACTIVE M1 AND ACTIVE
DERIVE M1_GATE M1 AND POLY
// ===== 3. 规则检查 =====
WIDTH M1_ACTIVE >= 0.18 // 最小线宽检查
SPACE M1_ACTIVE >= 0.20 // 最小间距检查
ENCLOSURE VIA1 M1_ACTIVE >= 0.05 // 包围检查
核心关键字速查表:
| 类别 | 关键字 | 功能说明 |
|---|---|---|
| 层定义 | LAYER |
定义物理层及其层号 |
| 层运算 | DERIVE |
通过布尔运算生成派生层 |
| 规则检查 | WIDTH |
检查图形最小宽度 |
SPACE |
检查图形最小间距 | |
ENCLOSURE |
检查一层对另一层的包围量 | |
AREA |
检查图形最小/最大面积 | |
| 控制流 | IF / ELSE / END |
条件分支控制 |
| 输出 | OUTPUT |
指定检查结果的输出格式 |
语法要点:SVRF中所有规则检查语句的通用格式为:
CHECK_TYPE layer_name [operator] value。操作符包括 >=、<=、==、!= 等,与C语言风格一致。
3.3 TCL风格DRC语法结构
在TCL风格的DRC规则中,每条规则都是一个TCL命令调用。其基本结构如下:
# ===== 1. 层定义 =====
define_layer M1 1000
define_layer M2 1001
define_layer VIA1 2000
# ===== 2. 层运算 =====
set M1_ACTIVE [and M1 ACTIVE]
set M1_GATE [and M1 POLY]
# ===== 3. 规则检查 =====
check_width M1_ACTIVE -min 0.18
check_space M1_ACTIVE -min 0.20
check_enclosure VIA1 M1_ACTIVE -min 0.05
TCL风格常用命令对照:
| SVRF关键字 | TCL命令 | 说明 |
|---|---|---|
LAYER |
define_layer |
定义物理层 |
DERIVE |
set ... [and/or/not ...] |
层布尔运算 |
WIDTH |
check_width |
线宽检查 |
SPACE |
check_space |
间距检查 |
ENCLOSURE |
check_enclosure |
包围检查 |
IF |
if { ... } { ... } |
条件分支 |
常见陷阱:TCL风格中,层运算结果必须显式赋值给变量(如
set M1_ACTIVE [and M1 ACTIVE]),否则后续规则无法引用该派生层。SVRF的 DERIVE 语句则自动完成赋值。
3.4 层运算操作符详解
无论是SVRF还是TCL,层运算都依赖一组标准的布尔操作符。这些操作符是构建派生层(如“有源区内的金属”、“不与多晶硅重叠的扩散区”)的核心工具。
标准层运算操作符:
| 操作符 | SVRF写法 | TCL写法 | 逻辑含义 | 示例 |
|---|---|---|---|---|
| AND | layer1 AND layer2 |
[and layer1 layer2] |
两层的重叠区域 | M1 AND CONTACT |
| OR | layer1 OR layer2 |
[or layer1 layer2] |
两层的合并区域 | M1 OR M2 |
| NOT | layer1 NOT layer2 |
[not layer1 layer2] |
layer1中不在layer2内的部分 | ACTIVE NOT POLY |
| XOR | layer1 XOR layer2 |
[xor layer1 layer2] |
两层的非重叠区域 | M1 XOR M2 |
| GROW | GROW layer distance |
[grow layer distance] |
将图形向外扩展指定距离 | GROW M1 0.1 |
| SHRINK | SHRINK layer distance |
[shrink layer distance] |
将图形向内收缩指定距离 | SHRINK M1 0.05 |
优化技巧:在编写复杂规则时,尽量将层运算结果保存为中间变量(如
DERIVE M1_ACTIVE M1 AND ACTIVE),避免在多个规则中重复计算相同的布尔操作。这能显著减少运行时间。
3.5 规则语法结构总览(SVG)
下图展示了标准DRC规则文件从层定义到规则检查的完整语法结构,以及SVRF与TCL两种风格的对应关系:
3.6 条件分支与变量使用
实际工艺中,不同电压域、不同器件类型往往需要不同的规则阈值。条件分支和变量机制让规则文件能够灵活适配多种场景。
SVRF条件分支示例:
VARIABLE CORE_VOLTAGE 1.8
VARIABLE IO_VOLTAGE 3.3
IF ( CORE_VOLTAGE == 1.8 )
WIDTH M1_CORE >= 0.18
SPACE M1_CORE >= 0.20
ELSE
WIDTH M1_CORE >= 0.24
SPACE M1_CORE >= 0.28
END
TCL风格条件分支示例:
set CORE_VOLTAGE 1.8
set IO_VOLTAGE 3.3
if { $CORE_VOLTAGE == 1.8 } {
check_width M1_CORE -min 0.18
check_space M1_CORE -min 0.20
} else {
check_width M1_CORE -min 0.24
check_space M1_CORE -min 0.28
}
变量命名规范:建议使用全大写加下划线(如
MIN_M1_WIDTH),便于与层名、关键字区分。变量值建议集中定义在文件头部,方便工艺参数调整。
3.7 常见语法错误与避坑指南
初学DRC规则编写时,以下错误最为常见:
- 层号冲突:两个不同层使用了相同的层号,导致工具无法区分。解决方案:建立层号清单,确保唯一性。
- 派生层未定义:在规则检查中引用了未通过
DERIVE或set定义的层。解决方案:检查所有派生层是否已显式定义。 - 单位不匹配:规则中使用了微米(um)但工具默认单位为纳米(nm)。解决方案:在文件头部统一声明单位,或使用
UNITS关键字。 - 操作符优先级错误:复杂布尔运算未加括号导致逻辑混乱。解决方案:使用括号明确运算顺序,如
(M1 AND ACTIVE) OR (M1 AND POLY)。 - 注释符号混用:SVRF使用
//,TCL使用#,混用会导致语法错误。
调试建议:当规则文件报错时,先检查层定义和派生层部分。超过70%的DRC语法错误源于层定义错误或派生层引用错误。使用工具的“语法检查”模式(如Calibre的
-drc 选项)可以快速定位问题行。
3.8 两种语言语法对比(SVG)
下图从语法结构角度对比SVRF与TCL在层定义、层运算、规则检查三个核心环节的写法差异: