一、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;
}