Yosys 磁盘写满报错速查:综合与仿真中途写文件失败处置
更新时间:2026-10-23。FAQ 速查页,面向在笔记本、共享服务器或 CI 容器里跑 Yosys 开源综合链的同学。Yosys 本身是「磁盘吞吐型」工具:大设计综合一轮,
write_json/write_ilang落盘的中间 netlist 轻松几个 GB;再配上 iverilog/verilator 仿真不加限额地 dump.vcd/.fst波形、日志 tee 一份不设轮转、abc 与 SymbiYosys(sby)这类子工具往/tmp堆临时文件,工作卷说满就满。盘满直说时是一句No space left on device,阴损时综合「跑完」了但写出的 netlist 是截断的,后面 P&R 或形式验证报出莫名其妙的语法错误,排查方向被带偏。如果是商用 Quartus 侧同主题,处置口径见 Quartus 磁盘写满速查;如果报错不是写文件失败而是内存或资源打爆,分诊去 Yosys 资源超限速查。
本文要回答的问题
- Yosys 综合或仿真中途报
No space left on device,先救场还是直接重跑? df -h看着还有空间,为什么还是写不进文件?- 工程目录里到底是谁在吃盘:中间 netlist、波形、日志、sby 工作区分别能不能删?
- 波形动辄几十 GB,怎么给 VCD/FST 上「限额」?
- 报错路径落在
/tmp,换 TMPDIR 到底有没有用?
一、报错原文与典型现象
最常见的是综合收尾 write_json 或 write_ilang 落盘失败(工程路径以 /proj/demo 占位):
ERROR: Can't open file `/proj/demo/build/top.json' for writing: No space left on device第二种现场在仿真侧。iverilog 跑长仿真、testbench 里 $dumpvars 全信号转储,.vcd 写穿磁盘;verilator 用 --trace-fst 时 .fst 同样没有上限:
VCD Error: write failed: No space left on device
FST: fstWriterCreate failed: /proj/demo/sim/dump.fst: No space left on device第三种容易被误判:报错路径根本不在工程目录,而是 /tmp。abc(Yosys 内置的工艺映射引擎)和 sby 默认把临时 netlist、SMT-LIB 查询文件写进 /tmp,很多发行版把 /tmp 挂成只有几百 MB 的 tmpfs,设计一大就直接顶穿:
ERROR: ABC: execution of command ".../yosys-abc ..." failed: return code 1
/tmp/yosys-abc-XXXXXX/output.blif: No space left on device还有一种「慢漏」形态值得点名:报错并不出现在综合或仿真当口,而是 make 流程在 tee 日志、写依赖文件、甚至 git 检出子模块时随机失败——这往往是工作卷水位已经顶到 95% 以上,任何一笔新增写入都可能成为压垮的最后一笔。要警惕「二次故障」:盘满当次没注意,下一轮工具读到写了一半的 .json 或 .vcd,报的是 JSON 解析失败、波形文件损坏这类新错误——看到这类报错先回头查上一轮日志尾部有没有 No space left。抓判据就一条:动词是 write/open/create、错误串带 No space left on device 或 Disk quota exceeded,就是容量问题,不是设计语法错误。
二、占盘大户与病因处置表
| 占盘来源 | 典型位置 | 体量与特征 | 处置 |
|---|---|---|---|
| 中间 netlist | build/*.json、*.ilang | 大设计单文件可达数 GB,多轮综合叠加 | 只留最新一轮,旧 netlist 及时清 |
| 仿真波形 VCD | sim/*.vcd | 全信号长仿真可到几十 GB | 换 FST 压缩格式、限层次与时间窗 |
| 仿真波形 FST | sim/*.fst | 比 VCD 小一个量级但仍无上限 | 同上限层次与窗口,抓完归档 |
| 运行日志 | *.log、tee 出来的全量日志 | 不轮转按年攒 | logrotate 或按轮次截断归档 |
| abc 临时文件 | /tmp/yosys-abc-* | 每次 abc 调用一组 blif 临时件 | 改 TMPDIR 指向大盘,异常退出后手清 |
| sby 工作区 | <task>/ 下每个 engine 子目录 | 每个证明任务一棵树,回归最狠 | 证明完成即 sby --dumptasks 收尾后整树清 |
| CI 工作区 | runner 工作目录 | 每次构建全量 clone + 综合产物 | CI 收尾脚本整目录清,只回传比特流 |
| inode / 配额 | 小文件密集的生成目录 | df -h 有余量、df -i 满或报 quota | 整目录清小文件,quota -s 查限 |
表中体量均为典型量级,具体数字以本设计规模与工具版本为准。
三、排查决策图
先判「容量满、inode 满还是 /tmp 满」,再用 du 定位大头,最后才动手清理——顺序反了会白删文件。
读这张图抓住一次分叉:红色入口先经蓝色的 df 双判,切成「/tmp 被顶穿」与「工作卷容量满」两条通道——前者直通橙色修复(换 TMPDIR 到大盘),后者还要再过一道蓝色 du 下钻定位才动手。红色只标现象与命中的根因,蓝色全是排查动作,橙色是这一次的救火动作,紫色闭环是从失败阶段重跑并沉淀防复发策略。不要跳过双判直接删工程里的大 netlist——根因在 /tmp 时删几个 GB 的 build/*.json 毫无作用。
四、逐条排查展开
第一刀:容量、inode、报错路径三件事一起看。 在工程根敲:
df -h /proj/demo /tmp # 工作卷与 /tmp 两卷水位一起看
df -i /proj/demo # 工作卷 inode 水位
du -h --max-depth=2 /proj/demo 2>/dev/null | sort -rh | head -20
du -sh build sim *.log 2>/dev/nullUse% 打到 100% 是容量写穿;df -h 还空着但 IUse% 100%,是生成目录里海量小文件吃光 inode,表现同样是写失败。报错原文里的路径如果落在 /tmp,直接确认 df -h /tmp——很多发行版把 /tmp 挂成内存容量一半的 tmpfs,abc 写 blif 很容易顶穿。共享服务器再敲 quota -s,报 Disk quota exceeded 时满的是个人配额不是卷。
第二刀:/tmp 类故障,换 TMPDIR 比清理更治本。 abc、sby、以及很多被 Yosys 调起的子工具都认 TMPDIR 环境变量。工作流跑之前把它指向大盘,临时文件就不再挤小分区:
export TMPDIR=/proj/demo/tmp
mkdir -p "$TMPDIR"
yosys -p "synth_gatemate -json build/top.json" top.v历史遗留的 /tmp/yosys-abc-* 目录在工具正常退出时会自清,异常退出(比如正是被盘满打死)会残留,确认没有任务在跑后整批清掉。Docker/容器场景同口径:容器层默认可写空间往往挂在宿主机系统盘上,跑综合务必挂大盘卷,并把 TMPDIR 指进挂载卷内。
第三刀:波形文件,把嘴管住。 VCD 是文本格式、无压缩,全信号长仿真涨到几十 GB 很常见;FST 是 verilator/gtkwave 生态的二进制压缩格式,同一场仿真通常小一个数量级,能用 FST 就别用 VCD。再进一步管住量:testbench 里只 dump 需要观察的模块层次($dumpvars(1, top.dut.core) 而不是全树),或限定转储的时间窗口,先用短波形定位大致区间再对可疑区间加细信号重跑。抓完波即归档或删除,调试越紧张越不敢删、攒几个月就是几十 GB。
第四刀:netlist、日志、sby 工作区与 CI,清不动就挪。 build/ 下每轮综合的 .json/.ilang 只留最新一份,旧轮次清掉——中间 netlist 随时可以从 RTL 重新综合,不值得囤。全量 tee 的日志接 logrotate 或按轮次截断,别按年攒。sby 每个证明任务一棵树、每个 engine 一个子目录,回归跑多了最狠,证明完成后整树清、只回传 PASS/FAIL 报告。CI 场景最容易被忽略:runner 每次全量 clone 加完整综合,工作区不清理磁盘几周必满——构建脚本收尾必须整目录清理,只回传比特流与报告。
五、预防与纪律
- 工作区放独立大盘:远离系统盘与 tmpfs 型
/tmp,经验上给工作卷预留约 20% 空闲,容纳一轮综合加一轮仿真的突发峰值。 - TMPDIR 显式指向大盘:写进 CI 环境与本机 shell 配置,不依赖默认
/tmp。 - 波形按需开:日常回归不带全信号 dump,统一用 FST,限层次限时间窗。
- 日志轮转:全量日志按轮次截断归档,老 netlist 只留最新一轮。
- CI 收尾即清:工作区用完即删只回传产物;工程目录大小纳入例行
du巡检。
这一篇在知识体系里的位置
本篇是 FPGA 开源工具链排错速查簇的 FAQ 页,专管 Yosys 生态磁盘容量一条线;商用 Quartus 侧同主题的处置对照在 Quartus 磁盘写满速查,内存与逻辑资源打爆(不是磁盘)的分诊在 Yosys 资源超限速查,三者共同覆盖「综合跑不动/写不下」这一高频报障面。
一句话总结
Yosys 磁盘写满报错先 df -h、df -i 并看报错路径是否落在 /tmp,三线分清容量、inode 与 tmpfs 小分区,再用 du 下钻锁定中间 netlist、VCD/FST 波形、日志、sby 工作区与 abc 临时文件这几类大户:/tmp 顶穿就换 TMPDIR 到大盘,波形换 FST 并限层次限时间窗,旧 netlist 只留最新、日志轮转、CI 收尾即清,写穿当次的半截 netlist 与波形不可信须整链重跑,长期靠工程上大盘、预留约 20% 空闲、定期 du 巡检三条纪律防复发。