当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]在超大规模(SoC/NoC)设计中,传统解释型HDL仿真器(如ModelSim/VCS)往往成为验证瓶颈。Verilator作为一款高性能开源Verilog/SystemVerilog仿真器,通过将RTL代码编译为优化的C++/SystemC模型,可实现10-100倍的仿真速度提升。本文将详解其加速原理与实战流程。



在超大规模(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编写成本较高,但其带来的仿真加速收益在长期迭代中无可估量。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭