Verilator生成仿真程序运行提示Invalid argument错误如何解决
问题原因与解决方案
1. 没有生成教程提及的Makefile的原因
你参考的教程里的Makefile是需要手动编写的项目编译脚本,不是Verilator自动生成的产物。Verilator默认仅会生成obj_dir目录下的Vthruwire.mk这类中间编译用的Makefile,不会生成教程里的通用项目Makefile。
2. 运行./thruwire报Invalid argument的解决方法
按优先级排查以下问题:
2.1 修复磁盘损坏问题
你之前收缩过VirtualBox的VDI磁盘,大概率是操作后虚拟机内的文件系统出现损坏,导致生成的可执行文件结构异常。先执行以下命令检查文件类型:
file thruwire
如果输出不是ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked ...这类正常可执行文件的描述,直接删除所有生成产物后重新编译:
rm -rf obj_dir thruwire
2.2 修复C++代码错误
你当前的C++仿真代码存在几个不符合规范的问题:
- main函数没有添加返回值,不符合C++语法规范
- 打印语句没有换行符,输出会出现乱码
- 没有释放申请的Vthruwire对象内存
修改后的代码如下:
#include <stdio.h> #include <stdlib.h> #include "Vthruwire.h" #include "verilated.h" int main(int argc, char **argv) { Verilated::commandArgs(argc, argv); Vthruwire *tb = new Vthruwire; for(int k = 0; k < 20; k++) { tb->i_sw = k&1; tb->eval(); printf("k = %2d, i_sw = %2d, led = %2d\n", k, tb->i_sw, tb->o_led); } delete tb; return 0; }
2.3 使用Verilator标准编译流程
不要手动编写g++编译命令,用--exe参数的标准流程自动生成可执行文件,避免参数写错:
# 生成编译脚本和中间代码 verilator -Wall -cc --exe thruwire.v thruwire.cpp # 编译生成可执行文件 make -C obj_dir -f Vthruwire.mk Vthruwire # 运行仿真 ./obj_dir/Vthruwire
2.4 环境兼容性排查
如果以上操作都无效,检查Verilator和GCC版本兼容性,重新安装依赖即可:
sudo apt update sudo apt install --reinstall verilator gcc g++
内容的提问来源于stack exchange,提问作者Anteino
相关产品推荐
相关产品推荐

