本专栏之前的文章中我们介绍了UC Berkeley开发的Rocket/BOOM处理器以及配套的Chipyard平台。这篇文章给大家介绍国内知名芯片设计公司平头哥开发的SMART平台。
平头哥半导体是国内开源芯片的积极引领者,其一直致力于国内特别是RISC-V架构处理器的开源工作。 SMART平台给笔者的感受就是它真心想为用户创造一个便于使用并且可以自由开发的的生态。通过SMART平台用户可以以更低的门槛使用平头哥的开源处理器,这对于国内RISC-V的普及与推广、激发更多同学对处理器技术的兴趣起到了非常重要的作用。
SMART平台是一个处理器仿真平台,它具有如下功能:
- 使用目标处理器进行SoC集成
- 仿真集成的SoC运行测试程序
- 查看测试报告
- 查看SoC仿真信号波形
- 替换仿真使用的Memory和ICG
除此之外,它还特别设计了图形界面帮助用户快速使用这些功能,这一点也是笔者觉得比较赞的。
SMART平台支持平头哥的多种处理器,本文接下来使用的SMART平台内的处理器为业界报导的性能最强的RISC-V处理器——平头哥C910处理器。
SMART平台有哪些内容
拿到Smart平台后,我们可以看到其根目录下有如下几个文件和目录:
setup.csh
是一个CShell脚本,用来快速设置SMART平台运行所需的环境变量;run_smart
文件是一个使用wish脚本编写的图形化界面,用于快速调用SMART的各项功能,具体介绍见下文;tools
目录中为仿真时用到的一些工具、脚本,值得注意的就是将hex文件转换为pattern文件(用于tb中初始化存储器)的工具就在这里;lib
目录为运行程序所需的库文件,包括连接脚本、程序初始化、中断向量表和中断服务程序等;rtl/cpu
目录存放着CPU的源码(仿真模型)及其相关的Memory等IP;rtl/platform
目录存放Smart平台,主要是SoC相关的代码;tb
目录存放仿真用的testbench,包含内存的初始化、信号波形保存、仿真行为结束判定以及程序运行轨迹的检测等功能;case
目录存放仿真的测试激励,包括C程序和汇编程序两种,包括性能、低功耗、中断等多种测试程序;workdir
为用户使用的目录,存放仿真产生的临时文件、测试结果和波形等。
SMART平台有哪些功能
作为一个平头哥处理器的集成与测试平台,SMART具有相当多方便的功能,本节接下来给予一一介绍。
修改setup.csh
setup.csh
中主要为仿真工具选择及其对应的环境变量的设置,刚拿到SMART平台首次使用前,需要按照自己的实际情况修改setup.csh
。
我们先选择仿真工具。SMART平台支持VCS和IRUN两种仿真工具,本文中使用笔者较为常用的Synopsys VCS进行仿真。 选择方法是在setup.csh
的开头选择set EDA_TOOL = VCS
。
之后设置主要的环境变量VERDI_HOME
, DEBUSSY_PLI
以及VCS_HOME
,以及VCS的License脚本路径。
保存后在命令行中运行setup.csh使其生效(以后每次新打开命令行运行SMART平台前均需此步骤):
source setup.csh
打开图形界面
为了方便用户快速使用SMART平台的各种功能,SMART使用wish设计了一个图形界面。在SMART根目录中执行如下命令,即可打开SMART的图形界面,SMART图形界面上共有6组命令。
./run_smart
第一组命令有关环境变量设置与使用方法介绍。点击open setup.csh
即可打开前面提到的环境变量配置文件;点击open smart readme
即可打开SMART的README文件,该文件中为SMART平台以命令行方式(即非图形界面方式)运行的使用说明。
第二组命令可以查看代码和波形。点击open_verdi
即可通过verdi查看SMART平台仿真使用的SoC代码和处理器代码;点击open_wave
即可使用verdi查看仿真最新一次生成的fsdb波形文件。
第三组命令与集成有关。点击open integration ref
可打开处理器SoC集成方案示例,在无特殊需求时,使用此方案进行集成是一种比较好的选择;点击open clk_en ref
可以打开处理器时钟系统的集成实例,通过其中的CLOCK_RATIO
参数可以配置不同的系统时钟分频得到clk_en
,根据仿真结果可用于实际电路系统的设计。
第四组命令是处理器调试功能的测试代码。笔者将它们理解为jtag模块的测试与使用方法示例。这些测试,通过操纵jtag信号将处理器置于debug模式,并且通过一系列task来完成读写寄存器或Memory的操作。点击open mem/gpr test code
可以查看这些测试代码,点击run debug mem/gpr test
可以执行测试。
第五组命令是测试用例相关。点击run_dhry
可以仿真运行Dhrystone程序(和本专栏前面使用Rocket/BOOM仿真执行的Dhrystone程序相同,本文下面也会使用Dhrystone程序测试平头哥C910处理器的性能); 点击run_int_case
可以运行中断相关的测试用例,其中ct_plic_int_smoke.s
为软件中断的测试程序,ct_plic_int_smoke_hw.s
为硬件中断的测试程序,用户也可以参考这些测试程序,进行自定义中断服务函数设计、中断配置、中断触发等; open_case_list
可以查看当前SMART平台支持的所有测试用例,而点击run_all_function_case
则一键运行上面看到的这些用例,之后可以通过case_report_check
查看测试报告,部分典型测试用例介绍见下文。
第六组中的Exit
命令则可退出SMART图形界面。
SMART平台中的测试用例
为了更广地覆盖处理器测试的各个方面,平头哥SMART平台包括了二十多个测试用例,包括整数/浮点计算、向量指令、中断与异常、CSR读写以及Cache相关测试等。下面举几个测试用例等典型例子:
- ct_imac_smoke.s:覆盖RV64IMAC指令集指令
- ct_cskyee_smoke.s:覆盖RV64平头哥拓展指令集指令
- ct_vdsp_smoke.s:覆盖RV64V定义的Vector整形运算指令,包括VALU、 VMISC、VMASK、VMULT、VSHIFT、VDIV等指令
- ct_csr_operate.s:覆盖CSR的寄存器读写,立即数读写和位操作
- ct_lsu_amo_basic_smart.s:对每条amo指令功能进行功能测试
- ct_lsu_dcache_clr_64k_smart.s:测试在64Kcache配置下的dcache.cva,dcache.csw,dcache.call指令的功能
- ct_lsu_prefetch_prf_basic_va_smar.s:测试L1、L2预取功能开启,以及不同的预取长度设置下的预取功能
使用SMART平台仿真C910处理器运行Dhrystone程序
本文接下来使用SMART平台仿真C910处理器运行Dhrystone程序,一方面是给大家展示一下使用SMART平台运行仿真、查看结果、查看波形的流程,另一方面也与Rocket/BOOM比较一下性能。
之前的文章中没有介绍Dhrystone是什么,导致许多读者反映不太理解,那本文在这里简要介绍一下Dhrystone程序。
Dhrystone是由Reinhold P. Weicker在1984年提出来的一个基准测试程序,其主要目的是测试处理器的整数运算和逻辑运算的性能。其测试方法很简单,就是单位时间内跑了多少次Dhrystone程序,其指标单位为DMIPS/MHz。 历史的原因我们把在VAX-11/780机器上的测试结果1757 Dhrystones/s定义为1 DMIPS,在其他平台测试到的每秒Dhrystones数应除以1757,才是真正的DMIPS数值,故DMIPS其实表示的是一个相对值。
运行Dhrystone程序
在SMART平台上运行Dhrystone程序非常容易,只要在图形界面上点击run_dhry
,或者在命令行中执行如下命令即可。
cd workdir # 进入工作目录
run ../case/dhry/Main.c # 执行仿真
之后即可在命令行中看到程序运行结果,如下图所示:
图中的结果为6.32222 dmips/MHz。 和上篇文章中一样,假定时钟频率为1MHz,换算成Dhrystone per Second约为11108.14,可以发现相比BOOM和Rocket有显著地提高。
查看波形
仿真程序结束之后,可以看到workdir中已经产生了fsdb文件,我们可以通过点击图形界面中的open_verdi
,打开verdi并查看该波形。
我们可以选择具体信号查看波形,通过波形我们一方面可以看处理器的行为(尤其是看处理器指令退休的监测信号,可以得知当前处理器执行完了哪些指令,如下图所示),另一方面也可以看整个平台各个部分的信号,这一点尤其在SMART平台上构建自己的SoC时特别有用。
本文小节
本文首先介绍了平头哥SMART平台的特点和功能,它是平头哥为方便用户使用平头哥处理器构建SoC而设计的仿真平台。之后我们在SMART平台中仿真平头哥C910处理器运行Dhrytstone程序,并与前文中的Rocket/BOOM进行对比,看出C910的性能确实远高于BOOM。最后我们通过观察波形来观察处理器的行为。