verilator之双控开关

书接上文 

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中。参考文档如下:

Phony Targets (GNU make)

同时对于顺序也要做一下调整,否则就会出现波形错误的问题,一开始没有调整时虽然打印出来的结果是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直接把内容复制到系统剪切板上了

Vim 剪贴板里面的东西 粘贴到系统粘贴板? - 知乎 (zhihu.com)

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值