RISC-V:立即编码变体

RISC-V: Immediate Encoding Variants

在 RISC-V 指令集手册,用户级 ISA 中,我无法理解第 11 页的 2.3 立即编码变体部分。

指令格式有R、I、S、U四种类型,然后有S和U类型的变体,分别是SB和UJ,我想是指Branch和Jump,如图2.3所示。然后是RISC-V指令产生的Immediate类型,如图2.4所示

所以我的问题是,为什么需要 SB 和 UJ?为什么要以这种方式洗牌? "the Immediate produced by RISC-V instructions" 是什么意思?它们是如何以这种方式生产的?

编码是为了让实际的硬件实现尽可能简单,而不是让reader一眼就看懂。

实际上,编译器会生成输出,所以如果用户不容易理解也没关系。

如果可能,SB 类型会尝试对与 S 类型相同的立即位位置使用相同的位,这样可以最大限度地降低硬件设计的复杂性。所以 imm[4:1] 和 imm[10:5] 都在同一个地方。立即值的最高位始终位于位置 31,因此您可以使用该位来决定是否需要符号扩展。同样,这使硬件更容易,因为对于多种类型的指令,最高位用于决定符号扩展。

为了加快解码速度,基础 RISC-V ISA 将最重要的字段放在每条指令的同一位置。正如您在指令格式中看到的 table,

  • 主要操作码始终在位 0-6 中。
  • 目标寄存器(如果存在)始终在位 7-11 中。
  • 第一个源寄存器(如果存在)始终在位 15-19 中。
  • 第二个源寄存器(如果存在)始终在位 20-24 中。

其他位用于指令的次要操作码或其他数据(funct3 位 12-14 和 funct7 位 25-31),以及立即数。立即数可以使用多少位取决于指令中存在多少个寄存器号:

  • 一个目标和两个源寄存器(R 型)的指令没有立即数,例如添加两个寄存器(ADD);
  • 具有一个目标和一个源寄存器(I 型)的指令有 12 位用于立即数,例如添加一个寄存器和一个立即数 (ADDI);
  • 具有两个源寄存器而没有目标寄存器(S 型)的指令,例如存储指令,也有 12 位用于立即数,但它们必须位于不同的位置,因为寄存器号也在一个不同的地方;
  • 最后,只有目标寄存器而没有次要操作码(U 型)的指令,例如 LUI,可以使用 20 位立即数(主要操作码和目标寄存器号一起需要 12位)。

现在从另一个角度考虑将使用这些立即值的指令。最简单的用户,I-立即数和 S-立即数,只需要一个符号扩展的 12 位值。 U 立即数指令需要 32 位值的高 20 位中的立即数。最后,branch/jump 指令需要在值的低位进行符号扩展立即数,除了最低位始终为零,因为 RISC-V 指令始终与偶数地址对齐。

但是为什么立即位会被打乱?这次想想解码直接场的物理电路。由于它是硬件实现,因此这些位将被并行解码;输出立即数中的每一位都有一个 multiplexer 到 select 它来自哪个输入位。多路复用器越大,成本越高,速度越慢。

因此,指令编码中的立即数位"shuffling"是为了让每个输出的立即数位尽可能少的输入指令位选项。例如,立即数位 1 只能来自指令位 8(S-立即数或 B-立即数)、21(I-立即数或 J-立即数)或常量零(U-立即数或没有立即数的 R 型指令) ).立即数位 0 可以来自指令位 7(S-立即数)、20(I-立即数)或常量零。立即数位 5 只能来自指令位 25 或常量零。等等。

指令位 31 是一种特殊情况:对于 RV-64,立即数的位 32-63 始终是指令位 31 的副本。这种高扇出增加了延迟,如果它也需要一个多路复用器,所以它只有一个选项(常数零除外,可以在管道中稍后通过忽略整个立即数来处理)。

同样有趣的是,只需要主要操作码(位 0-6)就可以知道如何解码立即数,因此立即数解码可以与解码指令的其余部分并行进行。


所以,回答问题:

  • SB 类型使分支范围加倍,因为指令总是与偶数地址对齐;
  • UJ型总体指令格式与U型相同,但立即数在低位而不是高位;
  • 通过减少每个输出立即位的选择数量,对立即位进行混洗以降低解码立即值的成本;
  • "immediate produced by RISC-V instructions" table 显示了可以从 RISC-V 指令解码的不同种类的立即数,以及指令中每个位的来源;
  • 它们是通过为每个输出立即数位使用主要操作码(位 0-6)来选择输入指令位而产生的。

选择RISC-V指令编码以简化解码器

2.2 Base Instruction Formats

The RISC-V ISA keeps the source (rs1 and rs2) and destination (rd) registers at the same position in all formats to simplify decoding. Except for the 5-bit immediates used in CSR instructions(Chapter 9), immediates are always sign-extended, and are generally packed towards the left most available bits in the instruction and have been allocated to reduce hardware complexity. In particular, the sign bit for all immediates is always in bit 31 of the instruction to speed sign-extension circuitry.

2.3 Immediate Encoding Variants

The only difference between the S and B formats is that the 12-bit immediate field is used to encode branch offsets in multiples of 2 in the B format. Instead of shifting all bits in the instruction-encoded immediate left by one in hardware as is conventionally done, the middle bits (imm[10:1]) and sign bit stay in fixed positions, while the lowest bit in S format (inst[7]) encodes a high-order bit in B format.

Similarly, the only difference between the U and J formats is that the 20-bit immediate is shiftedleft by 12 bits to form U immediates and by 1 bit to form J immediates. The location of instructionbits in the U and J format immediates is chosen to maximize overlap with the other formats andwith each other.

https://riscv.org/technical/specifications/

在 SB/UL 格式中改组立即数的原因也在 RISC-V 规范

中进行了解释

Although more complex implementations might have separate adders for branch and jump calculations and so would not benefit from keeping the location of immediate bits constant across types of instruction, we wanted to reduce the hardware cost of the simplest implementations. By rotating bits in the instruction encoding of B and J immediates instead of using dynamic hard-ware muxes to multiply the immediate by 2, we reduce instruction signal fanout and immediate mux costs by around a factor of 2. The scrambled immediate encoding will add negligible timeto static or ahead-of-time compilation. For dynamic generation of instructions, there is some small additional overhead, but the most common short forward branches have straight forward immediate encodings.