yxyx:verilator生成波形和gtkwave查看波形
在verilator指令的末尾要加上--trace选项,会在obj文件夹里生成对应的xxx_vcd_c.d和.o文件。
在上一部分里,c语言代码里只写了逻辑部分,但是想要gtkwave查看波形,还需要在代码里增加vcd指针并记录波形。
新的代码如下:
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include "Vverilog1.h" #include <verilated.h> #include "verilated_vcd_c.h" //用来生成.vcd文件 int main(int argc,char *argv[]) { VerilatedContext *context_p=new VerilatedContext; context_p->commandArgs(argc,argv); Vverilog1 *top=new Verilog1{context_p}; //实例化模块 VerilatedVcdC *tfp= new VerilatedVcdC; //初始化VCD对象指针 context_p->traceEverOn(true); //打开追踪 top->trace(tfp,0); tfp->open("wave.vcd"); //保存位置 while(!context_p->gotFinish()) { int a=rand() &1; int b=rand() &1; top->a=a; top->b=b; top->eval(); pritnf("a=%d, b=%d, f=%d\n",a,b,top->f); tfp->dump(context_p->time()); //dump wave context_p->timeInc(1);//仿真时间推进 assert(top->f == a^b); } delete top; tfp->close(); delete context_p; return 0;
在此次编译后,进入obj文件夹,运行一次./Vverilog1 才会在文件夹里看到wave.vcd文件
使用 gtkwave wave.vcd,会弹出gtkwave的图形界面
打开以后,左上角的树形图点开,左下角的表格里会出现wire singals的信息。一开始右侧的波形界面是空余的,用鼠标把信号源拖到右边才会有显示。
讲义中还要求将规则写在npc 下的makefile里,这样每次make sim就能进行编译,但我不确定,所以就先把用过的规则先写在里面。
VERILATOR_FLAGS=--cc --exe --build --trace sim: //编译出obj_dir文件夹
verilator $(VERILATOR_FLAGS) verilog1.v test_verilog.c wave: //制造并打开波形文件 obj_dir/Vverilog1 run gtkwave wave.vcd clean:rm -rf obj_dir
后续的补充:这个写法用于实现采集波形是足够的,但是要接入nvboard,要做的还远远不够。个人建议是参考nvboard的example文件夹的样例Makefile。其实要修改的地方不多。
-----------------------------
简单地说一下Makefile的编写规则:
1. 全大写的变量用等号或者冒号等号,后面写变量对应的指令。
2. sim:表示make sim指令输入后要执行的动作。 其他指令,比如make wave \make clean都是一样的原理
3. 可以写多条指令,多条指令用换行区分,或者用分号区分,也可以用两个and符号 && 来区分。用&&时,只有前一条执行成功才会执行下一条
4. 在sim那条指令里,除了前面的选项参数可以用变量替代,后面的文件名也可以用变量。变量还可以用正则匹配:
比如VERILOG_SOURCES = $(PWD)/*.v 就表示匹配当前路径下所有.v文件
由于我这里只需要考虑一个文件,所以直接写文件名, 记得在调用变量时,要用$() 括号括起来。
5.此外,还有一个需要注意的小点:在写规则时,最好另起一行再写详细指令,并且,指令不能以空格开头,而是以tab开头!这点很重要,否则makefile无法正确识别指令。
sim:verilator x
sim:
verilator √
写好以后,make sim,会执行编译出obj_dir文件夹的行为,make wave则会执行生成波形文件的行为(当然,由于代码里是死循环,所以不会执行后面的指令了)此外,wave.vcd如果是make后生成,那会生成在obj_dir之外。也就是说生成在当前用户所在路径下,不一定在obj文件夹里。
讲义要求我修改npc文件夹下的makefile,但我另开了一个文件夹,所以我自己写的也在自己文件夹里放了一份。