书接上文
Verilator Pt.2: Basics of SystemVerilog verification using C++ :: It's Embedded! (itsembedded.com)
由于需要写一个双控开关的tb文件,所以就小小借鉴了以下上面的DUT的tb文件,大体思路都是相同的,而且双控开关比上面那个DUT要简单许多。所以说tb文件可以参考上面DUT的tb文件,只要略作修改即可
#include <assert.h>
#include <stdlib.h>
#include <iostream>
#include <verilated.h>
#include <verilated_vcd_c.h>
#include"Vswitch.h"
#include"Vswitch___024root.h"
#define MAX_SIM_TIME 20
vluint64_t sim_time = 0;
int main(int argc,char **argv,char **env){
Vswitch *dut = new Vswitch;
Verilated::commandArgs(argc,argv);
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->eval();
m_trace->dump(sim_time);
sim_time++;
int a = rand() & 1;
int b = rand() & 1;
dut->a = a;
dut->b = b;
dut->eval();
printf("a = %d, b = %d, f = %d\n", a, b, dut->f);
assert(dut->f == (a ^ b));
}
m_trace->close();
delete dut;
exit(EXIT_SUCCESS);
}
随后我们就可以进行之前所说的那几步了,建立仿真所需的可执行文件->编译->运行->查看波形
然后就会发现这实在是太麻烦了,每次都得敲一大堆上去,于是我们就顺理成章地写一个makefile来帮我们自动执行。
这个makefile也可以参考上面verilator教程上的,只不过有几点需要注意:
首先就是.PHONY对应的几个目标,makefile规则下一个文件中只允许存在一个.PHONY,否则会出现:warning: overriding recipe for target .PHONY。这就需要我们把所有的目标都放在同一个.PHONY中。参考文档如下:
同时对于顺序也要做一下调整,否则就会出现波形错误的问题,一开始没有调整时虽然打印出来的结果是a^b,但是波形中却是~(a^b)。最终调整完如下:
MODULE=switch
.PHONY: sim verilate build waves lint clean
sim: waveform.vcd
verilate: .stamp.verilate
build: obj_dir/V$(MODULE)
obj_dir/V$(MODULE): .stamp.verilate
@echo
@echo "### BUILDING SIM ###"
make -C obj_dir -f V$(MODULE).mk V$(MODULE)
waveform.vcd: obj_dir/V$(MODULE)
@echo
@echo "### SIMULATING ###"
@./obj_dir/V$(MODULE)
waves: waveform.vcd
@echo
@echo "### WAVES ###"
gtkwave waveform.vcd
.stamp.verilate: $(MODULE).v tb_$(MODULE).cpp
@echo
@echo "### VERILATING ###"
verilator -Wall --trace -cc $(MODULE).v --exe tb_$(MODULE).cpp
@touch .stamp.verilate
lint: $(MODULE).v
@echo
@echo "### LINTING ###"
verilator --lint-only $(MODULE).v
clean:
@echo
@echo "### CLEANING ###"
rm -rf .stamp.*
rm -rf ./obj_dir
rm -rf waveform.vcd
由于makfile比较严格的书写规则,一定要避免不必要的空格以及空行
同时调整顺序时也要注意时间戳的概念,有的应该放在前,有的要放在后面
随后就可以用make命令进行编译,make waves进行波形查看
顺带一提,为了更好地改bug我有把vim重新安装了一遍 ,这样我就可以通过y直接把内容复制到系统剪切板上了