Verilator:高速仿真与 lint
更新时间:2026-09-21。硬件工具。事件驱动仿真见 Icarus Verilog,波形见 GTKWave。
一句话回答
Verilator 把可综合的 Verilog/SystemVerilog「翻译」成 C++/SystemC,再用 g++ 编译成本机可执行文件,做周期级(cycle-based)仿真,速度远快于传统事件驱动仿真器;它也能 --lint-only 当静态检查器用,帮你在综合前发现语法和可疑写法。
一、安装
bash
sudo apt install verilator # Ubuntu/Debian(版本可能偏旧,新版可源码装)
verilator --version二、lint 检查(最轻量用法)
bash
verilator --lint-only -Wall rtl.v只做静态检查、不产出仿真,适合接到 CI 里,每次提交先过 lint。
三、编译并仿真
bash
# --cc 生成 C++,--exe 连同 testbench 一起编译,--trace 开波形,--build 直接构建
verilator --cc --exe --build --trace \
top.v tb.cpp --top-module top
./obj_dir/Vtop # 运行C++ testbench 最小骨架:
cpp
#include "Vtop.h"
#include "verilated.h"
#include "verilated_vcd_c.h"
int main(int argc, char **argv) {
Verilated::commandArgs(argc, argv);
Vtop *top = new Vtop;
VerilatedVcdC *tfp = new VerilatedVcdC;
Verilated::traceEverOn(true);
top->trace(tfp, 99);
tfp->open("wave.vcd");
int sim_time = 0;
while (sim_time < 100 && !Verilated::gotFinish()) {
top->clk = !top->clk; // 翻转时钟
top->eval(); // 求值一个周期
tfp->dump(sim_time++);
}
tfp->close();
delete top;
return 0;
}新版可用 --binary 一条命令直接生成可执行文件,省去手写 Makefile。
常见坑
- 代码含
#延时/延迟赋值/不可综合结构:Verilator 只支持周期级、可综合子集,这类写法会报错。 - testbench 是纯 Verilog 且大量用延时:Verilator 需要 C++ 驱动或可综合风格的 testbench,行为级 TB 兼容性差。
- 忘记反复
eval()+ 推进时间:周期模型靠你手动翻时钟、调用 eval。 - 波形没开
--trace/ 没traceEverOn:导出的 VCD 为空。 - 发行版版本太旧:较新 SystemVerilog 语法不支持,必要时从源码装新版。
- 以为它做时序仿真:Verilator 不带门级延迟,不用于 STA/时序签核。
总结
Verilator 把可综合 Verilog/SV 转成 C++ 本机码做高速周期仿真,并能用 --lint-only -Wall 做静态检查;典型命令 verilator --cc --exe --build --trace 加 C++ testbench;代价是只支持可综合、周期级风格,不支持 #延时和时序签核。