nppexec通过调用iverilog、vvp和gtkwave实现verilog一键编译、仿真与波形查看:先编译当前文件为a.out,再运行仿真,最后打开test_tb.vcd;要求testbench中必须包含匹配的$dumpfile("test_tb.vcd")和$dumpvars(),且工具路径已加入系统path,命令中路径与文件名严格一致。

怎么用NppExec调用iverilog编译并仿真
Notepad++本身不能运行Verilog,必须靠NppExec插件调用iverilog完成编译、仿真和波形查看。关键不是“写代码”,而是让命令链正确串联且路径可访问。
- 确保
iverilog、vvp、gtkwave已安装,并加入系统PATH环境变量(否则要在命令里写全路径,比如D:\iverilog\bin\iverilog.exe) - 按
F6打开NppExec脚本窗口,粘贴以下命令(注意win10/win11路径切换语法差异):cmd /k cd /d "$(CURRENT_DIRECTORY)" & iverilog.exe -o a.out "$(FULL_CURRENT_PATH)" & vvp.exe a.out & gtkwave.exe test_tb.vcd & EXIT
- 这个命令只做三件事:编译当前文件为
a.out、运行仿真、打开test_tb.vcd——所以你的testbench里必须有$dumpfile("test_tb.vcd");,且文件名严格匹配 - 保存脚本时命名建议含工具名,比如
Run with Icarus,避免和ModelSim/Vivado脚本混淆
为什么编译成功但波形打不开?常见断点在哪
最常卡在gtkwave找不到.vcd文件,或vvp没生成它。根本原因不是工具装错,而是testbench里没触发dump输出,或路径/权限被Windows拦截。
-
$dumpfile()和$dumpvars()必须成对出现,且$dumpvars()不能放在initial块外;常见错误是只写了$dumpfile("xxx.vcd")但漏了$dumpvars -
gtkwave.exe默认不接受相对路径,命令中写的test_tb.vcd必须和当前.v文件在同一目录,且不能含中文或空格 - 如果控制台显示
vvp: finished但没弹出gtkwave,检查是否被杀毒软件拦截——特别是Windows Defender会静默阻止gtkwave.exe启动 - 临时验证方法:手动在命令行进入当前目录,执行
vvp a.out,再执行gtkwave test_tb.vcd,能跑通说明NppExec脚本里路径或逻辑有问题
如何让错误行双击跳转到源码
默认NppExec输出的错误信息只是文本,双击无效。要启用跳转,必须配置Console Output Filters,且正则必须匹配iverilog的实际报错格式。
- iverilog报错格式通常是
test.v:12: error: syntax error,不是ModelSim的** Error: test.v(12): ... - 进
插件 → NppExec → Console Output Filters → Highlight,添加新规则:.*\.v:(\d+):.*error:.*,勾选Jump to line,设置Line number group为1 - 别用网上抄来的通用正则,比如
.*\((\d+)\).*——iverilog不用括号包行号,用冒号,匹配不上就跳不了 - 生效前需重启Notepad++,或至少重新加载NppExec插件(插件菜单里有Reload选项)
多个Verilog文件怎么一起编译
单文件命令iverilog.exe -o a.out file.v无法处理模块分文件场景。硬编码路径或手动拼接既脆弱又难维护,得改用项目级编译方式。
- 不要在NppExec里硬写所有文件名,比如
iverilog.exe -o a.out top.v sub1.v sub2.v——一旦增删文件就得改脚本 - 推荐做法:在项目根目录建一个
run.bat,内容为iverilog -o a.out *.v或更稳妥的iverilog -o a.out $(cat filelist.txt),然后NppExec调用这个bat - 或者直接用
iverilog -f filelist.f,其中filelist.f每行一个.v文件路径(支持相对路径),这样NppExec脚本只需一行:iverilog.exe -f filelist.f -o a.out - 注意:iverilog对文件顺序敏感,
filelist.f里必须把被引用模块放前面,顶层模块放最后,否则报undefined reference
实际用起来最麻烦的从来不是配路径,而是testbench里$dumpfile名字和NppExec命令里写的不一致,或者忘记$dumpvars。这两处错一个,整个波形流程就断在中间,但控制台还显示“success”。











