使用Verilator进行大规模设计的C++仿真加速方案
扫描二维码
随时随地手机看文章
在超大规模(SoC/NoC)设计中,传统解释型HDL仿真器(如ModelSim/VCS)往往成为验证瓶颈。Verilator作为一款高性能开源Verilog/SystemVerilog仿真器,通过将RTL代码编译为优化的C++/SystemC模型,可实现10-100倍的仿真速度提升。本文将详解其加速原理与实战流程。
一、加速原理:从解释执行到编译执行
Verilator的核心在于“编译期转换”。
1. 解析与优化:读取RTL代码,进行静态分析和逻辑优化(如常量传播、死代码消除)。
2. 代码生成:将Verilog模块转换为等价的C++类(.cpp和.h文件)。
3. 编译链接:用户编写的C++测试平台(Testbench)与生成的代码一同编译成单一的可执行文件(Binary)。
4. 高速执行:该二进制文件直接由CPU执行,无任何解释开销,且可利用C++编译器的-O2/-O3优化。
二、实战流程:从RTL到可执行文件
1. 环境准备
# Ubuntu/Debian
sudo apt install verilator clang cmake make
# 验证安装
verilator --version
2. 目录结构与核心文件
project/
├── rtl/
│ └── my_soc.v # 待仿真的RTL设计
├── sim/
│ ├── CMakeLists.txt # C++构建脚本
│ └── bench.cpp # C++测试平台
└── obj_dir/ # 生成的C++代码与可执行文件
3. RTL设计(示例:一个简单的FIFO)
// rtl/my_fifo.v
module my_fifo #(parameter DEPTH=8) (
input wire clk,
input wire rst_n,
input wire wr_en,
input wire [7:0] din,
output reg [7:0] dout,
output wire empty,
output wire full
);
// ... FIFO逻辑实现 ...
endmodule
4. C++测试平台(Bench.cpp)
这是Verilator加速的关键。你需要用C++重写Testbench。
// sim/bench.cpp
#include "Vmy_fifo.h" // Verilator自动生成
#include "verilated.h"
int main(int argc, char** argv) {
// 初始化Verilator上下文
Verilated::commandArgs(argc, argv);
// 实例化顶层模块
Vmy_fifo* top = new Vmy_fifo;
// 仿真循环
for (int cycle = 0; cycle < 1000; cycle++) {
// 驱动时钟
top->clk = !top->clk;
// 驱动输入信号(示例)
if (cycle > 10 && cycle < 20) {
top->wr_en = 1;
top->din = cycle & 0xFF;
} else {
top->wr_en = 0;
}
// 复位逻辑
top->rst_n = (cycle > 5);
// 执行仿真一个时间步
top->eval();
}
// 清理
delete top;
return 0;
}
5. 构建与执行
使用CMake或Makefile将C++代码与Verilator生成的代码链接。
# sim/CMakeLists.txt
project(my_verilator_sim)
set(CMAKE_CXX_STANDARD 11)
# 查找Verilator
find_package(verilator REQUIRED)
# 添加可执行文件
add_executable(my_sim bench.cpp)
# 链接Verilator库和生成文件
verilate(my_sim
SOURCES ../rtl/my_fifo.v
TOP_MODULE my_fifo
PREFIX Vmy_fifo
VERILATOR_ARGS -Wall -trace-fst --cc
)
编译并运行:
cd sim
mkdir build && cd build
cmake ..
make -j4
./my_sim
三、大规模设计的加速技巧
1. 分层验证(Stubbing)
对于超大规模SoC,不必一开始就仿真整个系统。
• 技巧:使用$readmemh或C++ std::ifstream为ROM/RAM加载初始化文件,避免冗长的bootrom仿真。
• 技巧:对非关键模块(如低速外设)编写C++行为级模型(Transactor)替换RTL,大幅降低仿真复杂度。
2. 波形追踪优化
波形文件(VCD/FST)是仿真速度的杀手。
# 仅在调试时开启波形
verilate(... VERILATOR_ARGS --trace-fst)
在C++ Bench中:
// 仅在需要时dump波形
#if VM_TRACE
Verilated::traceEverOn(true);
tfp->open("wave.fst");
#endif
建议:功能稳定后关闭波形,纯逻辑仿真速度可再提升5-10倍。
3. 多线程仿真(Experimental)
Verilator支持初步的多线程(--threads 4),但对于复杂设计,线程间通信开销可能抵消收益。通常单线程+O3优化是最佳起点。
四、与SystemC联合仿真
对于包含复杂算法模型(如DSP、AI加速器)的设计,可采用SystemC + Verilator混合仿真。
1. RTL模块由Verilator编译。
2. 算法模型用SystemC TLM-2.0编写。
3. 通过TLM套接字(Socket)连接,实现高层次的软硬件协同仿真。
五、结语
Verilator将HDL仿真转化为C++程序执行,彻底改变了验证范式。对于大规模设计,“C++ Testbench + 分层Stub + 关闭波形”的组合拳,是突破仿真速度瓶颈、实现敏捷验证的有效途径。虽然初期C++ Testbench编写成本较高,但其带来的仿真加速收益在长期迭代中无可估量。





