Verilator简介与使用
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Verilator开源的Verilog和System Verilog翻译器
Verilator, the fastest Verilog/SystemVerilog simulator.
最快的Verilog/System Verilog模拟器
lAccepts synthesizable Verilog or SystemVerilog
接受可综合的 Verilog 或 System Verilog
lPerforms lint code-quality checks
执行 lint 静态代码质量检查
lCompiles into multithreaded C++, or SystemC
编译成多线程 C++ 或 System C
lCreates XML to front-end your own tools
创建 XML 作为前端工具
1.Verilator的使用
Verilator通常需要配合Makfile使用实现对Verilog代码的翻译和编译工作。接下来我们演示一个简单的Hello World程序来对Verilator进行介绍。
首先设计一个Verilog实现的Hello World程序our.v。
module our;
initial begin $display("Hello World"); $finish; end
endmodule
//our模块的功能是显示“Hello World"
接下来我们编写一个sim_main.cpp其作用会在后文介绍) 该程序会对Verilator翻译后的模型进行调用。
#include "Vour.h"
#include "verilated.h"
int main(int argc, char** argv, char** env) {
Verilated::commandArgs(argc, argv);
Vour* top = new Vour;
while (!Verilated::gotFinish())
{
top->eval();
}
delete top;
exit(0);
}
//我们会在后文对此处代码进行解释
我们首选在Ubuntu环境下对our.v使用Verilator进行翻译
verilator -Wall --cc our.v --exe sim_main.cpp
Verilator 会将翻译得到的一系列文件输出到 --Mdir 选项指定的目录或默认为“obj_dir”。
在执行上述命令之前test_our中只有our.v和sim_main.cpp文件现生成了obj_dir和一系列.cpp和.h文件
接下来我们使用make命令对生成的C++一源代码进行编译同时执行
make -j -C obj_dir -f Vour.mk Vour //编译
Obj_dir/Vour
通过观察执行结果在控制台中输出了“Hello World"
我们发现使用Verilator翻译过后的C++程序竟然和原始Verilog具有一样的行为。
2.Verilator工具介绍
Verilator的作用是将某些Verilog或System Verilog代码翻译成可编译的C++或System C代码之后再编写合适的驱动代码也就是sim_main.cpp一同使用C++编译器进行编译由此得到可执行的程序来对Verilog或System Verilog代码进行仿真得到波形图等仿真结果。
其详细的执行过程如下
1.Verilator通过读取指定的 Verilog 或 System Verilog 代码、对其执行 lint 静态代码检查以及可选地插入断言检查和覆盖分析点。它可以输出单线程或多线程的 .cpp 和 .h 文件即“Verilated经过验证的”代码。
2.用户需要编写的一个C++ / System C Wrapper file 封装文件这个文件会定义main()函数它会将“Verilated”模型实例化为C++/System C对象。
3.用户的Wrapper file、Verilator创建的文件、Verilator提供的“运行时的库”和System C库这些 C++ / System C 文件之后会由 C++ 编译器 gcc / clang / MSVC++ 统一进行编译。生成的可执行文件来执行设计仿真。Verilator 还支持将其生成的库可选加密链接到其他模拟器。
4.生成的可执行文件将在“模拟运行”期间执行实际的模拟。还可以生成可查看的设计波形轨迹。
3.Verilator性能表现
Verilator 并非简单地将 Verilog HDL 转换为 C++ 或 System C。Verilator会将代码编译成一个优化更快的和可选的线程分区模型该模型又包装在 C++/ System C 模块中。结果就是一个编译好的 Verilog 模型即使在单线程上的执行速度也比独立的System C快10倍以上在单线程上的执行速度比解释过的Verilog模拟器如Icarus Verilog快100倍左右。多线程可能会带来2-10倍的加速比解释的模拟器快200-1000倍。 Verilator 通常具有与闭源 Verilog 模拟器Carbon Design Systems Carbonator、Modelsim、Cadence Incisive/NC-Verilog、Synopsys VCS、VTOC 和 Pragmatic Cver /CVC相似或更好的性能。
4.翻译代码的结构
Verilator根据our.v输出了一个Vour.h的头文件该文件定义了一个名为{Vour}的类该类表示用户应该实例化的生成模型。这个模型类定义了验证模型的接口。
Verilator还会创建一个Vour.cpp文件以及内部的 .h 和 .cpp 文件。
Verilator的输出将包含一个Vour.mk文件该文件可以与Make一起使用来构建一个Vour__ALL .a静态库文件它包含所有必需对象的库。
5.C++输出模式
在 C++ 输出模式 (–cc) 下Verilator 生成的模型类是一个简单的 C++ 类。用户须为模型编写一个 C++ wrapper file 来实例化模型类并与 Verilator翻译后的模型链接。以下给出一个sim_main.cpp的例子
#include <verilated.h> // Defines common routines
#include <iostream> // Need std::cout
#include "Vtop.h" // From Verilating "top.v"
Vtop *top; // Instantiation of model
vluint64_t main_time = 0; // Current simulation time
// This is a 64-bit integer to reduce wrap over issues and
// allow modulus. This is in units of the timeprecision
// used in Verilog (or from --timescale-override)
double sc_time_stamp() { // Called by $time in Verilog
return main_time; // converts to double, to match
// what SystemC does
}
int main(int argc, char** argv) {
Verilated::commandArgs(argc, argv); // Remember args
top = new Vtop; // Create model
top->reset_l = 0; // Set some inputs
while (!Verilated::gotFinish()) {
if (main_time > 10) {
top->reset_l = 1; // Deassert reset
}
if ((main_time % 10) == 1) {
top->clk = 1; // Toggle clock
}
if ((main_time % 10) == 6) {
top->clk = 0;
}
top->eval(); // Evaluate model
cout << top->out << endl; // Read a output
main_time++; // Time passes...
}
top->final(); // Done simulating
// // (Though this example doesn't get here)
delete top;
}
模型顶层 IO 信号作为模型的成员被读取和写入。调用 eval() 方法来评估模型。当模拟完成时调用 final() 方法来执行任何 SystemVerilog final 块并完成任何断言。
6.System C输出模式
在 SystemC 输出模式 (–sc) 中Verilator 生成的模型类是 SystemC SC_MODULE。该模块将作为实例直接附加到 System C 网表中。 SC_MODULE 获得与 Verilog 模块相同的引脚分配具有以下类型转换 单个位的引脚变为 bool。 2-32 位宽的引脚变为 uint32_t。 33-64 位宽的引脚变为 sc_bv 或 vluint64_t具体取决于 --no-pins64 选项。更宽的引脚成为 sc_bv 的。 模型内部包括较低级别的子模块不是纯 SystemC 代码。这是一个特性因为在任何地方使用 SystemC 引脚互连方案都会将性能降低一个数量级。
7.运行实例
接下来将以一个由Verilog编写的FIFO为例进行演示由C++实例化FIFO
FIFO及test_bench来源:http://www.bubuko.com/infodetail-2720594.html)
C++输出模式
FIFO的test_bench
Sim_main.cpp驱动程序
Vivado波形图
Sim_main.cpp运行结果
System C输出模式
Sim_main.cpp驱动程序
System C驱动程序运行结果
生成的波形文件可以使用GTKwave工具查看此处不再赘述
有问题请指教