Skip to content

在difftest中查看仿真波形 #11

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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions