Windows下MSYS2安装Verilator完整指南:从零到跑通仿真 1. 为什么在Windows上装Verilator这么折腾先说结论Verilator本身是个好东西但它在Windows上的安装路径确实劝退过不少人。Verilator是一个高性能的Verilog/SystemVerilog仿真器它的工作方式跟市面上常见的商业仿真器比如ModelSim、VCS完全不一样。人家是解释执行它是把Verilog代码先翻译成C再用C编译器编译成可执行文件最终跑的是原生机器码。这种编译型仿真的思路带来一个直接的好处仿真速度非常快在大型SoC验证、流水线CPU模型这类动辄跑几百万个周期的场景里Verilator能比传统事件驱动仿真器快上好几倍甚至一个数量级。但问题也出在这里。既然Verilator的产出是C代码那它就需要一个好用的C编译环境。在Linux上这根本不是事gcc、make、perl什么的一装就好。可到了Windows上事情就变得微妙了Cygwin能跑但环境隔离得厉害编译出来的东西跟Windows原生生态脱节WSL能用但总要开一个Linux子系统而且文件跨系统访问有性能损耗很多硬件工程师不习惯官方虽然提供Windows二进制包但依赖链不完整跑复杂项目时经常缺这缺那。我自己最初是在WSL里用的Verilator说实话跑起来没问题但每次想用GTKWave看波形或者想把仿真结果跟Windows本地的Python脚本联动就要在文件系统两边来回倒腾效率很低。后来换成MSYS2方案才算真正在Windows上有了原生的使用体验。MSYS2本质上是一个软件发行平台它在Windows上模拟了一套类Unix环境同时提供pacman包管理器——用过Arch Linux的人对这个应该很熟它跟apt、yum是同一个层面的东西。通过pacman可以一键安装Verilator以及它依赖的gcc、make、perl、gtkwave等工具链而且这些包都是预编译好的不需要自己从源码折腾。这篇文章就把我在Windows上用MSYS2安装Verilator的完整过程讲清楚重点解决两个核心痛点一个是安装本身怎么做到一气呵成另一个是国内网络环境下怎么用镜像加速避免下载卡在某个进度条上不动。2. MSYS2的下载和安装大部分坑都发生在这个阶段2.1 官方包下载慢到怀疑人生MSYS2的安装包本体大约100MB左右从官方源下载在国内经常只有几KB/s到几十KB/s的龟速。最难受的是它不显示剩余时间你根本不知道它是在下载还是已经挂了。我一开始也硬等过等了大概二十多分钟才下完第二天下载工具链又卡住了这才下定决心配镜像。官方下载地址是 www.msys2.org如果你能流畅访问直接下最新的安装包就行。如果访问慢有两个替代思路第一个思路去国内高校开源镜像站下载安装包本体。比如清华TUNA镜像站的地址是 mirrors.tuna.tsinghua.edu.cn/msys2/distrib/里面有msys2-x86_64-latest.exe之类的最新安装包用浏览器或者下载工具都能拉满速。第二个思路如果你在自己的网络环境里实在搞不定可以找一台能正常访问外网的机器把安装包下载好再通过局域网或U盘拷贝到目标机器上。这种方式看着笨但在某些企业内网环境里反而是最靠谱的方案。2.2 安装过程中的一个关键选项安装MSYS2的时候有个步骤容易被人忽略安装路径。默认是C:\msys64我建议保持默认不要改到带空格的路径比如C:\Program Files\msys64这种。原因后面会讲MSYS2内部有一套路径映射机制路径里有空格的话有些Makefile脚本和工具链会出莫名其妙的解析错误。安装过程本身没什么难度一路Next就行。装完之后系统会弹出一个MSYS2终端窗口这是MSYS2的运行环境之一有三种终端MSYS2 MSYS用于维护MSYS2自身环境比如更新核心组件MSYS2 UCRT64推荐日常使用C运行库用的是UCRTUniversal C Runtime跟Windows系统自带运行库兼容性最好MSYS2 MinGW64传统MinGW-w64环境很多老教程里用的是这个。我推荐日常所有操作都在UCRT64终端里做因为Verilator的预编译包默认构建目标就是UCRT64混用不同环境会导致包冲突。安装完成后先别急着装Verilator第一步永远是更新系统核心。在MSYS2终端里执行pacman -Syu这条命令的含义是先同步包数据库-Sy再整体升级-u。如果提示要关闭终端窗口就照做关掉重开再执行一次。这一步非常关键因为MSYS2的包管理器依赖数据库版本一致性跳过更新就装软件经常遇到依赖版本不匹配的问题。2.3 网络卡在50%大概率是pacman镜像的问题很多人反馈MSYS2安装卡在50%左右其实那个50%通常是安装过程的最后阶段正在执行pacman -Syu更新系统包。这一步卡住几乎可以断定是官方源连不上或者速度太慢。解决方式就是换国内镜像。Mirrorlist配置文件在C:\msys64\etc\pacman.d\目录下有三个文件mirrorlist.mingw32MinGW32包源mirrorlist.mingw64MinGW64包源mirrorlist.ucrt64UCRT64包源mirrorlist.msysMSYS自身组件源这三个文件都是同一个套路里面是一长串带国家代码的镜像地址默认情况下所有行都被注释掉了pacman会用内置的官方镜像。我们需要做的就是把自己想用的国内镜像地址取消注释并且置顶。我以清华镜像为例实际操作如下先用任意文本编辑器打开C:\ms64\etc\pacman.d\mirrorlist.ucrt64注意路径取决于你的安装目录如果你装到了别的盘符就按实际路径来把文件里的#Server https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/ucrt64/这一行的#删掉变成Server https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/ucrt64/然后把这个Server 行剪切到文件的最顶部。同样的操作对mirrorlist.mingw32和mirrorlist.mingw64也要做一遍地址分别是Server https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/ Server https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/mirrorlist.msys的地址是Server https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/改完之后重新打开MSYS2 UCRT64终端再执行一次pacman -Syu你会发现速度完全不是同一个世界。正常情况下几十秒就把系统更新完了。这里补充一个实用经验如果清华镜像偶尔抽风可以换中科大镜像mirrors.ustc.edu.cn/msys2/或者南京大学的镜像mirror.nju.edu.cn/msys2/配置方法完全一样就是把URL换一下。你可以同时取消注释多个镜像pacman会自动选择最快的一个。3. 一键安装Verilator及完整工具链3.1 先装什么再装什么顺序很重要在MSYS2里装Verilator其实只需要一条命令但为了让后面跑仿真不折腾我建议把跟仿真相关的一套工具全部装上。先执行Verilator本体安装pacman -S mingw-w64-ucrt-x86_64-verilator注意包名的规律mingw-w64-ucrt-x86_64-是前缀代表这是UCRT64环境下的包。如果你用的是MinGW64终端需要装的是mingw-w64-x86_64-verilator前缀不同不能混用。只装Verilator还不够因为Verilator跑起来要调用外部工具链来完成Verilog - C - 可执行文件的全流程。具体来说需要gcc/gC编译器把Verilator生成的C代码编译成可执行文件make构建工具驱动编译流程perlVerilator脚本依赖perl解析参数这几样一起装pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-make mingw-w64-ucrt-x86_64-perl如果你还要看仿真波形再加一个GTKWavepacman -S mingw-w64-ucrt-x86_64-gtkwave装完之后验证一下是否成功verilator --version能正常输出版本号比如Verilator 5.022之类的就说明安装成功了。3.2 为什么这些包必须用MSYS2版本这里插一个很多人踩过的坑有些人在MSYS2终端里执行gcc --version发现系统报错找不到命令。这是因为MSYS2的PATH环境变量默认只包含了MSYS自己的工具路径并没有包含UCRT64工具链的bin目录。解决方式是每次打开MSYS2终端时如果你处于MSYS环境而不是UCRT64环境手动切换一下export PATH/ucrt64/bin:$PATH或者更直接一点打开MSYS2 UCRT64这个专属终端开始菜单里就有它已经预配置好了所有环境变量不需要手动设置。另一个需要理解的问题是为什么不直接去装一个Windows原生的MinGW-w64非得用MSYS2的包原因是不同发行版之间的工具链可能存在ABI不兼容。Verilator在MSYS2环境下编译生成的C代码预期链接的是MSYS2仓库里的gcc所产生的运行库。你要是混用了别的工具链轻则链接报错重则运行的时候崩溃排查起来非常虐心。所以我的经验是在MSYS2里装的工具就全都用pacman装不要自己去外面搞绿色版、免安装版。省那几分钟下载时间后面可能多花几小时排错。3.3 使用国内镜像加速工具链下载如果你在执行上面那几条pacman -S命令时发现速度很慢不管是在几十KB/s徘徊还是直接卡住不动十有八九是这把用的还是官方源。回到上一节的镜像配置确认四个mirrorlist文件都已经把国内镜像置顶了然后重新执行。如果已经配好但还是慢可以主动指定使用某个镜像用--cachedir和--pacman相关的参数或直接编辑/etc/pacman.conf调整并行下载数。这里有个关键调优项pacman默认是串行下载网络延迟高时会明显降低速度。在C:\msys64\etc\pacman.conf文件里找到#ParallelDownloads 5删掉注释或者直接改成ParallelDownloads 8这个参数的作用是同时开8个下载线程。改成这个之后安装大包时的体感速度提升非常明显尤其是gtkwave这种组件多的包能从等一分钟变成几秒完事。改完配置执行pacman -Syyu-Syy的意思是强制刷新所有包数据库忽略本地的缓存。这一步能确保你把最新的镜像列表和最新的包版本拉到本地。4. 第一个仿真工程从Verilog到可执行文件4.1 最小可运行示例安装验证通过之后我们来跑一个最小的Verilator工程。这不仅是为了验证环境更是为了让新手理解Verilator的核心工作流程。在某个工作目录下新建一个Verilog文件命名为counter.vmodule counter( input wire clk, input wire rst_n, output reg [7:0] count ); always (posedge clk or negedge rst_n) begin if (!rst_n) count 8d0; else count count 1b1; end endmodule这是一个8位计数器功能很直白。接下来写C测试平台testbench命名为sim_main.cpp#include cstdio #include cstdlib #include Vcounter.h #include verilated.h #include verilated_vcd_c.h int main(int argc, char** argv) { VerilatedContext* contextp new VerilatedContext; contextp-commandArgs(argc, argv); Vcounter* top new Vcounter{contextp}; VerilatedVcdC* tfp new VerilatedVcdC; contextp-traceEverOn(true); top-trace(tfp, 99); tfp-open(counter.vcd); int sim_time 0; for (int cycle 0; cycle 20; cycle) { top-clk 0; top-eval(); tfp-dump(sim_time); top-clk 1; top-eval(); tfp-dump(sim_time); if (sim_time 2) { top-rst_n 1; } } tfp-close(); delete top; delete contextp; return 0; }代码逻辑很简单循环20个周期每个周期里先让clk拉低再拉高每次跳变都调用eval()让仿真器计算一次电路状态然后调用dump()把当前时刻的波形记录到VCD文件里。4.2 构建命令逐行解析编译工程用如下命令verilator --cc --trace counter.v --exe sim_main.cpp这条命令干了什么拆开来看--cc告诉Verilator生成C代码而不是SystemC代码--trace使能波形跟踪支持这样C代码里才能调用VerilatedVcdC相关API--exe sim_main.cpp把sim_main.cpp作为主程序文件一起交给构建系统最终生成可执行文件执行完这条命令后Verilator会在当前目录下生成一个obj_dir文件夹里面放着一堆中间文件。其中最关键的是Vcounter.mk这是Makefile。接着执行编译make -C obj_dir -j$(nproc) -f Vcounter.mk Vcounter-j$(nproc)是并行编译参数nproc会返回当前机器的CPU核心数。如果你的机器是8核16线程这里就等于-j16编译速度会快不少。如果一切顺利obj_dir里会出现一个Vcounter.exe文件执行./obj_dir/Vcounter.exe然后目录下会生成counter.vcd波形文件用GTKWave打开gtkwave counter.vcd能看到计数器按周期递增功能验证无误。4.3 一个容易误导新手的差异MSYS2路径与Windows路径在MSYS2终端里./obj_dir/Vcounter.exe这个路径写法没问题因为MSYS2终端模拟了Unix路径风格。但如果你在Windows的CMD或PowerShell里直接运行同一个命令需要写.\obj_dir\Vcounter.exe或者obj_dir\Vcounter.exe这是一个很小的差异但我见过好几个新手卡在这——他们在MSYS2里编译完切到PowerShell想跑结果路径分隔符报错还以为编译产物有问题。另外注意MSYS2环境里C:\msys64\home\yourname\project这个目录在MSYS2终端里显示为/home/yourname/project。这是MSYS2虚拟文件系统的映射机制把Windows盘符路径跟Unix风格路径做了对应。理解了这一点很多路径报错就不再神秘了。5. 国内网络环境下的进一步加速方案5.1 使用镜像站下载MSYS2安装包前面2.1节提了一句安装包可以从镜像站下载这里补充具体操作。清华镜像站MSYS2安装包的目录是https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/我在写这篇文章时目录下最新的安装包名是msys2-x86_64-latest.exe直接用浏览器或迅雷下载就行速度通常能跑到10MB/s以上。下载完双击安装和官方版没有区别。其他备选镜像站地址镜像站安装包目录路径清华TUNAmirrors.tuna.tsinghua.edu.cn/msys2/distrib/中科大mirrors.ustc.edu.cn/msys2/distrib/南京大学mirror.nju.edu.cn/msys2/distrib/腾讯云mirrors.cloud.tencent.com/msys2/distrib/5.2 自己维护一个本地包缓存如果你的使用场景是离线环境或者在多台Windows机器上都要装同一套环境那么本地包缓存会非常有用。MSYS2的pacman默认把下载的包缓存在/var/cache/pacman/pkg目录下对应Windows路径就是C:\msys64\var\cache\pacman\pkg。你可以用pacman -Sc清理掉不再需要的缓存也可以用pacman -Scc全部清除。但是如果你想在离线状态下重装或者给其他机器同步环境反而要保留这个缓存。具体做法是在一台能联网的机器上装好所有需要的包把C:\msys64\var\cache\pacman\pkg目录整体拷贝到U盘或NAS在另一台机器上安装MSYS2之后把拷贝过来的包文件放到它的对应目录下执行pacman -U加包文件路径来离线安装或者执行pacman -Syy配合设置IgnorePkg之类的方式复用缓存。不过更简单粗暴的方式是直接拷贝整个MSYS2目录到另一台机器上。MSYS2的绿色化程度很高大部分情况下拷贝过去就能直接开箱使用。唯一的风险是注册表项缺失会导致某些工具异常但纯命令行仿真链基本不受影响。我把整个msys64目录从一台机器拷到另一台Windows系统上用过Verilator,gcc,gtkwave都能正常运行。5.3 通过修改pacman.conf做精细控制pacman.conf里除了ParallelDownloads这个参数还有几个对国内网络环境有用的选项。第一个是Color开启后命令行输出有颜色区分报错和警告一目了然。默认是注释状态去掉#即可。第二个是CheckSpace这个建议保持开启它能防止磁盘空间不足时产生半个写坏的包。第三个是ILoveCandy这是个彩蛋参数开启后pacman下载时的进度条会变成吃豆人动画。对于在终端里等下载的人来说这个视觉反馈反而让等待不那么煎熬。vim /etc/pacman.conf改完之后按Esc输入:wq保存退出。不熟悉vim的用户可以直接用Windows自带的记事本编辑这个文件MSYS2的配置文件都是纯文本格式。6. 安装完成后的环境配置和踩坑记录6.1 把MSYS2工具链集成到Windows终端如果你习惯了在PowerShell或者Windows Terminal里工作可以不用每次特意打开MSYS2终端。最简单的集成方式是把MSYS2的可执行文件路径手动加入到Windows系统的PATH环境变量。需要添加的路径有两个C:\msys64\mingw64\bin C:\msys64\usr\bin如果你选择UCRT64环境作为主力那还需要加C:\msys64\ucrt64\bin添加完之后重开一个PowerShell窗口就能直接执行verilator --version、gcc --version了。但这里有一个要特别提醒的坑不要把C:\msys64\usr\bin直接添加到系统PATH里除非你清楚自己在干什么。这个目录里存放了很多Unix工具find、grep、sort等它们的参数格式和Windows原生命令不同。一旦把它加进了PATH并且顺序靠前Windows系统内置的find等命令会被MSYS2版本覆盖某些脚本和程序会因此崩溃。这个坑在Git Bash用户群体里也很常见症状五花八门。如果确实想在PowerShell里直接用Verilator更安全的做法是把C:\msys64\ucrt64\bin和C:\msys64\usr\bin同时加到PATH里但把顺序放在Windows系统目录之后。这样当某个命令在Windows目录里找不到时才会去找MSYS2的冲突概率大幅降低。6.2 常见报错及排查思路报错一verilator: command not found原因当前终端是MSYS环境没有加载UCRT64的PATH或者你切换到了别的终端环境。排查确认你打开的是MSYS2 UCRT64终端或者输入echo $PATH看是否包含/c/msys64/ucrt64/bin。报错二unable to find ltmain.sh或者make: g: No such file or directory原因这台机器上缺少C编译器或者make找到了但g没有安装。排查执行pacman -S mingw-w64-ucrt-x86_64-gcc装编译器装完重新运行构建命令。报错三/usr/bin/sh: D:/xxx: No such file or directory原因路径中包含空格或特殊字符Makefile解析出错。排查把工程目录放到无空格的路径下比如D:\verilator_proj\counter不要放在C:\Users\你的用户名\Desktop\my project这种带空格的路径里。这个坑我记得特别清楚之前在公司里帮同事排查他的工程目录是E:\Work Files\project1结果Verilator生成的Makefile在调用sh时把Work Files拆成了两个字段报错信息极其迷惑。解决办法就是让他换了个目录问题立刻消失。报错四Cannot open VCD file counter.vcd原因工作目录没有写权限或者可执行文件是在别的目录下运行的。排查确认当前工作目录可写或者在代码里使用绝对路径打开VCD文件。6.3 把Verilator跟其他编辑器/IDE对接Verilator装好之后很多人会希望把它嵌入到VSCode或者别的编辑器里做语法检查、代码补全。VS Code里有几个Verilog插件比如Verilog-HDL/SystemVerilog和surfer。语法检查功能默认依赖系统里的iverilog或Verilator。你需要把Verilator的可执行文件路径告诉插件。以VSCode的Verilog插件为例通常在设置项里搜索verilator然后把verilator.lint.verilator.executable修改为实际路径。需要注意的是VS Code本身启动的终端环境不一定是MSYS2环境所以插件调Verilator时需要确保它能找到Verilator及相关的DLL。最简单的办法是始终通过MSYS2 UCRT64终端启动VS Code这样环境变量就已经全部就位code .如果你用Windows Terminal也可以把MSYS2 UCRT64作为默认终端配置。在Windows Terminal的设置里新增一个配置命令行填写C:\msys64\msys2_shell.cmd -defterm -here -no-start -ucrt64这样每次打开Windows Terminal就直接进入UCRT64环境和MSYS2专属终端效果一致。7. 根据个人经验再补充几条小技巧到这里一套完整的MSYS2 Verilator环境就已经能正常工作了。最后分享几个我长期使用后沉淀下来的经验不算必修课但能省不少事。第一如果你以后准备做稍微复杂点的SystemVerilog验证尤其是要跑UVM环境建议直接把mingw-w64-ucrt-x86_64-uvm这个包也装上。虽然Verilator的UVM支持还在持续完善中但它已经能跑通相当一部分UVM测试用例。这样一来你在Windows上也能用uvm包了不用一提到UVM就只能上虚拟机开Linux。第二MSYS2的Python环境可以作为你仿真后处理的分析平台。装个mingw-w64-ucrt-x86_64-python或者直接用MSYS2的Python环境跑一些简单的波形分析脚本很方便。这样整个验证闭环就都在MSYS2内部完成了不需要来回切换。第三注意保持MSYS2环境的定期更新。Verilator的开发节奏挺快的新版本经常会修复编译bug和增加新语法支持。建议隔一两周执行一次pacman -Syu第四想深挖Verilator能力的建议仔细看官方文档verilator.org上的User Guide里面有一个例子叫做t_pipe是流水线CPU的完整验证例程。把这十几个例子都跑一遍你对Verilator的理解会上一个台阶。Windows下做数字IC验证过去总让人觉得不是正路但MSYS2这套组合拳用下来我的实际体感是日常的RTL仿真、波形调试、甚至跑小型UVM环境完全没有问题。如果你只是做FPGA开发需要快速验证一个模块的功能这套环境甚至比开WSL还省心。希望这篇文章能帮你少走几步弯路把环境装得干净利落。