简介:这份PDF资料聚焦Cadence calibre在DRC验证中的常见报错与设置问题,面向版图设计初学者及需要更换工艺库、导入新DRC文件的工程师。内容围绕三类典型故障展开:include文件访问或路径错误、未定义层名参数(如at_conn)以及DRC工具无法加载运行集文件,逐一给出排查思路与修复方法,涵盖参数设置、路径引用、许可证HOSTID与虚拟机MAC地址匹配等关键环节。资源包为1个PDF文件,约1.07MB,轻量便携,适合随时查阅对照。目前已有8762人学习下载,说明其在EDA实践群体中具有较高参考价值。读者可从中获得针对报错信息的定位逻辑、路径与参数修正的具体操作,以及许可证配置的排错方向,帮助在更换DRC文件或导入新工艺库时快速恢复验证流程,减少反复试错的时间成本。
1. 换 DRC 文件前,为什么你的 calibre 跑出来全是假错
版图改完一轮,工艺那边突然通知规则文件从旧版本切到新版本,你兴冲冲把calibre -drc一跑,结果满屏几百条违规,逐条点进去看,全是些不该报的间距、不该断的连线。这时候多数人的第一反应是「规则变严了」,于是埋头改版图,改到半夜才发现——根本不是版图的问题,是换 DRC 文件之前那几个设置没对齐。
calibre 跑 DRC 这件事,本质上是把一份规则文件(rule file,通常叫xxx.drc或runset)喂给 Calibre nmDRC 引擎,让它按规则去量你的 GDS。规则文件里写死了层号映射、单位、精度、器件识别方式、结果输出格式。你换了一份 DRC 文件,等于换了一整套「度量衡」。如果新文件里的 layer map、精度、LAYOUT PATH、LAYOUT PRIMARY这些和上一版不一致,引擎就会拿错误的层去量错误的图形,报出来的错自然全是玄学。
这篇写给正在做版图验证、准备切换 DRC 规则版本的工程师。不管你是刚接手一套跑不通的 runset,还是要把旧工艺的 DRC 迁到新工艺,下面这套「换文件前先对齐设置」的流程都能直接抄。核心就一句话:换 DRC 文件不是换一个文件,是换一整套上下文,先把上下文对齐,再谈跑不跑得通。
2. 换 DRC 文件前必须对齐的四类设置
换规则文件翻车,九成翻在这四类设置上:路径与顶层、层号映射、单位与精度、器件识别。它们不是并列关系,而是有先后依赖——路径错了后面全白搭,层号错了报错全是假的,精度错了量出来的数不可信,器件识别错了会把该连的判成断。
2.1 路径、顶层单元与库映射:先让引擎找对版图
Calibre 跑 DRC 第一步是读版图。规则文件里通常有这么几行控制读入行为:
# runset 片段:版图读入相关设置 LAYOUT PATH "design.gds" # 待验证的 GDS 路径,相对/绝对都行 LAYOUT PRIMARY "top_cell" # 顶层单元名,必须和 GDS 里真实顶层一致 LAYOUT SYSTEM GDSII # 输入格式,GDSII / OASIS LAYOUT CASE YES # 单元名大小写敏感,YES 表示区分逻辑说明:LAYOUT PATH指向你要验的版图,LAYOUT PRIMARY指定从哪个单元开始往下展平。很多人换 DRC 文件时只改了规则,忘了改这两行,结果引擎去读上一版的旧 GDS,或者顶层名对不上直接报「cell not found」。
参数说明:LAYOUT CASE YES这个开关特别容易被忽略。有些工艺的单元命名混用大小写,如果规则文件里写NO,引擎会把INV和inv当成同一个单元,展平后层次结构错乱,报出来的错你根本对不上版图。换文件时先确认新旧两份 runset 的LAYOUT CASE是否一致。
提示:换 DRC 文件后第一次跑,先只跑读入不跑规则,确认引擎能正确识别顶层和单元数,再往下走。
2.2 层号映射表:新旧规则对不上层,报错全是假的
这是换 DRC 文件最容易翻车的地方。DRC 规则里所有操作都是针对「层」的,比如「M1 到 M1 的最小间距」「Poly 到 Active 的最小包围」。规则文件靠一张 layer map 把工艺层名翻译成 GDS 里的 layer/datatype 对:
# layer map 片段:工艺层名 -> GDS layer/datatype LAYER M1 10 0 # 金属1 对应 GDS layer 10 datatype 0 LAYER M2 20 0 LAYER POLY 5 0 LAYER ACTIVE 3 0 LAYER VIA1 15 0逻辑说明:左边是规则文件里用的逻辑层名,右边是 GDS 里实际的 layer 号和 datatype 号。规则里写M1,引擎就去 GDS 里找 layer 10 datatype 0 的图形来量。
参数说明:换 DRC 文件时,新旧两份的 layer map 必须逐行比对。常见坑是新工艺把某个层拆成了两个 datatype,或者把 via 的 layer 号整体挪了位。如果新规则文件里M1还指向 10/0,但你的新 GDS 里 M1 已经改成 10/1,引擎就会去量一个空层,报「no shapes found」或者量到别的图形上报假错。
比对方法很简单,把两份 runset 的 layer map 段抽出来 diff:
# 抽出两份 runset 的 layer 定义段做对比 grep -E "^LAYER " old.drc | sort > old_layers.txt grep -E "^LAYER " new.drc | sort > new_layers.txt diff old_layers.txt new_layers.txt逻辑说明:grep抓出所有LAYER开头的行,排序后 diff,一眼就能看出哪些层号变了、哪些层新增或删除了。这一步花五分钟,能省你半夜改版图的几个小时。
2.3 单位与精度:量出来的数差一个量级,先查这里
DRC 报的间距、宽度都是带单位的数。Calibre 内部用数据库单位(database unit,通常写作DBU)来量,规则文件里会声明精度:
# 精度与单位设置 PRECISION 1000 # 内部精度,1 微米 = 1000 个 DBU LAYOUT UNITS 1000 # 版图单位,和 PRECISION 配套逻辑说明:PRECISION 1000表示引擎把 1 微米切成 1000 份来量,最小能分辨 1 纳米。规则里写「最小间距 0.2 微米」,引擎就换算成 200 个 DBU 去比。
参数说明:换 DRC 文件时,如果新旧两份的PRECISION不一致,比如旧的用 1000、新的用 2000,那么同一条规则量出来的结果会差一倍。更隐蔽的情况是LAYOUT UNITS和PRECISION不匹配,引擎读进来的版图尺寸整体缩放,报出来的错位置全偏。换文件后先跑一条最简单的规则(比如某个已知安全间距),看报出来的数值是否符合预期,能快速验证精度设置对不对。
2.4 器件识别与连接提取:别让引擎把该连的判成断
有些 DRC 规则涉及器件识别和连接关系,比如「栅极必须被某层覆盖」「两个器件之间不能有未连接的扩散区」。这类规则依赖规则文件里的器件定义和连接提取设置:
# 器件识别相关设置 DEVICE MOS (POLY ACTIVE) [gate] # 定义 MOS 器件由 Poly 和 Active 构成 CONNECT M1 BY VIA1 # 声明 M1 通过 VIA1 连接 CONNECT M2 BY VIA2逻辑说明:DEVICE行告诉引擎怎么从图形里认出器件,CONNECT行告诉引擎哪些层之间是导通的。引擎据此建立连接图,再跑依赖连接的规则。
参数说明:换 DRC 文件时,如果新规则里器件定义方式变了(比如从「Poly 交 Active」改成「Poly 交 Active 且被某层覆盖」),或者连接关系多了/少了一层,那么所有依赖连接的规则结果都会变。常见现象是「明明连着的线报开路」,或者「明明断开的报短路」。这时候别急着改版图,先把新旧两份的DEVICE和CONNECT段拉出来对比。
3. 一套可复现的换 DRC 文件操作流程
上面四类设置对齐之后,换 DRC 文件就有了可复现的步骤。下面这套流程我一般按顺序走,每一步都有明确的检查点,跑不通就停在那一步排查,不要跳步。
3.1 第一步:备份旧 runset 并抽取关键设置
换文件之前先把旧的 runset 完整备份,然后把关键设置段抽出来存档。这不是形式主义,是给自己留后悔药——新文件跑不通时,你得能快速回退到已知能跑的配置。
# 备份旧 runset 并抽取关键设置段 cp old.drc old.drc.bak grep -E "^(LAYOUT|LAYER|PRECISION|DEVICE|CONNECT)" old.drc > old_settings.txt wc -l old_settings.txt # 看抽出来多少行,心里有数逻辑说明:cp做备份,grep把路径、层、精度、器件、连接这几类关键行抽到一个文件里。wc -l数一下行数,方便后面和新文件对比时知道规模。
参数说明:grep -E用的是扩展正则,^(LAYOUT|LAYER|...)表示行首匹配这几个关键词之一。如果你的 runset 里这些设置用了别的写法(比如缩进或注释),需要相应调整正则。
3.2 第二步:对新 runset 做同样的抽取并逐段 diff
对新 DRC 文件做同样的抽取,然后和旧的逐段对比。这一步是核心,差异点就是你要重点确认的地方。
# 对新 runset 做同样抽取并对比 grep -E "^(LAYOUT|LAYER|PRECISION|DEVICE|CONNECT)" new.drc > new_settings.txt diff old_settings.txt new_settings.txt逻辑说明:diff会逐行列出差异,<开头的是旧文件有、新文件没有的,>开头的是新文件有、旧文件没有的。重点看LAYER行的 layer/datatype 有没有变,PRECISION有没有变,CONNECT有没有增删。
参数说明:如果差异太多看不过来,可以分段 diff,先只比LAYER行,再比PRECISION和CONNECT。分段比的好处是每类设置的差异单独看,不容易漏。
3.3 第三步:改路径和顶层,先跑读入验证
差异确认清楚后,先改LAYOUT PATH和LAYOUT PRIMARY指向你的实际版图,然后只跑读入,不跑规则。
# 只做版图读入验证,不跑规则 calibre -drc -hier -turbo 4 -runset new.drc -batch -verify_layout逻辑说明:-verify_layout让引擎只读版图并报告读入结果,不执行规则检查。-hier表示层次化处理,-turbo 4用 4 个线程加速,-batch是批处理模式。
参数说明:-turbo后面的数字按你机器的核数来,一般设成物理核数的一半到全部。-verify_layout跑完会输出读入的单元数、层数、图形数,拿这些数和旧版对比,确认读入的版图是对的。
注意:如果这一步就报「cell not found」或「layer not found」,说明路径、顶层名或 layer map 还有问题,先解决再往下走。
3.4 第四步:分规则块跑,定位第一处假错
读入验证通过后,不要一次性跑全部规则。把规则文件按功能块拆开,一块一块跑,这样报错时能快速定位是哪类规则出的问题。
# 分规则块跑,先跑间距类规则 calibre -drc -hier -turbo 4 -runset new.drc -batch \ -rules "spacing_rules" -results spacing_results.db逻辑说明:-rules指定只跑某个规则块(具体块名看你的 runset 怎么组织),-results指定结果输出文件。先跑最基础的间距规则,因为间距规则不依赖器件识别和连接提取,最容易验证层号和精度对不对。
参数说明:如果你的 runset 没有分块,可以手动把规则文件按注释分段,临时拆成几个小文件分别跑。跑通一块再跑下一块,逐步扩大范围。
3.5 第五步:结果比对与假错分类
每跑完一块,把结果和旧版对比。假错通常分三类:层号错导致的「量错对象」、精度错导致的「数值偏差」、器件识别错导致的「连接误判」。分类之后针对性排查,比盲目改版图高效得多。
# 统计结果条数,和旧版对比 calibre -drc -batch -results new_results.db -report new_report.rpt grep -c "ERROR" new_report.rpt # 数错误条数逻辑说明:-report输出可读报告,grep -c数错误条数。如果新版错误条数比旧版多出一个数量级,基本可以确定是设置问题而不是版图问题。
参数说明:grep -c "ERROR"只是粗略计数,更细的分类要看报告里的错误类型字段。把新旧报告的错误类型分布对比,哪类错误突然暴增,就去查对应的设置。
4. 换 DRC 文件时最容易踩的五个坑
这一章全是血泪经验,每条都按「现象 → 原因 → 解决」写,你对照自己的情况看。
4.1 现象:报大量间距错,但版图明明没动
原因:新旧 runset 的 layer map 不一致,引擎拿新规则的层号去量旧版图的层,量到了错误的图形。比如新规则里M1指向 10/1,但你的版图里 10/1 是别的层,引擎就把那个层当 M1 来量间距。
解决:把两份 runset 的LAYER行逐行 diff,确认每个逻辑层名对应的 layer/datatype 和你的版图一致。不一致的要么改 runset,要么确认版图是否真的用了新层号。
4.2 现象:报错位置整体偏移,或者量出来的数值差一倍
原因:PRECISION或LAYOUT UNITS不一致,引擎读版图时整体缩放,或者量的时候单位换算错了。
解决:对比两份 runset 的PRECISION和LAYOUT UNITS,确保一致。如果不一致,确认哪个是对的,然后统一。跑一条已知安全间距的规则验证数值。
4.3 现象:明明连着的线报开路,或者断开的报短路
原因:CONNECT段不一致,引擎建立的连接图和实际不符。常见是新规则多了一层连接关系,或者 via 的层号变了但CONNECT没跟着改。
解决:对比两份 runset 的CONNECT段,确认每层连接关系都对。特别检查 via 相关的连接,via 层号变了CONNECT必须同步改。
4.4 现象:引擎报「cell not found」或「no shapes found」
原因:LAYOUT PRIMARY顶层名和 GDS 里不一致,或者LAYOUT CASE设置导致大小写匹配失败,或者LAYOUT PATH指向了错误的文件。
解决:用版图工具打开 GDS 确认顶层单元名,检查LAYOUT CASE设置,确认LAYOUT PATH指向的是你要验的那份 GDS。
4.5 现象:规则跑了一半报语法错,或者某些规则被跳过
原因:新旧 runset 的语法版本不一致,或者新规则依赖的某些定义在旧版里没有。Calibre 不同版本的 runset 语法有差异,直接换文件可能触发解析错误。
解决:看报错行号,定位到具体规则。确认你的 Calibre 版本支持新 runset 的语法。如果新规则依赖某些预定义变量或宏,确认这些定义在文件里存在。
5. 用变量和 include 把换 DRC 文件的成本压到最低
上面讲的都是「换文件时怎么对齐」,但更省事的做法是从一开始就把易变的部分抽成变量,换文件时只改一个配置块,而不是满文件找。这套做法我用了几年,换工艺、换版本、换项目时基本能做到十分钟内跑通。
核心思路是把 runset 拆成两层:一层是「环境配置」,放路径、层号、精度、连接这些随工艺变的东西;一层是「规则逻辑」,放具体的检查规则,规则里只引用变量,不写死数值。
# env.tcl:环境配置层,换工艺只改这个文件 set LAYOUT_PATH "design.gds" set LAYOUT_PRIMARY "top_cell" set PRECISION_VAL 1000 set M1_LAYER 10 set M1_DATATYPE 0 set M2_LAYER 20 set M2_DATATYPE 0 # ... 其他层定义# rules.drc:规则逻辑层,引用变量,不写死数值 LAYOUT PATH $LAYOUT_PATH LAYOUT PRIMARY $LAYOUT_PRIMARY PRECISION $PRECISION_VAL LAYER M1 $M1_LAYER $M1_DATATYPE LAYER M2 $M2_LAYER $M2_DATATYPE # 规则部分只引用层名,不关心具体层号 M1.SPACE.1 { @ 最小间距检查 SPACE M1 < 0.2 }逻辑说明:env.tcl用 Tcl 变量定义所有易变参数,rules.drc用$变量名引用。换工艺时只改env.tcl,规则逻辑完全不动。Calibre 支持在 runset 里 include 外部文件,把这两层拼起来跑。
参数说明:变量命名建议带前缀区分类型,比如M1_LAYER是层号、M1_DATATYPE是数据类型、PRECISION_VAL是精度值。规则里引用变量时注意 Tcl 的$语法,字符串变量和数值变量在拼接时可能需要{}或""包裹。
这套做法的好处在换 DRC 文件时特别明显:新工艺给你一份新规则,你只需要把新规则里的层号、精度、连接关系填进env.tcl,规则逻辑部分直接复用。如果新规则逻辑有变化,再单独改rules.drc,改动范围可控。
验证方法也很直接:准备两份env.tcl,一份对应旧工艺一份对应新工艺,用同一份rules.drc分别跑,对比结果。如果结果差异只出现在工艺确实变化的规则上,说明变量抽取是干净的;如果出现莫名其妙的差异,说明还有写死的数值没抽出来。
我自己的习惯是,每接手一套新 runset,第一件事不是跑,而是先花二十分钟把易变参数全部抽成变量,写一个env.tcl模板。这二十分钟的投入,在后续每次换版本、换项目时都能省回来。换 DRC 文件这件事,本质上不是技术难题,是配置管理问题——把易变的部分管好,剩下的就是体力活。希望帮到你。
本文还有配套的精品资源,点击获取