fpga.love首页资讯期刊视频工具Wiki
首页 / 期刊 / 202606 期 / 开源工坊
开源工坊

Verilator 实战:30 分钟搭好首个仿真回归测试

本刊编辑部 · 202606 期 · AI 时代的 FPGA 新图景

Verilator 实战:30 分钟搭好首个仿真回归测试

图:Verilator 实战:30 分钟搭好首个仿真回归测试 · 主题示意图

Verilator 是当前最活跃的开源 Verilog/SystemVerilog 仿真器:把 RTL 编译成 C++ 模型,仿真速度通常比商用事件驱动仿真器快一个数量级,还免费。这一篇把它跑通,30 分钟。

1. 为什么是 Verilator

  • 快:编译为原生 C++ 执行,适合大规模回归与 CI(持续集成)流水线;
  • 开源:MIT 协议,配合 Yosys 综合、nextpnr 布线,可组成完整的开源 FPGA 流程;
  • 生态:与 Cocotb(Python 测试)、OSVVM(开源验证方法学)等可组合使用。

2. 安装

  • macOS:brew install verilator;
  • Debian/Ubuntu:apt install verilator(仓库版本较旧,建议源码编译取最新版);
  • 源码:git clone https://github.com/verilator/verilator 后按 README 构建,约 5 分钟。

3. 最小可跑示例

一个 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 等时序语义。

4. 常见坑(先记这 3 个)

  • 未初始化警告:加 --x-initial-edge 或显式复位,避免仿真与综合行为不一致;
  • 四态信号:Verilator 默认只支持 0/1 两态仿真,x/z 需 --x-assign 显式处理;
  • 延迟控制:经典 #5 clk = ~clk 在 Verilator 5 需 --timing 开关,纯周期仿真建议用计数器驱动时钟。

5. 下一步

  • 把计数器换成你的真实模块,接上 Yosys(read_verilog → synth → write_netlist)做综合一致性对比;
  • 有板卡后接 nextpnr 布线下载,验证 RTL 仿真与上板行为一致;
  • 后续本栏目将逐期拆解 LiteX(SoC 生成)、OSVVM(验证方法学)实战。
← 上一篇 · 给 FPGA 新手的 100 天路线图下一篇 · 国产生态全景:四大厂商工具链与落地案例 →
← 返回本期目录