OpenLANE 天线规则违规:二极管插入配置键体系与残余违例手动闭环
更新时间:2026-11-06。报错排查篇,属于 EDA 报错排查系列,总入口见 开源 EDA 报错排错中心。OpenLANE flow 一路跑到
[SUCCESS]: Flow complete.,退出码 0,翻开 reports/manufacturability.rpt 却躺着上百条天线违例——这是 OpenLANE 天线规则违规最迷惑人的地方:它不硬杀流程,只在签核报告里记账。本篇用一个故意造出来的宽金属设计(ant_wide_m2)跑五轮真实 flow,讲清二极管插入相关配置键的新旧体系、自动修复为什么只是概率收敛,以及残余违例不归零时的手动闭环路径。天线效应本身的物理机理见 什么是天线效应?为什么长金属要跳线?,想亲手造一次见 种子实验:亲手制造一次天线效应。
先用一张分区概念卡把涉及的角色摊开:检查链路负责判决,现行四个配置键负责自动修复,废弃旧键是最常见的踩坑入口,判据本身则来自 PDK 而不是 OpenLANE。
读这张卡抓一条主线:检查器只判决、不修复,修复完全由配置键控制;而新旧两代键共存时,一个过时的写法足以把整条修复链路静默关掉。
本文要回答的问题
- flow 明明 SUCCESS、退出码 0,为什么 manufacturability.rpt 里还有上百条天线违例?
DIODE_INSERTION_STRATEGY is now deprecated这句警告到底意味着什么,它和新键是什么关系?- GRT_REPAIR_ANTENNAS、RUN_HEURISTIC_DIODE_INSERTION、HEURISTIC_ANTENNA_THRESHOLD、DIODE_ON_PORTS 四个键各管哪一段?
- 为什么二极管从 13785 个加到 28521 个,违例只是从 23 降到 18 而不是归零?
- 自动修复收敛不到零时,手动处置按什么顺序做?
一、报错现场:OpenLANE 天线规则违规为什么不杀 flow
报错轮的设计 ant_wide_m2 故意把金属布线做宽做长,给天线效应创造条件。flow 尾段的 OpenROAD Antenna Rule Checker(ARC)在 STEP 36 执行,调用的是 OpenROAD 的 check_antennas -verbose,脚本位于容器内 /openlane/scripts/openroad/antenna_check.tcl。检查结束后日志末尾给出两类计数:
两个编号的口径不同:ANT-0002 按网络计数,133 条网络的天线比率超标;ANT-0001 按引脚计数,落在这些网络上的 138 个接收引脚暴露在风险中。同一份数据被 flow 汇总进 manufacturability.rpt 的 Antenna Summary 段,写着 Pin violations: 138 / Net violations: 133。
关键认知是:天线违例是签核记账,不是流程硬失败。报错轮日志结尾照常打印 [SUCCESS]: Flow complete.,退出码 0。OpenLANE 把 DRC、天线这类制造性检查的判决权留给读者,flow 不停,但带着一百多条违例的版图绝不能投片——无视报告比报错本身更危险。
二、谁在判决:ARC、OpenROAD 与 PDK LEF 里的判据
这条报错涉及三层,职责分清才不会修错地方。ARC 是 OpenLANE 在 signoff 段挂载的检查步骤,真正做计算的是 OpenROAD 的 check_antennas 命令;而「比率多少算违规」的阈值既不在 OpenLANE 也不在 OpenROAD,而在 sky130A PDK 的 LEF 文件里,每层金属用 ANTENNAGATEAREA(栅极面积上限)和 ANTENNADIFFAREA(扩散区面积上限)两类属性给出工艺判据。换句话说,换一个 PDK,同一版图的违例数会整体变化。
本版本没有天线余量类旋钮,判据无法人为放宽,能动的只有修复行为。天线比率的算法与两条修复路线的取舍,见 天线检查与修复流程:比率怎么算、违例怎么分流、跳线与二极管怎么取舍 与 metal jumper 修天线:布线器向上跳层修天线违例的原理、与 diode 的取舍及适用条件。
三、根因:一个废弃配置键把自动修复整个关掉了
报错轮 flow 开头有两行极易被划过去的日志,它们就是 138 条违例的直接根因:
第一行是废弃警告:DIODE_INSERTION_STRATEGY is now deprecated,明确指引用 GRT_REPAIR_ANTENNAS、DIODE_ON_PORTS、RUN_HEURISTIC_DIODE_INSERTION 三个新键替代。第二行才是致命动作:DIODE_INSERTION_STRATEGY set to 0. Setting GRT_REPAIR_ANTENNAS to 0——为兼容旧配置,OpenLANE 看到旧键写 0 就把新的总修复开关联动关掉。这一轮 STEP 19 只剩 Global Routing,违例原封不动留到签核段。
旧键当年是个整数策略号(0 表示不插、其他值选不同插入策略),新版本把它拆成正交的三个维度:修不修(GRT_REPAIR_ANTENNAS)、要不要在布线前做启发式插入(RUN_HEURISTIC_DIODE_INSERTION)、在端口上怎么保护(DIODE_ON_PORTS),再配一个激进度阈值。老配置文件原样拷进新版本,是这个坑的标准触发方式。
四、排查清单:五个配置键的语义与默认值
容器内 /openlane/configuration/routing.tcl 给出的实测默认值如下,排查时先对照自己的 config.json 有没有覆盖它们:
| 配置键 | 默认值 | 语义与排查要点 |
|---|---|---|
| GRT_REPAIR_ANTENNAS | 1 | 全局布线后调 OpenROAD repair_antennas 做修复;被旧键联动关 0 是首查项 |
| RUN_HEURISTIC_DIODE_INSERTION | 0 | 在 STEP 19 单独跑启发式二极管插入,与 GRT 修复互相独立,默认不开 |
| HEURISTIC_ANTENNA_THRESHOLD | 90 | 天线比率达到上限的 90% 即插二极管;调小更激进,二极管数量显著上升 |
| DIODE_ON_PORTS | none | 设为 in 时对输入端口额外加保护二极管,专治引脚侧违例 |
| DIODE_INSERTION_STRATEGY | 已废弃 | 只应出现在兼容路径;config.json 里应彻底删除,不要再写 |
排查顺序:第一步全文搜 config.json 里的 DIODE_INSERTION_STRATEGY,有就删,改用新键;第二步确认 GRT_REPAIR_ANTENNAS 没被显式关 0;第三步违例仍多时再开 RUN_HEURISTIC_DIODE_INSERTION,并按残余量级调 HEURISTIC_ANTENNA_THRESHOLD;第四步若 ANT-0001 引脚违例占比高,加 DIODE_ON_PORTS=in。
五、修复与复跑:五轮收敛曲线与残余违例的手动闭环
把从 ARC 报违例到预防沉淀的决策路径画成下图,红是根因、蓝是排查、绿是复跑通过态、橙是修复动作、紫是防复发:
读这张图抓住两个分叉:读报告后先判断修复链路是不是被配置关掉了,关掉就先恢复开关;开关正常仍有残余,才进入参数加严与手动闭环。五轮真实 flow 的实测数据如下,五轮配置差异只在天线修复开关与层限:
| 轮次 | 天线修复配置 | 插入二极管数 | pin / net 违例 |
|---|---|---|---|
| wide_m2(报错轮) | 旧键设 0,修复被联动关闭 | 无修复动作 | 138 / 133 |
| wide_m2_fix | 启发式开启,阈值 90,限低层金属 | 13785 | 23 / 23 |
| wide_m2_fix2 | 阈值 40 加 DIODE_ON_PORTS=in | 28521 | 18 / 18 |
| wide_jumper | 全金属栈,阈值 90 | 见公开仓日志 | 40 / 40 |
| wide_maxfix | 全金属栈加严档 | 见公开仓日志 | 43 / 43 |
加严档的二极管插入量有明确实录:同一设计在阈值 40 加端口保护下,STEP 19 一次插入 28521 个二极管,是默认档 13785 个的两倍多。
修复轮多了 STEP 19 启发式插入与 STEP 20 二极管合法化,后续步骤顺延两位,ARC 因此从 STEP 36 变成 STEP 38——找报告按步骤名而不是编号定位。
五轮里最好的一轮也剩 18/18,没有归零轮,这是自动修复的机理决定的:修复作用在全局布线的估算结果上,详细布线随后重新走线、改变实际金属面积,合法化还会挪动单元;每轮布局布线自带随机性,违例数因此不单调——全金属栈两轮(40/40、43/43)反而比低层限定点轮差,就是布线资源整体重分配后的回弹。二极管与跳线两法的横向对照见姊妹篇 OpenLANE DRC 天线违例修复:二极管插入与跳转层两法,策略体系的完整梳理见 天线效应修复:天线比率规则怎么读、跳线与二极管两种修复策略怎么选。
加严档的最终签核报告如下,18/18 是五轮最佳但不是终点:
残余违例的手动闭环按四步走。第一,打开 runs/<tag>/logs/signoff/38-arc.log,check_antennas -verbose 按网络逐块打印,搜 VIOLATED 并记下违例层名,残余通常集中在靠近驱动单元的 met1 段。第二,对顽固网络三选一或组合:手动插入 sky130 天线二极管单元后走合法化;调低 FP_CORE_UTIL 给布线和二极管让空间,拥塞缓解后长金属比率自然下降;调布局约束把驱动单元向负载靠拢,缩短关键金属。第三,重跑完整 flow 后对照新 manufacturability.rpt 的计数,同一配置可多跑几轮取最优,一次回弹不代表配置无效。第四,投片口径下签核要求违例清零,不归零就继续闭环或走工艺偏差评审,不能带着残余违例收尾。
实验环境
- 机器/系统:云主机 16 vCPU / 30GB / Ubuntu,OpenLane 官方 Docker 容器内运行。
- 工具版本:OpenLane d054702b;sky130A PDK(volare 管理);OpenROAD 41a51eaf(版本照抄 log 三行头)。
- 日期:2026-11-06。
- 完整命令:
docker run efabless/openlane:d054702b2cce04761cc2bc598f6b95c9d8ca7c6c-amd64 flow.tcl -design /work/ant_wide_m2 -tag wide_m2 -overwrite (PDK=sky130A),修复轮替换 -design 与 -tag 为 ant_wide_m2_fix、ant_wide_m2_fix2、ant_wide_jumper、ant_wide_maxfix 四组配置分别复跑。
代码获取
五轮实验的 config.json(config-err / fix / fix2 / jumper / maxfix 五份配置)与全部原始日志在公开仓 https://github.com/derekzhuo/geek-doc.cn/tree/main/experiments/openlane-antenna-violation。按目录内 README 准备 volare 管理的 sky130A PDK 与 OpenLane 容器后即可复跑,五轮配置差异只在天线修复开关与层限,综合、网表与其余流程参数完全一致。
这一篇在知识体系里的位置
本篇是 EDA 报错排查系列 中 OpenLANE 签核阶段错误簇的一员,处理的是「flow 跑完但制造性报告不干净」这一类问题。物理机理与入门实验见 什么是天线效应?为什么长金属要跳线? 与 种子实验:亲手制造一次天线效应;修复方法的横向取舍见 天线效应修复:天线比率规则怎么读、跳线与二极管两种修复策略怎么选、天线检查与修复流程:比率怎么算、违例怎么分流、跳线与二极管怎么取舍 和 metal jumper 修天线:布线器向上跳层修天线违例的原理、与 diode 的取舍及适用条件;同批姊妹篇 OpenLANE DRC 天线违例修复:二极管插入与跳转层两法 侧重两种修复法的直接对照,与本篇的配置键视角互补。
总结
OpenLANE 天线规则违规不硬杀 flow,ARC 在签核段把 ANT-0002/ANT-0001 计数写进 manufacturability.rpt,退出码仍是 0;本次 138/133 的根因是 config.json 里已废弃的 DIODE_INSERTION_STRATEGY 设 0,联动把 GRT_REPAIR_ANTENNAS 关掉,修复链路整体静默。排查按五个键的语义走:删掉旧键、确认 GRT_REPAIR_ANTENNAS 开启,再用 RUN_HEURISTIC_DIODE_INSERTION 加 HEURISTIC_ANTENNA_THRESHOLD 调激进度、DIODE_ON_PORTS 护端口。五轮实测从 138/133 收敛到最佳 18/18 且不归零,因为自动修复作用于布线估算,详细布线与布局随机性会重塑违例,更激进不等于单调变好;残余违例靠读 38-arc.log 逐网络定位违例层,手动插二极管、降 FP_CORE_UTIL 或调布局后重跑复看,报告清零才能投片。