1.5 RISC-V 基础指令长度编码

文章详细阐述了RISC-V指令集架构的指令编码方式,包括基础的32位指令和压缩的16位指令,强调了指令对齐(IALIGN)和最大指令长度(ILEN)的概念。还讨论了非法指令的处理,以及大端和小端内存系统对指令存储的影响,指出小端指令编码能简化硬件设计并解耦系统字节序。
摘要由CSDN通过智能技术生成

基础指令长度编码
基本RISC-V ISA的基本指令长度为32位,必须在32位边界处自然对齐。
然而,标准RISC-V编码方案意在支持扩展指令的可变长编码,每条指令长度是16位的倍数,并且指令在16位边界对齐。
压缩标准ISA扩展通过提供压缩的16位指令减少代码大小,并且放宽了对齐限制,允许16位和32位两种对齐,以此来提高代码密度。
我们是用IALIGN来指代指令对齐约束,值只能是16或32。基本ISA的IALIGN是32位,压缩扩展的ISA的IALIGN是16位。
我们使用ILEN表示一种实现支持的最大指令长度,通常总是IALIGN的倍数。

扩展指令长度编码
部分32位指令编码空间已经暂停分配给长度大于32位的指令,这个空间的全部这次都被预留,以后提议编码长度大于32位也并未被冻结。

指令的低16位定义了指令码长度。

长度大于32位的标准指令集扩展编码将额外的低阶位设置为1.
指令编码

目前只有16-bit和32-bit编码被认为是冻结的。

考虑到压缩格式的代码大小和节能,我们希望在ISA编码方案中构建对压缩格式的支持,而不是作为事后的想法再添加,但是为了允许更简洁的实现,我们不强制使用压缩格式。我们还想选择性地使用更长的指令来支持实验和更大的指令集扩展。尽管我们编码规范要求对核心RISC-V ISA更严格的编码,者有几个好处:
1.标准IMAFD ISA的实现只需要在指令缓存中保存最高30位(节约6.25%空间)。在指令缓存重新填充时,任何遇到地位被清除的指令都应被重新编码为
非法的30位指令,以防止非法指令异常行为。

==2.也许更重要的是,通过将基本ISA压缩为32位指令字的子集,我们省下了更多的空间,可以用于非标准和自定义扩展。特别的,基本RV32I ISA使用不到1/8的32位指令字编码空间。==更多信息,参考26章。

非法指令
bits[15~0]的值全部为零的编码被定义为非法指令。这些指令被认为最小长度为16位,如果有使用16位指令集扩展,否则是32位。
bits[ILEN-1:0]全部为1的编码也被认为是非法指令,这些指令长度被认为是ILEN位。

我们认为,任何长度的指令只要包含全零都是非法的,因为会这很快将错误跳转到零内存区域。类似地,所有位为1的指令也是非法的,以捕获其他通用类型错误,像未编程的非易失性存储器,内存总线未连接,损坏的内存等。
在所有RISC-V实现中,软件可以依赖自然对齐的32宽指令包含0来构造一个非法指令,当需要一个非法指令的时候。
但在所有RISC-V实现中,软件构造bits[ILEN-1:0]的所有位为1的编码是很困难的,因为软件不知道目标处理器的指令位宽ILEN。(例如,软件被编译为一个标准二进制库被用于不同的机器)。
定义一个32位所有位都为1的非法指令也是可以考虑的,因为所有机器都必须支持32位宽,但是这个要求取指单元(准确的说是ILEN>32位的机器的取指单元IFU)报告一个非法指令异常,而不是访问错误,当指令接近包含边界时,这会使得可变指令长度取码和译码变得复杂。

大端和小端
RISC-V基本ISA的内存系统可以是大端的,也可以是小端的,特权级架构进一步定义支持了双端操作。
指令以16位小端的包序列的形式存储在内存中,不考虑内存系统大小端。组成一条指令的包被存储在递增的半字地址空间中,最低地址的空间存储编号最低的位。

我们最初选择小端,是因为目前商业上的统治地位(比如,所有的x86系统,iOS, Android,Windows For ARM)。另外一个原因是小端内存系统对于硬件设计者更自然。然而,在特定应用领域,例如IP网络(IP networking),网络字节序是大端的;另外,某些历史代码是在假设大端处理器的基础上构建的,为此我们定义了RISC-V的大端或者双端变体

我们必须将内存中的指令包顺序固定下来,其独立于内存的系统端序,来确保长度编码位总是出现在半字地址序的第一个位置。这个允许可变长指令的长度可以被IFU快速确定,通过检测第1个16位指令的最初几位。

我们进一步将指令包本身设置为小端,从而将指令编码和系统大小端完全解耦。这种设计对软件工具和双端硬件都有好处。否则,例如,RISC-V汇编器和反汇编器都总需要知道预期的活动端序。尽管是在双端系统中,端序模式可能在执行过程中动态变化的。相比之下,通过给指令一个固定端序,即使是二进制模式,精心编写的软件也有可能是端序不确定的,就像位置无关代码。

指令是小端的选择确实有些影响。例如,大端JIT编译器,在存储到指令存储器时候必须交换字节序。

( JIT just in time)编译(也称为动态翻译或运行时编译)是一种执行计算机代码的方式,它涉及在程序执行期间(运行时)而不是执行前进行编译。

一旦我们固定小端序指令编码,这个自然导致将长度编码位放在LSB位置,以避免拆分操作码字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值