本文介绍了怎么在 WSL 中安装 和使用HDL 仿真器(iverilog)和波形查看器(GTKWave),这两者都是轻量的开源工具链,适合快速验证。
文章中的示例工程:
https://github.com/HaroldFrey/cocotb_counter_example
相关文章:
cocotb 使用指南——用 Python 验证你的 RTL
文章也开源在了github:
https://github.com/HaroldFrey/WSL_Use
目录
它们是什么 检查是否已安装 安装 验证安装 iverilog 使用详解 GTKWave 使用入门 与 cocotb 配合 常见问题
1. 它们是什么
| iverilog | ||
| GTKWave | 波形查看器 |
工作流程:
写 Verilog 代码 → iverilog 仿真 → 生成波形文件(.fst/.vcd)→ GTKWave 打开查看iverilog 是 cocotb 官方默认支持的仿真器(见 04-cocotb使用指南.md),GTKWave 通过 WSLg 图形界面直接在 Windows 桌面上显示波形。
2. 检查是否已安装
在 Ubuntu 终端执行:
iverilog -V 2>&1 | head -1 # 应显示 Icarus Verilog version 12.0gtkwave --version | head -1 # 应显示 GTKWave Analyzer v3.3.x有输出版本号 = 已安装 ✅(本机实测:iverilog 12.0 / GTKWave 3.3.116,均已就绪) 显示 command not found = 未安装,执行第 3 步。
3. 安装
如果未安装,在 Ubuntu 终端执行:
# 一条命令装两个(iverilog + gtkwave)sudo apt install iverilog gtkwave -y💡 GTKWave 是 GUI 程序,通过 WSLg 显示(WSL 2 自带图形支持,无需额外配置)。首次使用建议同时装中文字体(波形里的中文标签不乱码):
sudo apt install fonts-noto-cjk -y
4. 验证安装
iverilog -V 2>&1 | head -1 # Icarus Verilog version 12.0gtkwave --version | head -1 # GTKWave Analyzer v3.3.116gtkwave # 启动后 Windows 桌面上应弹出 GTKWave 主窗口GTKWave 主窗口能弹出 = WSLg 图形通路正常 ✅
⚠️ 若窗口只在任务栏有图标但点不出来,
wsl --shutdown后重开(详见 02 §7.2)。
5. iverilog 使用详解
5.1 基本三步
iverilog -o sim counter.sv tb_counter.v # ① 编译:Verilog 源码 → 仿真程序 simvvp sim # ② 运行:执行仿真,生成波形gtkwave dump.vcd & # ③ 看波形5.2 常用选项
-o <文件> | -o sim | |
-s <模块> | -s counter | |
-g2012 | -g2012 counter.sv | |
-Wall | -Wall counter.sv | |
-I <目录> | include "xxx.v") | -I include/ |
-y <目录> | -y lib/ | |
-tn | -tn counter.sv |
💡
.sv文件不写-g2012一般也能编译(iverilog 按扩展名自动识别),但加-g2012最保险(严格按 SV-2012 标准)。
5.3 语法检查(写代码后先跑这个)
iverilog -tn counter.sv && echo"语法 OK"# 无输出 = 通过写完 RTL 先语法检查再仿真,是省时间的好习惯。
5.4 多文件项目
# 所有源文件一起列出即可,iverilog 自动解析模块依赖关系iverilog -o sim top.sv sub_module1.sv sub_module2.sv tb_top.v5.5 波形语句 $dumpfile / $dumpvars(测试台里)
initialbegin$dumpfile("dump.vcd"); // 波形文件名(扩展名决定格式:.vcd 或 .fst)$dumpvars(0, tb_counter); // 记录范围:0 = 该模块及以下所有层级end这两句写在测试台的
initial块里,仿真一运行就自动开始记录波形。
6. GTKWave 使用入门
打开波形文件
gtkwave dump.fst # 打开 FST 波形(推荐,文件小、速度快)gtkwave dump.vcd # 打开 VCD 波形(通用格式,文件较大)gtkwave dump.fst &打开后界面:

基本操作:
Ctrl+滚轮 | |
Ctrl+A 全选 → Append |
工具栏图标速查(实测体验):
Ctrl+滚轮) | |
这些图标只改变"查看方式",不会修改波形数据本身——随便点,多试试就熟了。
纯 iverilog 手动流程(不用 make,理解原理)
不依赖 cocotb 的最简方式,4 步走通"编译 → 仿真 → 波形":
① 写测试台 tb_counter.v(手动驱动时钟/复位):
`timescale 1ns/1psmodule tb_counter;reg clk = 0;reg rst = 1;wire [7:0] count; counter dut (.clk(clk), .rst(rst), .count(count)); // 例化被测模块always #5 clk = ~clk; // 每 5ns 翻转 → 10ns 周期时钟initialbegin$dumpfile("dump.vcd"); // ⭐ 生成波形$dumpvars(0, tb_counter); // 记录所有信号 #10 rst = 0; // 复位后释放 #100$finish; // 仿真结束endendmodule② 编译(iverilog 把两个文件编译成仿真程序 sim):
iverilog -o sim counter.sv tb_counter.v③ 运行仿真(vvp 执行,自动生成 dump.vcd):
vvp sim④ 打开波形:
gtkwave dump.vcd &💡 这套流程的好处:每一步都看得见、可理解(编译 → 运行 → 波形)。cocotb 只是把这套流程用 Python 断言自动化了,底层还是这几步。
7. 与 cocotb 配合
cocotb 用 iverilog 作默认仿真器,生成波形的方法:
# Makefile 中加一行:WAVES=1运行 make 后生成波形文件 sim_build/counter.fst,然后用 GTKWave 打开:
gtkwave sim_build/counter.fst⚠️ 实测修正:
COMPILE_ARGS += --trace是 Verilator 的写法,iverilog 会报invalid option -- '-'。iverilog + cocotb 请用WAVES=1。
想要 VCD 格式? cocotb 的 iverilog 支持固定生成 .fst(源码里写死了扩展名),用 fst2vcd 转换(GTKWave 自带):
fst2vcd sim_build/counter.fst > sim_build/counter.vcd # 注意:输出到标准输出,用 > 重定向gtkwave sim_build/counter.vcd # 打开 VCD传统 iverilog 方式(不依赖 cocotb)可以直接生成 VCD:测试台里写
$dumpfile("dump.vcd"); $dumpvars;(见 §6 手动流程和 §5.5)。
推荐流程:cocotb 写断言验证功能 → GTKWave 看波形分析时序,两者互补。
8. 常见问题
Q: gtkwave 启动没有窗口 / 窗口点不出来
WSLg 会话异常。wsl --shutdown(Windows PowerShell 中执行)后重新打开终端再试。
Q: 波形里中文显示为方块
缺少中文字体:sudo apt install fonts-noto-cjk -y,然后 fc-cache -fv。
Q: 提示 cannot open display
不应发生(WSLg 自动设置 DISPLAY)。检查 echo $DISPLAY 应为 :0;仍异常则 wsl --shutdown 重启。

如需转载,请联系作者获得授权(点击公众号主页的“联系我们”)
夜雨聆风