Verilator详解

发布时间:2023-05-17

一、Verilator官网

Verilator是一种高速的组合逻辑仿真器,它将Verilog HDL编写的硬件描述代码转换为C++或SystemC的仿真代码。Verilator在很多方面都比其他仿真器更快、更准确。Verilator官网提供了完整的文档、教程和安装指南等资料,方便用户使用。 下面是Verilator的官方网址:

https://www.veripool.org/projects/verilator/wiki/Intro

二、Verilator Windows

Verilator可以在Windows系统上安装使用。不过,官方并没有提供Windows版本的二进制包,需要手动编译。在Windows上编译Verilator,需要先安装Cygwin,然后使用Cygwin终端进入Verilator的源代码目录,运行如下命令进行编译:

perl scripts/make_verilator.pl

编译完成后,将生成verilator.exe可执行文件,将其加入系统环境变量中,即可在Windows上使用Verilator进行硬件描述语言的仿真。

三、Verilator仿真

使用Verilator进行仿真,需要先将Verilog HDL代码转换为C++代码。在Linux系统上,可以使用如下命令进行转换:

verilator --cc [Verilog HDL文件名]

上述命令将生成一个C文件(默认为verilated.cpp)和一个头文件(默认为[Verilog HDL文件名]_top.h),可以在C文件中调用头文件中定义的仿真函数进行仿真。 在仿真过程中,需要设置一些仿真参数,如仿真的时钟周期和仿真时间等,可以在C++文件中使用如下代码进行设置:

#include "verilated.h"
VL_PRINTF("[INFO] Starting simulation\n");
//初始化Verilog模块
top = new Vtop;
//设置时钟周期
Verilated::timeunit(-9);
Verilated::timeprecision(-12);
//仿真时间
vluint64_t sim_time = 0;
while (!Verilated::gotFinish()) {
    //设置仿真时间
    sim_time += 10;
    top->i_clk = 0;
    //更新输入端口
    top->eval();
    //模拟时钟上升沿
    top->i_clk = 1;
    top->eval();
    //输出仿真结果
    if (sim_time % (10*1000*1000) == 0) {
        VL_PRINTF("[INFO] sim_time=%lu ns\n", sim_time);
    }
}

四、Verilator VCS

Verilator支持VCS格式的仿真,可以将转换后的C++代码与VCS联合编译。在Linux系统上,可以使用如下命令进行联合编译:

vlogan [Verilog HDL文件名]
verilator --vpi --cc [Verilog HDL文件名]
cd obj_dir
make -f V[Verilog HDL文件名]_top.mk
vcs V[Verilog HDL文件名]_top.cpp [其他C++文件] -o [仿真可执行文件名]
./[仿真可执行文件名]

该命令将生成一个可执行文件,可以直接运行进行仿真。

五、Verilator教程

Verilator官网提供了完整的教程,涵盖了从入门到精通的各个方面,包括Verilog HDL语言基础、Verilator的基本应用、Verilator与其他仿真器的比较等内容。 下面是Verilator官方提供的教程地址:

https://www.veripool.org/projects/verilator/wiki/Tutorial

六、Verilator中文文档

Verilator中文文档由Verilator中文社区翻译并维护,其中包括了Verilator的基本概念、使用方法、应用案例等内容。 下面是Verilator中文文档的地址:

https://www.osdv.org/docs/verilator/index.html

七、Verilator手册

Verilator官方提供了完整的手册,包括了Verilog HDL语言的基本知识、Verilator的基本原理、Verilator的使用方法、调试技巧等内容。 下面是Verilator官方提供的手册地址:

https://www.veripool.org/projects/verilator/wiki/Manual-verilator

八、Verilator多线程

Verilator可以在多核CPU上进行多线程仿真,提高仿真效率。在Linux系统上,可以使用如下命令进行多线程仿真:

verilator --cc [Verilog HDL文件名] --threads [线程数]

上述命令将根据指定的线程数,自动进行多线程仿真。

九、Verilator tb

Verilator支持使用C编写测试代码对硬件进行单元测试。在C测试代码中,需要调用Verilator生成的头文件中定义的函数进行仿真,测试某个特定的问题。 下面是一个使用Verilator进行单元测试的例子:

// C++测试代码
#include "verilated.h"
#include "Vtop.h"
#include "testbench.h"
class Testbench : public VerilatedTestbench {
public:
    Vtop* u_DUT;
    Testbench() {
        u_DUT = new Vtop;
    }
    ~Testbench() {
        delete u_DUT;
    }
    virtual void op() {
        // 进行仿真
        u_DUT->eval();
        // 测试完成后调用finish
        if (Verilated::gotFinish()) {
            (*log_os) << "[TEST] simulation completed successfully\n";
            finish();
        }
    }
};
int main(int argc, char** argv) {
    Testbench* tb = new Testbench;
    // 在这里初始化测试数据
    // ...
    // 添加仿真时钟
    tb->addClock(1, 10);
    // 开始仿真
    tb->run(argc, argv);
    return 0;
}