EDA开源仿真工具verilator入门10:verilator 实现vcd波形保存

verilog文件:multi_logic.v

module multi_logic (a,clk,ou1);
	input a,clk;
	output ou1;      
	reg a, clk, ou1;           
	always @(posedge clk) begin
		ou1 <= a;
	end
endmodule

cpp文件:test_main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
#include "Vmulti_logic.h"  // create `multi_logic.v`,so use `Vmulti_logic.h`
#include "verilated.h"
 
#include "verilated_vcd_c.h" //可选,如果要导出vcd则需要加上
 
int main(int argc, char** argv, char** env) {
 
  VerilatedContext* contextp = new VerilatedContext;
  contextp->commandArgs(argc, argv);
  Vmulti_logic* multiLogic = new Vmulti_logic{contextp};
  
 
  VerilatedVcdC* tfp = new VerilatedVcdC; //初始化VCD对象指针
  contextp->traceEverOn(true); //打开追踪功能
  multiLogic->trace(tfp, 0); //
  tfp->open("wave.vcd"); //设置输出的文件wave.vcd
  int clk = 0;
  int count = 0;
  int clkin = 1;
  multiLogic->a = 0;
  //multiLogic->b = 0;
  multiLogic->clk = clkin;

  while (!contextp->gotFinish()) {
    contextp->timeInc(1); //推动仿真时间
    count++;
    int a = rand() & 1;
    int b = rand() & 1;
    clk = !clk;
    clkin = clk;
    multiLogic->clk = clkin;
    multiLogic->a = a;
    //multiLogic->b = b;
    multiLogic->eval();
    if (clk)
    printf("a = %d, ou1 = %d\n",
     a, multiLogic->ou1);
 
    tfp->dump(contextp->time()); //dump wave
    if (count > 30) 
        break;
  }
  delete multiLogic;
  tfp->close();
  delete contextp;
  return 0;
}

verilator编译指令:

verilator -Wall --trace --cc --exe --build multi_logic.v test_main.cpp

注意要加上--trace参数,执行仿真程序,会生成对应的vcd波形文件,可以用gtkwave查看。我们来查看vcd文件格式:

$version Generated by VerilatedVcd $end
$date Mon Apr  3 23:52:15 2023 $end
$timescale 1ps $end

 $scope module TOP $end
  $var wire  1 # a $end
  $var wire  1 $ clk $end
  $var wire  1 % ou1 $end
  $scope module multi_logic $end
   $var wire  1 # a $end
   $var wire  1 $ clk $end
   $var wire  1 % ou1 $end
  $upscope $end
 $upscope $end
$enddefinitions $end


#1
1#
1$
0%
#2
0$
#3
1$
1%
#4
0#
0$
#5
1#
1$
#6
0#
0$
#7
1$
0%
#8
1#
0$
#9
0#
1$
#10
0$
#11
1#
1$
1%
#12
0$
#13
0#
1$
0%
#14
0$
#15
1#
1$
1%
#16
0$
#17
0#
1$
0%
#18
1#
0$
#19
1$
1%
#20
0$
#21
1$
#22
0$
#23
0#
1$
0%
#24
0$
#25
1#
1$
1%
#26
0$
#27
1$
#28
0#
0$
#29
1$
0%
#30
0$
#31
1#
1$
1%

这里大概介绍下vcd波形文件的格式,其实也很简单,就是先声明hierarchy结构,time0会保存所有信号的值,而从time1开始只会保存信号的变化值,需要注意整个hierarchy结构下的两个位置的信号可能对应一个变化信号,例如clk对应clkmulti_logic.clk两个位置的信号值,这是因为其实这两个信号的值是一样的,我们没必要对应两个变量,这也是波形保存中常用的方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值