一、规则文件概述
Calibre (mentor家验证工具)和 ICverify (S家验证工具)产品使用 标准验证规则格式(SVRF)文件 (简称规则文件),该文件控制 Calibre 工具对设计的处理流程。也就是常用的DRC和LVS脚本语言均为SVRF语言;

Calibre 和 ICverify 产品的所有功能均依赖于规则文件中指定的声明。规则文件中的多数元素可分为两类:
- 操作(Operations):对版图数据进行处理
- 规范语句(Specification Statements):定义操作的执行环境
操作和规范语句进一步组织为以下功能组:
1.1 操作组 Layer derivation
- 层操作(Layer Operations):(1)产生polygon(2)产生edge(3)产生edge segment
- **连接性提取语句(Connectivity Extraction Statements):**识别layout 中的电气连接关系;
- **器件识别语句(Device Recognition Statement):**从几何中识别出来device;
- **text 标签:**在source 和layout 之间,将label 或者text 给内部的net 连接点;
- 分块语句(Fracturing Statements):
- 后设计校正语句(Post-Design Correction Statements):
1.2 规范语句组
规范语句控制环境,比如(1)层定义;(2)block 的一些cell(3)产生结果:指定filename 和获取result的数据类型;控制report 文件;控制DRC的输出;(4)文件处理:控制输入输出的文件路径;
- 规范语句(Specification Statements):
每个部分均会描述对应功能组,并列出属于该组的规则文件操作 / 语句(以下简称规则文件元素 或元素)。有关规则文件操作和语句的完整信息,请参见字典章节。
Calibre 还支持将编译时 Tcl 验证格式(TVF)脚本作为规则文件输入。
二、规则文件编译概述
在被验证应用使用之前,规则文件必须先经过编译。此过程在 Calibre 应用中自动执行,在 Pyxis Layout 中则通过load rules 命令完成。
编译过程的核心检查内容包括:
- 语法正确性
- 图层类型与操作的匹配性
- 配置参数的有效性
编译的最终结果是生成规则文件的编译镜像,供应用程序执行其包含的操作。
SVRF 规则文件的一个重要特性是声明的顺序无关性 ------ 层定义、规则检查语句等的排列顺序不影响最终功能。
规则文件的部分内容支持条件编译。也就是说可以按照我们的需求进行一部分的DRC、LVS、ECR的检查,其余部分可以跳过;
三、通用语法约定
在最低层级,规则文件中的所有元素(除预处理指令、宏和 Include 语句外,这些在编译第一阶段处理)均为关键字 、数字 、字符串常量 或名称。本节内容涵盖命令解析、数值表达式与约束、变量使用的详细规则。
3.1 SVRF 符号与命令解析
编译时,以下集合中的符号关键字会被立即识别,无需考虑周围是否存在空白字符。
表 2-1. SVRF 符号
| 字符 | 含义 | ||
|---|---|---|---|
// |
规则文件单行注释 | ||
@ |
规则检查注释 | ||
/* */ |
块注释分隔符 | ||
= |
赋值字符,用于层推导及部分内置语言的变量赋值 | ||
{ } |
规则检查体和宏的分隔符;部分参数列表的分隔符 | ||
" " |
字符串常量分隔符,不区分大小写 | ||
' ' |
字符串常量分隔符,不区分大小写 | ||
( ) |
数学表达式的分组运算符;负边缘输出的尺寸检查运算符;内置语言函数的参数列表分隔符;器件模型名及其他器件元素的参数分隔符 | ||
[ ] |
内置语言脚本分隔符;文件名分隔符;正边缘输出的尺寸检查运算符 | ||
< |
小于号,用于约束和条件语句;某些情况下层名的左分隔符 | ||
> |
大于号,用于约束和条件语句;某些情况下层名的右分隔符 | ||
== |
等于,用于约束和部分条件语句 | ||
<= |
小于等于,用于约束和条件语句 | ||
>= |
大于等于,用于约束和条件语句 | ||
!= |
不等于,用于约束和条件语句 | ||
- + * / |
数学运算符,遵循常规含义;* 是单元名的通配符(匹配 0 个或多个字符),含通配符的字符串需用引号括起 |
||
^ |
数学表达式中的幂运算符;在多数表达式中优先级与 * / 相同,在 DFM 表达式中优先级更高;规则检查注释中的转义元字符,用于引用变量值(数组的第一个值)转义方法:- 规则检查注释:\^- DFM RDB COMMENT:^^- SVRF Message 语句:\\^ |
||
! |
逻辑非,用于部分数学表达式 | ||
~ |
按位取反,正数返回 0,非正数返回 1,用于部分数学表达式 | ||
% |
取模运算符,用于部分数学表达式 | ||
&& |
逻辑与运算符,用于部分 LVS 语句 | ||
| ll | 逻辑或运算符,用于部分 LVS 语句 | ||
:: |
TVF 及其他基于 Tcl 的 SVRF 扩展中的作用域运算符;部分内置语言中的向量运算符 | ||
, |
参数分隔符,用于内置语言函数 | ||
? |
网名的通配符(匹配 0 个或多个字符),含通配符的字符串需用引号括起 | ||
$ |
路径名中的环境变量引用运算符 | ||
# |
预处理条件语句定义运算符 |
接下来处理的是其余的 SVRF 关键字,例如 "and"(与)或 "parallel"(并行)。SVRF 关键字始终不区分大小写 。单元名和文件名的匹配区分大小写 (这并非因为规则文件本身区分大小写,而是由设计格式和操作系统决定的)。net 名可能区分大小写,也可能不区分,具体取决于规则文件中的设置。一般而言,SVRF 规则文件中的所有其他元素均不区分大小写,但部分元素可通过特定的 SVRF 语句设置为区分大小写。
每个操作和规范语句都包含一个或多个用于描述该操作或语句的组成关键字 。部分关键字由多个单词构成;在这种情况下,单词之间必须用空白字符分隔(换行符除外)。每个操作或语句中会有一个关键字被指定为主关键字,因为它标识了该操作的名称。
主关键字的示例包括 Group(分组)、Area(面积)、External(外部)和 Not Outside(非外部)。
次关键字的示例包括 PARALLEL(并行)和 ACUTE(锐角)。
关键字本身不区分大小写,但在语法描述中,次关键字会以大写形式显示,以区别于主关键字。
名称的识别优先级最低 。一般而言,用户指定的名称可由字母、数字、句点(.)和下划线(_)组成。这些名称不得包含 表 2-1 中所列的特殊符号。不过,以字符串常量形式出现的名称可突破这些限制。
语法中出现的符号 layer、layer1、layer2......layerN,既可以表示原始层或派生层的名称,也可以表示原始层的层号 。层的类型(原始层、派生边缘层、派生多边形层或错误层)通常与上下文相关,其使用限制会在相应位置进行说明。
操作 (规范语句除外)的语法元素通常可以按任意顺序排列 ,这种灵活性旨在适配用户的使用习惯。但不可拆分或重新排列由多个单词构成的独立语法元素 。例如,操作 Not Inside 不能在 Not 和 Inside 之间插入其他成分,也不能重新排列为 Inside Not。
层操作的语法在大多数情况下具有灵活性 。例如,以下六个 Area 操作是等价的:
area < 4 contact
contact area < 4
area contact < 4
< 4 area contact
<4 contact area
contact < 4 area
以下三个 OR 操作同样等价:
metal or poly
metal poly or
or metal poly
不过,在某些情况下,需要注意操作中各成分的顺序 。其中一种情况是涉及两个输入层的非交换性操作 :layer1 始终被认定为操作中首次出现的输入层名称 。例如,以下两个 Inside 操作通常不等价:
contact inside metal
metal inside contact
其他顺序可能产生影响的情况,会在对应操作的描述中酌情说明。
规则文件中的语句和操作通常对空白字符不敏感 :即它们可以在行中的任意位置开始,也可以跨行书写(无需使用续行符 )。此外,语句和操作无需各自从新行开始 。若两个连续操作的边界模糊不清,当两个主关键字位于同一行时,边界以第二个操作的主关键字 为界;否则,边界以包含第二个操作主关键字的行的开头为界。
四、注释
规则文件中允许使用注释对源代码进行标注。双斜杠(//)用于开启单行注释 ,注释内容持续至该行末尾。同时,也支持多行 C 风格注释 (/* ... */)。
规则检查注释 以符号 @ 开头,这种注释从 @ 开始,至换行符结束,且必须位于规则检查块内部。此类注释可用作调试辅助工具,当你在 Calibre RVE 和 Pyxis Layout 界面中查看规则检查结果时,这些注释会作为结果注释显示。
用于 DRC 的 Calibre RVE 还会将特定的规则检查注释识别为高亮显示和显示偏好的配置命令;
五、约束
部分 SVRF 层操作面向测量 ,因此会附带约束条件。约束是非负实数的取值范围;满足某一操作指定约束条件的输入数据,通常会作为结果数据输出。
约束的语法使用表 2-2 前六行所示的六个关键字(运算符)。表中最后四种约束形式的语法,是前四种运算符的组合;在大多数情况下,即 a >= 0 且 a < b。约束 "<0" 是不被允许的,因为在 SVRF 操作中,严格负的约束值是不可能存在的。而约束 "<= 0" 是允许使用的。
并非所有操作都支持所有类型的约束,或支持所有的数值 a 和 b 。例如,在以下约束中,a = 0 对于 With Width 操作是无效的,因为该操作不允许存在宽度为零的多边形。
示例:
< 4:表示所有小于 4 的非负实数>= 5 < 7:表示所有大于等于 5 且小于 7 的实数
表 2-2. 约束
| 运算符 | 约束表示法 ¹ | 替代约束表示法 | 数学表示法 |
|---|---|---|---|
< |
< a |
- | x < a |
> |
> a |
- | x > a |
<= |
<= a |
- | x ≤ a |
>= |
>= a |
- | x ≥ a |
== |
== a |
- | x = a |
!= |
!= a |
- | x ≠ a |
> 和 < |
> a < b |
< b > a |
a < x < b |
>= 和 < |
>= a < b |
< b >= a |
a ≤ x < b |
> 和 <= |
> a <= b |
<= b > a |
a < x ≤ b |
>= 和 <= |
>= a <= b |
<= b >= a |
a ≤ x ≤ b |
¹ a 和 b 为非负实数,< 0 不被允许
约束限制
并非所有操作都支持所有类型的约束或所有数值,例如 With Width 操作中 a = 0 是无效的(零宽度的多边形不存在)。具体限制请参见对应操作的描述。
带角度或倾斜边数据的约束
带角度或倾斜的边数据有时会给测量约束 或测量值相等性检验带来问题。此类边数据可能导致计算出的坐标值无法精确落在版图数据库的坐标网格上,这会影响约束是否被满足。更一般地,此类边数据可能会对由此推导出的所有计算值产生不利影响。
如果测量计算生成的坐标值处于版图数据库中两个可用值之间,测量工具必须选择将该坐标值 "吸附" 到哪个网格点上。例如,欧几里得距离由公式 \(√(x² + y²)\) 确定,该距离会被转换为欧几里得值的浮点表示。若该值恰好处于版图数据库在特定精度下可表示的两个坐标值之间,则会被 "吸附" 到数据库网格上。由于操作系统计算引擎、各类 CPU 硬件以及采用不同方法编译的软件在浮点运算上存在差异,所选的网格点通常无法预测。
表 2-2 约束
| 运算符 | 约束表示法 ¹ | 替代约束表示法 | 数学表示法 |
|---|---|---|---|
| < | < a | - | \(x < a\) |
| > | > a | - | \(x > a\) |
| <= | <= a | - | \(x ≤ a\) |
| >= | >= a | - | \(x ≥ a\) |
| == | == a | - | \(x = a\) |
| != | != a | - | \(x ≠ a\) |
| > 和 < | > a < b | < b > a | \(a < x < b\) |
| >= 和 < | >= a < b | < b >= a | \(a ≤ x < b\) |
| > 和 <= | > a <= b | <= b > a | \(a < x ≤ b\) |
| >= 和 <= | >= a <= b | <= b >= a | \(a ≤ x ≤ b\) |
| ¹ a 和 b 为非负数,且不允许使用 "<0"。 |
基于上述原因,对于带角度和倾斜边数据,期望在任意精度下将坐标值吸附到网格时表现出一致的行为是不合理 的。这一点适用于所有处理此类数据的层操作。因此,只要存在带角度或倾斜的边数据,就必须使用适当的测量容差。
具体而言,检查精确相等性的约束(==) 在发生网格吸附时可能会产生意外结果。因此,对于倾斜或带角度的数据,应避免使用相等性约束(==),而是建议使用测量容差。
一般来说,检验两个数值 A 和 B 是否相等应遵循以下表达式,其中 \(\epsilon\)(epsilon)为一个足够小的数,A 为用于确定相对容差的参考值:\(\frac{|A - B|}{A} < \epsilon\)若该表达式成立,则认为两个数值相等。
为说明这一点,以下操作的效果可能不符合预期,具体取决于是否发生网格吸附:
plaintext
# 可能存在问题
area_1 = AREA L1 == 0.5
更好的写法是使用一个合适的容差因子 tol:
plaintext
VARIABLE tol 0.004
area_1 = AREA L1 >= 0.5 < 0.5*(1 + tol)
这一原则同样适用于 DFM 特性计算。以下这类特性检验通常不符合预期:
plaintext
# 可能存在问题
[ AreaA = (AREA(A) == AREA(B)) ? 0 : AREA(A) ] > 0
使用较小的容差会更合适:
plaintext
[ AreaA = ((ABS(AREA(A) - AREA(B))/AREA(A)) < 0.002) ? 0 : AREA(A) ] > 0
有关 DFM 特性约束评估的更多细节,请参见第 2631 页的 "DFM 特性的比较" 章节。
六、数值表达式
数值表达式可用于指定任意层操作中的任意数值参数 ,也可用于在 Variable 规范语句中定义变量。数值表达式还可作为数值参数,用于许多规范语句以及 SVRF 语句所引用的各种内置语言的函数中。
数值表达式是数值常量 、数值变量 和运算符 的组合,运算符的优先级从高到低如下表所示。在对应括号内,优先级相同的运算符按从左到右 的顺序计算;嵌套括号则从最内层开始向外计算。
例如,3 * (GRID + 6) 就是一个数值表达式:
rule { EXT metal < 3 * ( GRID + 6 ) } // GRID 是一个数值变量
在该例中,括号内的子表达式会先于乘法运算进行计算。
SVRF 数值表达式可包含下表所示的函数。
表 2-3 按优先级排序的数值运算符
| 运算符 | 运算符类型 | 定义 |
|---|---|---|
| ( ) | 分组 | 计算括号内表达式的数值 |
| + - ! ~ | 一元 | 正、负、非、逻辑取反 |
| * / ^ % | 二元 | 乘、除、幂、取模 |
| + - | 二元 | 加、减 |
表 2-4 SVRF 数值表达式支持的数学函数
| 函数 | 定义 |
|---|---|
| CEIL(x) | 返回不小于给定值的最接近整数 |
| FLOOR(x) | 返回不大于 x 的最接近整数 |
| TRUNC(x) | 返回绝对值不大于 x 的最接近整数 |
| SQRT(x) | 计算 x 的平方根 |
| ABS(x) | 计算 x 的绝对值 |
| EXP(x) | 返回 e 的 x 次幂 |
| LOG(x) | 计算 x 的自然对数(以 e 为底) |
| SIN(x) | 计算 x 弧度的正弦值 |
| COS(x) | 计算 x 弧度的余弦值 |
| TAN(x) | 计算 x 弧度的正切值 |
| MIN(expression1,expression2) | 返回两个表达式的较小值 |
| MAX(expression1,expression2) | 返回两个表达式的较大值 |
这些运算符和函数是 SVRF 语言的一部分,但 SVRF 语句所引用的所有工具专用语言可能并非都支持完整的运算符和函数集。
七、坐标列表中的负数
部分 SVRF 元素的参数为 x-y 坐标对列表。在某些情况下,负数必须用括号括起来。
例如:
e = DENSITY metal < 0.25 ... INSIDE OF (-200) (-100) 400 200
若在这些情况下未指定括号,减号会被解释为减法运算符 ,而非一元负号,这可能导致意外结果。相关情况会在适用该规则的参数说明中讨论。
八. 字符串常量
字符串常量是由一对双引号(" ")或单引号(' ')括起来的一个或多个字符序列 。字符串常量不可跨行 ;若省略末尾的引号,则会延伸至规则文件中该行的末尾。此外,可嵌入标准 C 语言转义序列。但在字符串常量中嵌入空白字符时需谨慎,尤其是在命名规则检查语句时 ------ 因为在命令行中指定这类名称可能会很困难(例如在 Pyxis Layout 环境中)。字符串常量不会使规则文件区分大小写,空字符串常量会被忽略。
在任何需要名称的地方都可以使用字符串常量,在该上下文中,无论其包含何种字符,都会被视为名称。这允许名称与 SVRF 关键字、数字重合,或包含语言符号。对变量名加引号不会阻止其底层值的替换。
以下代码是字符串常量的使用示例:
INCLUDE "/user/illamp/block/code/rules"
"inside layer" = x NOT INSIDE y
"523.4" {
EXTERNAL < 4 'inside layer'
}
九. 变量
- variables 可以在rule文件中用作statement parameters
- rule 文件的变量可以通过两种方式定义:
- 在内部,定义variable statement语句段落
- 在外部,作为unix环境变量
SVRF 规则文件支持两种类型的变量:在 Variable 语句中声明的变量,以及环境变量。
有关在规则文件中声明变量的详细信息,请参见 Variable 规范语句。
环境变量可通过 Variable 规范语句引用,也可在路径名中通过在其前添加美元符号($)来引用,环境变量的默认值可通过 #PRAGMA ENV 预处理指令定义。
注TVF 允许在规则文件中更灵活地声明变量。
在 ICverify 中,变量也可在 Pyxis Layout 工艺文件中解析。若一个变量同时在工艺文件和规则文件的 Variable 规范语句中定义,则定义必须一致 。也就是说,在 ICverify 中,Variable 规范语句不能重新定义 Pyxis Layout 工艺文件中已定义的变量名。Pyxis Layout 工艺变量也可用于在 Variable 规范语句中定义变量。
使用 ICverify 时需注意,规则文件编译期间在工艺文件中查找的 Pyxis Layout 变量,会在编译时解析为其对应值 。因此,若这些值在规则文件加载后被重新关联,加载的规则文件将无法反映 Pyxis Layout 系统的真实状态,此时应重新加载规则文件。
十、路径名参数中的环境变量
在规则文件语句中指定路径名参数时,可将环境变量用作文件名的组成部分(此规则不适用于 ICverify )。环境变量通过在其前添加美元符号($)来标识。工具会在编译时计算环境变量的值,并将其替换到文件名字符串中。
例如,给定以下环境变量定义:
xyz -> /user
pdq -> data
rst -> ram.gds
以下规范语句:
LAYOUT PATH "$xyz/illamp/$pdq/misc.gds/$rst"
会被解析为:
LAYOUT PATH "/user/illamp/data/misc.gds/ram.gds"
为明确 "文件名组成部分" 的概念,文件名参数由以下巴克斯 - 诺尔范式(BNF)定义:
filename -> ["/"] path_str
path_str -> ["$"] string [ "/" path_str ]
string -> (除 "/" 外的任意字符序列)
其中 表示紧随其后的字符串将被解释为环境变量。请注意,variable_name 结构在规则文件中通常不会解析,仅在规范语句和层操作的输出路径名,以及条件(#IFDEF)语句中有效。
若文件名解析所需的环境变量未定义 ,或仅定义了空值,则会发生编译错误(ENV2)。
包含环境变量的路径名可用于指定 Calibre 输出文件。作为环境变量声明的路径名,无需 在规则文件的 Variable 语句中声明。
若在 SVRF 元素的输出路径名中指定了不存在的目录 (例如 Density 或 Net Area Ratio 操作的 RDB 关键字),则 Calibre 应用程序会创建该目录(前提是环境中使用了适当的权限)。
十一。关键字缩写
可对 SVRF 关键字集中的部分单词进行缩写 。当单词较长且使用繁琐,或预期使用频率较高时,缩写是合理的。缩写采用待缩写单词的前缀形式 ,且选择时需避免与常见层名冲突。关键字的缩写通常会在其首次出现 时展示,并通过关键字中大写显示的部分字母来标识。
例如,DEVice 表示 Device 关键字可缩写为 Dev。
11.1 关键字 - 名称冲突
用户定义的名称(例如层、规则检查和单元的名称)通常不能与 规则文件语言的关键字冲突,因为优先级规则总是先识别关键字 ,再识别名称。用户名称不能冲突于或包含 语言符号(如右大括号 })。若发生此类冲突,可使用字符串常量替代名称来解决。
此规则通常适用于完整的关键字 。例如,存在关键字 "LVS Reduce Series Capacitors",并不意味着 "series" 一词不能作为用户定义的名称;但 "LVS"不可用作用户名称,因为语法检查器不允许不完整地指定多单词 SVRF 语句。
为尽量减少这些限制,在几乎不可能出现问题的情况下,已尽可能允许关键字名称与用户定义名称重合。
下表列出了会与用户定义名称冲突并导致编译错误的关键字、关键字缩写或关键字前缀:
表 2-5 关键字 - 名称冲突

11.2 内联参数块规则
内联代码块用于定义一组与 SVRF 操作分离但仍位于规则文件中的参数。这也允许你在一个独立的、命名唯一的块中定义参数,并通过规则文件中的命令(或作为独立文件)引用该块。
例如,Litho File 语句指定 Litho、Fracture、RET 或 MDPverify 操作的 FILE 参数以内联形式作为独立块存在。调用 Litho File 的操作的 File 参数可指定一个 Litho File 名称:
plaintext
Litho File setup.poly [
iterations 5
gridsize 0.00109375
stepsize 0.00109375
tilemicrons 80.000000
]
Litho OPC poly File setup.poly
当该 Litho 操作被编译时,会在规则文件中搜索 Litho File 规范语句名称 setup.poly。若找到,则 Litho File setup.poly 会自动用于该 Litho 操作;若未找到,则假定 setup.poly 是一个外部文件。
内联代码块使用的语法规则与典型的 SVRF 语法不同(例如,内联块中可接受不同的注释字符)。第 61 页的 "SVRF 符号与命令解析" 给出了 SVRF 规则文件的通用语法约定。
下表列出了内联代码的特殊语法规则。
表 2-6 内联关键字 / 命令语法规则
| 关键字 / 命令 | 允许的注释字符 | 特殊语法规则 |
|---|---|---|
| Density Convolve | // | 脚本的关键字和参数不得与方括号位于同一行 |
| DFM Spec Fill | // | 反斜杠(\)可用于行续行。语法规则与 SVRF 规则文件相同 |
| Fracture HITACHI、Fracture JEOL、Fracture MEBES、Fracture MICRONIC、Fracture NUFLARE | // | 脚本的关键字和参数不得与方括号位于同一行 |
| Litho DenseOPC、Litho File、Litho OPC、Litho OPCverify、Litho ORC、Litho Printimage、Litho PSMgate | //、# | 1. 反斜杠(\)可用于行续行2. 大括号({})可用于:- 包裹内联光学和抗蚀剂模型- 在 fragmentLayer 块中声明自定义分片- 在 Tcl 脚本中定义循环- 定义 denseopc_options 块3. Litho File 块中的双引号用于在该块的 Tcl 部分定义字符串4. Litho File 块中的括号和方括号可用于计算 Tcl 表达式5. sse 变量声明中不允许使用正斜杠(/)6. 若在 Litho 块的任何位置使用 C 风格块注释(/* */),Calibre 会生成错误 |
| MDP Embed | // | 1. 行长度不得超过 1023 个字符(若超过,Calibre 会将任何 SVRF 行截断至 1023 个字符)2. 不得在嵌入的 SVRF 语句组内指定左方括号([)或右方括号(])。因此,任何方括号的出现都必须按以下方式替换:- 左方括号([)替换为 <LB>- 右方括号(])替换为 <RB>3. <SVRFSTART>、<SVRFEND>、<LB> 和 <RB> 中的左右尖括号(< >)为文字字符,必须保留 |
| MDP Checkmap、MDP Mapsize | // | 脚本的关键字和参数不得与方括号位于同一行 |
| MDPverify、MDPmerge、MDPstat | // | 1. 脚本的关键字和参数不得与方括号位于同一行2. 参数文本不得包含左方括号([)或右方括号(]) |
十二。规则文件基础结构
驱动 Calibre 工具的语句和操作 存储在一个文本文件中。你可使用任意文本编辑器编写该文件,即规则文件 。当规则文件被加载时,会对其进行语法及其他错误检查 ,并完成编译。由于编译器将规则文件作为单个整体 处理,因此元素的呈现顺序通常并不重要 。但在某些情况下,元素存在顺序依赖性。
十三、summary
所有的rule file 文件均不区分大小写;
关键词的顺序不能直接互换;