3.1 系统总体设计方案

基于RISC-V的通信DSP总体设计包含1个程序控制器(PCU),一个标量处理器(SPU), 一个向量处理器(VPU),一个数据存取器(LSU),一个内存子系统(MSS)和调试单元。

基于RISC-V架构的通信DSP的设计以及在5G RedCap基带中的应用(四)-基于RISC-V的通信DSP设计方法-LMLPHP

3.1.1 程序控制单元

程序控制单元(PCU)分为以下子单元:

  • 调度器:从程序存储器中对齐指令,并将它们分派到不同的单元。它包括一个指令队列,并管理16位和32位指令对齐。
  • 中断处理程序:处理来自中断控制器或内部原因的传入中断,并相应地更改程序计数器和处理器状态。
  • 程序定序器:确保正确的程序流,无论是顺序的还是非顺序的。它还管理程序计数器(PC),并对不同类型的不连续指令使用以下机制:
    • 分支机制:管理所有分支、循环、子例程调用和子例程返回操作
    • 分支目标缓冲区(BTB):最小化流执行更改的惩罚
    • Loop Buffer:存储和执行内部缓冲区中的短循环,而不从程序内存中重新获取迭代代码

3.1.2 标量处理单元

标量处理单元(SPU)处理所有标量计算和位操作,并为控制和面向DSP的操作提供有效的OOB C编译器支持。SPU由两个单独的计算子单元组成,分别命名为SPU0和SPU1。子单元是独立的,可以与其他子单元并行执行指令。

算术运算包括加法、减法、比较、最小值、最大值和其他。逻辑运算包括按位与、与、或、不或、排他或、排他的或和其他。位操作操作包括移位、提取等。

此外,SPU可以执行乘法运算和专用运算。乘法运算包括乘法、乘法累加和复数算术。

3.1.3 向量处理单元

向量处理单元(VPU)处理所有向量计算和位操作,并为控制和面向DSP的操作提供有效的OOB C编译器支持。

算术运算包括加法、减法、比较、最小值、最大值和其他。逻辑运算包括按位与、与、或、不或、排他或、排他的或和其他。位操作操作包括移位、提取等。

此外,VPU可以执行向量乘法运算和专用运算。乘法运算包括乘法、乘法累加和复数算术。

3.1.4 加载和存储单元

加载和存储单元(LSU)负责所有数据存储器访问。该单元被划分为名为LS0和LS1的两个子单元,它们能够使用各种寻址模式从数据存储器加载或存储数据存储器。

LSU支持每个周期高达128位的负载带宽,并且并行支持每个周期最高128位的存储带宽。

LSU在每个周期中根据以下寻址模式生成两个独立的32位地址(一个用于加载,一个用于存储):

  • 间接寻址,包括后期修改
  • 使用基址寄存器和立即数或指针进行索引,包括后期修改
  • 直接,完全嵌入到指令中(长直接)
  • 堆栈,使用堆栈指针(SP)寄存器向软件堆栈推送和弹出

LSU支持在访问后执行的以下类型的地址寄存器修改:

  • 线性修改
  • 模数修正

所有LSU指令都可以使用谓词作为条件。

存储/加载到数据存储器/从数据存储器加载的数据的源/目标可以是核心通用寄存器文件(GRF)和一些专用寄存器中的任何一个,如中所述。

3.1.5 存储器子系统

存储器子系统(MSS)是一个扩展系统,可以轻松适应全SoC集成。MSS由以下部件组成:

  • 程序存储器子系统(PMSS):包含可选的一级程序存储器和四路或双向高速缓存
  • 数据存储器子系统(DMSS):包含L1数据存储器和可选的双向高速缓存
  • 通用单元:包括队列和缓冲区管理器、程序中断控制器和用作看门狗计时器、RTOS或通用计时器的计时器

核心在没有等待状态的情况下访问L1存储器和高速缓存;然而,访问外部存储器可能需要几个等待状态。

3.2 处理器流水线设计方案

以经典的MIPS五级流水线举例,此流水线中五级分别为用于将指令从存储器中取出的取指级;将取出的指令译码为后续所需的操作命令和从通用寄存器组中取出操作数的译码级;执行运算指令,计算访存地址和分支地址的执行级;读写存储器的访存和将执行结果写回通用寄存器组的写回级。

基于RISC-V架构的通信DSP的设计以及在5G RedCap基带中的应用(四)-基于RISC-V的通信DSP设计方法-LMLPHP

图3.1即为处理器的流水线设计

​​​​​​​3.3 DSP P扩展指令设计

由上一节描述可知一些常见的数字信号处理应用所需要的运算,将这些运算 拆分后仍然是比较基础的四则运算。但是由于在数字处理的计算中存在大量的卷 积或相似的运算,因此可以通过设计同时对多组操作数进行运算的 SIMD  运算指令通过并行化数据运算的方式进行加速。

SIMD 即单指令流多数据流,是一种采用一个控制器来控制多个运算器,同时 对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上 的并行性的技术。简单来说就是一个指令能够同时处理多个数据。相对应的,传 统的计算就被称为单指令单数据流。单指令单数据流和单指令多数据流的区别如图4.4所示。

图4 . 4 单 指 令 单 数 据 流 和 单 指 令 多 数 据 流 的 区 别

为了实现更大程度的并行化,所设计的指令都规定操作数总长度为64位,并 且可以同时执行两组32位运算或四组16位运算。但是指令本身仍然为32位,以保证最大限度兼容原有设计。在卷积运算中,最主要的运算就是乘法与加法运算。在指令的设计中,可以设计点积指令或者融合乘加指令一步到位实现卷积运算。但是考虑到硬件实现上将乘法器与加法器串联后会影响时序性能,本文中所设计的 SIMD  指令均不包含 两步以上的运算,仅把简单运算并行化。这样的设计虽然使得进行数字信号处理 计算时需要更多条指令,但是可以最大限度保证处理器的主频不会受到扩展自定 义指令的影响。根据本设计中已经实现的处理器中运算器的实际情况以及对上述应用的分析,决定对加法、减法、乘法和移位四种运算进行扩展。

​​​​​​​3.3.1 指令编码

根据RISC-V ISA 的规定,32位指令的最低2位必须是11,再往前的三位不 能全为1。根据此规定和规范中所推荐的 opcode 编码,最终在本设计中选择所扩展的 DSP 运算指令的七位 opcode 统一为0101011。

RISC-V I 型指令可用编码空间较少,并且在 DSP 应用中,较少使用立即 数,因此本设计中所扩展的运算指令均为 R 型指令。但是在本设计中为了实现一些特殊操作,仍然扩展了若干个I 型指令,这些I 型指令的opcode 统一为1011011。

R 型指令格式如图4.5所示。在R 型指令中,操作数地址与目的地址不在编码 范围内,可编码位有 funct7 funct3 两个字段。在本设计中,funct7 字段用于编码指令的功能,funct3 字段用于指示指令操作数的类型。

图4.5 R型指令编码

所设计的指令编码中 funct7 部分被额外划分为两个部分,高6位用于指示指 令的操作类型,如加减乘除等,最低位用于设置特殊操作。指令编码中的 funct3 也划分为两个部分,最高位用于设置特殊操作,低2 位则用于配置指令的操作数类型是16位还是32位。

3.3.2 ​​​​​​​​​​​​​​运算指令

扩展的运算类指令实现了加法、减法、乘法、移位几类运算,此外这四类算 数运算增加了一些特殊操作,分别是由 funct7  字段的最后一位控制的掩码操作和由 funct3 字段的最高位控制的水平操作。在通常的 SIMD 操作中,如上图4.1 所示,是垂直的运算。即如果有 X0,X1,YO,Y1  四个操作数,那么乘法运算的两个结果分别就是 XOYO 和 X1Y1,  这样的运算过于死板。由于本文中所设计的指令不包含两个以上的操作,如果想要实现乘加运算,就需要首先进行乘法计算,再进行加法计算。以同时计算 XOYO+X1Y1 和X2Y2+X3Y3 为例,如图4.6所示,计算完成乘法之后,需要进行相加的操作数 XOYO 与 X1Y1,X2Y2   与 X3Y3 被放在了同一个寄存器中。水平操作的作用就是 将操作数的来源指定在同一个寄存器内,不需要先将结果移动到两个寄存器中再进行运算,增加了SIMD 操作的灵活性。

图4.6乘法与水平加法的配合使用

所设计的 SIMD 指令支持同时对两组32位数据或四组16位数据进行计算, 但是如果希望仅对寄存器中的几组数进行操作就比较困难,因此在指令设计中加 入了掩码操作。掩码的配置使用6位来表示,其中低4位是高有效的掩码位,高2 位是控制位,控制位可以实现四种控制功能,00表示掩码位设置为全0,11 表示 掩码位设置为全1,01表示掩码位保留第一个操作数的值,10表示掩码位保留第二个操作数的值。例如在两个寄存器中各存有四个16位数据,分别是X0,X1,X2,X3YO,Y1,Y2,Y3 如果想要计算XO+YO,X2+Y2,X1 X3保持不变,就可以通过掩码功能实现,图4.7显示了掩码操作的应用。

图4.7 掩码加法

为了实现掩码操作的配置,需要再额外单独设计一个配置掩码控制寄存器的 指令,这个指令通过I 型指令完成,通过立即数的形式直接操作掩码控制寄存器的 值。由于该指令不对寄存器进行操作,而是对掩码控制寄存器进行操作,在使用 此指令时,需要将指令中的源寄存器和目的寄存器都设置为只读的x0 寄存器以避免对通用寄存器组的误操作。通过基本运算指令与水平操作、掩码操作两种特殊操作的结合,就可以较为灵活地实现对数据的并行操作以适应多种应用场景。

​​​​​​​3.3.3 特殊指令

除了运算指令以外,还需要一些特殊指令辅助 SIMD  运算。在一些运算中, 例如快速傅里叶变换,需要对操作数进行重新排序,如果是以标量的方法进行排 序,那么就需要使用循环一步步完成,并附带有大量的分支操作。但是对于 SIMD 操作,这种方式无疑会拖慢整个程序的运行速度。实际上快速傅里叶变换的码位倒序可以通过不断进行奇偶分组实现,如图4.8是以八个数为例进行奇偶分组实现码位倒序。

基于RISC-V架构的通信DSP的设计以及在5G RedCap基带中的应用(四)-基于RISC-V的通信DSP设计方法-LMLPHP

图4.8 使用奇偶分组进行码位倒序

为了实现上述对操作数重新组合的操作,本设计额外加入了一个可编程的混 洗指令,混洗指令也是 R 型指令,指令中的操作数为两个源寄存器和一个目的寄 存器。在进行混洗操作时,首先将两个源寄存器进行拼接,然后通过额外的混洗 配置寄存器进行混洗目标的选择,最终从拼接后的源寄存器中选择一半的数据存入目的寄存器中。在16位混洗模式下每个源寄存器内有四个数,共有两个源寄存器,即一次混洗的数据共有八个,需要用3 位来表示每一个数。目的寄存器有一个,内有四个数,混洗配置寄存器共需要12位来表示目的寄存器的数据来源。32位数据也可以用16位混洗模式对数据进行重新组合,不需要为32位数据设计新的混洗模式。为了实现混洗模式的配置,除了混洗指令以外,还要设计一个用于设置混洗 模式的指令,这个指令的设计与设置掩码控制寄存器的指令相同,使用立即数对混洗配置寄存器直接操作。

​​​​​​​3.3.4 总结

表4.1 和表4.2中分别显示了扩展的R 型指令I 型指令。表中的 m 表示指令 支持掩码操作,掩码操作位设为0表示不使用掩码操作,设置为1表示使用掩码 操作。表中的 h 表示指令支持水平操作,水平操作位设置为0表示不使用水平操 作,设置为1表示使用水平操作。表中的 funct2  用于设置指令操作的数据宽度, funct2 中的二进制数值为10时表示操作的数据宽度为16位,值为二进制数01时 表示数据宽度为32位,其他数值无效。除了表中扩展的新指令之外,设计还引入 了RISC-V 中原本为64位处理器所设计的访存指令ld 和 sd, 用于一次读写存储器中64位的数据。

​​​​​​​表4.1 扩展的R型指令内容

表4.2  展 的 1 令 内

03-06 05:14