2021年9月27日星期一

用verilator搭的测试框架大概流程

verilator testbench 和 run_func之间的关系

 

chiplab/sims/verilator/run_func下有Makefile_run

还有configure.sh,makefile,生成的文件有output等。

 

chiplab/software/下是测试代码,还有testbench代码

u@unamed:~/prjs/chiplab/software$ ls
coremark  dhrystone  func  generic  linux  my_program  random_boot

 

func下就是func_lab3这样的测试例子。

 

verilator模拟的时候是需要先编译verilog项目,再编译testbench cpp代码,然后运行编译好的二进制代码模拟。

testbench在sims/verilator目录下,include目录里是测试框架的实现部分。

u@unamed:~/prjs/chiplab/sims/verilator/testbench$ ls
include  sim_main.cpp  simu_top.v

比如include/testbench.h里是CpuTestbench的实现。run_func/Makefile_run里的参数例如DUMP_DELAY也都是传递给testbench cpp代码的。

        ../output ${RUN_FLAG} --dump-delay $(DUMP_DELAY) --dump-trace $(DUMP_TRACE) --time-limit $(TIME_LIMIT) --save-bp-time $(SAVE_BP_TIME) --ram-save-bp-file $(RAM_SAVE_BP_FILE) --top-save-bp-file $(TOP_SAVE_BP_FILE) --restore-bp-time $(RESTORE_BP_TIME) --ram-restore-bp-file $(RAM_RESTORE_BP_FILE) --top-restore-bp-file $(TOP_RESTORE_BP_FILE)


testbench编译出来就是这个output。

u@unamed:~/prjs/chiplab/sims/verilator/run_func$ ls
config-generator.mak  config-software.mak  log   log_script  Makefile_run  obj_dir  qemu_system_run.sh
config.log            configure.sh         logs  Makefile    obj           output   tmp

比如,software/func/func_lab3下面并没有编译生成的文件,而是在下面这个目录

u@unamed:~/prjs/chiplab/sims/verilator/run_func/obj/func/func_lab3_obj/obj$ ls
data_ram.coe  data_ram.mif  inst_ram.coe  inst_ram.mif  main.bin  main.data  main.elf  rom.vlog  test.s


main.elf就是func_lab3编译生成的longarch目标代码,通过func_lab3下的convert.c转换成main.bin, main.data,最终以指令内存和数据内存的形式(data_ram.coe data_ram.mif inst_ram.coe inst_ram.mif)由testbench的ouput程序加载。


测试程序运行的流程大概是这样:

chiplab/sims/verilator/run_func下运行make

在Makefile中分别编译testbench,run_func,生成文件复制到run_func下相应的目录

(可能还有golden trace)

然后Makefile里调用Makefile_run

Makefile_run里最终调用output(也就是testbench编译生成的),把编译好的目标代码以指令内存和数据内存文件的方式送给output。

 

 

要测某一条指令,可以在run_func下写个一句汇编(比如addi.w)的程序,编译以后生成inst_ram,运行testbench后检查寄存器。