3. 制造规则问题诊断的数据准备

在 Calibre 版图制造规则诊断中,绝大多数“规则明明写对了却报错”或“该报的错没报”的问题,根源并不在规则语句本身,而在于输入数据之间的依赖关系被破坏。一次完整的 DRC 运行,本质上是把五类输入按固定依赖顺序装配成一个可执行的检查环境:版图数据(GDS/OASIS)、层映射(Layer Map)、规则文件(Rule File)、工艺文件(Process/Technology File)以及运行选项(Runset Options)。任何一类输入与其它输入不一致,都会在结果层表现为误报(False Error)或漏报(Missing Error)。

先建立依赖关系的整体认识。版图数据只提供“几何图形 + 层号/数据类型号”这一层信息,它本身不知道哪一层是 Poly、哪一层是 Contact。层映射负责把版图里的 (layer, datatype) 二元组翻译成规则文件能识别的逻辑层名。规则文件用逻辑层名书写检查语句,例如“Poly 与 Contact 的最小间距”。工艺文件则提供规则文件引用的工艺参数,如最小线宽、最小间距、各层厚度与电阻值。运行选项决定用哪个规则文件、哪个层映射、哪个工艺文件、以什么模式(flat/hierarchical)运行。这五者的关系可以用下面的依赖图表示。

Calibre DRC 输入数据依赖关系 版图数据 GDS / OASIS (layer, datatype) 层映射 Layer Map (layer,datatype)→逻辑层名 规则文件 Rule File (.cal) 逻辑层名 + 检查语句 工艺文件 Process / Tech File 工艺参数 (W/S/T) 运行选项 Runset Options -hier / -flat / -turbo 提供层号 翻译逻辑层 提供参数值 指定文件路径 加载版图 诊断结果 误报 / 漏报 输入不一致的最终表现 依赖链:版图数据 → 层映射 → 规则文件 ← 工艺文件;运行选项控制全部输入的加载

从图中可以看到,层映射是版图数据与规则文件之间的“翻译层”,工艺文件是规则文件的“参数供给层”,运行选项则是整个装配过程的“调度层”。诊断输入不一致,就是沿着这些箭头逐一核对。

一、层映射不一致:最常见的误报来源

层映射文件通常以 layer_map 语句书写,格式为 layer_map = <layer> <datatype> <logical_name>。假设版图数据中 Poly 层实际是 layer 5 datatype 0,而层映射文件里写成了 layer 5 datatype 1,那么规则文件里所有引用 Poly 的检查都会作用在空层上。结果是:本该报出的 Poly 间距违规全部漏报,而某些依赖 Poly 存在的检查可能因为空层产生异常几何而误报。

排查方法很直接:用 calibre -drc -hier -layer_map layer.map 加载后,在日志中搜索 Layer map 段落,确认每个逻辑层名对应的实际 (layer, datatype) 与版图数据一致。更可靠的做法是先用 calibre -drc -hier -dump_layers 导出实际层号清单,再与层映射文件逐行比对。常见错误包括:datatype 写错、逻辑层名拼写不一致、同一逻辑层被映射到多个物理层、以及层映射文件里缺少规则文件引用的某个逻辑层。

二、规则文件与工艺文件的参数脱节

规则文件中的检查语句通常引用工艺文件里的变量,例如 @poly_min_width、@contact_min_space。如果工艺文件被替换成另一个工艺节点的版本,而规则文件没有同步更新变量名或变量值,就会出现两种后果:变量名不存在时 Calibre 直接报语法错误;变量名存在但数值不匹配时,检查阈值被悄悄改变,导致误报或漏报。例如工艺文件里 @poly_min_width = 0.18,而规则文件按 0.13 工艺编写,实际检查就会用 0.18 去卡 0.13 的版图,产生大量误报。

排查时应在规则文件开头找到 #include 或 INCLUDE 语句,确认它引用的工艺文件路径和版本号。然后在 Calibre 日志中搜索 Variable 或 @ 开头的变量赋值记录,核对关键阈值是否与当前工艺节点一致。一个实用的做法是把工艺文件中的变量清单导出成表格,与规则文件中所有 @ 引用做交叉比对,确保没有“引用了但未定义”或“定义了但值不对”的项。

三、运行选项导致的加载错位

运行选项中最容易出问题的是文件路径和运行模式。如果 runset 中 -layer_map 指向了旧项目的层映射文件,而版图数据来自新项目,层映射就会整体错位。同样,-hier 与 -flat 的选择会影响层次化单元的展开方式,某些在 flat 模式下能报出的跨单元违规,在 hier 模式下可能因为单元边界处理不同而漏报。此外,-turbo 模式对某些复杂规则的支持有限,若规则文件里使用了 turbo 不支持的语句,Calibre 可能跳过该检查而不报错,造成漏报。

排查运行选项时,应先在日志开头确认实际生效的选项列表,而不是只看 runset 文件里写了什么。Calibre 会在日志中回显最终解析后的命令行参数。重点核对:-layer_map 路径、-rule 路径、-hier/-flat 模式、以及是否有 -turbo 与规则文件不兼容的警告。如果日志中出现 Warning: Rule ... not supported in turbo mode,就说明该规则被跳过了,必须切换模式重新运行。

四、输入一致性检查清单

把上述排查点整理成一份可执行的检查清单,每次诊断前按顺序过一遍,可以大幅减少因输入不一致导致的误报与漏报。

检查项 核对内容 不一致的典型后果
版图数据 vs 层映射 每个逻辑层对应的 (layer, datatype) 是否与 GDS/OASIS 实际层号一致 空层检查 → 漏报;异常几何 → 误报
层映射 vs 规则文件 规则文件引用的逻辑层名是否都在层映射中有定义 未定义层名 → 语法错误或跳过检查
规则文件 vs 工艺文件 规则中所有 @变量是否在工艺文件中定义,数值是否匹配当前工艺节点 阈值偏移 → 误报或漏报
运行选项 vs 实际文件 -layer_map、-rule、-hier/-flat、-turbo 是否与当前项目匹配 加载旧文件 → 整体错位;模式不兼容 → 跳过检查
日志回显 vs runset 文件 日志中实际生效的选项是否与 runset 中书写的一致 路径被覆盖或变量被重定义 → 隐性不一致
实用技巧:在 Calibre 日志中搜索 Reading layer map、Reading rule file、Reading process file 三个关键行,确认每个文件的实际加载路径和版本。如果某个文件没有被加载,日志中不会出现对应行,这本身就是输入缺失的信号。
注意:不要假设 runset 文件里写的路径就是实际加载的路径。Calibre 允许在命令行中覆盖 runset 中的选项,且环境变量(如 CALIBRE_LAYER_MAP)也可能影响加载结果。排查时必须以日志回显为准。

总结来说,输入数据不一致导致的误报与漏报,几乎都可以沿着“版图数据 → 层映射 → 规则文件 ← 工艺文件,运行选项控制全部”这条依赖链定位。诊断时先确认日志中实际加载了哪些文件、以什么模式加载,再逐层核对层号、逻辑层名、变量值和运行模式。把这份检查清单固化为每次 DRC 诊断前的标准动作,就能把大量“规则问题”还原为“输入问题”,从而快速排除误报与漏报。