Sci论文 - 至繁归于至简,Sci论文网。 设为首页|加入收藏
当前位置:首页 > 计算机论文 > 正文

基于FPGA 的 RISC-V CPU矩阵乘法定制指令实现论文

发布时间:2022-06-30 11:48:59 文章来源:SCI论文网 我要评论














SCI论文(www.lunwensci.com):

  摘要:RISC-V作为新一代开源精简指令集,具有功耗低、面积小和性能高的优点,尤其是基于FPGA实现的RISC-V CPU可以为不同应用场景进行定制优化。本文主要研究了对在FPGA中实现的RISC-V CPU添加硬件实现的自定义指令的方法,并以信号处理中常见的矩阵乘法为例,增加专用的矩阵乘法指令对重复耗时的矩阵运算进行加速,提升其在特定应用领域的整体系统性能。

  关键词:RISC-V;自定义指令集;FPGA

  Implementation of Customized Instruction for RISC-V CPU Based on FPGA

  SHAO Yimin,ZHOU Jun,QIN Gong

  (Jianghan University,Wuhan Hubei 430056)


  【Abstract】:As a new generation open-source RISC CPU,RISC-V has many advantages such as low power dissipation,small area,high performance,etc.Especially,Realized in FPGA makes it a tailorable platform optimized for different application scenarios.We researched the ways to add customized instructions in FPGA based RISC-V CPU,and realized a matrix multiplication instruction as an example to accelerate the traditional repeated and time-consuming matrix operations that are frequently used in signal processing to improve the whole performance of the system.

  【Key words】:RISC-V;customized instruction;FPGA


  0引言

  RISC-V是始于加州大学伯克利分校的一个基于精简指令集(RISC)原则的开源指令集架构。该架构相较于传统x86和ARM成本更低,并可以针对应用场景自定义定制与优化,可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件[1-2]。总的而言,RISC-V开源、方便在FPGA实现,指令可定制与扩展,使其越来越被关注。

  本文主要分析和研究基于FPGA实现的RISC-V CPU架构,在基础指令集的基础上将信号处理中的某些复杂或耗时的运算通过硬件描述语言(HDL)进行硬件实现,并添加到CPU系统的方法。具体而言,通过专用硬件模块实现单周期的1×4与4×1矩阵乘法指令。由于乘、加运算是很多运算的基础,比如卷积、相关、矩阵运算等都需要大量乘法和加法运算,通用CPU通常只能逐一地用乘法、加法指令实现。而一旦CPU中增加专用的矩阵乘法指令,则可以将需要多个周期的多条的乘加运算分解为单一周期的专用矩阵乘法指令完成,从而实现运算加速、提升系统性能。经测试,采用该指令能明显提高这类运算的计算时间[3]。

  1 RISC-V指令集

  RISC-V指令集架构,简洁、模块化、可扩展及开源,可通过有限指令集的组合和扩展,构建适合任何领域的微处理器。RISC-V指令集包括基础整数指令集和扩展指令集两部分。其中,基础指令集根据整数位宽不同,又分为RV32I、RV64I等,扩展指令集则包括硬件乘除法(M)、压缩指令(C)、原子操作(A)、单精度浮点指令(F)等。显然,扩展指令集成为了RISC-V针对不同应用场景进行定制的一个特点,也体现了其用FPGA实现的优势,可以根据需要来实现基础指令集加若干扩展指令集的定制CPU。除此之外,RISC-V指令集编码空间还分成了标准(Standard)、保留(Reserved)和用户(Custom)三个部分,来进一步对指令集进行扩展增强,如图1所示。标准部分是由RISC-V基金会制定的,保留部分是预留给将来使用的空间,用户区则是用来给用户自定义的空间,这部分则可以更加灵活,本设计主要针对这部分进行研究。由图1可看到,RISC-V提供了custom-0~3四条指令供用户直接使用,进一步可以看到每条Custom指令还预留了子编码空间,能扩展出更多的自定义指令。当依照指令集设计指令时,指令中的操作码(Opcode)需按图1进行设计。比如设计custom-0,就需要将指令中的Opcode,即Inst[6:2]设计为00 010。对于32位及以上指令来说,最低2位Inst[1:0]始终为11。而对于16位指令,最低2位则不能为11,这种编码设计能使指令译码器方便地识别指令是多少位的。这里就可以确定待实现指令最低7位编码为:00 010 11。

\

  再进一步,需要根据指令的编码格式,如图2所示,设计出具体指令编码。RISC-V的R-type指令是寄存器类型,I-type是短立即数类型,S-type是内存存储类型,U-type是高位立即数类型,B-type是条件跳转类型,J-type是无条件跳转类型。

  矩阵乘法指令显然参数较多,需要从内存读入数据到寄存器来完成计算,不需要使用立即数,所以可以设计为R-type,硬件实现中则可以使用CPU内的若干寄存器作为源操作数。RV32I中定义了32个32位通用寄存器X0~X31,其中X10~X17,主要用来存放函数参数,所以定制的矩阵乘法选用1×4和4×1作为基本单位相乘,正好利用这8个寄存器。指令编码设计中还剩下功能字段funct3和funct7,参考加减运算,funct3定为000,funct7设为000 0001,不会出现冲突,rd则为目标寄存器。

  2基于FPGA的硬件设计

  通常,自定义指令主要是为了增加CPU在某方面的运算能力,所以这部分的硬件逻辑主要是对ALU单元的扩展,直接连在ALU单元上,如图3所示。

  根据具体要实现的逻辑功能不同,自定义指令需要占用的CPU时钟周期可能也不一样。比如,对于组合逻辑,在时钟的上跳沿,输入数据稳定的送到输入端口以后,结果只经过很短的传输延迟就能得到,所以在下一个时钟周期,就可以读取结果了,即对应着单周期指令。还有些运算采用时序逻辑,则往往对应着多周期指令,需要多个时钟周期才能完成操作。对于多周期指令,尤其是周期不确定时,则硬件上就需要使用运算开始和结束信号来进行标记。再比如,有些指令是操作内部寄存器的,还有些指令则可能是操作外部IO端口的,对应的硬件逻辑实现也各不相同。

  因此在进行自定义指令设计时,首先需要明确自定义指令对应的硬件逻辑类型,然后才能用HDL语言予以实现。

  用Verilog HDL语言实现乘、加的计算可以自行用复杂和快速的逻辑实现,也可以简化交由编译工具自动优化,直接用assign c=a×b;的形式,注意命名、位宽等尽量使用与原始代码中一致的预定义并添加详尽注释便于以后修改,计算的结果假设存到mtxmult_ result变量中。

  3基于蜂鸟e203开源核添加定制指令硬件

  蜂鸟e203处理器由芯来科技开发,是国内第一个完善的开源RISC-V处理器项目,提供了一套从模块到SoC,从硬件到软件,从运行到调试的完整解决方案,并且配备完整的文档,书籍和开发板。其研发团队经验丰富,使用稳健的Verilog 2001语法编写的可综合的RTL代码,以工业级标准进行开发,注释丰富、可读性强、易于理解。

  本设计基于蜂鸟e203,首先需要分析其Verilog HDL实现的代码结构,然后研究基于其实现扩展用户自定义指令的方法。

  蜂鸟e203指令的译码是通过e203_defines.v文件实现的,所以首先需要按照前面提到的指令编码设计来修改该文件,具体就是参考其规范,添加用于定制指令译码的宏。

  蜂鸟e203内核由e203_cpu_top提供,其中包括CPU(e203_cpu.v)和SRAMs(e203_srams.v)两个模块,其中CPU模块中包括时钟控制(e203_clk_ctrl.v)、内核(e203_core.v)、数据紧耦合存储器控制(e203_dtcm_ ctrl.v)、指令紧耦合存储器控制(e203_itcm_ctrl.v)、扩展控制与状态寄存器(e203_extend_csr.v)、中断同步(e203_irq_sync.v)和复位控制(e203_reset_ctrl.v)。其中,e203_core模块中实现了CPU的基本架构,包括总线接口单元BIU(e203_biu.v)、执行单元(e203 exu.v)、取指单元(e203_ifu.v)和存储器访问控制(e203_lsu.v)四个部分[6]。

\

  在执行单元模块的e203_exu_alu.v中实现了ALU的功能。完成矩阵乘法自定指令需要修改其中的数据通路文件e203_exu_alu_dpath.v。在其中增加输入接口以及乘、加运算逻辑,并需要添加一个运算请求信号,比如alu_req_mtxmult,该信号来源于e203_exu_alu_ rglr.v模块,根据其中alu_i_info得到的输出。对于矩阵运算的输出,则需要将其添加进原始代码的最终计算结果alu_dpath_res处。参考原始代码进行修改,将alu_req_mtxmult转成和指令相同的名称mtxmult,进行位扩展扩展到和数据位长相同后,再与计算结果(前面提到的mtxmult_result)相“与”后,再用相“或”的形式添加,参考代码如下:

  [原代码]|({`E203_XLEN{op_mtxmult}}&mtx mult_result)

  矩阵乘法指令的源操作数则由数据派遣模块(e203_ exu_alu)派遣到a0~a7寄存器的数据来获取,并作为e203_exu_alu模块的输入送到e203_exu_alu_dpath模块。

  完成硬件修改设计后,通过EDA工具进行编译,产生编程文件写入FPGA即得到带有定制指令的RISC-V CPU硬件部分。

  4编译链修改及软件应用方法

  虽然有了定制指令的CPU硬件,但是目前还无法使用该指令。因为编译工具链都是基于基础指令集而实现,并不认识我们自定义指令,所以还需要按照硬件的设计修改编译工具链,使其能正确的将自定义指令转为CPU认识的代码。

  首先,在GitHub的RISC-V官方代码riscv-opcodes文件夹中包含了RISC-V的所有指令集操作码信息以及控制与状态寄存器(CSR),同时还提供了用于转换的Python脚本文件parse_opcodes。首先需要修改riscv-opcodes文件夹下的opcodes-rv32i文件,按照前述的指令编码格式参考标准指令的写法,添加mtxmult指令如下:

  mtxmult rd rs1 rs2 31..25=1 14..12=0 6..2=0x02

  1..0=3

  接着用parse_opcodes加上-c参数,将opcodes-rv32i转换为mtxmult.h,其中会生成mtxmult指令的c语言宏定义MATCH_MTXMULT、MASK_MTXMULT。

  RISC-V工具链也是开源的,代码在GitHub上。所以接着需要下载RISC-V GNU工具链的源代码并更新子模块,安装编译所需的相关依赖。建议基于Linux环境对工具链进行编译,操作步骤将更简洁。得到编译链源代码后,就可以根据自定义指令对相关源代码进行修改,重新编译,生成针对包含自定义指令的专用编译工具链。

  接着需要修改riscv-opc.h,按照在mtxmult.h中生成的宏,添加如下内容:

  D ECLA RE _ IN S N(mtxmult,MAT CH _ MTXMULT,MASK_MTXMULT)

  同时还要修改riscv-opc.c源文件。参考其中riscv_ opcodes[]中的写法,添加

  {“mtxmult”0,INSN_CLASS_I,“d,s,t”MATCH_ MTXMULT,MASK_MTXMULT,match_opcode,0}

  然后编译该工具链,完成后即可得到能识别mtxmult自定指令的riscv编译器。此时,可以写一个最简单的C语言代码,添加一条mtxmult指令进行编译,检查编译器是否能成功编译。

  获得编译链以后,还有最后一个问题就是如何正确使用该指令了。由于在硬件设计中,是从X10~X17这几个寄存器中获得操作数,所以最方便的还是通过RISC-V

  CPU的内联汇编的方法来将指令的应用封装好,使用户调用时更方便,参考代码如下:

  asm volatile(

  “lw x10,%[a0]tn“

  “lw x11,%[a1]tn“

  ...

  “lw x17,%[a7]tn“

  “mtxmult%[output],x12,x13tn“

  :[output]“=r“(reg)//输出操作数

  :[a0]“m“(a[i*A_COL+(k+0)]),//输入操作数,

  [a1]“m“(a[i*A_COL+(k+1)]),

  ,[a7]“m”(b[(k+3)*B_COL+j])

  :“x10“,“x11“,“x12“,“x13“,“x14“,“x15“,“x16“,“x17“);//受影响的寄存器。

  其中,a0~a3代表矩阵A的第i行,第k+0,1,2,3列的四个元素,a4~a7代表矩阵B的第k+0,1,2,3行的四个元素。

  显然,以蜂鸟e203而言,其乘法也是由17步的加法完成,因此完成一个基本运算需要17×4+3=71步。而现在只需要一个mtxmult指令在一个周期即可完成(假设不包含数据装载到寄存器耗时),较大程度的提高了矩阵乘法的运算速度。

  5测试

  针对增加了定制指令的RISC-V CPU,我们用其实现了一个32×128与128×32的矩阵乘法运算进行测试。矩阵乘法中通过将矩阵分解为1×4与4×1的计算,按照内联汇编的方式调用mtxmult指令进行循环,记录执行耗时。另外则是直接按照没有自定指令,使用乘法运算循环来实现,记录运行耗时进行对比。

  RISC-V中有3个64位计数器,分别为:Instret、Cycle、Time,可以用来评估器件的硬件性能。其中,Instret计数器可以统计自CPU复位以来共运行了多少条指令;Cycle计数器可以统计自CPU复位以来共运行了多少个周期;Time计数器由已知的固定时钟频率驱动,可以获取自CPU复位以来共运行了多少时间。3个计数器的值可以调用get_instret_value()、get_cycle_ value()、get_timer_value()三个函数来获得。

  测试结果如图4所示,其中图a为未使用定制指令的运行结果,图b为使用自定义指令后的运行情况,可以看到采用自定义指令后,运行时间约为未使用定制指令的1/5。

  6结语

  本文介绍了RISC-V指令集架构技术特点,并详细说明了RISC-V CPU自定义指令的硬件与软件实现方法,并通过在基于FPGA上实现的RISC-V RV32I指令集CPU上增加自定的1×4与4×1矩阵乘法指令,实现了对信号处理中的乘加类运算优化,效果明显。

  实验结果证明,基于FPGA实现的RISC-V CPU可以方便地扩展自定义指令,从而对特殊运算进行硬件加速。定制实现的矩阵乘法指令在需要大量乘加运算模型中,能较好地节省运算时间。这种灵活的设计方式必将为在FPGA中实现RISC-V CPU带来更多的生命力。

  参考文献

  [1]廖汉松,吴朝晖,李斌.基于RISC-V的卷积神经网络专用指令集处理器[J/OL].计算机工程:1-9[2021-06-20].https://doi.org/10.19678/j.issn.1000-3428.0058371.

  [2]李东泽,曹凯宁,曲明,等.五级流水线RISC-V处理器软硬件协同仿真验证[J].吉林大学学报(信息科学版),2017,35(6):612-616.

  [3]李晓霖,韩萌,郝凯,等.面向100 Gbps网络应用的RISC-V CPU设计与实现[J].计算机辅助设计与图形学学报,2021,33(6):956-962.

  [4]Huang J.AI Drives the Rise of Accelerated Computing in Data Centers[EB/OL].[2021-06-20].https://blogs.nvidia.com/blog/2017/04/10/ai-drives-rise-accelerated-computing-datacenter/.

  [5]Albert Ou,Arun Thomas,Andrew Waterman.Volume 1,Unprivileged Spec v.20191213[EB/OL].[2021-06-20]https://riscv.org/technical/specifications/.

  [6]Hummingbirdv2 E203 Core and SoC.Hummingbirdv2 E203 Core and SoC 0.2.1 documentation.2021-6-12.https://doc.nucleisys.com/hbirdv2/. 
 
关注SCI论文创作发表,寻求SCI论文修改润色、SCI论文代发表等服务支撑,请锁定SCI论文网!

文章出自SCI论文网转载请注明出处:https://www.lunwensci.com/jisuanjilunwen/39779.html

发表评论

Sci论文网 - Sci论文发表 - Sci论文修改润色 - Sci论文期刊 - Sci论文代发
Copyright © Sci论文网 版权所有 | SCI论文网手机版 | 鄂ICP备2022005580号-2 | 网站地图xml | 百度地图xml