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是示例参数,实际值由工艺设计规则决定。
规则文件组织方式
随着工艺节点演进,规则文件动辄数千行。若全部平铺,维护成本极高。推荐按功能分区组织:
- 头部声明区:单位、精度、输入输出、报告格式;
- 层定义区:原始层、派生层、变量层;
- DRC规则区:按金属层、通孔层、有源区等分组;
- LVS规则区:器件识别、连接提取、参数比对;
- 输出与报告区:结果数据库、摘要报告、错误分类。
分区之间用注释分隔,便于定位。例如:
// ========== 层定义 ==========
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规则文件从声明、层定义、操作符运算到规则检查与结果输出的整体结构关系,以及模块化引入方式。
图中纵向展示了规则文件从声明到输出的主数据流,横向标注了TVF扩展与模块化引入的位置。实际编写时,层定义区与操作符区往往交替出现,因为派生层需要依赖操作符生成;但整体结构应保持清晰分区,避免规则交叉混乱。