Verilator教程《一》

首先需要运行以上命令,下载测试用例。

将测试用例的sv转换为cpp

--cc指的是转换为c++,--sc可以转换为systemC

执行上述指令后,弹出以下错误

修改为op_in_r <= operation_t’(0);后,转换通过

完成后会生成一个文件夹obj_dir,里面是转换后的cpp文件

其中的.mk文件会构造执行我们的仿真。.h和.cpp文件包含C++头文件和执行文件,来自于SystemVerilog的转换。建议去浏览这些文件。

我们现在需要重点关注Valu.h和Valu___024unit.h这两个文件。

Value.h是包含ALU类定义的最基本的头文件。我们在C++的testbench中需要去例化它。

Valu___024unit.h是ALU类内部的头文件,它包含operation_t的类定义。

我们已经将测试用例转换为C++了,现在就可以写testbench了。

首先,头文件中要包含<verilated.h>和<verilated_vcd_c.h>,这包含一些verilator的惯例以及将波形写入VCD文件中。

Valu.h和Valu___024unit.h的作用同上。

我们使用sim_time变量去追踪何时完成仿真。有很多方法去结束仿真,但是现在我们采取仿真20个时钟边缘。

Valu *dut = new Valu;例化我们转换的ALU模块。相当于sv中的alu dut(.*)

Verilated::traceEverOn(true);
    VerilatedVcdC *m_trace = new VerilatedVcdC;
    dut->trace(m_trace, 5);
    m_trace->open("waveform.vcd");

这四行指的是波形存储。特别的,我们创建了m_trace,将他传递给了dut,dut->trace(m_trace, 5);参数5限制了波形的深度。

最后,我们凑齐了仿真的所有条件。

while (sim_time < MAX_SIM_TIME) {
    dut->clk ^= 1;
    dut->eval();
    m_trace->dump(sim_time);
    sim_time++;
}

在while循环中,dut->clk ^= 1;翻转ALU的时钟,这是我们在testbench中使用的唯一时钟。

dut->eval();评估我们ALU模块中的所有信号。m_trace->dump(sim_time);将所有的波形信号写入我们的波形文件当中。

当达到MAX_SIM_TIME,循环就会停止。这里的时间并不是指的一个时间的确定值,而是指时钟的翻转次数。

构建仿真执行

Verilator不是用来仿真testbench的,而是将verilog转换为C++,为make构建指令。仿真使用的是C++本身。

Testbench和转换的HDL资源都是C++应用。

为了构建可执行的仿真,我们需要重新生成.mk文件去包括C++的testbench

--Wall 打开c++的warning

--trace 打开波形跟踪

之后我们就可以make了

-C obj_dir指的是工作目录,-f Valu.mk指我们所需要的makefile文件,生成的可执行文件为Valu,构建成功后,可以在obj_dir目录下看见Valu。

运行该应用,会在该目录生成waveform的文件。

得到仿真波形图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值