Page 31 - 《软件学报》2025年第9期
P. 31

3942                                                       软件学报  2025  年第  36  卷第  9  期



                                              表 1 不同执行单元支持的指令类型

                                      执行单元类型                             支持指令类型
                                         LOAD                            LOAD、ALU
                                        STORE                            STORE、ALU
                                         ALU                                ALU
                                         JUMP                               JUMP

                 3.2   指令集  VLIW  扩展及编码
                    本文硬件架构基于        RISC-V  指令进行实现, 选用     RV32  作为基础指令集, 并在其上进行          VLIW  扩展. 由于
                 RV32  指令的  opcode 均在编码的   0–6  位, 且  opcode 的  0–1  位均为  1, 因此本文使用编码的  0–1  位表示  VLIW  信息.
                 该方法在   32  位指令编码如常用的      RV32、RV64  上是可以直接实现的. 但是对于          16  位指令编码的指令, 由于其编
                 码  0–1  位不全为  1, 会影响当前设计下指令包结束标志的判定, 因此不能直接用于                   16  位指令编码. 但这一点仅影
                 响变长   VLIW  的实现, 与本文的混合指令调度算法是正交关系.
                    本文使用指令编码第        0  位来表示当前指令是否为指令包结尾, 即一个指令包中的最后一条指令. 该位默认值
                 1  表示是包结尾, 取   0  时表示不是指令包结尾. 图       2  给出了指令编码结构示意图.

                                                指令其他部分                      指令 opcode
                                 31                                    7  6          0
                                                    …                     x   x x x x 1   x

                                                                                  包结束信息
                                                  图 2 指令编码结构示意图

                    该  VLIW  扩展方式与   RV32  具有良好的兼容性, 扩展的一位         VLIW  编码仅标识当前指令是否为包结尾, 能够
                 兼容指令本身的功能和含义, 以           RV32I 中  add  指令为例进行说明     (编码如表    2  所示), add  指令实现的功能为
                 rd=rs1+rs2, 即两个源寄存器   rs1  和  rs2  的值相加并将结果写入到目的寄存器       rd.

                                                表 2 add  指令  VLIW  扩展示例

                                                               编码位
                           指令名称
                                   31–25 (funct7)  24–20 (rs2)  19–15 (rs1)  14–12 (funct3)  11–7 (rd)  6–0 (opcode)
                             add     0000000      rs2      rs1        000       rd     0110011
                            add_ne   0000000      rs2      rs1        000       rd      0110010

                    表  2  中, add_ne 是指在指令包内而非指令包结束的         add  指令. 上述两种情况下指令均会被识别为           add  指令, 执
                 行的基本操作也均为       add  操作, 只不过执行时硬件会根据其         opcode 第  0  位的值在不同的模式下执行.

                 4   整数线性规划调度算法及表调度算法

                    指令调度中如何扩展调度区域与单个调度区域的指令调度的研究是正交关系. 本文专注于研究单个调度区域
                 的指令调度, 针对单个调度区域的调度评价指标为该调度区域的                     IPC, 计算公式为   IPC=指令数/cycle 数.

                 4.1   整数线性规划调度算法
                    对于一个调度区域       R, 有调度策略    s ∈ S, S  是所有调度策略的集合. IPC(R, s) 指的是调度区域      R  在调度策略    s
                 下的  IPC, cycle(R, s) 指的是调度区域  R  在调度策略   s 下的  cycle  数. 则指令调度的优化目标为求一个调度策略
                 s ∈ S , 使得  IPC(R, s) 最大. 由于一个调度区域  R  中的指令是固定的, 因此      max IPC(R, s) 等价于  min cycle(R, s). 虽
                 然已有将整数线性规划用于指令调度算法的工作, 但是现有方法并不适用于本文的                            VLIW  架构, 原因在于    VLIW
                 架构多用在    DSP  领域, 其执行单元多为功能受限的, 即单个执行单元只能执行特定类型的指令, 而不能执行所有
   26   27   28   29   30   31   32   33   34   35   36