我想用C语言构建一个RISCV模拟器,它将支持RISC-V ISA的有限指令集,仅限于具有64位扩展(RV32I和RV64I)的32位基础。但是我不太理解64位扩展是什么以及如何使用它们。谁能给我解释一下基础和扩展之间的区别,以及我如何在代码中区分它们?
发布于 2019-01-02 01:50:18
RISC-V旨在支持广泛的自定义和专业化。每个基本指令集的特征在于寄存器的宽度和用户地址空间的相应大小。有两个基本变体,RV32I和RV64I,其中i代表整数ISA。
基本整数ISA可以由硬件实现来子集,但是操作码陷阱和由管理程序层进行的软件仿真然后必须用于实现不是由硬件提供的功能。
虽然64位地址空间对于较大的系统是必需的,但32位地址空间在未来几十年内可能足以满足许多嵌入式和客户端设备的需求,并且将是降低内存流量和能耗的理想选择。此外,32位地址空间对于教育目的来说是足够的。最终可能需要更大的扁平128位地址空间,因此我们可以在RISC-V ISA框架中使用。
可以使用一个或多个可选的指令集扩展来扩展基本整数ISA,但是不能重新定义基本整数指令。RISC-V指令集扩展分为标准扩展和非标准扩展。标准扩展通常应该是有用的,并且不应该与其他标准扩展冲突。
非标准扩展可能是高度专门化的,或者可能与其他标准或非标准扩展冲突。
指令集扩展可根据基本整数指令集的宽度提供略有不同的功能。RISC-V基本指令和指令集扩展的命名约定为了支持更通用的软件开发,定义了一组标准扩展以提供整数乘/除、原子操作以及单精度和双精度浮点算法。
基本整数指令集被命名为“i”(根据整数寄存器宽度,以RV32或RV64作为前缀),包含整数计算指令、整数加载、整数存储和控制流指令,并且对所有RISC-V实现都是强制的。
标准的整数乘除扩展名为“M”,它向整数寄存器中保存的值添加乘法和除法指令。
由“A”表示的标准原子指令扩展添加了原子地读取、修改和写入存储器以实现处理器间同步的指令。用“F”表示的标准单精度浮点扩展添加了浮点寄存器、单精度计算指令以及单精度加载和存储。用“D”表示的标准双精度浮点扩展扩展了浮点寄存器,并添加了双精度计算指令、加载和存储。
参考- RISC-V ISA手册
https://stackoverflow.com/questions/53997468
复制相似问题