RISC-V可变指令长度如何详细工作?

How does RISC-V variable length of instruction work in detail?

浏览了RISC-V ISA文档后,给我的印象是RISC-V支持16位(RVC)、32位(RV32I)和64位(RV64I)指令长度.

For the RV32I: immediate is signed extended to 32 bits

For the RV64i: immediate is signed extended to 64 bits

RV32I 和 RV64I 似乎都使用 32 位指令大小,差异与符号扩展的大小有关。

我认为较大的指令大小允许您在指令中编码较大的立即数,这应该比较小的指令大小更好,因为它很容易从 space 中 运行。

对于RV64I,如果只使用32位的指令长度,64位的寄存器文件和内存地址,如何充分利用硬件资源。 (例如,直接跳转到一个大内存地址。)

而且一般情况下,RV64I的命名应该说明指令长度是64位吗?

RISC-V 允许混合 16 位、32 位、48 位、64 位等指令!

RV32I 定义了 32 位计算机体系结构,其中寄存器为 32 位宽。它的指令都是 32 位宽的。例如,它 lw 将 32 位字加载到寄存器中,add 添加两个寄存器并以第三个为目标。

RV64I 定义了一个 64 位计算机架构,其中寄存器是 64 位宽(因此是 RV64)——它的指令也是 32 位宽。 RV32 指令仍然有效,并且有一些额外的指令可以适应 32 位和 64 位操作。例如,lw 仍然加载一个 32 位字(尽管现在符号扩展以填充 64 位寄存器),因此使用新指令 ld 来加载一个 64 位字。 add 仍然添加两个寄存器并以第三个为目标,但同样的 add 现在正在执行 64 位加法而不是 32 位加法,因为寄存器在 RV64 中是 64 位的。一条新指令 addw 执行 32 位加法,以防这就是您想要的。

RVC 是可以添加到 RV32I 或 RV64I 的扩展。当存在时,它允许 16 位指令,并且,它的设计是这样的,即 16 位指令扩展 1:1 为 32 位宽的指令——因此,寄存器架构(两者都没有变化) RVC 被添加到的 RV32 或 RV64),并且在某种意义上,他们可以做的没有什么新的东西已经在 32 位宽的指令集中。我们应该将其更多地视为一种 space 节省技术,而不是一些新功能。

基本架构(即没有 RVC)允许分支到 16 位边界。 PC 和 return 地址以及所有分支指令都支持任何偶数字节值,因此当 RVC 添加到某物时,其他指令不会改变。此工件还支持 48 位和 64 位指令,但目前还没有为这些大小定义扩展。

但是,指令集保留了足够的操作码space,可以区分16位、32位、48位和64位指令。以二进制 11(指令的最低位)开头的指令是 32 位大小的指令(但保留了一种模式:因此它们不能以 11111 开头)。紧凑指令在同一位置使用 00、01 和 10。 48位指令使用起始序列011111,64位指令以0111111开始。

基本架构还对所有内容使用 pc-relative 分支,因此您可以构建代码段大至 4GB 的可执行映像(加载时,它可以位于 64 位地址中的任何位置) space).

It seems both RV32I & RV64I use 32 bits instruction size and the difference relates to the size of sign extension.

RV32 与 RV64,寄存器从 32 位扩展到 64 位,所以,是的,当符号扩展发生在 RV64 上时,它会扩展到 64 位。

I think large instruction size allows you to have large immediate number encoded inside the instruction, which should be better than smaller instruction size since it is very easy to run out of space.

RISC V 指令集是在对 MIPS(早期的 RISC 设计)进行多年研究后设计的。与具有可变长度指令大小的 x86 相比,MIPS 在 40 多年的演变中没有留下足够的操作码 space。固定大小的指令集是代码 space 和功能之间的权衡——指令大小越大,可以编码的越多,但代价是代码密度。代码密度对性能影响巨大,不容忽视。因此,RISC V 允许可变大小的指令,如果您愿意,可以在您的实现中创建 256 位指令!

For risc-v, RV64I, if it only use 32 bits instruction length, with 64 bits register file and memory address, how it could sufficiently use the hardware resource. (ex. jump direct to a large memory address.)

可执行程序映像的代码大小可达 4GB,并且仍然使用 pc-relative 分支 — 它将使用我们所说的远分支,其中分支序列由两条指令组成 ( auipcjal)。需要明确的是,4GB 是一个非常大的代码段。 64 位架构的大部分价值在于能够处理超过 4GB 的数据,而不是超过 4GB 的代码。要达到超过 4GB 的代码大小,您可以使用指针(例如存储在表中),因为指针可以是完整的 64 位宽。这种技术已经用于 DLL(即使将每个 DLL 的大小加在一起时它们通常不会接近超过 4GB 的代码)因为它们通常是独立加载的(因此 pc-relative 分支将在内部工作单个代码段,在代码段之间插入是行不通的)。

And in general, should the nameing of RV64I indicate the length of instruction is 64 bits?

因为,无论我们拥有什么架构(例如 16 位、32 位、64 位),在我们 运行 之前,我们倾向于 运行 从 space 中获取数据在代码 space 之外,64 位架构的主要特征是它支持 64 位地址 space,从而为数据提供大量内存。这种对大地址总线的支持还伴随着使用 64 位地址的能力,当然也可以操纵 64 位值。因此,RV64 的重要之处在于 64 位寄存器以及使用 64 位值来寻址的能力记忆。 (指令大小是一个正交问题。)