Verilator入门使用教程

工作原理

安装

在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

参考:

Verilator入门笔记 - Lando's Blog (du33169.tech)

安装 Verilator - USTC CECS 2023

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值