蜂鸟E203(二)如何运行Verilog仿真测试平台

从github下载蜂鸟E203如下所示(github上仅提供E203源代码):
在这里插入图片描述
在这里插入图片描述
riscv/riscv-tools在(一)已经在eclipse中配置完成。
risc-v tools包含:
(1)GCC(GNU C compile)
(2)C运行库
(3)Binutils
(4)GDB以及Openocd

(其中在使用git的过程中,一般我们总会有些文件无需纳入git的管理,也不希望它们总出现在未跟踪文件列表,这些文件通常是日志文件、临时文件、编译产生的中间文件、工具自动生成的文件等等。此时我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式,Git会根据这些模式规则来判断是否将文件添加到版本控制中)

如何在verilog tb中利用vcs 软件运行riscv-tests自测试用例
在这里插入图片描述
自测试用例(riscv-test),由上图所示,在其子文件夹isa下,包含由汇编语言编写的一些测试处理器是否符合指令集架构定义的测试文件。
其中不同文件夹均是扩展指令集的指令测试:
基础指令集:RV32I RV64I

标准扩展 M(整数乘/除)

标准扩展A(原子内存操作)

标准扩展 C(精简的16位指令)

标准扩展 F(单精度浮点数)

标准扩展 D(双精度浮点数)

特权级 M(Machine)

特权级U(User)

特权级S(Supervisor)

扫描二维码关注公众号,回复: 8555116 查看本文章

而riscv-tests中这些指令集架构(ISA)的测试用例都是使用汇编语言编写,为了在仿真阶段能够被处理器执行,还需要将这些汇编程序编译成二进制文件。而在generated文件夹下,已经预先上传了一组编译完成的可执行文件和反汇编文件,以及能够被verilog 的tb文件readmemh函数读入的文件。
在这里插入图片描述
在这里插入图片描述
而testbench测试平台的主要功能在于:
1、例化DUT文件,并生成时钟和复位信号
2、根据运行命令解析测试用例的名称,并使用系统函数readmemh读入相应文件的内容,然后使用文件中的内容初始化ITCM
在这里插入图片描述
在这里插入图片描述
3、在运行结束后分析该测试用例是否执行成功,在tb文件中对x3寄存器进行判断,如果x3为1,则意味pass,否则fail
在这里插入图片描述
使用makefile 运行测试用例:

SIM_DIR     := ${PWD}
RUN_DIR      := ${PWD}/run
TESTNAME     := rv32ui-p-add 
TESTCASE     := ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/${TESTNAME}
DUMPWAVE     := 1
CORE        := e203
CFG         := ${CORE}_config

E201        := e201
E203        := e203
E205        := e205
E205F       := e205f
E205FD      := e205fd
E225FD      := e225fd

#将CORE_NAME中的CORE变量中如果有小写转换成大写
#将core_name中的CORE变量中如果有大写转换成小写
CORE_NAME = $(shell echo $(CORE) | tr a-z A-Z) 
core_name = $(shell echo $(CORE) | tr A-Z a-z)
#echo $(CORE) | tr a-z A-Z tr(translation) 常被用于更改字符,
#tr从标准输入中替换、缩减和删除字符,并将结果写到标准输出。
#注意:tr只能通过stdin,而无法通过命令行参数来接收输入,tr {选项} {src_str} {dest_str}
#如果两个字符集的长度不相等,那么dest_str会不断重复其最后一个字符,直到长度与src_str相同
#如果dest_str长度大于src_str,那么在dest_str中超出src_str的部分字符全部忽略。
all: run_test

install: 
	mkdir -p ${SIM_DIR}/install/tb #-p 确保父目录名称存在,如果父目录不存在的就新创建一个。
	cp ${SIM_DIR}/../tb/tb_top.v ${SIM_DIR}/install/tb/ -rf
	sed -i "s/e200/${core_name}/g" ${SIM_DIR}/install/tb/tb_top.v
	sed -i "s/E200/${CORE_NAME}/g" ${SIM_DIR}/install/tb/tb_top.v
	cp ${SIM_DIR}/../rtl/${core_name} ${SIM_DIR}/install/rtl -rf
#sed -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
# -e :直接在命令列模式上进行 sed 的动作编辑
# -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
# -i :直接修改读取的文件内容,而不是输出到终端。
#function
#a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
#c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
#d :删除
#i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
#p :列印,亦即将某个选择的数据印出。
#s : 取代
# /g与不加g的区别:(加g表示global) e200->core_name
${RUN_DIR}:
	mkdir -p ${RUN_DIR}
	rm -f ${RUN_DIR}/Makefile
	ln -s ${SIM_DIR}/bin/run.makefile ${RUN_DIR}/Makefile

compile: ${RUN_DIR}
	make compile RUN_DIR=${RUN_DIR} -C ${RUN_DIR}

wave: ${RUN_DIR}
	make wave TESTCASE=${TESTCASE} RUN_DIR=${RUN_DIR} -C ${RUN_DIR}

run_test: compile
	make run DUMPWAVE=${DUMPWAVE} TESTCASE=${TESTCASE} RUN_DIR=${RUN_DIR} -C ${RUN_DIR}

SELF_TESTS := $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32uc-p*.dump))
ifeq ($(core_name),${E203})
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32um-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ua-p*.dump))
endif
ifeq ($(core_name),${E205})
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32um-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ua-p*.dump))
endif
ifeq ($(core_name),${E205F})
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32um-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ua-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32uf-p*.dump))
endif
ifeq ($(core_name),${E205FD})
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32um-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ua-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ud-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32uf-p*.dump))
endif
ifeq ($(core_name),${E225FD})
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32um-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ua-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ud-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32uf-p*.dump))
endif

SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32ui-p*.dump))
SELF_TESTS += $(patsubst %.dump,%,$(wildcard ${RUN_DIR}/../../riscv-tools/riscv-tests/isa/generated/rv32mi-p*.dump))

regress_prepare:
	make compile
	@-rm -rf ${RUN_DIR}/rv32*.log
regress_run:
	$(foreach tst,$(SELF_TESTS), make run_test DUMPWAVE=0 TESTCASE=$(tst);)
regress_collect:
	@-rm -rf ${RUN_DIR}/regress.res
	@find ${RUN_DIR} -name "rv32*.log" -exec bin/find_test_fail.csh {} >> ${RUN_DIR}/regress.res \;
	@cat ${RUN_DIR}/regress.res
regress: regress_prepare regress_run regress_collect 

clean:
	rm -rf run
	rm -rf install

.PHONY: compile run install clean all run_test regress regress_prepare regress_run regress_collect 

(1) make install CORE=e203
运行该命令为e203 编译进行预先操作,该命令会在vsim 目录下生成一个install 子文件夹,在其中放置rtl 和tb 文件,并修改关键字

(2)由于E203 的makefile 默认iverilog作为仿真工具,接下来使用vcs 作为仿真工具
1、修改run.makefile文件,添加vcs仿真工具的配置
2、修改tb文件,使用系统函数$vcdpluson产生波形

(3)make compile
编译core和soc的RTL代码

(4)make run_test
将github中makefile中的echo命令注释;->这是打印一个虚假的PASS到log文件,用户需要使用真正的仿真器(本次使用的是vcs)得到真实的运行结果。

(5)make regress_run
使用e200_opensource/riscv-tools/riscv-tests/isa/generated目录中testcases,逐个的运行testcase。

(6)make regress_collect
收集步骤五运行的测试集的结果,将打印若干行的结果,每一行对应一个测试用例,如果那个测试用例运行通过,则打印pass,否则,打印fail。
在这里插入图片描述

发布了54 篇原创文章 · 获赞 4 · 访问量 1047

猜你喜欢

转载自blog.csdn.net/buzhiquxiang/article/details/103349704