1.1 仿真测试平台
SoC芯片的仿真测试依赖于仿真测试平台Testbench。图5-1给出了本文SoC芯片的仿真测试平台结构。Testbench基于Verilog和交叉编译环境设计,被测试的部件叫做DUT(Design Under Test)。在对DUT施加激励之前,要设置测试平台的“timescale”来指定测试平台的时间单位和时间精度。例如,timescale为1ns/1ps,表明在该仿真测试平台中的时间单位是1ns,时间精度是1ps。
图5-1 测试平台架构图
Testbench环境产生DUT所需的时钟和复位信号,以及DUT激励信号,就组成了testbench的“最小系统”。然后,编写测试用例来测试被测试设计的。
首先使用本文前面介绍的GCC工具链编译C程序或者汇编文件,生成机器代码,在testbench初始化阶段通过“$readmemb”函数读入XQ900RV的指令存储器IMEM中。XQ900RV复位完成后,会从指令存储器中的第一条指令开始执行。
1.2 指令集仿真测试
1.2.1 基础指令集仿真测试
基础指令集测试采用RISC-V官方提供的测试用例“riscv-tests”进行测试,其包含IMAFDC指令集的全部测试用例。测试用例使用汇编语言编写,使用本文构建的GCC工具来逐个编译上述测试用例,将生成的hex文件使用Verilog中的“$readmem”函数读入指令存储器,在测试平台运行指令测试。
由于RISC-V基础指令集包含上百条指令,如果一一测试的话十分耗费时间,因此本文中编写回归测试Makefile脚本,自动批量执行基础指令测试。为方便观察仿真测试结果,本文在Makefile脚本中设计了“make regress”命令来测试全部的指令集,并将每个指令的执行结果输出于一个文件中,便于查看全部回归测试结果,如图5-2所示:
图5-2 部分基础指令集测试结果
1.2.2 K指令集仿真测试
本文在验证实现的加解密指令时,首先使用C语言编写算法的测试原型,算法原型产生“Golden Data”用于参照。在编写C算法原型的时候,预留本文扩展的加解密指令的接口。在没有使用加解密指令的C算法原型中,使用C语言描述各个加解密指令的逻辑;在进行加解密指令测试时,用本文3.4节编译器提供的内建加解密builtin函数实现。
1.3 FPGA原型验证
FPGA进行原型验证不仅进一步验证系统的功能和性能,更可以加速仿真过程,对于复杂应用程序的仿真验证效率提升更为明显。FPGA原型验证流程包括:首先将所有的RTL设计移植到FPGA中;接着将调试无误后执行FPGA开发流程,即约束、综合、布局布线并产生bitstream文件,并将生成好的bitstream文件下载到FPGA开发板中;最后将仿真测试用例使用本文3.4节提供的编译器编译好后,加载到FPGA的RAM里,编写程序使用按键控制FPGA上电运行。
本文使用测试板为AX7A200,FPGA芯片型号为Xilinx的xc7a200t-484-2,如图5-3所示。
图5-3 AX7A200 FPGA开发板
在Vivado2021.1工具中对本设计进行综合之前,需要给SoC设置约束。约束主要包括时钟约束、约束复位按键等。
1.4 性能及分支预测测试
1.4.1 Coremark性能测试
为测试处理器核心的性能指标,常使用标准测试程序(Benchmark)。标准测试程序执行一组数学运算,以测试处理器核心的整数及浮点运算能力。常见的测试程序有Drystone、SpecInt 2k6和Coremark等[56]。
EEMBC将Coremark代码托管在Github平台。用户可以修改Interations变量的值来更改Coremark迭代次数,为了更加准确地测试CPU的性能,需要迭代10次以上才能获得较为稳定的结果。本文使用两种Coremark程序运行方法,第一种是使用软件仿真平台运行不同次数的Coremark程序;第二种是使用FPGA加速Coremark仿真测试。如本文1.1节所述,使用两种测试方法都需要将应用程序编译成对应的二进制代码。另外,使用本文所述的FPGA原型测试平台还需将生成的程序文件分解为4个bank。
仿真软件采用单线程的iverilog、单线程的Verilator、单线程的VCS和FPGA。其中,iverilog是一款开源的轻量级仿真器;Verilator是一款开源的、能够将硬件描述语言转换成C或System C等高级语言描述模型的编译型仿真器;VCS是Synopsys的高性能编译型商用仿真器。实验主机CPU为Intel i7 12700H,仿真软件运行在在Centos7系统,FPGA运行频率为35MHz。在Coremark程序中设置迭代10次,对本文SoC平台进行测试。结果如表5-1所示。
表5-1 不同仿真方式的测试时间和结果
仿真工具 | Iverilog | Verilator单线程 | VCS单线程 | FPGA |
测试时间 | 10+小时 | 8分钟 | 5分钟 | ~5秒 |
Coremark得分 | 3.29 | 3.29 | 3.29 | 3.29 |
1.4.2 分支预测器性能分析
为检验分支预测器改进对CPU性能的影响,本文进一步设计了验证环境来测试静态分支预测器、Gshare分支预测器以及改善分支别名以后的Bi-Mode分支预测器。
CPU性能计量的一种方法是使用IPC,即每周期执行的指令个数。本文用1.4.1节Coremark程序作为测试的基准程序,分别测试在XQ900RV中使用静态分支预测器、Gshare分支预测器和Bi-Mode分支预测器的Coremark程序运行情况。为了计算IPC,在测试平台中检测CPU的退休指令数目,同时统计Coremark程序运行的CPU时钟周期数,就可以计算出指令的IPC,公式如下:
1.5 本章小结
本章首先搭建了测试平台,使得程序能够被正确编译并生成对应的二进制格式文件。通过将生成的文件加载到系统的指令存储器中,实现了基础指令集和扩展指令集的仿真测试,对于扩展指令集,测试了SHA256指令的加速效果。此外,本章还介绍了使用FPGA进行原型验证的相关工作,通过在FPGA上运行测试用例并使用UART观察测试结果,完成了对处理器的原型验证。最后,本章对处理器进行了Coremark测试,使用FPGA硬件加速仿真,评估其性能,并测试了不同分支预测器对处理器IPC的影响。