yosys ERROR: Can't open input file:read_verilog 找不到文件的速查
更新时间:2026-10-26。FAQ 速查页,属于开源 EDA 工具排错系列。Yosys(开源逻辑综合套件)里
read_verilog读不到文件时抛的ERROR: Can't open input file,九成不是文件丢了,而是「yosys 找文件的地方和你以为的地方不是同一个」——相对路径相对的是启动 yosys 的目录,不是脚本文件所在的目录。同系列的顶层名问题见 yosys Module is not part of the design,模块未声明见 yosys 模块未声明综合报错。
先给答案(赶时间看这段就够):在跑 yosys 的那个终端里先敲 pwd 和 ls <报错里的路径>。pwd 不是工程根——换到工程根再启动 yosys,或改用绝对路径;pwd 对但 ls 报不存在——逐字符比对拼写与大小写,再 ls -l 查软链是否悬空。yosys 本身没有「相对脚本定位」的魔法,.ys 脚本里的相对路径同样相对启动目录。
本文要回答的问题
- 报错说
Can't open input file,文件明明在,怎么回事? - yosys 的相对路径到底相对谁?
.ys脚本里写相对路径安全吗? - 拼写、软链、大小写各是什么表现,怎么区分?
- 怎么改才能一劳永逸不再踩?
一、报错原文与现象
# command: yosys -p read_verilog src/n5_top.v; hierarchy -top n5_top
# date: 2026-10-26T01:42:59+08:00
# host-toolchain: Yosys 0.9 (git sha1 1979e0b) / Verilator 4.038 2020-07-11 rev v4.036-114-g0cd4a57ad / iverilog 11.0
---
ERROR: Can't open input file `src/n5_top.v' for reading: No such file or directory
---
# exit_code: 0读这张实录抓三个特征:第一,报错文本是 ERROR: Can't open input file \src/n5_top.v' for reading: No such file or directory——yosys 把相对路径**原样照印**出来,这个原样字符串就是排查的钥匙;第二,报错出现在命令行 -p脚本的第一条命令read_verilog 上,连 banner 和「Executing Verilog-2005 frontend」都没来得及打,属于「秒炸」,说明问题发生在文件打开这一步,与 Verilog 语法内容无关;第三,yosys 0.9 的 ERROR 会终止脚本执行,hierarchy -top` 根本没跑到。
「秒炸 + 路径原样照印」是这一类报错的指纹。如果 yosys 跑了一阵子才报错,那方向就完全不同——比如 yosys Module is not part of the design 是文件读完了、在层级展开阶段才炸。
二、根因总览:三种「找不到」
| 报错现象 | 根因 | 快速验证 | 处置 |
|---|---|---|---|
| 相对路径找不到 | 启动目录不是工程根 | pwd 对照工程根 | cd 到工程根或用绝对路径 |
| 人眼看着对、机器说不存在 | 拼写/大小写不一致 | ls 逐字符比对 | 修正路径或文件名 |
文件名 ls 能列出但打不开 | 软链悬空 | ls -l + readlink -f | 重指软链目标 |
三类根因里第一类覆盖面最大。yosys 不做任何路径解析魔法:read_verilog src/n5_top.v 里的 src/n5_top.v 会被直接拼到进程当前工作目录后面去 open(2),而进程的工作目录是你在 shell 里敲 yosys 时所在的目录——不是你 .ys 脚本放的目录,也不是源文件放的目录。Makefile 里 cd build && yosys ../scripts/run.ys 这种写法,就是让 run.ys 里所有相对路径集体失准的经典姿势。
三、路径排查漏斗
这张图的主线是「先按报错里的路径形态分流,再进对应的检查通道」。颜色按语义分角色:红是报错入口与三个命中的根因,蓝是排查动作(pwd / ls / readlink 三件套),橙是对应修复,紫是收尾防复发。工作目录问题覆盖面最大(含 Makefile 里 cd 换目录、CI 提交目录不同两个变体),所以排在最左主干;软链悬空最会伪装——文件名能 ls 出来,open 却失败,排在最右独立一支。不要一上来就全局 find / -name 找文件,先用 pwd 把「yosys 站在哪」这一个问题钉死,一半的瞎猜就消掉了。
四、修复验证与逐条展开
工作目录:相对路径相对的是「启动 yosys 的目录」。 上面的报错就是在非工程根的目录里启动 yosys 造成的。验证与修复一步到位——改用绝对路径后同一条命令直接通过:
# command: yosys -p read_verilog /tmp/errlog-evidence-b4/src/n5_top.v; hierarchy -top n5_top; stat
1. Executing Verilog-2005 frontend: /tmp/errlog-evidence-b4/src/n5_top.v
Parsing Verilog input from `/tmp/errlog-evidence-b4/src/n5_top.v' to AST representation.
Generating RTLIL representation for module `\n5_top'.
Successfully finished Verilog frontend.
2. Executing HIERARCHY pass (managing design hierarchy).
Top module: \n5_top
Removed 0 unused modules.
3. Printing statistics.
=== n5_top ===
Number of wires: 4
Number of cells: 1
$xor 1
End of script. Logfile hash: 3e6f8e9a45换绝对路径后 read_verilog 正常解析、hierarchy -top n5_top 认出顶层、stat 打出 4 根线 1 个 $xor 单元——综合链路完整跑通,证明文件本身、模块名、语法都没问题,唯一变量就是路径。不想用绝对路径的话,等价修复是先 cd 到工程根再启动 yosys。
.ys 脚本里的相对路径同样相对启动目录。 很多人以为 yosys -s scripts/run.ys 里写的 read_verilog src/top.v 会相对 run.ys 的位置解析——不会。yosys 执行脚本时只是逐条跑命令,工作目录全程不变。脚本要可移植,两条路:启动脚本统一在工程根拉起 yosys(约定优于配置),或者脚本里全程用绝对路径/由 Makefile 用变量注入工程根。商业工具里同类问题有 search_path 之类的查找机制兜底(见 Design Compiler 路径/文件不存在),yosys 的 read_verilog 没有这个查找列表,路径不对就是直接报错,反而更好排查。
拼写与大小写:Linux 区分大小写。 Src/N5_top.v 和 src/n5_top.v 是两个不同路径。设计文件从 Windows 侧拷过来、或脚本在大小写不敏感的机器上写好后搬到 Linux 跑,就会出现「人眼看着对、机器说不存在」。把报错里照印的路径和 ls 输出逐字符比对,别靠肉眼扫——全角字符、数字 0 与字母 O 都咬过人。
软链悬空:文件名在、指向没了。 工程里指向第三方 IP 或库目录的软链最常见——目标搬走后软链本身还在,ls 能列出文件名,open 时报 No such file or directory。判别用 ls -l <path> 看箭头目标是否标红,或 readlink -f <path> 报不存在即悬空。修复是重指到新位置,不要再叠一层新软链。
五、排查清单
这张清单对应正文顺序:先目录、再拼写、后软链,最后一步用绝对路径复跑做闭环验证。四步都走命令行三件套(pwd / ls / readlink),全程不到三分钟;如果四步走完还没命中,剩下的方向是 NFS 缓存延迟(刚生成的文件另一台机器暂时不可见,报错不可稳定复现)这类环境问题,往「能不能稳定复现」上问一句就能分辨。
实验环境
- 机器/系统:云主机(Linux)
- 工具版本:Yosys 0.9 (git sha1 1979e0b) / Verilator 4.038 2020-07-11 / iverilog 11.0(照抄 log 头部 host-toolchain 行)
- 日期:2026-10-26
- 完整命令:
- 复现报错:
yosys -p "read_verilog src/n5_top.v; hierarchy -top n5_top"(在非工程根目录下启动) - 修复验证:
yosys -p "read_verilog /tmp/errlog-evidence-b4/src/n5_top.v; hierarchy -top n5_top; stat"
- 复现报错:
代码获取
复现用源码 n5_top.v 与报错/修复两份 log 在公开仓 https://github.com/derekzhuo/geek-doc.cn/tree/main/experiments/ts-yosys-cant-open-input-file。装好 Yosys 后先按正文复现命令以相对路径启动重现 ERROR,再改绝对路径跑 yosys -p "read_verilog <绝对路径>/n5_top.v; hierarchy -top n5_top; stat" 验证读入与综合统计输出。
这一篇在知识体系里的位置
本篇是开源 EDA 排错速查簇中「文件读入」节点的 FAQ 页:同簇的 yosys Module is not part of the design 管「文件读进去了、顶层名对不上」、yosys 模块未声明综合报错 管「读入顺序与声明缺失」,本篇管最前一道门「文件根本没打开」;三者按综合流水线的先后顺序排列,合起来覆盖 yosys 输入侧的三类「找不到」。商业工具侧的对照见 Design Compiler 路径/文件不存在(DC 有 search_path 查找机制,表现与 yosys 不同),全簇导读见 开源 EDA 报错排查枢纽 与 EDA 知识目录。
一句话总结
yosys 报 ERROR: Can't open input file 时先记住一件事:相对路径相对的是启动 yosys 的目录,不是脚本或源文件所在目录——按「pwd 钉目录 → ls 比对拼写与大小写 → ls -l/readlink 查软链 → 换绝对路径复跑验证」四步走,三分钟定位;防复发靠「统一在工程根启动 yosys + 脚本内路径由 Makefile 变量注入 + 定期扫悬空软链」三条纪律。