ysyx需要使用verilator进行仿真以及波形绘制。所以昨天完成verilator的安装之后今天就开始使用verilator完成ysyx任务,具体任务是根据如下博客进行的
【一生一芯】Verilator上手 - 老吴家的小阿哲 - 博客园 (cnblogs.com)
基本上跟着做全流程差不多能对verilator有一个大概了解,对于基本的流程能够掌握
首先就是最简单的Hello World。新建文件夹之后再给他显示出来,这具有verilog以及c++版本。
verilator官方手册也给出了具体例子
随后跟着流程做一个cmake跑通verilator的文件CMakeLists.txt(这里对于文件名要求很高,只能是按照这个格式,否则会报错
make_minimum_required(VERSION 3.22) #手册中没有这一行,但是Cmake要求每个Cmakelists开头必须添加这一行,否则报错,
#具体版本要看每个人安装的cmake版本,我是3.16.03,所以把版本改成了3.16
project(cmake_example)
find_package(verilator HINTS $ENV{VERILATOR_ROOT})
add_executable(Vour sim_main.cpp)
verilate(Vour SOURCES our.v)
这里也用到了一些github上的例子
https://github.com/n-kremeris/verilator_basics
这上面是一个基本的DUT案例。已经将。sv以及tb.cpp文件给出了,只需要按照流程跑一遍即可
跑的时候也是会出现问题的,比如代码中有一处枚举赋值语句
typedef enum logic [1:0] {
add = 2'h1,
sub = 2'h2,
nop = 2'h0
} operation_t /*verilator public*/;
operation_t op_in_r;
if(rst)
op_in_r <= 0;
op_in_r是不能这么赋值的,上网搜索后有以下几种方法
Errors and Warnings — Verilator Devel 5.021 documentation
经过实测只有第三种方法是有用的,或者可以直接改成
op_in_r <= nop;
这样就可以完成对于verilog文件的修改了
随后就是tb文件,在verilator中,测试文件是以cpp的形式存在的。如果是较为简单的测试文件,他的形式是大体相近的
#include <stdlib.h>
#include <iostream>
#include <verilated.h>
#include <verilated_vcd_c.h>
#include "Valu.h"
#include "Valu___024unit.h" #这两个文件就是通过将.v文件转换为cpp文件所生成的
#define MAX_SIM_TIME 20
vluint64_t sim_time = 0;
int main(int argc, char** argv, char** env) {
Valu *dut = new Valu; #dut算是一个设备的名称,具有普遍性,即Vexample *dut =new Vexample
Verilated::traceEverOn(true);
VerilatedVcdC *m_trace = new VerilatedVcdC;
dut->trace(m_trace, 5);
m_trace->open("waveform.vcd");
while (sim_time < MAX_SIM_TIME) {
dut->clk ^= 1;
dut->eval();
m_trace->dump(sim_time);
sim_time++;
}
m_trace->close();
delete dut;
exit(EXIT_SUCCESS);
}
在流程中,完成.v文件的编写后,要把.v文件进行由.v文件向cpp文件的转换,通过以下命令实现
verilator -Wall --trace -cc alu.sv --exe tb_alu.cpp
随后在完成之后就可以进行编译
#编译
make -C obj_dir -f Valu.mk Valu
#运行可执行文件
./obj_dir/Valu
#查看波形
gtkwave waveform.vcd
至此流程就都结束了
这里再推荐一个比较好的verilator进阶教学
Verilator Pt.2: Basics of SystemVerilog verification using C++ :: It's Embedded! (itsembedded.com)
可以有空读一读