图:Verilator 实战:30 分钟搭好首个仿真回归测试 · 主题示意图
Verilator 是当前最活跃的开源 Verilog/SystemVerilog 仿真器:把 RTL 编译成 C++ 模型,仿真速度通常比商用事件驱动仿真器快一个数量级,还免费。这一篇把它跑通,30 分钟。
brew install verilator;apt install verilator(仓库版本较旧,建议源码编译取最新版);git clone https://github.com/verilator/verilator 后按 README 构建,约 5 分钟。一个 8 位计数器 DUT(counter.sv):
module counter #(parameter W = 8) (
input logic clk, rst_n,
output logic [W-1:0] q
);
always_ff @(posedge clk or negedge rst_n)
if (!rst_n) q <= '0;
else q <= q + 1;
endmodule
C++ 测试台(sim_main.cpp):
#include "Vcounter.h"
#include "verilated.h"
int main(int argc, char** argv) {
Verilated::commandArgs(argc, argv);
Vcounter dut;
int errors = 0;
for (int i = 0; i < 256; i++) {
dut.clk = 0; dut.eval();
dut.clk = 1; dut.eval();
if (dut.q != (i & 0xff)) errors++;
}
return errors ? 1 : 0;
}
编译并运行:
verilator --binary --trace --timing counter.sv sim_main.cpp
./obj_dir/Vcounter
退出码 0 即回归通过。--trace 会生成 .vcd 波形文件,配合 GTKWave 查看;--timing 用于支持 always_ff 等时序语义。
--x-initial-edge 或显式复位,避免仿真与综合行为不一致;--x-assign 显式处理;#5 clk = ~clk 在 Verilator 5 需 --timing 开关,纯周期仿真建议用计数器驱动时钟。read_verilog → synth → write_netlist)做综合一致性对比;