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,但我另开了一个文件夹,所以我自己写的也在自己文件夹里放了一份。

posted @ 2024-01-27 11:21  namezhyp  阅读(1313)  评论(0编辑  收藏  举报