3. 工艺规则文件解析

DRC rule deck 是代工厂把“版图必须满足什么”翻译成可执行代码后的产物。它通常由数千行文本组成,但结构并不杂乱:一份成熟的 deck 往往遵循“环境与变量 → 层定义 → 派生层 → 规则主体 → 输出与开关”的组织方式。读懂它,意味着你能在报错时快速定位到规则来源,而不是只盯着版图反复猜测。

一、rule deck 的典型层次结构

以 Calibre 的 SVRF 语法为例,一份 deck 从文件头开始,通常包含以下层次:

  • 环境与选项:如 LAYOUT PATH、LAYOUT PRIMARY、LAYOUT SYSTEM GDSII,声明版图来源与格式;DRC RESULTS DATABASE 指定结果库路径。
  • 变量定义:用 #DEFINE 或 VARIABLE 声明可复用的数值、开关或路径,例如最小线宽、间距阈值、是否开启某类检查。
  • 层定义:把 GDS 层号/数据类型映射为可读名字,如 LAYER M1 30 0,后续规则全部用 M1 引用。
  • 派生层:通过布尔运算、尺寸调整、边缘提取等生成中间层,如 M1_NOTCH = M1 NOTCH ...。
  • 规则主体:逐条写出检查语句,如 WIDTH、SPACE、ENCLOSURE、DENSITY 等。
  • 输出与开关:控制哪些规则被激活、结果如何分类、是否生成 RDB 或 ASCII 报告。

这种分层不是形式主义。层定义让规则与工艺层解耦,派生层让复杂检查可读,变量让同一份 deck 能适配不同工艺节点或不同产品档位。理解层次,才能在报错时判断“是规则本身写错了,还是我调用的层不对”。

DRC rule deck 层次结构与数据流 ① 环境与选项 LAYOUT PATH / SYSTEM / RESULTS ② 变量定义 #DEFINE / VARIABLE ③ 层定义 LAYER M1 30 0 ④ 派生层 布尔 / 尺寸 / 边缘运算 ⑤ 规则主体 WIDTH / SPACE / ENCLOSURE ⑥ 输出与开关 RDB / ASCII / 规则激活 规则执行时的数据流与条件判断 GDSII 版图 层号 / 数据类型 层映射 M1 = 30/0 条件判断 IF / ELSE 执行检查 WIDTH / SPACE 跳过 / 报错 规则未激活或违规 结果数据库 RDB 违规坐标 / 规则名 / 层 变量注入阈值 派生层参与判断 规则主体按层与条件逐条执行,结果统一写入 RDB 供后续分析

二、变量定义:让 deck 可配置

变量是 deck 中最容易被忽略、却最影响调试效率的部分。常见写法有两种:

#DEFINE M1_MIN_WIDTH 0.032
#DEFINE M1_MIN_SPACE 0.032
#DEFINE CHECK_DENSITY 1

VARIABLE M2_MIN_AREA 0.010

前者是预处理宏,在解析前直接文本替换;后者是 SVRF 变量,可在运行时通过命令行覆盖。实际项目中,代工厂常把同一份 deck 用于多个产品,通过变量区分金属层数、是否开启密度检查、是否启用冗余金属填充检查。调试时如果发现某条规则“明明版图满足却报错”,第一件事就是确认该规则引用的变量当前取值是多少,而不是直接改版图。

变量还可以参与条件判断。例如:

IF (CHECK_DENSITY == 1) {
  DENSITY M1 0.30 0.70
}

这种写法让 deck 在“全规则模式”和“快速模式”之间切换,签核阶段通常全开,迭代阶段可临时关闭耗时规则。

三、条件判断:规则不是无条件执行的

DRC deck 中的条件判断主要出现在三个位置:

  1. 规则级开关:用 IF / ELSE 包裹整条规则,决定是否执行。例如是否检查某层密度、是否检查天线效应。
  2. 层间条件:根据派生层是否存在决定后续操作。例如 IF (EXIST M1_NOTCH) 再执行 notch 检查。
  3. 参数条件:同一规则在不同区域使用不同阈值,例如芯片边缘与中心区域采用不同的密度上限。

条件判断的常见陷阱是“嵌套过深”。一份 deck 中如果出现三层以上嵌套,往往意味着规则被过度参数化,调试时应先画出条件树,确认当前运行路径,再判断报错是否来自预期分支。

四、常用命令:从层操作到检查输出

Calibre SVRF 中高频出现的命令可以按功能分组记忆:

类别命令作用示例
层定义LAYER映射 GDS 层号LAYER M1 30 0
布尔运算AND / OR / NOT / XOR生成派生层M1_A = M1 AND AA
尺寸操作SIZE / GROW / SHRINK层边缘偏移M1_S = SIZE M1 BY 0.01
宽度检查WIDTH最小线宽WIDTH M1 < 0.032
间距检查SPACE最小间距SPACE M1 < 0.032
包围检查ENCLOSURE层间包围ENCLOSURE M1 BY VIA1 < 0.01
密度检查DENSITY区域密度DENSITY M1 0.30 0.70
结果输出DRC RESULTS DATABASE指定 RDB 路径DRC RESULTS DATABASE "out.rdb"

其中 WIDTH、SPACE、ENCLOSURE 是最常被触发的三类规则。以 WIDTH M1 < 0.032 为例,它表示“M1 层上任何宽度小于 0.032 μm 的区域都算违规”。注意这里的比较方向:小于阈值才报错,而不是大于。很多初学者第一次读 deck 时会把这个方向搞反,导致误判。

五、一次实际的规则定位过程

假设 Calibre 运行后 RDB 中报出 M1.S.1 违规,坐标集中在芯片左上角。按以下顺序排查:

  1. 在 deck 中搜索 M1.S.1,找到对应规则行,确认它引用的层是 M1 还是某个派生层。
  2. 查看该规则上方是否有 IF 条件,确认当前变量取值是否让该规则处于激活状态。
  3. 检查 M1 的层定义是否与版图实际层号一致,排除层映射错误。
  4. 若规则引用了派生层,回溯派生层的布尔运算,确认运算结果是否与预期一致。
  5. 最后再回到版图,检查违规坐标处的实际图形。

这个顺序的核心逻辑是:先确认“规则本身是否按预期执行”,再确认“版图是否真的违规”。多数误报来自前两步,而不是版图本身。

实用建议:拿到一份新 deck 时,先不要急着跑全量。用 #DEFINE 临时关闭耗时规则,只保留 WIDTH、SPACE、ENCLOSURE 三类基础检查,跑通后再逐组打开。这样既能快速验证环境配置,也能在报错时缩小规则范围。
注意:不要直接修改代工厂提供的 rule deck 主体。若需调整阈值或开关,优先通过命令行变量覆盖,或在独立文件中用 INCLUDE 追加规则。直接改 deck 会导致签核结果与代工厂基准不一致,流片风险由设计方承担。

读懂 rule deck 的最终目标,是让每一次 DRC 报错都能被追溯到具体的层、变量和条件分支。当你能在几分钟内定位到 M1.S.1 来自哪一行、受哪个变量控制、是否被条件包裹时,DRC 调试就从“反复试错”变成了“按图索骥”。