Verilator入门笔记

警告
本文最后更新于 2024-08-23,文中内容可能已过时。

verilator主页

archlinux:

sudo pacman -S verilator

debian/ubuntu

sudo apt-get install verilator

使用wsl或MinGW/Cygwin编译安装

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

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图像

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