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规则文件层次架构。

DRC规则文件层次化组织架构 主控规则文件 (Main.drc) INCLUDE 包含层 (工艺定义 / 通用规则 / 自定义规则) 功能模块层 (NW_规则 / PO_规则 / M1_规则 / VIA_规则 / ...) 规则组层 (最小宽度组 / 最小间距组 / 包围组 / 密度组) 原子规则层 (WIDTH / SPACE / ENCLOSURE / DENSITY) 调试时:从违例报告中的规则名反向定位 → 原子规则 → 功能模块 → 主控文件

层次化组织的核心机制是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违例就变成了“定位-理解-修正”的闭环。以下是一个典型的调试流程。

  1. 读取违例报告:从DRC运行结果中提取违例规则名、坐标和层信息。
  2. 定位规则定义:在规则文件中搜索违例规则名,找到对应的检查语句。
  3. 理解检查意图:分析检查语句中的层、约束值和修饰符,明确设计规则要求。
  4. 分析违例原因:结合版图图形,判断是设计错误、规则误报还是规则文件bug。
  5. 修正与验证:修改版图或调整规则文件,重新运行DRC验证。
DRC违例调试流程 步骤1 读取违例报告 步骤2 定位规则定义 步骤3 理解检查意图 步骤4 分析违例原因 步骤5 修正 验证未通过则返回步骤1 调试核心原则 • 先确认规则文件版本与工艺文档一致,避免因规则版本错误导致误报。 • 使用DRC工具的“交互式调试”模式,逐条检查规则执行结果。 • 对于复杂派生层,手动计算或使用小测试版图验证逻辑正确性。 • 记录每次规则修改的变更日志,便于回溯和团队协作。
实战案例: 某次调试中,DRC报告M1最小间距违例,但版图中M1图形间距明显大于规则值。经检查发现,规则文件中使用了 SPACE M1 >= 0.1,但变量 min_M1_space 被错误地定义为0.1(实际应为0.12)。修正变量定义后,违例消失。这个案例说明:规则文件中的变量定义错误是导致误报的常见原因。