sky 发表于 2020-9-22 16:32:55

RISC-V unprivileged ISA 简析

本帖最后由 sky 于 2020-9-22 16:34 编辑

1:RISC-V 指令集架构大致分为两部分,base指令集和extension指令集。现在这两部分都处于一个还在完善的阶段,截止到现在,它的base 指令集和extension的指令集状态如图:

RISC-V unprivileged ISA

标有Ratified标志的为已经被批准确认的指令集,像RV32I,M,A等。标有Draft标志的为还处于草案阶段,有些东西还有待修改,像V,P等。标有Frozen标志的表示虽然没有被确认但不希望在确认前有大的修改,像Ztso。
2:RISC-V core在设计的时候可以根据core的设计意图选择所支持的模块化指令子集,如果想要低功耗和小面积可以选用RV32I,C等指令子集(支持的指令子集的数量一般会比较少),如果追求高性能,可以选择RV64I,M,C等指令子集(支持的指令子集的数量一般比较多),如果有浮点运算的需求,可根据浮点计算的精度选择F,D,Q指令子集。当然一个RISC-V core一定少不了对CSR的访问,所以理论上所有的core一定要支持Zicsr指令子集。
3:现在RISC-V的core不是太多,主流的为32位RISC-V core,而且为了设计简单,很多RISC-V core不支持浮点运算(即只支持整数运算,这样不用设计FPU)。
4:对于RV32I,它有32个32bit位宽的GPR(general purpose registers),即XLEN=32。其中寄存器x0的所有bit被硬件强制为0,剩下的31个x1~x31为通用目的寄存器。除此之外,有一个额外的寄存器用于存放当前指令的PC(program counter)值。

RV32I gprs


5:指令具有不同的编码格式,对于RV32I,共有六种编码格式。其中R,I,S,U为基本的编码格式,B,J为扩展编码格式。

RV32I instruction formats


6:RV32I主要完成四类常见的整数运算:一,整数的算数运算,像ADD,SUB,OR等,二,控制传输,像JAL,BEQ等,三,数据的加载和存储,像LW,SW等,四,环境操作,像ECALL,EBREAK等。
7:M主要包含两大类整数运算:一,乘法运算,像MUL,MULH等,二,除法运算,像DIV,REM等。
8:C是压缩指令,目的是将原本32位的指令用16位的指令代替(只有一部分指令操作可以代替),因此可以使code size变小,一般情况下C可以使code size减少25%~30%。一般常用的整数算数运算,控制状态指令和加载存储指令都可以部分被压缩指令代替(C.J,C.ADD,C.OR等)。C有自己的指令编码格式:

RVC instruction formats


9:Zicsr是控制状态寄存器(CSR)访问的专用指令子集,即CSR只能通过这个指令子集里的指令来访问(因为CSR实现的时候被单独map在一段4K的地址空间里)。常见的CSR操作有读,写,置位等。
10:Zifencei是取指令fence指令子集,这个指令子集里也只有一条指令fence.i,用于写指令和读指令之间的同步。
11:F,D,Q均为浮点指令子集,其中F位单精度(single-precision)浮点运算子集,D为双精度(double-precision)浮点运算子集,D为四精度(quad-precision)浮点运算子集。浮点运算会有额外的一组浮点运算的GPR:

Floating-Point gprs


12:A为原子操作指令子集,用于多线程之间的memory访问同步。
13:RV64I是基于RV32I做的,只是register的位宽(XLEN)变成了64,剩下的L,B,J,T,V,P等均处于草案阶段,待完善。
页: [1]
查看完整版本: RISC-V unprivileged ISA 简析