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