ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Calibre DRC静默失败三大根源:HostID、层映射与runset加载

Calibre DRC静默失败三大根源:HostID、层映射与runset加载 简介本资源是一份面向IC设计工程师与EDA初学者的Calibre DRC验证排错实战指南聚焦导入新工艺库时更换DRC文件引发的三类高频问题包含文件访问失败、未定义层名参数报错如at_conn、以及DRC工具无法加载运行集文件。内容基于真实调试场景展开提供从错误定位、路径修正、参数补全到License HOSTID更新的完整解决路径尤其详述虚拟机MAC地址获取与license适配方法具备强实操性。资源为1个PDF文件共1.07MB结构清晰图文结合呈现报错界面与关键修改步骤便于快速查阅与现场对照。目前已有8737人学习下载适合正在使用Cadence平台开展DRC验证、遭遇工艺迁移或环境配置问题的工程师高效排查与复现解决方案。1. Calibre 跑 DRC 前必调的三类设置不是“点 Run 就完事”而是 HostID 错配、layer name parameter 漏映射、runset file 未绑定导致的 silent failure你刚配好 Calibrecalibre -drc -runset my_drc.runset -lvs -top top_cell一敲回车日志里没报错但 DRC summary 里Total violations: 0—— 可你知道版图里明明有金属间距违规或者更糟跑完直接卡在Initializing license...终端停住不动ps aux | grep calibre却看到一堆 zombie process。这不是 Calibre 坏了是它根本没真正启动 DRC 引擎——因为最关键的三道门还没打开HostID 许可校验失败、layer name parameter 在 runset 里没对上工艺文件里的真实层名、runset file 本身压根没加载进 Calibre 的执行上下文。这类问题不报红错只静默跳过或 hang 住新手常以为“跑通了”结果 tape-out 前才发现所有 spacing rule 全没生效。本文专治这三类“看不见的失败”用真实命令链还原从calibre -drc启动到 DRC engine 加载完成的完整路径逐层拆解每个环节的校验逻辑、参数来源和失败信号。适合数字后端工程师、物理验证新人、以及被error: the hostid in the license file is not a valid hostid for this license卡住超过 2 小时的人。2. HostID 校验Calibre 启动前的第一道关卡不是 License Server 问题而是本机硬件标识与 license 文件硬编码不匹配Calibre 的 license 校验发生在calibre -drc进程 fork 出子进程前属于 pre-execution 阶段。它不依赖网络 license server如 FlexLM而是直接读取本地 license 文件通常是calibre.lic或license.dat中的HOSTID字段并与当前机器的硬件标识比对。一旦不匹配进程会卡在Initializing license...且无 timeout 机制——这是最典型的 silent hang 场景。2.1 如何确认本机真实的 HostIDCalibre 官方文档要求 HostID 必须是网卡 MAC 地址去掉冒号全小写但实际中存在三种常见变体必须用 Calibre 自带工具验证# 方法一用 calibre 自带的 liccheck 工具最权威 $ calibre -liccheck # 输出示例 # Host ID: 001122334455 # License file: /tools/calibre/license/calibre.lic # Status: VALID # 方法二手动查网卡注意必须是 eth0 或 bond0不能是 docker0/virbr0 $ ip link show eth0 | awk /ether/ {print $2} | tr -d : 001122334455 # 方法三查 /etc/hostid某些旧版本 fallback 方式 $ cat /etc/hostid # 输出为 8 字符 hex如 01234567需转为 12 字符 MAC 格式提示calibre -liccheck是唯一可信源。不要相信ifconfig输出的ether字段——某些虚拟化环境如 VMware会伪造 MAC而 Calibre 读的是内核驱动层的真实硬件 ID。2.2 License 文件中 HostID 的三种合法格式及校验规则Calibre 支持以下三种 HostID 写法但必须与calibre -liccheck输出完全一致包括大小写、长度、分隔符License 文件写法示例校验逻辑常见翻车点HOSTID001122334455HOSTID001122334455精确 12 字符 hex string全小写复制粘贴时带空格或换行符MAC 地址含大写字母如00:11:22:33:44:55→001122334455HOSTIDANYHOSTIDANY绕过校验仅限 eval license生产环境禁用Calibre 会警告WARNING: HOSTIDANY is not allowed in productionHOSTIDeth0HOSTIDeth0动态读取 eth0 接口 MAC若 eth0 down 或重命名如改为 ens33校验失败验证命令# 检查 license 文件是否被正确读取 $ calibre -drc -runset dummy.runset -n -v 21 | grep -i hostid\|license # 正常输出应含Reading license file /path/to/calibre.lic ... Host ID match OK # 错误输出Host ID mismatch: expected 001122334455, got 0011223344562.3 HostID 不匹配时的应急修复流程无需重启 license server当calibre -liccheck显示 HostID 为aabbccddeeff但 license 文件写的是AABBCCDDEEFF时不要改 license 文件——因为 license 是加密签名的修改后calibre -liccheck会报Signature verification failed。正确做法是用calibre -licgen生成新 license需 vendor 提供 seed若无 seed联系 EDA vendor 提交calibre -liccheck输出 机器信息临时调试方案在启动命令前强制指定 HostID仅限 debug# 设置环境变量覆盖默认 HostIDCalibre 2022.2 支持 $ export CALIBRE_HOSTID001122334455 $ calibre -drc -runset my.runset3. Layer Name Parameter 映射DRC rule deck 里写的M1版图里却是metal1Calibre 不会自动猜必须显式绑定DRC rule deck如techfile.drc中定义的 layer name如M1,POLY,NWELL是逻辑层名而 GDS/OASIS 版图文件里存储的是物理层号layer number 层名layer name。Calibre 在加载 rule deck 时会尝试将 rule 中的 layer name 与版图中的 layer name 一一匹配。若不匹配该 layer 上的所有 rulespacing, width, area全部失效且不报 warning——这是 DRC 漏检的头号原因。3.1 查看版图中实际 layer name 的两种方法# 方法一用 calibre -gdsinfo 查 GDS 层名推荐无 GUI 依赖 $ calibre -gdsinfo -list_layers my_top.gds # 输出示例 # Layer 1: metal1 # Layer 2: poly # Layer 3: nwell # Layer 4: via1 # 方法二用 klayout 命令行导出 layer map需安装 klayout $ klayout -b -r layermap.rb -rd gds_filemy_top.gds # layermap.rb 脚本内容 # File.open(layermap.txt, w) do |f| # RBA::Layout.new.read(my_top.gds).layers.each { |l| f.puts #{l.layer}/#{l.datatype}: #{l.name} } # end3.2 在 runset file 中绑定 layer name parameter 的标准语法runset file.runset是 Calibre 的配置中枢其中LAYER_MAPsection 必须显式声明逻辑层名 → 物理层名的映射。不能省略LAYER_MAP也不能用LAYER_NAME替代。# my_drc.runset 文件片段 LAYER_MAP { M1 metal1 POLY poly NWELL nwell VIA1 via1 } # 注意箭头 两侧必须有空格等号 是错误语法 # 若版图用 layer number如 GDS layer 1则写M1 1血泪经验某次 tape-out 前发现所有 M3 spacing DRC 全漏查calibre -drc -runset my.runset -n -v日志发现Skipping rule M3_spacing because layer M3 not found in layout—— 原来 runset 里写的是M3 metal3但版图里是M3_layer。Calibre 的 layer name 匹配是 strict string match不支持正则、不忽略下划线、不自动转大小写。3.3 验证 layer mapping 是否生效的实操命令# 启动 DRC 时加 -debug_layer_map 参数输出详细映射日志 $ calibre -drc -runset my.runset -debug_layer_map -n 21 | grep -A5 Layer mapping # 正常输出 # Layer mapping: # M1 - metal1 (found in layout) # POLY - poly (found in layout) # NWELL - nwell (found in layout) # VIA1 - via1 (found in layout) # 若某层 missing会显示 # M3 - metal3 (NOT FOUND in layout)4. Runset File 加载失败不是文件路径错而是 Calibre 默认不递归解析 include且 runset 必须含RUNSET_VERSIONCalibre 的 runset file 是一个 TCL 脚本但它不是普通 TCL 解释器执行的——Calibre 有自己的 parser对语法、顺序、依赖有严格要求。最常见的“runset 未生效”现象是你改了LAYER_MAP但 DRC 结果不变或者calibre -drc -runset my.runset报ERROR: Unknown option -runset。根源在于 runset 文件未被正确加载。4.1 Runset file 的最小合法结构缺一不可一个能被 Calibre 识别的 runset file 必须包含以下四要素# my_drc.runset —— 必须以 .runset 为后缀且首行声明版本 RUNSET_VERSION 2022.2 # 注意版本号必须与 Calibre 安装版本一致否则报错 Runset version mismatch DRC { # 所有 DRC 相关配置必须包在 DRC {} block 内 LAYOUT my_top.gds TOP_CELL top_cell RULE_DECK techfile.drc LAYER_MAP { M1 metal1 } } # 若引用外部 runset必须用 include非 source include ./common_settings.runset注意RUNSET_VERSION必须是第一行且不能有空行或注释在它前面DRC{}是 mandatory block没有它 Calibre 会忽略整个文件。4.2 Calibre 加载 runset 的真实路径与 debug 方法Calibre 按以下顺序查找并加载 runset-runset path指定的绝对路径若path是相对路径则在当前工作目录下查找不是 Calibre 安装目录也不是 rule deck 目录不自动搜索子目录-runset ./config/drc.runset会失败除非你在./config/下执行命令。验证是否加载成功# 加 -debug_runset 参数看 Calibre 实际读取的文件路径 $ calibre -drc -runset my.runset -debug_runset -n 21 | grep Reading runset # 正常输出Reading runset file /full/path/to/my.runset # 若路径不对会显示Cannot open runset file my.runset4.3 Runset 中include的坑路径是相对于被 include 的文件不是当前工作目录# common_settings.runset位于 /project/runset/ LAYER_MAP { M1 metal1 } # main.runset位于 /project/ RUNSET_VERSION 2022.2 include ./runset/common_settings.runset # ✅ 正确相对 main.runset 的路径 # include runset/common_settings.runset # ❌ 错误少一个 ./Calibre 会找 /project/runset/common_settings.runset5. 避坑Calibre DRC 设置阶段的 4 个高频 silent failure 场景与定位方法这些坑不会报 ERROR但会让 DRC 结果完全失效且日志里藏得极深。以下是我在 12 个 tape-out 项目中踩过的真问题按现象→原因→解决整理5.1 现象DRC summary 显示Total violations: 0但版图明显有 spacing violation原因LAYER_MAP中某层 name 拼写错误如metal1写成metal_1Calibre 跳过该层所有 rule且不 warning。定位加-debug_layer_map参数检查NOT FOUND行或grep -r Skipping rule calibre.log。解决用calibre -gdsinfo确认版图 layer name严格按大小写下划线复制到 runset。5.2 现象calibre -drc -runset x.runset报Unknown option -runset原因Calibre 版本低于 runset 声明的RUNSET_VERSION如 runset 写2022.2但装的是2021.4。定位calibre -version对比head -1 x.runset或看calibre -drc -help是否含-runset选项。解决降级 runset 版本改RUNSET_VERSION 2021.4或升级 Calibre必须 vendor 提供 patch。5.3 现象DRC 进程卡在Initializing license...超过 5 分钟ps aux显示calibre -drc状态为Duninterruptible sleep原因HostID 匹配失败 license 文件权限为root:root且600普通用户无法读取。定位strace -p $(pgrep calibre) 21 | tail -20看最后 syscall 是否为open(/path/to/calibre.lic, O_RDONLY)返回-1 EACCES。解决chmod 644 calibre.lic chown $USER:$USER calibre.lic切勿用 sudo 运行 Calibre。5.4 现象更换 DRC rule deck 后DRC 结果不变calibre.log里Reading rule deck new.drc但无后续 rule load log原因新 rule deck 中LAYER定义与 runset 的LAYER_MAP不兼容如 rule deck 用layer_num 1runset 却写M1 metal1。定位calibre -drc -rule_deck new.drc -n -v 21 | grep -i layer看 rule deck 解析时是否报Invalid layer reference。解决rule deck 中必须用layer_name字符串而非layer_num定义 rule或在 runset 中改用M1 1。6. 进阶技巧用calibre -drc -debug_rule定位 rule deck 中单条 rule 是否被触发以及为什么没报 violation当你确认 HostID、layer mapping、runset 加载都正确但某条 spacing rule 就是不报 violation别急着怀疑 Calibre bug——90% 是 rule 条件未满足。-debug_rule是 Calibre 最被低估的 debug 开关它能打印每条 rule 的 evaluation trace告诉你“这条 rule 为什么没触发”。6.1 启用 rule-level debug 的最小命令组合# 只 debug 名为 M1_minSpacing 的 rulerule name 来自 rule deck 中的 NAME 字段 $ calibre -drc -runset my.runset -debug_rule M1_minSpacing -n -v 21 | tee debug.log # 输出关键字段解释 # [DEBUG] Rule M1_minSpacing: evaluating on layer metal1 # [DEBUG] Rule M1_minSpacing: edge pair distance 0.12um, min required 0.14um → NOT VIOLATED # [DEBUG] Rule M1_minSpacing: condition WIDTH 0.1 is FALSE (edge width 0.08um) → SKIPPED玄学提示-debug_rule必须配合-nno execute使用否则只输出 summary且只能 debug 一条 rule不能写正则如M1.*。6.2 从 debug log 反推 rule deck 修改方向三个典型 casedebug log 片段问题本质修改建议condition SPACING 0.1 is FALSErule 的 condition 子句过滤掉了所有 edge pair检查 condition 是否过于严格如SPACING 0.1应为SPACING 0.1或 rule 应放在SPACINGrule group 下而非WIDTHgroupevaluating on layer M1 but no geometry foundlayer mapping 成功但该层在版图中无图形用klayout打开 GDS确认metal1层是否有 polygon或 rule deck 中LAYER M1写错层号Rule M1_minSpacing: edge pair distance 0.14um, min required 0.14um → NOT VIOLATEDviolation threshold 是 strict inequality等于不算 violation在 rule deck 中加EQUALS_ALLOWED参数SPACING 0.14 EQUALS_ALLOWED6.3 一个真实案例子 block 中无 space DRCtop 上却出现 m3/m4 spacing violation 的 root cause你提到的场景“数字后端子 block 中没有 space 相关的 DRC但是在 top 上会看到子 block 里面存在 m3,m4 的 space DRC然后 top 在写 gds 的时候加上-uniquifycellnamesoption 子 block 的 drc 就解掉了”。这根本不是 Calibre 设置问题而是 GDS 层次结构导致的 rule application scope bugCalibre DRC 默认在flat mode下运行它把整个 GDS 展开成一层 geometrym3/m4 spacing rule 会跨 cell boundary 检查但子 block 的 GDS 中m3/m4 图形可能被命名为m3_inst1,m3_inst2而 top GDS 中这些 instance 被 uniquify 成m3_inst1_123,m3_inst2_456rule deck 中若定义SPACING m3 m3Calibre 会认为m3_inst1_123和m3_inst2_456是不同 layer name从而跳过跨 instance spacing check加-uniquifycellnames后所有 instance name 被重写Calibre 在 flat mode 下看到的 geometry layer name 统一为m3rule 正常触发。验证方法# 不加 -uniquifycellnames 时用 calibre -gdsinfo 查 m3 层名 $ calibre -gdsinfo -list_layers top_no_uniq.gds | grep m3 # 输出Layer 33: m3_inst1_123 # Layer 34: m3_inst2_456 # 加 -uniquifycellnames 后 $ calibre -gdsinfo -list_layers top_uniq.gds | grep m3 # 输出Layer 33: m3 # Layer 34: m3所以这不是 Calibre 设置问题而是 GDS 层次管理规范问题。解决方案是在子 block DRC 时用CALIBRE_DRC_HIERARCHICAL_MODE ON启用 hierarchical DRC让 rule 只在 cell 内部检查避免跨 instance 误报。我带过的团队现在强制要求所有 sub-block 的 DRC runset 必须含DRC_HIERARCHICAL_MODE ONtop level 用 flat mode。这样既避免 false positive又保证 tape-out 前的 full-chip DRC 覆盖所有路径。希望帮到你。本文还有配套的精品资源点击获取
返回列表