购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 RISC-V的主要特征

本节对RISC-V指令集的主要特征进行介绍,希望能够帮助读者了解RISC-V架构的特性

2.3.1 模块化设计

为了能够广泛应用在嵌入式、个人计算机、服务器等各种成本和性能的应用场景中,RISC-V指令集采用模块化的架构设计,包括基础整数指令集和指令集标准扩展等两大类。基础整数指令集是所有处理器都必须实现的核心部分,它仅有40余条指令,十分简洁,但是足以支持操作系统等软件的运行,并且能够满足教育科研、嵌入式处理器和通用处理器的指令集需求。针对嵌入式处理器、通用处理器等不同低、中、高端的应用场景,RISC-V的基础整数指令集分为RV32I、RV32E、RV64I、RV64E、RV128I这五种类型,它们在处理器位宽和寄存器数量等方面有所不同。

为了进一步提升处理器的性能、效率和灵活性,RISC-V指令集中还定义了多种可选的指令集标准扩展,例如M标准扩展支持整数乘法和除法、A标准扩展支持原子访存操作、F标准扩展支持单精度浮点运算、D标准扩展支持双精度浮点运算等。C标准扩展是对基础整数指令集的压缩优化,可以减少静态代码的大小和提高指令的代码密度,可以显著降低指令存储的成本和处理器的能耗。

处理器开发者可以根据处理器的应用需求来灵活选用不同的指令集标准扩展,从而形成适合不同应用场景的定制化指令集方案。RISC-V架构中将基础指令集(RV32I或RV64I)和M、A、F、D、Zicsr、Zifencei等指令集标准扩展的组合“IMAFDZicsr_Zifencei”定义为一个指令集通用组合G,如RV32G或RV64G,其能够为广泛的通用计算提供简单但完整的指令集。在表2-1中列举了RISC-V指令集的基础整数指令集和部分指令集标准扩展。

表2-1 RISC-V指令集的组成

注:该表格仅列举了部分指令集标准扩展,查阅其他内容请参考最新指令集标准文档。

2.3.2 基础整数指令集

为了适合嵌入式处理器、通用处理器等应用场景,RISC-V架构的基础整数指令集分为RV32I、RV32E、RV64I、RV64E、RV128I这五种基础整数指令集。RV32I是标准32位基础整数指令集,包含计算类、分支跳转类、访存类这三类,共计42条指令,定义了32个32位通用整数寄存器和指示当前指令地址的PC寄存器,其中x0寄存器硬连接为0,RISC-V架构是一个load-store结构,所有的计算类指令都是在寄存器间进行的,只有LOAD指令和STORE指令才会去访问存储。

RV32I中指令的位宽是32位,在指令存储中保持四字节对齐和小端字节顺序存储,当分支跳转指令的目标地址不是四字节对齐时,会触发“指令地址不对齐”异常,若实现了位宽为16的压缩指令,这一对齐限制可放宽到两字节对齐。如表2-2所示,RV32I有6种指令格式,包括R、I、S和U这四种基本指令格式以及B、J这两种立即数指令格式变种,其中指令格式B是指令格式S的变种,指令格式J是指令格式U的变种,指令格式B、J中的立即数位置和指令格式S、U相同,只是表示的是立即数的不同位。RV32I中指令最多有两个源寄存器操作数rs1、rs2,并且产生结果存到一个目的寄存器rd中,源寄存器编号、目的寄存器编号在这些指令格式中位置相同,这简化了流水线译码单元的逻辑。在立即数方面,除了CSR的5位立即数,RISC-V中立即数都是有符号数扩展的。在指令编码格式中,立即数符号位都在指令字的第31位上,不同指令格式中立即数的其余数位尽可能靠左保持一致,这种立即数格式设计减小了硬件实现的复杂度。

表2-2 RV32I指令编码格式

指令格式中低7位是主操作码opcode,opcode最低两位为11表示该指令的位宽大于16,低两位为00、01、10表示该指令是16位宽的压缩指令,主操作码使用情况如表2-3所示。opcode第三位到第五位为1时,表示指令编码的长度大于32。标识为“reserved”的主操作码应该避免留给自定义扩展使用,它是留给未来的指令集标准扩展使用的;标识为“custom-0”或“custom-1”的主操作码留给指令长度是32的指令集自定义扩展使用;标识为“custom-2/rv128”或“custom-3/rv128”的主操作码留给RV128的自定义扩展使用,它也可以留给RV32或RV64的指令集自定义扩展使用。

表2-3 RISC-V主操作码使用表,inst[1:0]=11

绝大多数整数计算指令是在整数通用寄存器存储的操作数间进行的。在整数计算指令中,寄存器-立即数操作使用I指令格式,寄存器-寄存器操作使用R指令格式。在RISC-V指令集中,整数计算指令不产生算术异常。控制转移指令有无条件跳转指令和条件分支指令这两类,在RV32I指令集中没有定义结构可见的延迟槽。在无条件跳转指令中,JAL指令使用J指令格式,JALR指令使用I指令格式,所有的条件分支指令使用B指令格式。在访存指令中,LOAD指令使用I指令格式,STORE指令使用S指令格式。在RV32I指令集中,各指令的汇编格式以及功能描述如表2-4所述。

表2-4 RV32I指令列表

(续)

2.3.3 M扩展

在许多应用尤其是在定点计算密集型的应用中,整数乘法操作和除法操作经常出现,即使乘除法运算操作在计算操作中总体占比不大,但如果使用软件程序实现乘除法操作,其运算效率会很低,乘除法运算的执行时间会在程序执行时间中占据很大一部分。因此,在硬件上实现乘法器和除法器是十分必要的。考虑到乘除法操作在不经常出现的低端应用场景中的简单实现,RISC-V指令集中将乘除法指令定义为可选择实现的指令集标准扩展“M”。在RV32M指令集中,各指令的汇编格式以及功能描述如表2-5所述。

表2-5 RV32M指令列表

2.3.4 F扩展

浮点运算操作在科学计算、图像处理、机器学习等应用领域无处不在,为了满足不同应用场景的浮点计算需求,RISC-V指令集中定义了可选实现的单精度浮点数的指令集标准扩展“F”,兼容IEEE 754-2008算术标准。在F扩展中定义了32个浮点专用寄存器f0-f31以及一个浮点控制和状态寄存器(FCSR),其中FCSR保存浮点功能部件的动态舍入模式设置和异常状态设置。

F扩展中定义了浮点计算指令和浮点访存指令。浮点计算指令分为数据分类、转移、转换、比较、算术、符号注入指令,浮点数据访存指令包括用于存储器和浮点寄存器堆之间访存数据的FLW、FSW指令。浮点计算指令是在浮点通用寄存器和整数通用寄存器的操作数之间进行的,所以浮点计算指令使用R指令格式。在RV32F指令集中,各指令的汇编格式以及功能描述如表2-6所示。

表2-6 RV32F指令列表

(续)

2.3.5 C扩展

本节介绍RISC-V压缩指令集标准扩展,即C扩展,可以用缩写“RVC”来表示。通过将最频繁使用的指令使用更紧密的短16位指令进行编码来减少静态代码的大小和动态取指的带宽,这减少了对指令存储的占用和能量消耗,对成本和功耗敏感的嵌入式处理器来说尤为重要,也可以改善指令缓存不命中的情况。通常,一个程序中50%~60%的RISC-V指令可以替换为RVC指令,这可以使代码规模减小25%~30%。

RVC采用了一种简单的压缩方案,提供较短的16位版本的常用32位RISC-V指令,压缩方案如下:

❑ 立即数或者地址偏移量较小。

❑ 特定指令的一个源寄存器或者目的寄存器固定为x0寄存器、x1寄存器或者x2寄存器。

❑ 目的寄存器和第一个源寄存器相同。

❑ 寄存器使用最常用的8个寄存器。

C扩展存在众多的优势,它与所有其他标准指令扩展兼容。C扩展允许16位指令与32位指令自由混合,后者可以在任意16位边界上启动,即IALIGN=16。随着C扩展的加入,处理器的任何指令操作都不会引发指令地址不对齐异常。在RV32C、RV64C和RV128C中,压缩指令编码是最常见的。需要注意的是,C扩展并不是被设计成一个独立的ISA,而是要与基础ISA一起使用。

接下来介绍C扩展的压缩指令格式,表2-7给出了9种压缩指令格式。CR、CI和CSS可以使用32个RVI寄存器中的任何一个,但CIW、CL、CS、CA和CB只能使用其中的8个,如表2-8所示。注意,有一个单独版本的加载和存储指令,使用堆栈指针作为基本地址寄存器,因为从堆栈中保存和恢复是普遍的,并且它们使用CI和CSS格式允许访问所有32个数据寄存器。CIW为ADDI4SPN指令提供了一个8位的立即数指令。浮点访存的压缩指令使用CL和CS格式,将8个寄存器映射到f8~f15。

表2-7 16位RVC压缩指令组成格式

表2-8 CIW、CL、CS、CA和CB格式对应的寄存器

该格式的设计是为了在所有指令中将两个寄存器源指示保持在同一位置,而目的寄存器字段可以移动。当存在完整的5位目标寄存器指定符时,它与32位RISC-V编码的位置相同。当立即数是符号扩展时,符号扩展总是从第12位开始。在基础规范中,立即字段被打乱以减少所需要的立即数指定符的位数。对于许多RVC指令来说,不允许使用立即数0,并且x0不是有效的5位寄存器指定符。这些限制为其他需要更少操作数位的指令腾出了编码空间。

RVC编码映射表如表2-9所示,表的每一行对应编码空间的一个象限。最后一个象限仅由两个最低有效位设置,对应的指令宽度大于16位,包括基本ISA中的指令。一些指令只对某些特定的操作有效,当无效时,它们被标记为Reserved,以表明操作码被保留给未来的标准扩展。对于不同的指令集实现,存在相同的指令译码对应于不同的指令。以RV32为例,对于00象限,支持的指令只有ADDI4SPN、FLD、LW、FLW、FSD、SW、FSW,100作为保留可忽略该部分译码操作。

表2-9 RVC编码映射表

2.3.6 Zifencei扩展

本节介绍Zifencei扩展,它包括FENCE.I指令,该指令提供了同一个处理器内核中写指令内存空间和读指令内存空间之间的显式同步,即读取的指令总是最新写入的指令。该指令目前是确保指令内存存储和读取都对处理器内核可见的唯一标准机制。对于FENCE.I指令来说,其指令格式如图2-1所示,FENCE.I中未使用的字段imm[11:0]、rs1和rd在将来的扩展中保留给更细粒度的FENCE操作。由于前向兼容性,基础实现忽略这些字段,标准软件应将这些字段置0。

图2-1 FENCE.I指令格式

FENCE.I指令用于同步指令和数据流。在执行FENCE.I指令之前,对于同一个处理器内核,RISC-V不保证用存储指令写到内存指令区的数据可以被取指令取到。使用FENCE.I指令后,对同一处理器内核,可以确保指令读取是最近写到内存指令区域的数据。但是,FENCE.I不保证其他RISC-V处理器内核的指令读取也能够满足读写一致性。如果要使写指令内存空间对所有的处理器内核都满足一致性要求,需要执行FENCE指令。FENCE.I只能保证同一个处理器内核(硬件线程)执行的指令流和数据流顺序,不能保证多个处理器内核之间的指令流和数据流访问。

如果在程序中添加一个FENCE.I,则该指令能够保证FENCE.I之前所有指令的访存结果都能被FENCE.I之后的所有指令访问到。通常说来,当处理器的微结构硬件实现时,一旦遇到一条FENCE.I指令,便会先等到之前的所有访存指令执行完,然后再冲刷流水线,包括icache,这使其后的所有指令,能够重新取指,从而得到最新的值。

2.3.7 Zicsr扩展

本节介绍每个处理器内核关联的控制和状态寄存器的指令集标准扩展,也就是Zicsr扩展。RISC-V定义了与每个处理器内核关联的4096个控制和状态寄存器(CSR)的单独地址空间。接下来介绍这些CSR全部的CSR指令操作。

首先介绍CSR指令,所有的CSR指令都是原子化地读或写一个CSR,如图2-2所示,其CSR指示符编码在指令的12位csr字段中,位数为20~31。立即数形式使用rs1字段中编码的5位零扩展立即数。

图2-2 CSR指令格式

Zicsr扩展总共存在6条CSR操作指令,如表2-10所示。

表2-10 Zicsr指令列表

前文所述的指令存在相应的伪指令。读取CSR的汇编器伪指令CSRR rd,csr;写回CSR的汇编程序伪指令CSRW csr,rs1,CSRWI csr,uimm。进一步定义汇编器伪指令,利用CSRS / CSRC csr,rs1或者CSRSI / CSRCI csr,uimm指令设置并清除CSR的某些数位。汇编伪指令对应的汇编指令如表2-11所示。

表2-11 汇编伪指令与对应汇编指令列表

2.3.8 特权架构

RISC-V的特权架构定义了处理器的特权模式和相关的内存保护机制,包含特权指令以及运行操作系统和连接外设的功能。RISC-V的特权架构分为三个特权模式:用户模式U,监管者模式S和机器模式M。

用户模式U:用户模式是最低的特权模式,运行在这个模式的程序无法直接访问系统资源(如I/O设备)和敏感的CSR,用户模式通常用于运行应用程序。

监管者模式S:监管者模式是中等特权模式,主要用于运行操作系统的内核。监管者模式拥有一定的系统资源访问权限,可以执行某些特权指令,具备基本的异常处理和虚拟内存管理的能力。

机器模式M:机器模式是最高的特权模式,具有对整个系统的完全控制权限,是RISC-V硬件平台必须实现的特权模式。在RISC-V架构中,机器模式用于运行固件、引导加载程序和底层系统软件,可以直接访问所有的系统资源和CSR,执行所有特权指令。此外,机器模式还负责处理异常以及系统重置和初始化。

RISC-V的特权架构设计旨在实现对系统资源的有效保护和访问控制,同时为操作系统和应用程序提供一种可扩展、灵活的硬件支持。在特权架构实现中,机器模式为必选特权模式,许多嵌入式系统只需要实现机器模式便可以满足需要,另外两种为可选特权模式。通过不同的特权模式组合可以实现不同用途的硬件系统,如表2-12所示。

表2-12 RISC-V特权模式及其应用场景

M、S、U等特权模式的实现需要控制和状态寄存器(CSR)的支持。在RISC-V架构中,CSR有独立的12位地址空间,是处理器内部除通用寄存器以外的重要结构寄存器,并在不同的特权模式下定义了若干不同的CSR,可以在较高特权模式下访问较低特权模式的CSR。CSR负责不同特权模式下的中断和异常、系统性能监测、系统信息、debug操作、存储保护、浮点运算等机制的配置和状态信息显示。RISC-V架构定义了CSRRW、CSRRS、CSRRC等指令来原子性地读改写CSR,从而支持处理器的不同特权模式、中断、异常、虚拟存储管理等机制的有机结合,使得处理器运行更加安全、使用更加便捷。 qg9S5tG+yNLBehiViwaY05MLL8kw1wPR/pnJjrR7Yhoxt1642hDD37VOf/Y4/zGd

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开