4. Calibre规则文件基础

Calibre物理验证的核心输入是规则文件。它既不是普通的配置文件,也不是一段可随意拼接的脚本,而是一套由SVRF(Standard Verification Rule Format)和TVF(Tcl Verification Format)共同构成的“可执行验证描述”。理解它的语法结构,是后续搭建可维护验证流程的前提。

SVRF与TVF的分工

SVRF是Calibre原生的规则描述语言,负责定义层、几何操作、DRC/LVS检查、器件识别与结果输出。它的语句通常以关键字开头,例如 LAYER、AND、NOT、DRC CHECK、LVS 等,每条语句描述一个明确的几何或电气操作。TVF则是嵌入在规则文件中的Tcl扩展,用于流程控制、变量计算、条件判断、循环和外部数据读取。两者关系可以理解为:SVRF负责“验证什么”,TVF负责“如何组织与调度”。

一个典型的规则文件开头会先声明单位、精度和输入版图格式,例如:

// 示例:基础声明
LAYOUT SYSTEM GDSII
LAYOUT PATH "top.gds"
LAYOUT PRIMARY "top_cell"
DRC RESULTS DATABASE "drc_results.gds" GDSII
DRC MAXIMUM RESULTS ALL
DRC SUMMARY REPORT "drc_summary.rpt"

这些声明决定了后续所有几何操作的坐标解释方式。若单位或精度设置错误,即使规则逻辑正确,也会导致误报或漏报。

层定义:从工艺层到验证层

规则文件中的“层”并不等同于GDS中的层号,而是经过映射后的验证层。常见做法是先定义原始层,再通过布尔运算生成派生层。例如:

// 示例:层定义与派生
LAYER M1 30
LAYER VIA1 40
LAYER M2 50

LAYER M1_M2_OVERLAP = M1 AND M2
LAYER VIA1_NOT_IN_M1 = VIA1 NOT M1
LAYER M1_DUMMY = M1 AND NOT M1_M2_OVERLAP

这里 M1、VIA1、M2 是原始层,M1_M2_OVERLAP 等是派生层。派生层可以继续参与后续运算,形成层次化的层体系。良好的层定义应遵循“原始层只定义一次、派生层按功能命名”的原则,避免在规则中反复出现裸层号。

操作符与几何运算

SVRF提供丰富的几何操作符,常见包括:

  • AND:交集,用于提取重叠区域;
  • NOT:差集,用于检查缺失或多余;
  • OR:并集,用于合并同类图形;
  • XOR:异或,用于比对差异;
  • SIZE:尺寸缩放,用于宽度/间距检查;
  • ENCLOSE:包围关系,用于检查包覆;
  • INTERACT:交互关系,用于检查相邻或接触。

这些操作符可以组合成复杂表达式。例如检查M1对VIA1的包覆不足:

// 示例:包覆检查
M1_ENCLOSE_VIA1 = ENCLOSE VIA1 BY M1 < 0.05
DRC CHECK M1_ENCLOSE_VIA1

该语句的含义是:对每个VIA1,检查其被M1包围的边距是否小于0.05μm,若小于则报错。注意这里的0.05是示例参数,实际值由工艺设计规则决定。

规则文件组织方式

随着工艺节点演进,规则文件动辄数千行。若全部平铺,维护成本极高。推荐按功能分区组织:

  1. 头部声明区:单位、精度、输入输出、报告格式;
  2. 层定义区:原始层、派生层、变量层;
  3. DRC规则区:按金属层、通孔层、有源区等分组;
  4. LVS规则区:器件识别、连接提取、参数比对;
  5. 输出与报告区:结果数据库、摘要报告、错误分类。

分区之间用注释分隔,便于定位。例如:

// ========== 层定义 ==========
LAYER M1 30
LAYER VIA1 40
// ========== DRC规则 ==========
// M1最小宽度
DRC CHECK M1_WIDTH < 0.10

可复用模块化编写习惯

模块化的核心是“一次定义、多处调用”。SVRF支持通过 #DEFINE 或TVF变量实现参数化。例如将最小宽度定义为变量:

// 示例:参数化
TVF variable M1_MIN_WIDTH 0.10
DRC CHECK M1_WIDTH < $M1_MIN_WIDTH

当工艺版本更新时,只需修改变量值,无需逐条修改规则。更进一步的模块化是将常用检查封装为独立文件,通过 INCLUDE 引入:

// 示例:模块引入
INCLUDE "drc_m1.rules"
INCLUDE "drc_via.rules"
INCLUDE "lvs_core.rules"

每个子文件只负责一类检查,内部再按层分组。这样既便于多人协作,也便于版本管理。需要注意的是,INCLUDE 的路径应使用相对路径或环境变量,避免硬编码绝对路径导致移植失败。

实践建议:在规则文件开头集中定义所有可调参数(如最小宽度、最小间距、包覆余量),并在注释中标注对应的工艺文档章节号。这样当工艺规则更新时,可以快速定位需要修改的变量,而不是在数千行规则中逐条搜索。

常见误区:直接在规则中写死数值,例如 DRC CHECK M1_WIDTH < 0.10。一旦工艺从0.10更新到0.09,就需要全局替换,极易遗漏。应始终使用变量或宏定义。

语法结构可视化

下图展示了SVRF/TVF规则文件从声明、层定义、操作符运算到规则检查与结果输出的整体结构关系,以及模块化引入方式。

SVRF/TVF 规则文件结构与数据流 ① 头部声明区 LAYOUT SYSTEM / PATH / PRIMARY / DRC RESULTS DATABASE / SUMMARY REPORT ② 层定义区 原始层:LAYER M1 30 / LAYER VIA1 40 / LAYER M2 50 派生层:M1_M2_OVERLAP = M1 AND M2 | VIA1_NOT_IN_M1 = VIA1 NOT M1 ③ 操作符与几何运算 AND | NOT | OR | XOR | SIZE | ENCLOSE | INTERACT | 组合表达式 示例:M1_ENCLOSE_VIA1 = ENCLOSE VIA1 BY M1 < 0.05 ④ DRC / LVS 规则检查区 DRC CHECK M1_WIDTH < $M1_MIN_WIDTH | LVS 器件识别与连接提取 参数化:TVF variable M1_MIN_WIDTH 0.10 ⑤ 输出与报告区 结果数据库(GDSII)| 摘要报告(RPT)| 错误分类与定位 模块化引入 INCLUDE "drc_m1.rules" INCLUDE "lvs_core.rules" TVF 扩展 变量 / 条件 / 循环 外部数据读取 数据流方向:声明 → 层定义 → 运算 → 检查 → 输出;模块化通过 INCLUDE 横向复用

图中纵向展示了规则文件从声明到输出的主数据流,横向标注了TVF扩展与模块化引入的位置。实际编写时,层定义区与操作符区往往交替出现,因为派生层需要依赖操作符生成;但整体结构应保持清晰分区,避免规则交叉混乱。