所选编码与其他编码非常吻合,简化了硬件,但牺牲了必须生成指令的软件、必须解码指令的软件以及学习或使用 RISC V 的程序员;)。
S 格式将立即数分解为 imm[11:5] 和 imm[4:0]。这个立即数被分解的原因是为了保持其他字段,即寄存器字段rs2 和rs1,与 R-Type 指令中的两个源寄存器字段的位置相同。 (与 MIPS 相比,MIPS 类似但不完全,这消除了寄存器名称宽度(例如 5 位宽)多路复用器和几个额外的布线,以及控制信号。)
S 格式允许 12 位立即数。
虽然 (S)B 类型的分支使用 13 位立即数,但 13 位立即数的最后一个(最低有效位)始终为零因此它不会被存储!因此,它实际上需要像 S-Format 一样对 12 位进行编码,但是因为它们在实际使用中被移位(左移一位,例如 *2),所以与 S-Format 相比,所有位基本上都偏移了 1 位。立即格式化。 (移位并不困难或缓慢,但会占用硅空间。通常,这种恒定量的移位可以通过简单地将输入位连接到偏移输出位位置来完成,而不是使用我们在 ALU 中看到的专用移位器;但是,这仍然是直接和数据路径大小的布线,因此大约需要 12 到 32+ 条额外的布线。)
为了不必(尽可能多地移动)立即存储的部分,以便与 S 格式的立即数很好地对齐,未存储的LSB 位置(来自 S-Format)用于存储 SB-Format 立即数的第 11 位。这样,位 10:1 与 S-Format 立即数完全对齐。
但是为什么不直接将分支的第 12 位放在那里,这样可以使另一位与 S 格式保持一致(即 11:1)?因为在指令的立即数中编码的最高位用于将立即数符号扩展为 32 位(对于 RV32,或者对于 RV64 是 64 位,对于 RV128 是 128,很多线!)。因此,通过将符号位保持在与 S 格式 12 位立即数相同的位置,可以共享相同的符号扩展硬件(具有相同的上述优缺点;-)。因此,选择将第 11 位(SB-Type 立即数的下一个最高有效位)存储在 0 位位置(相对于 S-Format)。
SB(已经给定 S)的成本只有两条左右(1 位)线和一个 1 位多路复用器和一个 1 位控制信号 - 与其他替代方案相比是最低的。
请参阅以下presentation,幻灯片 46,标题为“RISC-V 立即编码”,副标题为:“为什么这么混乱?!?!”
UJ-Type 的做法类似,将符号位保持在与其他指令的符号位相同的位位置,同时尽可能多地与其他格式对齐其他位。
请参阅同一演示文稿的幻灯片 60。