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

时间:2019-07-03 16:02:04

标签: riscv isa

略读risc-v isa文档后,给我的印象是riscv支持16位(RVC),32位(RV32I)和64位(RV64I)指令长度。

  

对于RV32I:立即数的符号范围为32位

  • 指令长度:32位
  • 寄存器大小:32位
  • 内存地址:32位
  

对于RV64i:立即数的签名范围为64位

  • 指令长度:32位
  • 寄存器大小:64位
  • 内存地址:64位

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

我认为较大的指令大小使您可以在指令内部编码较大的立即数,这应该比较小的指令大小更好,因为它很容易耗尽空间。

对于risc-v RV64I,如果它仅使用32位指令长度,64位寄存器文件和存储器地址,那么它将如何充分利用硬件资源。 (例如,直接跳转到大内存地址。)

通常,RV64I的名称是否应指示指令的长度为64位?

1 个答案:

答案 0 :(得分:3)

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位宽的指令-因此,(RV32或RV32的寄存器体系结构都没有更改或添加了RVC的RV64),从某种意义上说,它们没有能够做的新事情,而32位宽的指令集中还没有。我们应该考虑它更多是一种节省空间的技术,而不是一些新功能。

基本体系结构(即没有RVC)允许分支到16位边界。 PC和返回地址以及所有分支指令均支持任何偶数字节值,因此,将RVC添加到某些内容时,其他指令不会更改。该工件还支持48位和64位指令,尽管尚未为这些大小定义扩展。

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

基本体系结构还对所有内容都使用了pc相对分支,因此您可以构建一个具有4GB的代码段的可执行映像(并且在加载时,它可以位于64位地址空间中的任何位置)。 / p>

  

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

RV32与RV64相比,寄存器从32位扩展到64位,因此,是的,当在RV64上进行符号扩展时,它扩展到了64位。

  

我认为较大的指令大小使您可以在指令内部编码较大的立即数,这应该比较小的指令大小更好,因为它很容易耗尽空间。

RISC V指令集是在对MIPS(早期的RISC设计)进行了多年研究之后设计的。与具有可变长度指令大小的x86相比,MIPS在40多年的发展中没有留下足够的操作码空间。固定大小的指令集是代码空间和功能之间的权衡–指令大小越大,可以进行的编码越多,但代价是代码密度高。代码密度对性能有巨大影响,因此不能忽略。因此,RISC V允许使用大小可变的指令,并且您可以根据需要在实现中创建256位指令!

  

对于risc-v RV64I,如果它仅使用32位指令长度,64位寄存器文件和存储器地址,那么它将如何充分利用硬件资源。 (例如,直接跳转到大内存地址。)

可执行程序映像的代码最大可以为4GB,并且仍使用pc相对分支-它会使用我们称为far分支的内容,其中分支序列由两条指令组成({{1} }和auipc)。需要明确的是,4GB是一个非常大的代码段。 64位体系结构的大多数价值在于能够处理超过4GB的数据,而不是超过4GB的代码。要达到超过4GB的代码大小,您将使用指针(例如存储在表中),因为指针可以是64位宽。这种技术已经用于DLL(即使将DLL的大小加在一起,它们通常通常不会超过4GB的代码),因为它们通常是独立加载的(因此,相对于PC的分支将在单个内部工作)代码段,在代码段之间插入是无效的。

  

通常,RV64I的名称是否应指示指令的长度为64位?

因为,无论我们使用哪种架构(例如16位,32位,64位),在存储空间不足之前,我们往往都会耗尽数据空间,这是64位的主要特征该体系结构是它对64位地址空间的支持,从而允许大量的数据存储空间。大型地址总线的这种支持还具有使用64位地址的能力,当然还可以操纵64位值。因此,RV64的重要之处在于64位寄存器以及使用64位值寻址内存的能力。 (指令大小是一个正交的问题。)