3. DRC规则语法入门:标准DRC规则语言(如SVRF/TCL)的基本结构、关键字与操作符

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两种风格的对应关系:

DRC规则语法结构总览(SVRF vs TCL) ① 层定义(Layer Definition) SVRF: LAYER M1 1000 | TCL: define_layer M1 1000 ② 层运算(Layer Operation / Derive) SVRF: DERIVE M1_ACTIVE M1 AND ACTIVE | TCL: set M1_ACTIVE [and M1 ACTIVE] ③ 规则检查(Rule Check) SVRF: WIDTH M1_ACTIVE >= 0.18 | TCL: check_width M1_ACTIVE -min 0.18 ④ 结果输出(Output) SVRF: OUTPUT results | TCL: report_violations -file drc.rpt 语法要点 • 层号唯一 • 派生层可嵌套 • 检查值带单位 • 支持条件分支 • 注释用 // 或 # • 大小写敏感 • 行末无分号 • 支持include

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在层定义、层运算、规则检查三个核心环节的写法差异:

SVRF vs TCL 语法对比 SVRF 语法 LAYER M1 1000 LAYER M2 1001 DERIVE M1_ACTIVE M1 AND ACTIVE WIDTH M1_ACTIVE >= 0.18 SPACE M1_ACTIVE >= 0.20 IF ( COND ) WIDTH ... END TCL 语法 define_layer M1 1000 define_layer M2 1001 set M1_ACTIVE [and M1 ACTIVE] check_width M1_ACTIVE -min 0.18 check_space M1_ACTIVE -min 0.20 if { $COND } { check_width ... }

3.9 本章小结