Verilator入门笔记
目录
警告
本文最后更新于 2024-08-23,文中内容可能已过时。
安装
linux
archlinux:
sudo pacman -S verilator
debian/ubuntu
sudo apt-get install verilator
windows
编译安装
git clone https://github.com/verilator/verilator
autoconf
./configure
make -j `nproc`
sudo make install
常用参数解释
- –cc 生成C库
- –sc 生成systemc
- –exe 包含测试程序创建makefile生成模拟可执行文件
- –build 自动调用编译器构建最终的可执行文件
- –binary 生成二进制文件
- –trace 允许执行程序时生成波形文件
- –trace-fst 生成fst格式的波形文件
项目创建
创建一个工程文件夹
mkdir vtest ; cd vtest
分别为verilog和c++测试程序创建文件夹
mkdir csrc vsrc
编写verilog程序
vim vsrc/our_OnOff.v
module our_OnOff(
input a,
input b,
output f
);
assign f = a^b;
endmodule
示例程序创建了our_OnOff模块,a、b作为输入信号,f取a、b异或作为输出
编写测试程序
vim csrc/main.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "Vour_OnOff.h"
#include "verilated_vcd_c.h"
vluint64_t main_time = 0;
int flag = 100;
double sc_time_stamp()
{
return main_time;
}
int main(int argc,char **argv)
{
Verilated::commandArgs(argc,argv);
Verilated::traceEverOn(true); //导出vcd波形
VerilatedVcdC* tfp = new VerilatedVcdC();
Vour_OnOff *top = new Vour_OnOff("top");
top->trace(tfp, 0);
tfp->open("wave.vcd"); //打开vcd
while(!sc_time_stamp() < 20 && !Verilated::gotFinish() && flag)
{
int a = rand() & 1;
int b = rand() & 1;
top->a = a;
top->b = b;
top->eval();
printf("a = %d, b = %d, f = %d\n",a,b, top->f);
tfp->dump(main_time);
main_time++;
flag--;
}
top->final();
tfp->close();
delete top;
return 0;
}
测试程序生成随机的a、b作为输入并导出vcd图像
Makefile
all:
@verilator --trace -Wall --cc vsrc/our_OnOff.v --exe csrc/main.c
@make -C obj_dir -f Vour_OnOff.mk Vour_OnOff
sim:all
@./obj_dir/Vour_OnOff
@gtkwave wave.vcd
clean:
@rm -rf ./obj_dir/
@rm wave.vcd
all目标:使用verilator生成c库和makefile(Vour_OnOff.mk),使用make编译
sim目标:在满足all目标后运行可执行文件并使用gtkwave查看波形
clean:删除obj_dir和wave.vcd