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后检查寄存器。