news 2026/2/6 17:39:51

iverilog新手教程:使用Makefile管理仿真工程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iverilog新手教程:使用Makefile管理仿真工程

从零开始:用 Makefile 构建高效 Verilog 仿真工程

你有没有过这样的经历?改了一行代码,却要重新跑一遍完整的iverilog编译命令;写了五个测试用例,每个都要手动敲一次vvp;想看波形还得记住$dumpfile的名字……如果你还在这样“裸奔”式地做 Verilog 仿真,那是时候升级你的工作流了。

在数字电路设计中,验证效率往往决定了迭代速度。而一个结构清晰、自动化程度高的仿真环境,不仅能省下大量重复劳动,还能让你更专注于逻辑本身。本文将带你一步步搭建基于Icarus Verilog(iverilog) + GNU Make的轻量级仿真框架——无需昂贵EDA工具,也能拥有工业级的构建体验。


为什么不能只靠手敲命令?

初学者常从这一步开始:

iverilog -o sim.vvp counter.v tb_counter.v vvp sim.vvp

简单直接,但问题很快浮现:
- 修改一个小模块,所有文件重编?
- 多个测试平台怎么切换?
- 团队协作时别人看不懂你的“执行顺序”?

这些问题的本质是:缺乏对依赖关系的管理

就像写C程序不会每次手动调gcc main.c util.c -o app,我们也该为 Verilog 引入“构建系统”。而最成熟、最通用的选择之一,就是Makefile

✅ 核心价值一句话总结:
让机器自动判断“要不要重新编译”,而不是你凭感觉决定。


先搞懂两个关键角色:iverilog 和 Make 是谁?

iverilog:把 Verilog 变成可运行的“字节码”

你可以把它理解为 Verilog 的“编译器”。它不直接执行代码,而是先翻译成一种中间格式(.vvp文件),再由vvp虚拟机来跑。

# 编译阶段 iverilog -g2005 -o sim.vvp src/*.v tb/*.v # 执行阶段 vvp sim.vvp

常见选项说明:
--g2005:启用 IEEE 1364-2005 标准,支持 generate 块等现代语法;
--o <file>:指定输出文件名,默认是a.out
- 若未显式声明端口类型(如input logic clk),iverilog 会尝试推断,但容易出错 ——建议始终明确声明

💡 小贴士:iverilog 不支持 SystemVerilog 的 class、interface 等高级特性,但它足够应对大多数教学和原型项目。

Make:聪明的“任务管家”

Make 最强大的地方在于它的时间戳比对机制。当你执行make run时,它会检查目标文件是否比它的依赖项“旧”。如果是,才触发重建。

举个例子:

sim.vvp ← counter.v(DUT) ← tb_counter.v(测试平台)

只要这两个源文件没变,make run就不会重新编译,直接跳到运行阶段 ——这就是增量构建的核心逻辑


实战:写一个真正能用的 Makefile

我们从最基础的场景开始:一个计数器模块 + 一个测试平台。

目录结构建议

project/ ├── src/ │ └── counter.v ├── tb/ │ └── tb_counter.v ├── Makefile └── .gitignore

第一版:基础流程控制

# === 配置区 === TOP_TB = tb_counter DUT = $(wildcard src/*.v) TESTBENCH = tb/$(TOP_TB).v VVP_OUT = sim.vvp # 工具与参数 IVERILOG = iverilog VVP = vvp FLAGS = -g2005 -o $(VVP_OUT) # === 构建规则 === .PHONY: all run clean wave lint all: $(VVP_OUT) @echo "✅ 构建完成:$(VVP_OUT)" $(VVP_OUT): $(DUT) $(TESTBENCH) $(IVERILOG) $(FLAGS) $^ @echo "🔄 已生成 $@" run: $(VVP_OUT) $(VVP) $< @echo "🏁 仿真结束" clean: rm -f $(VVP_OUT) *.vcd @echo "🧹 清理完成" wave: run gtkwave waves.vcd & lint: verilator --lint-only $(DUT) $(TESTBENCH) || true

📌 关键点解析:

  • $(wildcard src/*.v)自动收集所有源文件,避免漏加;
  • $^表示所有依赖项,$<是第一个依赖(即.vvp文件);
  • .PHONY声明伪目标,防止与同名文件冲突;
  • wave目标依赖于run,确保先仿真再开波形;
  • lint使用 Verilator 进行静态检查,提前发现语法错误。

现在你可以这样操作:

make # 默认 all → 编译 make run # 编译+运行 make wave # 编译+运行+打开 GTKWave make clean # 清理产物

是不是已经比一行行敲命令清爽多了?


进阶玩法:支持多个测试用例

当功能复杂起来,单一测试平台不够用了。比如我们要验证“递增”、“递减”、“复位”三种行为,可以拆成多个 testbench 文件:

tb/ ├── test_counter_up.v ├── test_counter_down.v └── test_reset.v

每个文件都实例化counter模块,并施加不同激励。

对应的 Makefile 改造如下:

TESTS = test_counter_up test_counter_down test_reset BINS = $(addsuffix .vvp, $(TESTS)) .PHONY: tests run_% clean tests: $(BINS) %.vvp: tb/%.v src/counter.v $(IVERILOG) -g2005 -o $@ $^ run_%: %.vvp $(VVP) $< @echo "🏁 测试 '$*' 完成" clean: rm -f *.vvp *.vcd

现在就能精准运行某个测试:

make test_counter_up.vvp # 只编译这个测试 make run_test_counter_up # 编译并运行

✨ 这才是真正的“按需构建”。


避坑指南:那些文档里不说的小细节

❌ 错误1:空格代替 Tab

Makefile 中命令前必须使用Tab缩进!如果用四个空格,会报错:

Makefile:4: *** missing separator. Stop.

解决方案:编辑器设置“显示不可见字符”,确认缩进是 Tab。


❌ 错误2:忘记生成 VCD 文件

要在测试平台中加入:

initial begin $dumpfile("waves.vcd"); $dumpvars(0, test_counter_up); // 0表示层级全展开 end

否则gtkwave打开的是空文件。


❌ 错误3:模块名冲突或顶层识别失败

iverilog 默认以最后出现的module作为顶层。如果你的测试平台没有initial块,可能被优化掉!

✅ 正确做法:
- 测试平台必须包含至少一个initialalways块;
- 显式通过文件顺序控制编译优先级(先 DUT 后 TB);
- 或使用-s top_module_name指定顶层(推荐):

FLAGS = -g2005 -s $(TOP_TB) -o $(VVP_OUT)

❌ 错误4:Windows 下路径问题

WSL 用户注意:
- 不要在 Windows 路径下运行(如/mnt/c/...),性能差且权限混乱;
- 换行符用 LF 而非 CRLF;
- 安装 gtkwave:sudo apt install gtkwave


更进一步:打造可复用的验证基础设施

一旦掌握了这套模式,就可以向外扩展更多实用功能。

✅ 添加回归测试脚本

创建regress.sh

#!/bin/bash FAILED=0 for t in test_*.v; do bin="${t%.v}.vvp" echo "🔍 正在测试: $t" iverilog -g2005 -s ${t%.v} -o $bin $t src/counter.v && \ vvp $bin | grep -q "PASS" || FAILED=1 done if [ $FAILED -eq 0 ]; then echo "🎉 所有测试通过!" else echo "❌ 存在失败用例,请检查输出。" exit 1 fi

配合 CI 使用,实现自动化验证。


✅ 波形命名规范化

改进 Makefile,使每个测试生成独立波形:

run_%: %.vvp $(VVP) $< && gtkwave ${*}.vcd & # 并在 test_xxx.v 中动态设置 dumpfile // initial begin // $dumpfile("$testname$.vcd"); // 需配合预处理器宏使用 // $dumpvars; // end

虽然 iverilog 不原生支持$testname$,但可通过 shell 替换实现类似效果(进阶技巧)。


✅ 版本控制最佳实践

.gitignore内容应包括:

*.vvp *.vcd a.out .depend

只提交源码和 Makefile,保持仓库干净。


总结:你得到的不只是一个 Makefile

通过本文的实践,你实际上掌握了一套数字系统验证的工程方法论

层级收获
技术层面掌握 iverilog + Makefile 协同工作机制
效率层面实现一键编译、增量构建、多测例管理
工程思维理解依赖管理、自动化流程、可维护性设计
发展潜力为后续学习 UVM、SystemVerilog、CI/CD 打下基础

更重要的是,这种极简高效的验证方式,在开源硬件浪潮中正变得越来越重要。无论是 RISC-V 核心开发、FPGA 开源项目,还是高校课程实验,一套可靠的自动化仿真流程,都是高质量交付的前提


下一步你可以尝试……

  • 结合 Python 脚本自动生成测试向量;
  • 使用 Cocotb 替代传统 testbench,实现 Python 驱动仿真;
  • 在 GitHub Actions 中集成make regress实现云端回归测试;
  • 将整个流程容器化(Docker),保证环境一致性。

🛠️ 动手永远是最好的学习方式。
现在就去你的项目里新建一个Makefile吧,哪怕只有三行,也是迈向工程化的第一步。

如果你在实践中遇到任何问题,欢迎留言交流。让我们一起把数字电路验证做得更智能、更优雅。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 5:09:48

鸣潮120帧解锁终极指南:从卡顿到流畅的完整解决方案

鸣潮120帧解锁终极指南&#xff1a;从卡顿到流畅的完整解决方案 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 鸣潮1.2版本更新后&#xff0c;你是否发现原本流畅的游戏画面突然变得卡顿&#xff1f;明明…

作者头像 李华
网站建设 2026/2/3 7:12:24

超详细版Vivado卸载操作指南(含Linux系统命令)

Vivado 卸载全攻略&#xff1a;从Windows到Linux&#xff0c;彻底清除不留痕你有没有遇到过这种情况&#xff1f;想升级 Vivado 到最新版&#xff0c;结果安装失败&#xff1b;或者重装系统前清理软件&#xff0c;却发现“已卸载”后磁盘空间还是被占着几十GB——罪魁祸首&…

作者头像 李华
网站建设 2026/2/6 15:25:06

强力视频去字幕工具:AI智能修复让画面回归纯净的专业解决方案

强力视频去字幕工具&#xff1a;AI智能修复让画面回归纯净的专业解决方案 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除&#xff0c;无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API&#xff0c;本地实现。AI-based …

作者头像 李华
网站建设 2026/2/3 6:39:53

GLM-4.5-Air:高效智能的120亿参数AI模型

GLM-4.5-Air作为一款拥有120亿参数的高效智能AI模型&#xff0c;凭借其在性能与效率间的出色平衡&#xff0c;为AI应用开发者和企业用户带来了全新选择。 【免费下载链接】GLM-4.5-Air 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/GLM-4.5-Air 近年来&#x…

作者头像 李华
网站建设 2026/2/3 18:12:34

猫抓cat-catch资源嗅探扩展完整实战手册:从零基础到高级应用

猫抓cat-catch资源嗅探扩展完整实战手册&#xff1a;从零基础到高级应用 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 当你浏览视频网站时&#xff0c;是否曾为无法下载心仪的视频而烦恼&#xff1…

作者头像 李华
网站建设 2026/2/5 18:13:50

Deepin Boot Maker:快速制作Linux启动盘的终极解决方案

Deepin Boot Maker&#xff1a;快速制作Linux启动盘的终极解决方案 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker 想要轻松制作Linux系统启动盘吗&#xff1f;Deepin Boot Maker是您不可错过的免费开源工具&…

作者头像 李华