verilator使用记录

verilator的作用

Verilator 是一种开源工具,用于将 Verilog 硬件描述语言转换为高性能的 C++ 或 SystemC 模型。它是一种 静态编译器,常被用于数字硬件仿真和验证。

具体作用

  1. 将 Verilog 转换为 C++/SystemC 模型
    Verilator 会将 Verilog 描述的硬件模块编译为可执行的 C++/SystemC 仿真代码,而不是直接运行仿真。
    转换后的 C++ 模型可以用来进行逻辑仿真、验证和性能评估。

  2. 用于功能仿真
    Verilator 生成的模型可以用来执行 周期精确 的仿真,适合验证硬件设计的功能正确性。

  3. 高性能仿真
    Verilator 的仿真速度通常比传统的事件驱动仿真器(如 ModelSim、VCS 等)快,因为它是静态编译的,优化了运行时性能。
    它特别适合大规模数字设计(如 SoC 或 CPU)的长时间运行仿真。

  4. 生成可综合的设计模型
    它生成的模型保留了硬件的层次结构,可以用于嵌入式软件开发或系统联合仿真。

  5. 支持嵌入式软件验证
    与软件环境(如测试脚本)集成,可以通过仿真硬件设计来测试嵌入式软件。

  6. 支持波形生成
    可以生成仿真波形(VCD 或 FST 格式),方便进行后期调试。

  7. 错误检测

Verilator 能够捕获 Verilog 代码中的常见错误(如语法错误、不定值)并报告,有助于提高代码质量。

verilator手册中的C++示例

  • 步骤一:准备所需的Verilog源文件
mkdir test_our
cd test_our

cat >our.v <<'EOF'
  module our;
     initial begin $display("Hello World"); $finish; end
  endmodule
EOF
  • 步骤二:创建一个 C++ 文件,定义仿真主程序
cat >sim_main.cpp <<'EOF'
  #include "Vour.h"
  #include "verilated.h"
  int main(int argc, char** argv) {
      VerilatedContext* contextp = new VerilatedContext;
      contextp->commandArgs(argc, argv);
      Vour* top = new Vour{contextp};
      while (!contextp->gotFinish()) { top->eval(); }
      delete top;
      delete contextp;
      return 0;
  }
EOF

代码解析:

// 使用 Verilator 的仿真测试程序,用于运行一个由 Verilog 模块生成的 C++ 模型

#include "Vour.h"   // Vour.h 是由 Verilator 自动生成的头文件,代表一个名为 our 的顶层 Verilog 模块
#include "verilated.h"  // verilated.h 是 Verilator 提供的库,用于仿真支持

int main(int argc,char** argv) {
    // 创建并初始化一个 Verilator 仿真上下文 contextp,
    // 它用于处理仿真状态、跟踪时间以及解析命令行参数。
    VerilatedContext* contextp = new VerilatedContext;
    contextp->commandArgs(argc, argv);

    // 创建一个由 Verilator 自动生成的 Vour 模块的实例 top,对应于用户的 Verilog 顶层模块。
    Vour* top = new Vour{contextp};

    // ☆★☆★仿真主循环★☆★☆
    while (!contextp->gotFinish()) 
    { 
        top->eval();    // 调用 eval() 方法,表示评估逻辑并计算当前时钟周期的输出。
    }
    // eval() 会根据当前信号和状态更新设计的状态,并执行任何时序或组合逻辑的计算。
    // 它执行 Verilog 代码中描述的 行为,例如逻辑计算、寄存器更新等。

    // 仿真完成后,释放动态分配的资源
    delete top;
    delete contextp;
    
    return 0;
}

  • 步骤三:使用 Verilator 编译
verilator --cc --exe --build -j 0 -Wall sim_main.cpp our.v
  • 步骤四:运行仿真
./obj_dir/Vour

整个编译过程

目的是为了将Verilog 文件 (our.v) 转换为 C++ 模型代码。

1.Verilog 编译(--cc):

  1. 解析 our.v 文件中的 Verilog 代码。
  2. 检查语法错误或潜在问题(例如未定义信号、不定值等),并输出警告/错误信息。
  3. 转换 Verilog 描述为一个可仿真的周期精确 C++ 类(如 Vour)。
  4. 生成的 C++ 文件存放在 obj_dir/ 目录下,包括:
    Vour.cpp:模块的实现文件。
    Vour.h:模块的头文件,定义类 Vour 及其接口。
    Makefile:用于编译和链接的构建文件。

2.链接 C++ 测试程序(--exe):

指定用户提供的 C++ 测试程序(sim_main.cpp),用于验证生成的模块。

  1. sim_main.cpp 是用户编写的主程序,用于初始化仿真上下文、实例化模块、调用仿真逻辑,并控制仿真流程。
  2. Verilator 将 sim_main.cpp 和生成的 Vour.cpp 一起编译,构建一个完整的仿真器。

3. 构建可执行文件(--build)

调用 make 工具,根据生成的 Makefile 编译并链接所有文件,生成最终的可执行文件。

  1. 执行 Makefile 中的指令,编译所有必要的 C++ 文件。
  2. 链接生成的目标文件,生成可执行文件。
  3. 输出的可执行文件存放在 obj_dir/ 目录中,命名为 Vour。

总结:整个过程的流水线

				   Verilog 文件 (our.v)
       						↓
  					  解析和静态检查
       						↓
          编译生成 C++ 仿真代码 (Vour.cpp, Vour.h)
       						↓
 用户测试程序 (sim_main.cpp)与C++ 仿真代码 (Vour.cpp, Vour.h)
       						↓
     					   编译
       						↓
     					   链接
       						↓
       					   构建
       						↓
				生成可执行文件 (obj_dir/Vour)

运行 obj_dir/Vour 后,模拟 Verilog 模块的行为,输出仿真结果(如 Hello World)。

posted @ 2025-12-05 10:51  阿坤不咕  阅读(0)  评论(0)    收藏  举报