在RISC-V指令集手册,用户级ISA中,我无法理解第2.3节立即编码变体第11页.
有四种类型的指令格式R、I、S和U,然后是S和U类型的变体,它们是SB和UJ,我认为它们的意思是分支和跳跃,如图2.3所示。然后是由RISC-V指令直接生成的类型,如图2.4所示。
所以我的问题是,为什么需要SB和UJ?为什么要用这种方式搅乱眼前的部分呢?说“RISC-V指令立即产生”是什么意思?它们是如何以这种方式产生的?


发布于 2016-09-12 12:31:29
为了加快解码速度,基本的RISC-RISC在每条指令中都将最重要的字段放在相同的位置。正如您在指令格式表中所看到的,
其他位用于指令的次要操作码或其他数据(第12-14位中的funct3和第25-31位中的funct7 ),以及第二个位。可用于即时的位数取决于指令中有多少寄存器号:
ADD);ADDI)的寄存器;LUI,可以使用20位作为即时操作(主要操作码和目标寄存器号一起需要12位)。现在从另一个角度想一想,使用这些直接值的指令。最简单的用户,I-即时和S-即时,只需要一个符号扩展12位值.U-即时指令需要32位值的上20位的即时指令.最后,分支/跳转指令需要在值的较低位中立即进行符号扩展,除非最低位总是为零,因为RISC-V指令总是与偶数地址对齐。
但是,为什么直接的部分会被洗牌呢?这一次想想物理电路,它解码了直接场。由于它是一个硬件实现,这些比特将被并行地解码;输出立即中的每一个位都将有一个复用器来选择它来自哪个输入位。多路复用器越大,成本越高,速度也越慢。
因此,指令编码中的直接位的“洗牌”是使每个输出立即位具有尽可能少的输入指令位选项。例如,直接位1只能来自指令位8(S-立即或B-即时)、21 (I-立即或J-立即)或常数0(U-立即指令或R-类型指令,没有立即)。即时位0可以来自指令位7(S-立即)、20 (I-立即)或常数0.直接位5只能来自指令位25或常数零。诸若此类。
指令位31是一个特例:对于RV-64,第32-63位的指令位总是指令位31的副本。这种高扇形增加了延迟,如果它也需要多路复用器的话,延迟会更大,因此它只有一个选项(除了常数为零,它可以在稍后的管道中通过忽略整个即时处理)。
还值得注意的是,只有主要的操作码(位0-6)才能知道如何解码立即,因此立即解码可以与解码其余指令并行进行。
所以,回答以下问题:
发布于 2016-09-12 06:53:23
编码的目的是尽量使实际的硬件实现尽可能简单,而不是让读者一眼就能理解。
在实践中,编译器将生成输出,因此,如果用户不容易理解,这并不重要。
在可能的情况下,SB类型尝试将相同的位位用于与类型S相同的即时位位置,从而将硬件设计的复杂性降到最低。这样,免疫4:1和10:5都在同一地方。最直接值的最上面的位总是位于第31位,这样您就可以使用该位来决定是否需要一个符号扩展。同样,这使得硬件变得更容易,因为对于多种类型的指令,顶部位被用来决定符号扩展。
发布于 2020-09-02 01:32:56
选择RISC-V指令编码来简化解码器。
2.2基本指令格式 RISC将源(rs1和rs2)和目的地(rd)寄存器保持在所有格式的相同位置,以简化解码。除了CSR指令中使用的5位即插即用(第9章)外,即插即用通常都是符号扩展的,并且通常被打包到指令中最左边的可用位,并被分配用于降低硬件复杂度。特别是,所有直接的符号位总是在指令的第31位中,以加速符号扩展电路。 2.3立即编码变体 S和B格式的唯一区别是使用12位直接字段以B格式的2的倍数编码分支偏移量。不像传统的做法那样,将指令编码的所有比特立即从硬件中左移一位,中间位(免10:1)和符号位停留在固定位置,而S格式(inst7)中的最低位以B格式编码高阶位。 类似地,U和J格式之间唯一的区别是,20位即时被左移12位以形成U直接,1位移动到形成J直接。选择U和J格式中指令位的位置,以最大限度地与其他格式和彼此重叠。 https://riscv.org/technical/specifications/
RISC-V规范中也解释了SB/UL格式的直接改组的原因。
虽然更复杂的实现可能有用于分支和跳转计算的单独加法器,因此在不同类型的指令之间保持直接位位置不变并不会带来好处,但我们希望降低最简单实现的硬件成本。通过在B和J的指令编码中旋转比特,而不是使用动态的硬件mux乘以2,我们减少了指令信号的扇出和即时mux的开销约为2倍。加扰后的立即编码将为静态或提前编译增加微不足道的时间。对于动态生成指令,有一些小的额外开销,但最常见的短前向分支具有直接的前向编码。
https://stackoverflow.com/questions/39427092
复制相似问题