3. DRC规则文件结构:规则文件格式、层次化组织与基本语法
DRC规则文件是物理验证的“法律条文”,它定义了版图必须满足的几何与电气约束。理解规则文件的结构是高效调试DRC违例的基础。本章将深入剖析SVRF与TVF两种主流格式、层次化规则组织方式以及规则语句的基本语法。
3.1 规则文件格式:SVRF vs. TVF
业界主流的DRC工具(如Calibre、ICV)支持两种规则文件格式:SVRF(Standard Verification Rule Format) 和 TVF(Tcl Verification Format)。两者在语法风格、变量处理和控制流上存在显著差异。
| 对比维度 | SVRF | TVF |
|---|---|---|
| 语法基础 | 专用规则语言,关键字驱动 | 基于Tcl脚本语言,扩展验证命令 |
| 变量定义 | VARIABLE layer_name M1 |
set layer_name M1 |
| 规则语句 | WIDTH M1 >= 0.1 |
check_width M1 -min 0.1 |
| 控制流 | 有限的条件分支(IF/ELSE) | 完整的Tcl控制流(if/for/foreach/proc) |
| 可读性 | 规则意图直观,适合纯规则定义 | 灵活但语法较复杂,适合高级用户 |
| 调试友好度 | 错误信息直接指向规则行号 | 需结合Tcl堆栈跟踪 |
实战建议: 大多数Foundry提供的标准DRC deck采用SVRF格式,因为它更接近物理验证工程师的思维习惯。TVF通常用于需要复杂数学运算或动态规则生成的场景。作为调试专家,建议优先掌握SVRF的阅读能力。
3.2 层次化规则组织:从顶层到底层
一个完整的DRC规则文件通常包含数千行规则。为了便于维护和复用,规则文件采用层次化结构组织。下图展示了一个典型的DRC规则文件层次架构。
层次化组织的核心机制是INCLUDE语句。主控文件通过INCLUDE将分散的规则模块组合成一个完整的检查集。
// 主控文件 Main.drc 示例
INCLUDE "foundry_tech.drc" // 工艺定义层:定义层号、最小格点
INCLUDE "generic_rules.drc" // 通用规则层:全局变量、标准检查函数
INCLUDE "layer_nwell.drc" // NW层规则
INCLUDE "layer_poly.drc" // PO层规则
INCLUDE "layer_metal1.drc" // M1层规则
INCLUDE "layer_via.drc" // VIA层规则
INCLUDE "custom_rules.drc" // 自定义规则(客户特定要求)
调试技巧: 当DRC工具报告“规则未定义”或“层未定义”错误时,首先检查INCLUDE路径是否正确,以及被包含的文件是否按正确顺序加载。层定义必须在规则使用之前被INCLUDE。
3.3 规则语句基本语法:SVRF核心元素
SVRF规则语句由操作符、层/变量、约束值和修饰符组成。掌握以下核心语法是阅读和调试规则文件的关键。
3.3.1 层定义与派生
层定义是规则文件的基础。通过逻辑运算可以从基本层派生出新的检查层。
// 基本层定义
LAYER M1 1001 // 将GDS层号1001映射为M1
LAYER M2 1002 // 将GDS层号1002映射为M2
LAYER VIA1 1010 // 将GDS层号1010映射为VIA1
// 派生层定义(逻辑运算)
AND M1 VIA1 = M1 AND VIA1 // M1与VIA1的交集
NOT M1 = M1 NOT VIA1 // M1中去除VIA1覆盖的区域
OR M1 M2 = M1 OR M2 // M1与M2的并集
SIZE M1 BY 0.05 = M1 // M1外扩0.05μm(用于包围检查)
3.3.2 核心检查语句
下表列出了最常用的SVRF检查语句及其语法格式。
| 检查类型 | 语法格式 | 说明 |
|---|---|---|
| 最小宽度 | WIDTH layer_name >= value |
检查layer_name中所有图形的宽度是否≥value |
| 最小间距 | SPACE layer_name >= value |
检查同一层内图形之间的间距是否≥value |
| 不同层间距 | SPACE layer1 layer2 >= value |
检查layer1与layer2之间的间距是否≥value |
| 包围检查 | ENCLOSURE inner_layer outer_layer >= value |
检查outer_layer对inner_layer的包围是否≥value |
| 面积检查 | AREA layer_name >= value |
检查layer_name中每个封闭图形的面积是否≥value |
| 密度检查 | DENSITY layer_name >= min_val AND <= max_val |
检查指定窗口内layer_name的密度是否在范围内 |
3.3.3 规则修饰符与输出控制
修饰符用于控制检查的精度、报告方式和异常处理。
// 精度控制
WIDTH M1 >= 0.1 // 默认精度为数据库单位
WIDTH M1 >= 0.1 // 使用μm单位(需配合UNIT语句)
// 报告控制
WIDTH M1 >= 0.1 // 默认报告所有违例
WIDTH M1 >= 0.1 // 报告前10个违例
// 异常处理(EXCEPTION)
SPACE M1 >= 0.1 EXCEPTION 0.05 // 允许0.05μm的间距违例(用于特殊区域)
// 条件检查(IF/ELSE)
IF { VARIABLE process_node == "7nm" } THEN {
WIDTH M1 >= 0.05
} ELSE {
WIDTH M1 >= 0.1
}
3.3.4 变量与参数化规则
使用变量可以避免硬编码,提高规则文件的可维护性。
// 变量定义
VARIABLE min_M1_width 0.1
VARIABLE min_M1_space 0.12
VARIABLE min_M1_M2_space 0.2
// 变量引用
WIDTH M1 >= @min_M1_width
SPACE M1 >= @min_M1_space
SPACE M1 M2 >= @min_M1_M2_space
常见陷阱: 变量名冲突是调试中的常见问题。当多个INCLUDE文件中定义了同名变量时,后加载的变量值会覆盖先加载的。建议在变量名前加模块前缀(如
M1_MIN_WIDTH)以避免冲突。
3.4 规则文件调试实战:从语法到逻辑
理解规则文件结构后,调试DRC违例就变成了“定位-理解-修正”的闭环。以下是一个典型的调试流程。
- 读取违例报告:从DRC运行结果中提取违例规则名、坐标和层信息。
- 定位规则定义:在规则文件中搜索违例规则名,找到对应的检查语句。
- 理解检查意图:分析检查语句中的层、约束值和修饰符,明确设计规则要求。
- 分析违例原因:结合版图图形,判断是设计错误、规则误报还是规则文件bug。
- 修正与验证:修改版图或调整规则文件,重新运行DRC验证。
实战案例: 某次调试中,DRC报告M1最小间距违例,但版图中M1图形间距明显大于规则值。经检查发现,规则文件中使用了
SPACE M1 >= 0.1,但变量 min_M1_space 被错误地定义为0.1(实际应为0.12)。修正变量定义后,违例消失。这个案例说明:规则文件中的变量定义错误是导致误报的常见原因。