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%