OpenLANE DRC 天线违例修复:二极管插入与 metal jumper 跳转层的五轮真机对照
更新时间:2026-11-06。报错排查篇,属于 EDA 报错排查系列。天线违例是 OpenLANE flow 里最容易被误判的一类问题:日志结尾照样打印
[SUCCESS]: Flow complete.,退出码也是 0,但manufacturability.rpt里躺着上百条违例。本篇用 32 位宽、256 级打包移位寄存器(8192 个触发器)在 sky130A 下稳定复现,用五轮真机实验对照二极管插入与 metal jumper 两种修法。机理见 天线效应 FAQ。
首屏答案:这版 OpenLANE(d054702b)不会因天线违例硬杀 flow,签核结论要读 manufacturability.rpt 的 Antenna Summary,基线 Pin 138 / Net 133。开 GRT_REPAIR_ANTENNAS=1 加启发式二极管,默认阈值压到 23/23,阈值降到 40 并开 DIODE_ON_PORTS=in 后达五轮最佳 18/18;放开 met2 限层允许跳线后反升到 40/40。五轮无一归零,加严轮残余全在 met1。
先用一张流程卡串起整条排查修复路径,后文逐节展开。
读这张卡抓住两个拐点:第三步前解决「违例是否真实、怎么稳定复现」,第四步后才进入修复选型;最后一步是「评估」而非「清零」,限层设计上这类违例存在物理边界。
本文要回答的问题
- flow 结尾是 SUCCESS、退出码为 0,为什么还说这版设计没通过天线签核?
- Pin violations 与 Net violations 两个计数分别是什么口径?
- 逐层比率报告里的 Partial/Cumulative area ratio 与 Required ratio 怎么对读?
- 二极管插入与 metal jumper 各靠什么机理降比率,五轮实测为什么不是单调收敛,为什么最严配置仍有 18 条残余?
一、报错现场:SUCCESS 背后的 138 pin / 133 net 违例
基线轮故意把修复开关全关:DIODE_INSERTION_STRATEGY=0,日志回执 Setting GRT_REPAIR_ANTENNAS to 0,同时 RT_MAX_LAYER 限在 met2,布线只能在 met1/met2 两层里完成。flow 跑到 STEP 36 的 OpenROAD Antenna Rule Checker(ARC),结尾如下:
这里要破除一个直觉:ARC 在这个 OpenLANE 版本里只报告、不拦截,不会像综合或布线失败那样中止 flow,[SUCCESS]: Flow complete. 与 exit_code: 0 只证明流程跑完,不证明版图可制造。判决书在 flow 末尾的 manufacturability.rpt 及其引用的 36-arc.log。
二、谁在判决:OpenROAD ARC、版本现场与两个计数
三层工具链版本全部照抄日志三行头:
| 层 | 组件与版本 | 在天线检查里的角色 |
|---|---|---|
| 检查引擎 | OpenROAD 41a51eaf(容器内 check_antennas) | 按工艺比率规则逐层逐孔计算天线面积比,输出 ANT 告警 |
| flow 框架 | OpenLane d054702b 官方 Docker 镜像 | 在 STEP 36 调 ARC,汇总成 manufacturability.rpt,违例不硬杀 flow |
| 工艺数据 | sky130A PDK(volare 管理),标准单元 sky130_fd_sc_hd | 提供各金属层/孔的 Required ratio 阈值与天线二极管单元 |
ARC 的汇总输出只有两行,但两个计数口径不同,必须分清:
ANT-0002 按网络计数,一根线任意引脚违例就算一个违例网络;ANT-0001 按引脚计数,同一根多扇出网络可能多个栅极同时超标,所以 pin 数(138)大于 net 数(133)。二极管并联在被保护栅极上,往往先消 pin 计数;net 计数反映还有几根线整体构型不达标。天线违例修复的完整分流逻辑见 天线检查与修复流程:比率怎么算、违例怎么分流、跳线与二极管怎么取舍。
三、违例报告怎么读:逐层比率与第一个违例网络
check_antennas -verbose 按「网络 → 引脚 → 层/孔」三级展开每个违例点。基线轮第一个违例网络 _08195_ 的报告:
读这份明细抓三组概念。第一,Partial area ratio 是当前层自身金属面积对栅极面积之比,Cumulative 是从栅极往上累积到该层的比值;连栅极的长金属相当于收集电荷的天线,越限就可能击穿栅氧,机理见 天线效应 FAQ。第二,Required ratio 是 sky130A 对该层该口径的阈值,实测超过即标 VIOLATED——met1 的 Side area 阈值是 400.00,残余主要栽在这一行。第三,Via: M1M2_PR 等孔也有独立比率,别只盯金属层。
这也解释了为什么测试设计要做到 8192 个触发器:级联深度降到 256 或 1024 级时单根网络金属长度不够,ARC 实测零违例;只有 32 位宽乘 256 级叠加 met2 限层,长网络被迫在两层里绕出足够面积,比率才稳定越阈。
四、排查清单:从复现条件到修复选型的决策路径
完整排查路径画成决策流程,颜色按角色区分:红是入口与根因,蓝是排查,橙是修复,绿是复跑,紫是签收。
读这张图抓住一个分岔和一条纪律。分岔在根因之后:两条路线不互斥但前提不同——二极管需要引脚附近有放置空间,跳线需要上层金属可用,选型对比见 metal jumper 修天线:布线器向上跳层修天线违例的原理、与 diode 的取舍及适用条件。纪律是复跑必须跑完整 flow 而非单跑 ARC:插二极管新增 STEP 19、20,布线全部重排、编号后移,修复轮 ARC 变成 STEP 38;只对旧 odb 重跑看到的还是旧构型。
五、五轮真机对照:两种修法的收敛曲线与反直觉数据
五轮实验共享同一份 RTL、容器与 PDK,每轮只改配置,计数全部摘自各自 manufacturability.rpt:
| 轮次 | 关键配置 | 插入二极管数 | Pin / Net 违例 |
|---|---|---|---|
| 基线 wide_m2 | met2 限层,修复开关全关 | 0 | 138 / 133 |
| 默认修复 wide_m2_fix | 仍限 met2,GRT_REPAIR_ANTENNAS=1,启发式阈值 90 | 13785 | 23 / 23 |
| 加严修复 wide_m2_fix2 | 仍限 met2,阈值降到 40,DIODE_ON_PORTS=in | 28521 | 18 / 18 |
| 跳线 wide_jumper | 放开层限用全金属栈,允许向上跳线 | 报告未单列 | 40 / 40 |
| 满配 wide_maxfix | 全金属栈加阈值 40 加端口保护 | 报告未单列 | 43 / 43 |
先看二极管路线。默认修复轮在全局布线前启发式插入 13785 个天线二极管,每个给相连栅极提供电荷泄放旁路,等价于增大有效栅面积、把比率拉回阈值以下,违例从 138/133 收敛到 23/23。加严轮把 HEURISTIC_ANTENNA_THRESHOLD 从 90 降到 40 并加 DIODE_ON_PORTS=in(输入端口直接挂保护),插入量翻倍到 28521 个:
这一轮拿到五轮最佳的 18/18,但代价明显:二极管翻倍只多换回 5 条违例,边际收益递减,近三万个额外单元还占面积、增功耗、加剧布线拥塞。
再看反直觉的跳线两轮。放开 RT_MAX_LAYER 后布线器可把长网络中途跳到 met3 及以上,单段连续金属被孔切断,这正是 metal jumper 的机理;但实测违例不降反升到 40/40,满配轮进一步到 43/43。原因是全局布线带拥塞驱动的构型随机性:放开层限等于换了一道布线题,整版拓扑重新生长,违例点不继承上一轮位置。五轮数据因此不是单调收敛曲线,而是不同配置各自的独立抽样,本实验恰好暴露跳线替代不了二极管的场景。两条天线违例修复路线如何搭配见 天线效应修复策略选型。
六、为什么修不到零:met1 的物理边界与签收口径
五轮无一归零,最好成绩停在 18/18。对加严轮 ARC 日志逐条统计,18 条 VIOLATED 判决全部落在 met1,首个残余违例网络 chain[123] 的明细如下,超标行正是 met1 的 Side area:
明细对应 Required ratio: 400.00 (Side area) (VIOLATED) 一类判决,根因是两个物理限制叠加。
第一,最底层金属无处可跳。jumper 的本质是向上换层切断长金属,而 met1 下面只有局部互连层 li1 和器件孔,跳不下去;网络又被限层压在 met1/met2 里,向上只有一个 M1M2 孔,绕线自由度极低。第二,最底层也插不进二极管。8192 个触发器的输入引脚密集排在单元行附近,启发式插入靠空白 site 放二极管,局部拥塞到没有合法位置时 OpenROAD 只能跳过——这正是二极管翻倍、违例却只少 5 条的原因。两条路线在同一角落同时失效,残余因此稳定存在。
正确收口不是把阈值拧到零边缘,而是建立带数据的签收口径:记录每轮配置、二极管数量与 Pin/Net 计数,对残余逐条确认层别与比率余量,再按工艺判据决定豁免或改版。flow 会直接中断的硬失败见 OpenLANE PDN pitch 报错 PDN-0191,与本篇「不中断但不过签核」是两种故障形态。
实验环境
- 机器/系统:云主机 16 vCPU / 30GB / Ubuntu(OpenLane 官方 Docker 容器内运行)
- 工具版本:OpenLane d054702b(efabless/openlane 镜像,完整 tag d054702b2cce04761cc2bc598f6b95c9d8ca7c6c-amd64);sky130A PDK(volare,标准单元 sky130_fd_sc_hd);OpenROAD 41a51eaf4ca2171c92ff38afb91eb37bbd3f36da
- 日期:2026-11-06
- 完整命令:
docker run efabless/openlane:d054702b2cce04761cc2bc598f6b95c9d8ca7c6c-amd64 flow.tcl -design /work/ant_wide_m2 -tag wide_m2 -overwrite(基线轮,PDK=sky130A;其余四轮替换 -design/-tag 与 config.json)
代码获取
五轮实验的配置文件(config-err.json、config-fix.json、config-fix2.json、config-jumper.json、config-maxfix.json)、移位寄存器 RTL 与原始日志在公开仓 https://github.com/derekzhuo/geek-doc.cn/tree/main/experiments/openlane-antenna-violation。复现方式:备好 Docker 与 volare 管理的 sky130A PDK,把对应轮次的 config-*.json 复制为设计目录的 config.json,容器内跑 flow.tcl -design <设计目录> -tag <轮次名> -overwrite,查看 manufacturability.rpt 的 Antenna Summary 对照五轮计数。
这一篇在知识体系里的位置
本篇是 EDA 报错排查系列 中 OpenLANE 签核错误簇的一员,处理「flow 不中断、但制造规则没过」的静默问题。机理读 天线效应 FAQ;检查与分流见 天线检查与修复流程;选型见 跳线与二极管怎么选,跳线边界见 metal jumper 修天线。同批对照 PDN-0191 pitch 报错 与 Magic DRC met1.2 违例。
总结
OpenLANE DRC 天线违例修复的第一道坎是认知:d054702b 的 ARC 只报告不拦截,flow 打印 SUCCESS、退出码 0 不代表签核通过,判决要去 manufacturability.rpt 读 Pin 138 / Net 133 的真实计数。第二道坎是选型:二极管靠给栅极加泄放旁路,插 13785 个压到 23/23,加严后插 28521 个达到五轮最佳 18/18;metal jumper 靠向上换层切断长金属,但放开层限改变整版布线构型,反升到 40/40、43/43。修不到零的根因在 met1——最底层金属跳不出去,拥塞处又插不进二极管;正确收口是带齐配置与计数做逐条残余评估,而不是迷信退出码或追求归零。