Quartus 磁盘写满报错速查:编译中断与工程目录膨胀处置
更新时间:2026-10-23。FAQ 速查页,面向在笔记本或共享服务器上跑 Quartus Prime 的 FPGA 入门同学。Quartus 是典型的「磁盘吞吐型」工具:每跑一轮完整编译,
db/与incremental_db/下的编译数据库就攒一份,加上仿真波形、SignalTap 抓波和 Platform Designer(原 Qsys)生成物,工程目录涨到几十 GB 很常见(具体体量以工程规模与器件为准)。盘满直说时是一句No space left on device,阴损时编译中途断掉、db/里留下半截数据库,下一轮 Quartus 报的是数据库损坏,排查方向容易被带偏。同门的清理思路在 Vivado 磁盘写满速查 里也有对照;如果编译不是失败而是长时间无进展,那更可能是卡死而非盘满,分诊见 Quartus 编译卡死速查。
本文要回答的问题
- Quartus 编译中途报「写文件失败 / No space left on device」,先救场还是先重跑?
df -h看着还有空间,Quartus 为什么还是写不进文件?- 工程目录里到底是谁在吃盘,
db/、incremental_db/、仿真波形分别能不能删? - SignalTap 抓波和
.vcd/.fsdb波形动辄几个 GB,怎么管住? - CI 工作区和
.qar归档堆在工程根,怎么形成清理纪律?
一、报错原文与典型现象
最常见的是 Fitter 或 Assembler 阶段往 db/ 写编译结果时失败,工程路径以 /proj/demo 占位:
Error (12324): Can't write to file
"/proj/demo/db/top.cmp.rdb": No space left on device
Error: Can't open file "/proj/demo/output_files/top.sof" -- no space left on device第二种现场在 IP 与 Platform Designer 生成阶段。生成物写到一半失败,ip/、qsys_system/(或 synthesis/submodules/)目录里留下不完整的 .v、.qip,下一轮 Analysis & Synthesis 直接报找不到实体或文件语法错误:
Error (10170): Verilog HDL syntax error at qsys_system/synthesis/submodules/xxx.v
near end of file -- unexpected end of file
Info: can't create directory "/proj/demo/incremental_db/compiled_partitions": No space left on device还有两种容易误判的形态:一是仿真侧,ModelSim 转储全信号 .vcd/.fsdb 写穿,仿真本身跑完了但波形文件截断不可信;二是 SignalTap 逻辑分析仪大深度抓波,.stp 采集数据与导出的 CSV 越攒越多,抓波当口盘满还可能直接把硬件会话卡死。要警惕「二次故障」:盘满当时没注意,下一轮 Quartus 读到上一轮写了半截的 db/ 数据库,报的是数据库损坏、版本不匹配之类的新错误——看到这类报错先回头查上一轮编译日志尾部有没有 No space left。读这类报错抓住一点:凡路径落在工程目录、动词是 write/open/create 且带着 No space left on device 或 Disk quota exceeded,就是容量问题,不是设计错误也不是 license 问题。
二、占盘大户与病因处置表
| 占盘来源 | 典型位置 | 体量与特征 | 处置 |
|---|---|---|---|
| 编译数据库 | db/ | 每轮编译累积 .rdb、网表等,GB 级 | 确认不回溯增量编译后整目录删 |
| 增量编译分区 | incremental_db/ | Rapid Recompile 缓存,反复累积最狠 | 不用增量编译时整目录删 |
| 仿真波形 | .vcd、.fsdb、simulation/ | 全信号 dump 长仿真可达数 GB | 限定 dump 层次与时间窗,抓完即归档 |
| SignalTap 抓波 | .stp 采集数据、导出 CSV | 深采集多轮叠加 | 调试完导出精简数据,删原始采集 |
| IP 与 qsys 生成物 | ip/、qsys_system/、synthesis/submodules/ | 每个 IP 各留一套生成 HDL | 移除不用的 IP 后清对应目录,重新生成 |
| 工程归档 | 工程根的 .qar、.qarlog | 每归档一次一个全量压缩包 | 归档挪出工程盘集中保管,只留最近 |
| 输出文件 | output_files/ | .sof/.pof/.rpt 全套,多版本叠加 | 归档最新成功一套,旧版本清 |
| 多版本安装 | intelFPGA/、各版本安装目录 | 每个版本本体占几十 GB | 不用的旧版本从安装器卸载 |
| CI 工作区 | runner 工作目录 | 每次构建全量 checkout + 编译产物 | CI 收尾脚本整目录清,只回传产物 |
| inode / 配额 | 小文件密集的生成目录 | df -h 有余量、df -i 100% 或报 quota | 整目录清小文件,quota -s 查限 |
表中体量均为典型量级,具体数字以本工程规模与所用 Quartus 版本为准。
三、排查决策图
先判「容量满还是 inode/配额满」,再用 du 定位大头,最后才动手清理——顺序反了会白删文件。
读这张图抓住一次分叉:红色入口先经蓝色的 df 双判,切成「容量满」与「inode/配额满」两条互不相干的通道,再汇入蓝色的 du 下钻定位。红色只标现象与命中的根因,蓝色全是排查动作,橙色是这一次的救火动作,紫色闭环是从失败阶段重跑并沉淀防复发策略。不要跳过双判直接删大文件——inode 耗尽时删几个 GB 的 db/ 网表毫无作用,得清小文件密集的整棵生成目录。
四、逐条排查展开
第一刀:容量、inode、配额三条线一起看。 Linux 上在工程根敲:
df -h /proj/demo # 工程所在卷容量水位
df -i /proj/demo # 同一卷 inode 水位
du -h --max-depth=2 /proj/demo 2>/dev/null | sort -rh | head -20
du -sh db incremental_db ip output_files simulation 2>/dev/nullUse% 打到 100% 是容量写穿;df -h 还空着但 IUse% 100%,是 IP 与 qsys 生成目录里海量小文件吃光了 inode,表现同样是写失败。共享服务器再敲 quota -s(具体命令随存储系统而异),报 Disk quota exceeded 时满的不是卷而是个人配额,删东西也要删自己账下的。
第二刀:编译数据库与增量缓存,删之前分清能不能回溯。 Quartus 目录里最大的两个常客是 db/(综合与适配的编译结果库)和 incremental_db/(Rapid Recompile / 增量编译的分区缓存)。口径如下:不做增量编译回溯时,incremental_db/ 整目录可删,下次编译自动重建;db/ 删掉等于回到全量编译,耗时长但安全,适合长期没清理、版本号又对不上的老库。正在跑的工程先退出 Quartus 再删,避免工具握着句柄写半截。写穿当次的半截数据库不可信——Quartus 未必自查得出,「编译完成」的提示也可能照打,腾出空间后从 Analysis & Synthesis 开始整链重跑,不要试图续用旧库。
第三刀:波形与抓波文件,把嘴管住。 仿真侧的头号大户是 testbench 里不加节制地全信号 dump:.vcd/.fsdb 跑长仿真涨到数 GB 很常见。改为只 dump 需要观察的模块层次,或限定转储的时间窗口;先用短波形定位大致区间,再对可疑区间加细粒度信号重跑一轮。SignalTap 侧同理:采样深度按需设,抓完导出关键数据后删除原始采集与导出的 CSV;调试结束记得把抓波配置从日常工程里摘掉,别让大深度采集混进回归流程。这两类文件还有个共性坑——调试越紧张越不敢删,攒上几个月就是几十 GB,定期按时间戳归档腾地方。
第四刀:生成物、归档与安装目录,清不动就挪。 IP 和 Platform Designer 的生成物(ip/、各 synthesis/submodules/)删除后重新 Generate 即可重建,代价是一次生成时间;不用的 IP 先从工程移除再清目录,省得生成器下次又拉回来。.qar 工程归档是「全量快照」,每归档一次工程根就多一个压缩包,应挪到独立归档盘集中保管,工程里只留最近一份。笔记本系统盘紧张时,把工程建到独立数据盘(Windows 下如 D:/proj/demo);旧版本 Quartus 从安装器卸载,不要手删安装目录。CI 场景最容易被忽略:runner 每次构建全量 checkout 加完整编译,工作区不清理,磁盘几周必满——构建脚本收尾必须整目录清理,只回传 .sof 与报告。
五、预防与纪律
- 工程放独立大盘:远离系统盘,经验上给工作卷预留约 20% 空闲,容纳一轮编译的突发峰值。
- 编译库定期清:不做增量回溯就定期删
incremental_db/,老工程的db/宁可全量重编也别堆着。 - 波形按需开:日常回归不带全信号 dump,大深度 SignalTap 配置不进日常工程。
- 归档集中保管:
.qar挪出工程盘,定期清点只保留有里程碑意义的版本。 - CI 收尾即清:工作区用完即删,只回传比特流与报告;工程目录大小纳入例行巡检。
这一篇在知识体系里的位置
本篇是 FPGA 工具排错速查簇的 FAQ 页,专管 Quartus 磁盘容量与 inode 一条线;编译长时间无进展的卡死类问题在 Quartus 编译卡死速查,Xilinx 侧同主题的对照处置在 Vivado 磁盘写满速查,三者共同覆盖「编译跑不动/写不下」这一高频报障面。
一句话总结
Quartus 磁盘写满报错先 df -h、df -i、quota -s 三线双判容量、inode 与配额,再用 du 下钻锁定 db/ 编译数据库、incremental_db/ 增量缓存、仿真波形与 SignalTap 抓波、IP/qsys 生成物、.qar 归档这几类大户:能删的按「删增量缓存、清老 db 全量重编、波形按需采集、归档挪盘集中保管」处置,写穿当次的半截数据库腾空间后整链重跑不续用,CI 工作区用完即清,长期靠工程上大盘、预留约 20% 空闲、定期 du 巡检三条纪律防复发。