Skip to content

在difftest中查看仿真波形 #11

@stormkidorg

Description

@stormkidorg

在Difftest中查看仿真波形

描述:在调试过程中,遇到信号值不正确,单从emu程序中看不出问题的时候,可以考虑启用波形仿真。

1.修改源文件

1.1 make 相关

  • 文件:verilator.mk:定位到以下代码段(关键字trace
  • 文件路径:"你的项目名字"/difftest/verilator.mk
# Verilator trace support

EMU_TRACE ?= 1		#==============>>这一行<<==============#

ifeq ($(EMU_TRACE),1)

VEXTRA_FLAGS += --trace

endif
  • EMU_TRACE ?= 修改为 EMU_TRACE ?= 1 ,并保存
    • 修改后将启用 verilator 的波形生成功能
    • 有关trace选项的功能描述详见 verilator 官方文档 Verilator (veripool.org)
    • 章节 "8.1.8 How do I generate waveforms (traces) in C++?"

1.2 difftest 源码

  • 文件:emu.h
  • 文件路径:"你的项目名字"/difftest/src/test/csrc/verilator/emu.h
#define VM_TRACE 1
  • 在 "文件" 中加入如上的宏定义,并保存

2.编译和运行

2.1 编译新的emu程序

  • 进入 "你的项目名字"/difftest 目录执行以下命令,生成新的emu程序
make emu

2.2 运行emu程序

  • 进入"你的项目名字"/build目录,执行以下命令(将emu*.bin文件拷贝到其他地方执行也可以,只要你知道这两个文件的路径)
./emu -i add-riscv64-mycpu.bin
  • 程序会统计仿真时钟周期个数Guest cycle spent: 22("22"是例子具体要看你自己的程序)
    • 注意:仿真周期个数统计需要在SimTop.v中接入 “DifftestTrapEvent ”模块
    • 可参考:oscpu-framework,接入DifftestTrapEvent

  • 执行以下命令,获取帮助提示
./emu -h

  • 注意红框部分的描述,执行以下命令
    • -b:开始记录的第 n 个周期
    • -e:结束记录的第 N 个周期
    • 由上面得到的Guest cycle填入0和22,表示全程记录
./emu -b 0 -e 22 --dump-wave -i add-riscv64-mycpu.bin
  • 预期得到以下输出

  • "你的项目名字"/build目录下会生成以时间命名的*.vcd文件

3.使用gtkwave观察仿真波形

  • 打开*.vcd文件,添加一些信号,即可查看仿真波形

4.思路过程

  • 这里是我启用difftest框架中功能的思考

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions