“一生一芯”学习笔记 2 【Verilator】

什么是Verilator?

Verilator 将 Verilog 和 SystemVerilog 硬件描述语言(HDL)设计转换为 C + + 或 SystemC 模型,编译后可以执行该模型。Verilator 不是传统的模拟器,而是编译器。

Verilator 的主要功能就是将 Verilog 代码转化为 SystemC 或 C++ 代码

Verilator 具体工作原理

verilator

Verilator 命令行参数配置

  • --cc表示将根据HDL生成C++文件,--sc表示将生成System C文件

    {prefix}.cpp为模型的C文件

    {prefix}.h为模型的头文件

    {prefix}.mk为模型编译时的makefile

  • --build表示直接根据{prefix}.mk生成模拟时模型的库。

    {prefix}__ALL.a 包含所有必须对象的库

    既可以直接buil得到库

    1
    2
    verilator -cc --exe --build -j top.v sim_main.cpp
    obj_dir/Vtop

    也可以不直接build

    1
    2
    3
    verilator -cc --exe sim_main.cpp top.v
    make -j -C obj_dir -f Vtop.mk Vtop
    ./obj_dir/Vtop
  • --exe表示生成模型的二进制文件,在Vtop.mk中体现

  • --main表示将会自动生成一个含main函数的cpp文件,即wrapper file,这个文件将会读取命令行参数、实例化模型,并驱动模拟

    {prefix}__main.cpp

  • 前缀{prefix}可以通过--prefix指定。

  • 生成的所有文件都在目标文件夹中,可以由--Mdir指定,默认为“obj_dir”

  • --top-moduleor --top指定顶层模块

  • -j {}指定编译线程数

  • -o {file abspath}指定生成目标文件的路径和名称

命令行参数:verilator Arguments — Verilator Devel 5.021 documentation

生成的文件:Files — Verilator Devel 5.021 documentation

Overview — Verilator Devel 5.021 documentation

Verilator 使用指南 - USTC CECS 2023

wrapper 驱动

需要使用<verilated.h>中的VerilatedContext类构建一个环境

1
2
3
4
5
6
7
8
9
10
#include <verilated.h>

//创建仿真环境
VerilatedContext* contextp = new VerilatedContext;

//接收命令行参数
contextp->commandArgs(argc, argv);

//推动仿真时间
contextp->timeInc(n)

Verilator + GTKwave 查看仿真波形

在 C++ wrapper中,控制产生波形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
#include "verilated_vcd_c.h"
...

int main(){

VerilatedVcdC* tfp = new VerilatedVcdC; //初始化VCD对象指针
contextp->traceEverOn(true); //打开追踪功能
top->trace(tfp, 0); //
tfp->open("wave.vcd"); //设置输出的文件wave.vcd

while(){
...
tfp->dump(contextp->time()); //dump wave
contextp->timeInc(1); //推动仿真时间
}

tfp->close();
delete tfp;
return 0;
}

在verilator的编译命令行中开启--trace选项,然后运行程序,会生成wave.vcd波形文件

用GTKwave打开波形文件

1
gtkwave wave.vcd

效果如下:

image-20240124094646036

GTKwave波形 GTKWave (sourceforge.net)

Verilator+gtkwave-CSDN博客