Calibre 回归结果或产物丢失:results/SVDB 找不到速查
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列。「Calibre 夜间回归跑了几百个 rule,调度系统报 DONE,早上用 RVE 调结果,数据库目录是空的」——做物理验证(DRC 设计规则检查、LVS 版图原理图一致性、PEX 参数提取)的人多半心虚过这一刻。Calibre(Mentor/Siemens 的物理验证工具,批处理入口
calibre -drc/-lvs/-pex)的产物比一般工具碎:DRC 的.results/.summary、LVS 的 SVDB(Run Results Directory,RVE 打开的那套数据库)、PEX 的.sp/.spi网表,少一个下游就开不了窗。大多数情况不是 Calibre 没写,而是任务其实没成功、文件写到了执行节点本地盘、并发作业互踩同名 work 目录,或被 clean/清理脚本收走。本篇给三分钟定位法。任务到底成没成的分诊见 Calibre 退出码非零怎么办,磁盘写满导致产物写一半见 Calibre 磁盘空间不足速查,流程背景见 Calibre 物理验证实操,全簇索引见 开源 EDA 报错排错中心。
本文要回答的问题
- LSF 显示作业
Successfully completed,为什么收集脚本找不到.results和 SVDB? - transcript 末尾打了结果摘要,为什么 run 目录是空的,或缺的文件每次都不一样?
- RVE 打开数据库报目录损坏或打不开,跟「结果丢失」是同一类问题吗?
- 作业在计算节点跑完了,产物为什么没回到提交节点和归档区?
- hierarchical 回归顶层报告在,为什么子块的结果合不进来?
一、报错原文与现象
这类问题的共同特征:Calibre transcript 自己往往没有 Error,惊吓发生在调度、收集和文件系统层。最典型的现场是作业报成功、收集报错:
# LSF 邮件 / bhist 显示
Job <cal_drc_top_night> was successfully completed.
# 回归收集脚本输出
collect_results.sh: work/run_2026_10_22_0200/top.drc.results: No such file or directory
[REGRESS] run=2026_10_22_0200 total=24 collected=22 MISSING=2第二种现场是 RVE 打不开数据库,或 PEX 网表只有半截:
$ calibredrv -m svdb/run_rules -- select_rules ...
# RVE 命令行 / 图形窗报:
ERROR: Cannot open results database "svdb/..": directory is incomplete or corrupted.
$ ls -l pex/
-rw-r--r-- 1 user group 812 Oct 22 04:31 top.pex.netlist.sp.tmp
# 正式名 top.pex.netlist.sp 不在,只剩 .tmp 半成品第三种现场出现在农场:登录执行节点还能在本地盘看到结果,提交节点和归档区始终没有:
$ bjobs -l 7123099 | grep -E "Status|Started on"
Status <DONE>; Started on <node-b06>;
$ ls work/run_2026_10_22_0200/svdb/
# 空目录或不存在
$ ssh node-b06 ls /scratch/user/7123099/svdb/
.. run_rules run_drc ...记住这个反差:日志说写了、调度说成功、结果目录说没有——说明 Calibre 写完之后有「第二只手」动过目录,或者作业站立的工作目录根本不是收集脚本查找的目录。先别怀疑工具,先还原这批产物的一生。
二、可能原因速查表
| 现象 | 可能原因 | 处置 |
|---|---|---|
| 作业成功、整个 run 目录消失 | 框架跑完即清或定时清理 cron | 查 crontab 与 Makefile clean 目标 |
| 目录在、每次缺的文件不同 | 并发 block/corner 共用同名 work 目录互踩 | 每 run 独立目录带 run id,禁止共享可写目录 |
| transcript 有摘要、run 目录没有 | 相对输出路径相对了执行节点上的启动目录 | 作业脚本显式 cd,输出一律共享盘绝对路径 |
| RVE 库损坏、只剩 .tmp 文件 | 任务被 bstop/超时杀掉,在 mv 落定前终止 | bhist 查 TERM 原因,半成品判失败重跑 |
| 执行节点本地盘有、提交节点没有 | 结果写到 /scratch 未回传 | 直接写共享盘,或收尾显式回传并校验 |
| 收集脚本报固定文件名找不到 | runset 输出名带时间戳/主机名/线程号 | 收集脚本与 runset 输出名用同一变量派生 |
| 昨天还能看、今天没了 | 留存到期被磁盘清理策略删除 | 结果库与网表分级保留,归档双份 |
| 顶层报告在、子块结果缺失 | hierarchical run 子块失败未合并 | 检查各 cell 子目录与 merge 日志 |
| 重跑后连上次部分结果都没了 | 重跑先 rm -rf 整个 run 目录 | 重跑开 _retry 新目录,旧目录保留 |
三、逐条排查展开
先按「任务成没成、文件写到哪、有没有第二只手」三件事做第一轮分诊,再进入对应支线:
读图抓住颜色:红色是入口现象,蓝色一步是分诊(退出码、transcript 尾部、预期产物清单三样一起看),橙色四条支线互斥——日志有写入记录但收集目录没有走向路径与回传,目录被清空或时间戳对不上走向并发与清理,只剩 .tmp 或 RVE 打不开走向写库中途被杀,顶层报告在而子块缺失走向 hier 合流;四条支线最后都收敛到紫色的封装纪律。
第一刀:确认任务到底成功没有。 调度状态 DONE 只说明进程退出了,不说明结果写完了。先看真实退出码(wrapper 和 tee 可能把码吃掉),再看 transcript 尾部有没有 --- EXITING due to error 一类横幅,最后对预期产物做存在性与非空校验:
grep -niE "error|fatal|exiting" run.log | tail -10
for f in top.drc.results top.drc.summary svdb top.pex.netlist.sp; do
[ -e "$RUN_DIR/$f" ] || echo "MISSING:$f"
done退出码怎么被管道、wrapper、LSF 语义吞掉,以及 137/143 信号杀的判据,在 Calibre 退出码非零怎么办 里展开;磁盘写满会让 Calibre 在写结果库阶段失败,症状与本篇高度重合,照 Calibre 磁盘空间不足速查 先排除容量问题。
第二刀:定位结果写到了哪台机、哪个目录。 runset 里的 DRC RESULTS DATABASE、LVS REPORT、PEX NETLIST 若给的是相对路径,基准是作业启动时的工作目录;LSF 作业默认在提交目录启动,但队列配了 lsf_tmpdir 或脚本里先 cd /scratch 时,结果就落在执行节点本地盘。用 bjobs -l <jobid> 的 Started on <node> 找到执行节点,登上去看本地盘还在不在。根治只有一条:输出路径全部写挂载的共享盘绝对路径,或在作业尾部显式回传并校验回传结果,回传失败作业不许报成功。
并发互踩是「每次缺的不一样」的唯一解释。 多 block、多 corner、多 rule 组并发时若共用同名 work/cal_run/,后启动的作业重建目录甚至先 rm -rf,就会带走先跑完作业的 SVDB;丢失随机、单个作业单独跑永远复现不了。判据是目录 mtime 被重写、transcript 里混入别的 block 名。处置是目录即契约:work/<run_id>/<block>_<check>/ 一层到底,run id 含日期与作业号(LSF 可用作业 id 派生),并发之间零共享可写目录,GDS/rule deck 等公共输入只读挂载。
清理误删与重跑毁现场用时间线还原。 先分清是「目录在但空」还是「整目录消失」:前者多为按文件 mtime 的清理策略,后者是删目录型脚本或 Makefile 的 clean 目标被误触发。
ls -ld work/run_2026_10_22_0200
crontab -l | grep -iE "clean|rm -rf|find .*-mtime"
grep -rn "rm -rf" regression/*.sh Makefile失败重跑若实现为 rm -rf <run目录> && 重跑,重跑再失败就连上次的部分结果一起没了——重跑一律开 <run_id>_retry1 新目录,旧目录保留到复盘结束。
原子发布:结果写完再改名,半成品不进收集视野。 Calibre 写结果库和 PEX 网表时会先落临时名、写完再更名;作业被 bstop、限时杀掉或节点宕机时,正式名永远不会出现,RVE 打开就是 incomplete/corrupted。封装上应让 Calibre 先写 work/<run_id>/_staging/,作业尾部校验全部预期产物存在且非空后,再 mv 到收集目录——同文件系统上的 mv 是原子的,收集脚本永远只看到「完整的一版」,绝不会读到写一半的库。
收集脚本必须与 runset 输出名对齐。 另一类高频乌龙是产物好好的、名字对不上:runset 里结果名带了时间戳、主机名或 $PEX_NETLIST_FILE 一类变量,而邮件/归档脚本只认固定的 top.pex.netlist.sp;改了 runset 输出名却没同步收集器,表现就是「回归成功、邮件里 0 附件」。规则是输出名只在一处定义,runset、收集、归档三处从同一个变量派生,禁止各自硬编码;汇总前先列缺失清单,带着缺失不许出全绿邮件。hierarchical(层次化)回归还要额外看 merge:顶层报告在不代表子块都在,逐个检查各 cell 子结果目录与合流日志,任何子块失败应让该顶层 run 判失败而不是静默出残缺报告。
四、预防与纪律
- run 目录命名即契约:
work/<run_id>/<block>_<check>/,run id 带日期与作业号;输出一律共享盘绝对路径,runset、清理白名单、收集、归档用同一个变量派生路径。 - 作业脚本四段式:开头 source 环境并
cd "$RUN_DIR"、umask 022;中段全程tee -a落 transcript;尾部先回传(本地盘场景),再做产物存在性与非空校验,通过后mv原子发布;以真实退出码与校验结果共同决定作业退出码。 - 预期产物清单化:DRC(results/summary)、LVS(SVDB 加报告)、PEX(网表加必要的
.pxi)逐件校验,缺一件即判失败并保留现场,不靠调度状态判定成功。 - 产物分级留存:结果库、LVS 报告、PEX 网表是结论产物,保留到下次里程碑或不少于 14 天并同步归档盘;临时文件跑完可清;清理脚本先 dry-run 输出删除清单并留缓冲。
- 并发零共享:任何两个并发进程不共享可写目录,这条写进框架模板;重跑开新目录,不删旧目录。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「Calibre 回归产物管理」节点的 FAQ 页:作业真失败(退出码非零、信号杀)的分诊见 Calibre 退出码非零怎么办,写结果阶段磁盘写满见 Calibre 磁盘空间不足速查,runset 与结果数据库的正常产物语义见 Calibre 物理验证实操,全簇索引见 开源 EDA 报错排错中心。
一句话总结
Calibre 回归结果或产物丢失,九成不是 Calibre 没写而是「任务其实没成功、相对路径漂移到执行节点本地盘、并发同名 work 目录互踩、clean 或清理策略误删、被杀在写库中途只剩临时文件、收集脚本与 runset 输出名对不上、hier 子块未合并」之一:先查真实退出码与 transcript 尾部确认任务成功,再用 bjobs -l 找执行节点定位真实写入目录,丢失随机查并发与 rm 式重跑,RVE 打不开查中途杀,最后靠「共享盘绝对路径、run id 目录隔离、产物清单双校验、写完再 mv 原子发布、结论产物分级留存」五条纪律防复发。