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 领域, 其执行单元多为功能受限的, 即单个执行单元只能执行特定类型的指令, 而不能执行所有

