• 【蜂鸟E203内核解析】Chap.4 累加运算NICE协处理器的设计



    前言:本文均为作者原创,内容均来自本人的毕业设计。 未经授权严禁转载、使用。里面的插图和表格均为作者本人制作,如需转载请联系我并标注引用参考。分享仅供大家学习和交流。

    1. 累加运算协处理器的设计

      NICE协处理器的调用需要创建用户自定义RISC-V的指令,NICE 支持自定义硬件联合单元的集成,从而提高特定领域的性能,同时降低功耗[6]。
      本设计开发了一个加法运算的协处理器用于加速累加运算操作,其中利用了DDR3数据存储器作为数据缓冲区(详见本论文4.1),将所需进行累加操作的三个数据输入到DDR3内部进行存储,利用NICE协处理器操作存储器提取所需数据到协处理器内部,处理后的数据通过rd寄存器输出,如图4-9所示。由于协处理器的运行是独立于处理器的内核,故可以独立于主处理器进行运算操作,可以减少运行的指令并减少流水线处理累加运算的时钟周期
    在这里插入图片描述

    图4-9 累加运算协处理器

    2. 累加运算协处理器的调用

      调用NICE接口有4个通道,请求通道、内存请求通道、响应通道、和内存响应通道。请求通道:主处理器在流水线的EXU级时,将指令的编码信息和源操作数传输到协处理器。反馈通道:协处理器告诉主处理器其已完成了该指令,并将结果反馈到主处理器。存储器请求通道:协处理器向主处理器发起存储器读写请求。存储器反馈通道:主处理器向协处理器写回存储器读写结果。各个通道信号说明如表4-2所示。

    表4-2 每个通道的信号的详细说明
    通道方向宽度信号名描述
    请求通道Output1nice_req_valid主处理器发送指令请求信号给协处理器
    Input1nice_req_ready协处理器返回指令接收信号到主处理器
    Output32nice_req_instr自定义指令的32位完整编码
    Output32nice_req_rs1源寄存器 1 的值
    Output32nice_req_rs2源寄存器 2 的值
    反馈通道Input1nice_rsp_valid协处理器发送反馈请求信号到主处理器
    Output1nice_rsp_ready主处理器返回反馈接收信号给协处理器
    Input32nice_rsp_data返回指令的执行结果
    Input1nice_rsp_err返回该指令的错误标志
    存储器请求通道Input1nice_icb_cmd_valid协处理器发送存储器读写的请求信号到主处理器
    Output1nice_icb_cmd_ready主处理器返回存储器读写的接收信号给协处理器
    Input32nice_icb_cmd_addr内存访问请求地址
    Input1nice_icb_cmd_read内存访问请求的写入或读取(0:写1:阅读)
    Input32nice_icb_cmd_wdata写入存储器的数据
    Input2nice_icb_cmd_size读写数据的大小(2'b00:字节;2'b01:半字;2'b10:1位;2'b11:保留)
    存储器反馈通道Output1nice_icb_rsp_valid主处理器发送存储器读写反馈请求信号到协处理器
    Input1nice_icb_rsp_ready协处理器返回存储器读写反馈接收信号给主处理器
    Output32nice_icb_rsp_rdata存储器读反馈的数据
    Output1nice_icb_rsp_err存储器读写反馈的错误标志
    Input1nice_mem_holdup协处理器占用存储器的信号(防止主处理器的后续指令继续访问内存,主处理器和协处理器同时访问内存可能导致竞争性失锁)

      调用协处理器的方法:扩展一个用RTL级代码编写的协处理器,想个办法调用这个独立于流水线的计算单元,调用协处理器应用起来的方法是:在MCU层面,在编译器里编写C语言主函数中包含指定汇编指令的调用,完成驱动的配置。在nuclei-board-labs-master\e203_hbirdv2\common\demo_nice里的insc.h给了调用的示例。

    // custom rowsum 
    __STATIC_FORCEINLINE int custom_rowsum(int addr)
    {
        int rowsum;
        
        asm volatile (
           ".insn r 0x7b, 6, 6, %0, %1, x0"
                 :"=r"(rowsum)
                 :"r"(addr)
         );
        
        return rowsum; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这里E203内核提供了NICE接口。通过自定义指令调用协处理器的过程如图4-9所示。
    在这里插入图片描述

    图4-9 NICE协处理器的调用过程

      NICE指令的完整执行过程如下:

    1. 主处理器的译码单元提供EXU级译码得到指令的操作码,以判断其是否属于默认的自定义指令组。
    2. 如果该指令属于自定义指令,请根据命令编码中的XS1位继续读取源寄存器。如果XS1和XS2位确定是否需要读取源寄存器,则在EXU级读哪个通用寄存器并取出源操作数。
    3. 主处理器保持数据支持的正确性,如果该指令需要读取源寄存器,并且以前执行的指令依赖于先读取后写入(RAW),则流水线将暂停,直到RAW依赖性被消除。此外,主处理器将根据指令编码中的XD位进行决策,以确定是否需要为预定义的命令将结果写入通用寄存器组,如果需要,则将索引信息存储在主处理器线程控制模块中的目标寄存器中,直到写回完成,以提供数据对后续命令的依赖性判断。
    4. 主处理器在EXU级通过NICE协处理器中接口的请求通道派发给外部的协处理器,派发的信息包括指令的编码信息、两个32位宽的源操作数的值。指令做进一步的译码,请求通道接收指令并依次执行指令。
    5. 协处理器通过反馈通道反馈结果、返回值。
    6. 主处理器提取命令,并将结果写回通用寄存器(如果需要写回)。

    3. NICE协处理器里的累加运算模块

      协处理器的功能模块在NICE协处理器内部,如图4-9所示。通过自定义指令调用协处理器后,协处理器的功能模块进行运算。本设计开发了一个累加运算模块用于累加运算,如图4-11所示。输入3个数时,先提取前两个数相加,再将第一次加法的和与第三个数相加,输出3个数的累加值[23]。
    在这里插入图片描述

    图4-11 NICE协处理器里的累加运算模块

    4. 自定义指令与NICE协处理器的验证

      输入10、20、30三个数进入协处理器做累加运算,通过Nuclei Studio编译器的调试信息打印所运算的结果,如图4-12所示。为了对比使用协处理器对累加运算的加速效果,设置了一组不使用协处理器的累加对比项(normal),可以发现协处理器可以进行累加运算,运算结果为60。
    在这里插入图片描述

    图4-12 协处理器累加运算结果

      因为关闭调试信息打印输出的情况下处理器可以节约一部分串口输出数据printf函数指令,这里便关闭了调试信息打印输出。可以发现:自定义指令调用NICE协处理器中的累加运算模块进行三个数的累加运算比普通C语言编写的累加运算读写减少了82条指令,同时减少了106个时钟周期,累加运算的性能提升了52%,如图4-13所示。可以预见的是,所涉及的累加运算越多,性能提升越明显
    在这里插入图片描述

    图4-13 协处理器与普通c语言进行累加运算的性能对比
  • 相关阅读:
    初识golang微服务框架kratos
    Rsync下行同步+inotify实时同步介绍和部署
    【数据聚类】第八章第一节:谱聚类算法概述及拉普拉斯矩阵
    LaTeX 删除页码
    【计组】计算机系统体系结构
    微信小程序录音机源代码
    MybatisPlus生成主键策略方法
    awk根据某个字段过滤文件航
    绝绝让你明白跨域cores
    【C++】认识类和对象
  • 原文地址:https://blog.csdn.net/qq_43858116/article/details/125498739