案例学习:verilog写一个双控开关,并进行仿真验证

1.进行verilog代码的编写

module example(
input a,
input b,
output f
);

assign f=a^b ;

endmodule

2.紧接着进行验证代码的编写

#include <verilated.h>
#include <verilated_vcd_c.h>
#include "Vexample.h"
#define MAX_SIM_TIME 300

vluint64_t sim_time = 0;

int main(int argc, char** argv, char** env) {
  Verilated::commandArgs(argc, argv);
  Vexample *dut = new Vexample;
  Verilated::traceEverOn(true);
  VerilatedVcdC *m_trace = new VerilatedVcdC;
  dut->trace(m_trace, 5);
  m_trace->open("waveform.vcd");

  while (sim_time < MAX_SIM_TIME)   //主函数

  {    
    int a = rand() % 2;    //随机产生但比特信号
    int b = rand() % 2;   //随机产生但比特信号
    dut->a =a ;             //对dut中的信号a赋值
    dut->b =b ;            //对dut中的信号b赋值
    dut->eval();           //通过 `eval()`函数更新电路的状态

    if (dut->f != (a^b))   //查看结果是否与预期相符合
    {
          std::cout<<"ERROR: f mismatch, "<< "exp: " 
            << (int)(a^b) <<"simtime: "                
            <<sim_time<<std::endl;
    }

    m_trace->dump(sim_time);  //将对应的时间dump进去
    sim_time++ ;  //循环结束前,把时间加1 .
 }

m_trace->close();
delete dut;
exit(EXIT_SUCCESS);

}

3.Makefile脚本编写

MODULE=example  //文件名**

.PHONY:sim
sim: waveform.vcd

.PHONY:verilate
verilate: .stamp.verilate

PHONY:build
build: obj_dir/Vexample

.PHONY:waves
waves: waveform.vcd

waves: waveform.vcd
    @echo
    @echo "### WAVES ###"
    gtkwave waveform.vcd

waveform.vcd: ./obj_dir/V$(MODULE)
    @echo
    @echo "### SIMULATING ###"
    ./obj_dir/V$(MODULE) +verilator+rand+reset+2

./obj_dir/V$(MODULE): .stamp.verilate
    @echo
    @echo "### BUILDING SIM ###"
    make -C obj_dir -f V$(MODULE).mk V$(MODULE)

.stamp.verilate: $(MODULE).v tb_$(MODULE).cpp
    @echo
    @echo "### VERILATING ###"
    verilator -Wall --trace --x-assign unique --x-initial unique -cc $(MODULE).v --exe tb_$(MODULE).cpp
    @touch .stamp.verilate

.PHONY:lint
lint: $(MODULE).v
    verilator --lint-only $(MODULE).v

.PHONY: clean
clean:
    rm -rf .stamp.*;
    rm -rf ./obj_dir
    rm -rf waveform.vcd

4.结果展示:

make sim //使用makefile进行仿真,得到waveform.vcd文件

gtkwave waveform.vcd //打开波形文件

如果将dut中的逻辑更改之后,会产生报错信息

由此可见,添加:std::cout<<"ERROR: f mismatch, "<< "exp: " << (int)(a^b) <<"simtime: "<<sim_time<<std::endl;

这条语句是十分有帮助的,对于检查错误

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin_wuminghao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值