verilator使用记录
verilator的作用
Verilator 是一种开源工具,用于将 Verilog 硬件描述语言转换为高性能的 C++ 或 SystemC 模型。它是一种 静态编译器,常被用于数字硬件仿真和验证。
具体作用
-
将 Verilog 转换为 C++/SystemC 模型
Verilator 会将 Verilog 描述的硬件模块编译为可执行的 C++/SystemC 仿真代码,而不是直接运行仿真。
转换后的 C++ 模型可以用来进行逻辑仿真、验证和性能评估。 -
用于功能仿真
Verilator 生成的模型可以用来执行 周期精确 的仿真,适合验证硬件设计的功能正确性。 -
高性能仿真
Verilator 的仿真速度通常比传统的事件驱动仿真器(如 ModelSim、VCS 等)快,因为它是静态编译的,优化了运行时性能。
它特别适合大规模数字设计(如 SoC 或 CPU)的长时间运行仿真。 -
生成可综合的设计模型
它生成的模型保留了硬件的层次结构,可以用于嵌入式软件开发或系统联合仿真。 -
支持嵌入式软件验证
与软件环境(如测试脚本)集成,可以通过仿真硬件设计来测试嵌入式软件。 -
支持波形生成
可以生成仿真波形(VCD 或 FST 格式),方便进行后期调试。 -
错误检测
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):
- 解析 our.v 文件中的 Verilog 代码。
- 检查语法错误或潜在问题(例如未定义信号、不定值等),并输出警告/错误信息。
- 转换 Verilog 描述为一个可仿真的周期精确 C++ 类(如 Vour)。
- 生成的 C++ 文件存放在 obj_dir/ 目录下,包括:
Vour.cpp:模块的实现文件。
Vour.h:模块的头文件,定义类 Vour 及其接口。
Makefile:用于编译和链接的构建文件。
2.链接 C++ 测试程序(--exe):
指定用户提供的 C++ 测试程序(sim_main.cpp),用于验证生成的模块。
- sim_main.cpp 是用户编写的主程序,用于初始化仿真上下文、实例化模块、调用仿真逻辑,并控制仿真流程。
- Verilator 将 sim_main.cpp 和生成的 Vour.cpp 一起编译,构建一个完整的仿真器。
3. 构建可执行文件(--build)
调用 make 工具,根据生成的 Makefile 编译并链接所有文件,生成最终的可执行文件。
- 执行 Makefile 中的指令,编译所有必要的 C++ 文件。
- 链接生成的目标文件,生成可执行文件。
- 输出的可执行文件存放在 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)。
浙公网安备 33010602011771号