3. SVRF语法基础:SVRF语言简介、关键字与标识符、注释规则、语句结构
SVRF(Standard Verification Rule Format)是 Calibre 平台的核心规则描述语言,用于定义 DRC、LVS、ERC 等物理验证规则。掌握 SVRF 语法是编写高质量 DRC 规则文件的前提。本节将系统介绍 SVRF 的语言特性、基本词法单元、注释规范以及语句组织方式。
3.1 SVRF语言简介
SVRF 是一种面向物理验证的领域特定语言(DSL),具有以下核心特征:
| 特性 | 说明 |
|---|---|
| 声明式 | 描述“检查什么”而非“如何检查”,验证引擎自动推导执行顺序 |
| 层次化 | 支持单元引用、派生层、逻辑运算,可处理复杂版图层次 |
| 几何运算 | 内置 AND、OR、NOT、SIZE、GROW、SHRINK 等图形操作符 |
| 规则驱动 | 通过 RULE 语句定义检查条件,输出违例标记 |
| 可扩展 | 支持变量、函数、条件编译、外部文件包含 |
设计理念:SVRF 的声明式风格使得规则文件独立于工艺节点——同样的语法结构可复用于 28nm、16nm、7nm 等不同工艺,只需调整数值参数和派生层定义。
3.2 关键字与标识符
3.2.1 保留关键字
SVRF 预定义了约 60 个保留关键字,用于控制规则结构、定义操作和声明对象。以下按功能分类列出最常用的关键字:
| 类别 | 关键字 | 用途 |
|---|---|---|
| 规则声明 | RULE |
定义一条检查规则 |
RULE_CHECK |
定义带详细报告的控制规则 | |
SELECT |
选择检查范围(单元、区域) | |
EXCLUDE |
排除特定单元或区域 | |
| 层定义 | LAYER |
声明物理层或派生层 |
DERIVED |
定义由运算得到的派生层 | |
AND |
图形逻辑与运算 | |
OR |
图形逻辑或运算 | |
| 几何操作 | SIZE |
图形尺寸缩放(扩大/缩小) |
GROW |
图形向外扩展 | |
SHRINK |
图形向内收缩 | |
| 检查约束 | WIDTH |
线宽检查 |
SPACE |
间距检查 | |
AREA |
面积检查 | |
| 流程控制 | IF / ELSE |
条件编译分支 |
INCLUDE |
包含外部规则文件 |
避坑提示:关键字不区分大小写,但业界惯例使用大写以增强可读性。切勿将关键字用作变量名或层名,否则会导致解析错误。
3.2.2 标识符命名规则
标识符用于命名层、变量、规则和函数。SVRF 标识符遵循以下规范:
- 字符集:字母(a-z, A-Z)、数字(0-9)、下划线(_)
- 首字符:必须以字母或下划线开头,不能以数字开头
- 长度限制:建议不超过 64 个字符,过长可能影响可读性
- 保留字冲突:禁止与关键字同名
- 命名风格:推荐使用大写字母加下划线(如
METAL1、POLY_OD)
// 合法标识符示例
LAYER M1 // 金属1层
LAYER CONT_VIA // 接触孔层
DERIVED GATE = POLY AND OD // 派生层:栅极
VARIABLE min_width = 0.18 // 变量:最小宽度
// 非法标识符示例
LAYER 1METAL // 错误:以数字开头
LAYER M1-SPACE // 错误:包含连字符
LAYER AND // 错误:与关键字冲突
3.3 注释规则
SVRF 支持三种注释方式,用于提高规则文件的可维护性:
| 注释类型 | 语法 | 适用范围 | 示例 |
|---|---|---|---|
| 单行注释 | // |
行内或整行注释 | // 定义金属1层 |
| 多行注释 | /* ... */ |
跨行注释块 | /* 间距规则组:M1 到 M1 */ |
| 文档注释 | /** ... */ |
规则或变量说明(部分工具支持) | /** 最小线宽:0.18um */ |
// ============================================
// 文件:drc_rules_28nm.svrf
// 功能:28nm 工艺 DRC 规则集
// 作者:IC 后端设计组
// 日期:2025-03-01
// ============================================
/* 层定义部分 */
LAYER M1 31 // 金属1层,GDS 层号 31
LAYER M2 32 // 金属2层,GDS 层号 32
/**
* 派生层:金属1上的栅极区域
* 由 POLY 和 OD 的交集定义
*/
DERIVED GATE = POLY AND OD
/* 规则检查部分 */
RULE WIDTH M1 0.18 // M1 最小线宽 0.18um
最佳实践:在规则文件头部使用多行注释块记录文件元信息(工艺节点、版本、作者);在每个规则组前使用单行注释说明检查目的;对复杂派生层使用文档注释解释运算逻辑。
3.4 语句结构
SVRF 语句采用自由格式,以分号(;)作为语句结束符。语句可以跨越多行,也可以在一行内书写多条语句。主要语句类型包括:
3.4.1 语句类型概览
| 语句类型 | 语法模式 | 示例 |
|---|---|---|
| 层声明 | LAYER 层名 [GDS号]; |
LAYER M1 31; |
| 派生层 | DERIVED 层名 = 表达式; |
DERIVED GATE = POLY AND OD; |
| 规则定义 | RULE 检查类型 层名 参数; |
RULE WIDTH M1 0.18; |
| 变量赋值 | VARIABLE 变量名 = 值; |
VARIABLE min_spacing = 0.22; |
| 条件编译 | IF (条件) { ... } ELSE { ... } |
IF (TECH == "28nm") { ... } |
| 文件包含 | INCLUDE "文件名"; |
INCLUDE "common_rules.svrf"; |
3.4.2 语句组织与缩进
SVRF 不强制缩进,但良好的缩进风格能显著提升可读性。推荐采用以下组织方式:
// 推荐缩进风格
LAYER M1 31;
LAYER M2 32;
LAYER V1 33;
DERIVED M1_BLOCKED = M1 AND BLOCK_LAYER;
DERIVED M1_CORE = M1 AND NOT M1_BLOCKED;
VARIABLE m1_width_min = 0.18;
VARIABLE m1_space_min = 0.22;
RULE WIDTH M1_CORE m1_width_min;
RULE SPACE M1_CORE m1_space_min;
// 条件编译块
IF (TECH == "28nm") {
RULE WIDTH M1 0.18;
} ELSE {
RULE WIDTH M1 0.24;
}
3.5 SVRF语句结构示意图
下图展示了 SVRF 规则文件的整体语句组织层次,从顶层文件包含到底层规则定义:
3.6 语句书写规范与常见错误
3.6.1 书写规范
- 语句结束:每条完整语句必须以分号(;)结尾,遗漏分号是常见语法错误
- 大小写:关键字不区分大小写,但层名和变量名区分大小写(
M1与m1不同) - 空白字符:空格、制表符、换行符均视为分隔符,不影响语义
- 字符串:文件路径和注释中的字符串使用双引号(
")包裹 - 数值:支持整数和浮点数,单位默认为微米(um),可通过
UNITS语句修改
3.6.2 常见语法错误
| 错误类型 | 错误示例 | 正确写法 |
|---|---|---|
| 遗漏分号 | LAYER M1 31 |
LAYER M1 31; |
| 关键字冲突 | LAYER AND 10; |
LAYER AND_LAYER 10; |
| 非法字符 | LAYER M1-SPACE 31; |
LAYER M1_SPACE 31; |
| 数字开头 | LAYER 1METAL 31; |
LAYER METAL1 31; |
| 注释未闭合 | /* 注释未结束 |
/* 注释已结束 */ |
调试技巧:当 Calibre 报告语法错误时,首先检查行末是否缺少分号,其次检查层名是否与关键字冲突。使用
calibre -drc -turbo 1 单线程模式运行,错误信息更易定位。
3.7 SVRF语法解析流程
下图展示了 Calibre 引擎解析 SVRF 规则文件的完整流程,帮助理解语法结构如何被转换为可执行的检查规则:
理解解析流程的意义:当规则文件出现错误时,了解解析阶段有助于快速定位问题。例如,层名未定义属于语义错误(阶段3),而遗漏分号属于语法错误(阶段2)。Calibre 的错误信息会明确指示错误类型和行号。