工作原理
安装
在Linux环境下
sudo apt-get install git perl python3 make autoconf g++ flex bison ccache
sudo apt-get install libgoogle-perftools-dev numactl perl-doc help2man
sudo apt-get install libfl2
sudo apt-get install libfl-dev
sudo apt-get install zlibc zlib1g zlib1g-dev
Verilator 的源码托管在 GitHub 上,我们可以通过以下命令来下载源码:
git clone https://github.com/verilator/verilator
进入源码目录,执行以下命令:
autoconf
./configure
make -j 4
sudo make install
make -j <nproc>
命令中的任务数要根据自己电脑的配置来调整,数量不要超过电脑最大线程数
执行以下命令:
verilator --version
如果输出了 Verilator 的版本号,说明已经安装成功。
测试
首先使用一个加法器模块进行测试
.
├── adder.v
└── adder_tb.cpp
adder.v
module adder(input [31:0] x,input [31:0] y,output [31:0] out);
assign out=x+y;
endmodule
adder_tb.cpp
#include <verilated.h>
#include "Vadder.h"
#include <iostream>
int main(int argc, char **argv) {
Verilated::commandArgs(argc, argv);
Vadder *tb = new Vadder;
uint32_t x=190,y=11;
tb->x = 190;tb->y = 11;
tb->eval();
std::cout << (tb->out) << std::endl;
tb->final();
delete tb;
return 0;
}
通过如下命令执行verilating:
verilator --cc adder.v --exe adder_tb.cpp --build
其中–build参数是自动执行构建过程。如果不加这个参数,verilator只会生成对应的C++源文件和mk脚本,需要自行调用make进行构建。
verilator默认的生成目录是当前目录下的obj_dir
,如果编译过程没有错误,将会在其中生成Vadder(或者Vadder.exe)可执行文件。运行该文件即可执行仿真,并查看输出结果。
./obj_dir/Vadder
输出为
201
注:Verilator 的编译命令解释如下:
$ verilator <options> <verilog-file> <cpp-file>
其中,<verilog_file>
是需要仿真的 Verilog 文件,<cpp_file>
是手动编写的 C++ 激励文件。<options>
是一些编译选项,这里列出一些常用的编译选项:
--cc
:指定将 Verilog 代码转化为 C++ 代码;--exe
:指定生成目标为可执行文件;--build
:直接编译生成目标文件;--trace
:导出波形文件时需要添加此选项;--top-module <top-module>
:指定 Verilog 顶层模块;--Mdir <build-dir>
:指定生成文件的目录;-CFLAGS <c-flags>
:指定一个 GCC 的编译选项;-I <include-path>
:可以指定一个包含路径。
仿真波形测试---计数器counter
module counter(
input clk,input rst,output reg [31:0] cnt
);
always@(posedge clk or posedge rst)begin
if(rst)cnt<=0;
else if(clk)cnt<=cnt+1;
end
endmodule
#include <verilated.h>
#include "obj_dir/Vcounter.h"
#include "verilated_vcd_c.h" // 引入波形头文件
#include <iostream>
int main(int argc, char **argv) {
Verilated::commandArgs(argc, argv);
Vcounter *tb = new Vcounter;
// 启用波形追踪
Verilated::traceEverOn(true);
VerilatedVcdC *tfp = new VerilatedVcdC;
tb->trace(tfp,0);
tfp->open("vtop.vcd");
//仿真输入
tb->rst=1;tb->clk=0;
tb->eval();
tfp->dump(0);
tb->rst=0;
bool clk = 0;
for (int i = 1; i <= 10; ++i)
{
clk = !clk;
tb->clk = clk;
tb->eval();
tfp->dump(i);//手动控制波形时间戳
}
tfp->close();
delete tfp;
tb->final();
delete tb;
return 0;
}
代码注释:
需要添加波形测试时需要如下语句:
#include "verilated_vcd_c.h"// 引入波形头文件
VerilatedVcdC* tfp = new VerilatedVcdC; //初始化VCD对象指针
Verilated::traceEverOn(true); //打开追踪功能
tfp->open("xxx.vcd"); //设置输出的文件,“xxx”可以任取
tfp->dump(contextp->time());//用于设置时间戳
/*
仿真信号的操控总共3种语句:
信号延时: contextp->timeInc(1);,数字为设定的时间宽度,单位默认ps,表示先前状态的时延
信号赋值: top->xxx = xxx;,xxx为信号名称,表示时延之后信号的新值
模型同步: top->eval();,就是Evaluate Model
例如:
contextp->timeInc(1);
top->clk = !top->clk;
top->div_valid = 0; // 调低,此处为时钟上升沿
top->eval();
*/
加上trace参数
verilator --trace --cc counter.v --exe counter_tb.cpp --build >/dev/null
./obj_dir/Vcounter
根据生成的vtop.vcd文件可以查看仿真波形
gtkwave vtop.vcd
参考: