Icarus Verilog:编译与仿真
一句话回答
Icarus Verilog(iverilog)是开源 Verilog 仿真器:用 iverilog 把 RTL 和 testbench 编译成一个 vvp 可执行文件,再用 vvp 运行仿真;testbench 里写 $dumpfile/$dumpvars 导出 VCD,就能用 gtkwave 打开看波形。
一、安装
bash
# Ubuntu/Debian
sudo apt install iverilog gtkwave
iverilog -V # 验证Windows 有官方安装包,安装后把 bin 加入 PATH。
二、最小流程
verilog
// tb.v
`timescale 1ns/1ps
module tb;
reg clk = 0;
always #5 clk = ~clk;
initial begin
$dumpfile("wave.vcd");
$dumpvars(0, tb);
#100 $finish;
end
endmodulebash
iverilog -g2012 -o sim.vvp rtl.v tb.v # 编译
vvp sim.vvp # 运行
gtkwave wave.vcd # 看波形三、常用参数
-g2012:按 IEEE 1800-2012 启用部分 SystemVerilog 语法(logic等);-o file:指定输出文件名(默认a.out);-c cmdfile:源文件很多时用命令文件列出;-D NAME、-I dir:传宏、加 include 路径;-y dir+-suffix:指定库目录与后缀。
常见坑
- testbench 忘记 $dumpvars:能跑出 VCD 文件但里面没信号。
- **时序题不给
timescale**:#5` 这类延时无单位,结果异常。 - 拿 iverilog 验证可综合性:它是仿真器,语法/行为能跑不等于能综合,综合要用 Yosys。
- 多模块文件没全部列出:报模块未定义,所有 .v 都要传给 iverilog。
- SystemVerilog 特性过多:iverilog 只支持 SV 子集,复杂 UVM/类支持有限,重度 SV 考虑商业或 Verilator。
$finish缺失:仿真不结束、vvp 一直挂着。
总结
iverilog 用 iverilog -g2012 -o out.vvp *.v 编译、vvp 运行、配合 $dumpvars 导出 VCD 给 gtkwave,是 Verilog 轻量功能仿真的首选;但它只做仿真不判可综合性,SystemVerilog 支持有限,高性能 lint/仿真另用 Verilator。