我想用 C 语言构建一个 RISCV 模拟器,它支持 RISC-V ISA 的有限指令集,仅限于具有 64 位扩展(RV32I 和 RV64I)的 32 位基数。但我不太明白什么是 64 位扩展以及如何使用它们。有人可以向我解释基础和扩展之间的区别吗?我如何在代码中区分它们?
最佳答案
RISC-V 旨在支持广泛的定制和特化。每个基本指令集的特征在于寄存器的宽度和相应的用户地址空间大小。有两个基本变体,RV32I 和 RV64I,其中 I 代表整数 ISA。
基本整数 ISA 可能是硬件实现的子集,但是必须使用监督层的操作码陷阱和软件仿真来实现硬件未提供的功能。
虽然 64 位地址空间是大型系统的要求,但 32 位地址空间在未来几十年内可能足以满足许多嵌入式和客户端设备的需求,并且对于降低内存流量和能耗而言将是可取的。此外,32 位地址空间足以用于教育目的。最终可能需要更大的平面 128 位地址空间,因此我们可以容纳在 RISC-V ISA 框架中。
基本整数 ISA 可以使用一个或多个可选的指令集扩展进行扩展,但是不能重新定义基本整数指令。 RISC-V指令集扩展分为标准扩展和非标准扩展。标准扩展应该是普遍有用的,并且不应与其他标准扩展冲突。
非标准扩展可能是高度特化的,或者可能与其他标准或非标准扩展冲突。
指令集扩展可能提供略有不同的功能,具体取决于基本整数指令集的宽度。 RISC-V 基本指令和指令集扩展的命名约定,以支持更通用的软件开发,定义了一组标准扩展以提供整数乘法/除法、原子操作以及单精度和 double 浮点算术-梅蒂克。
基本整数 ISA 被命名为“I”(前缀为 RV32 或 RV64,具体取决于整数寄存器宽度),包含整数计算指令、整数加载、整数存储和控制流指令,并且对于所有 RISC- V 实现。
标准整数乘法和除法扩展名为“M”,并添加了对整数寄存器中保存的值进行乘法和除法的指令。
标准原子指令扩展,用“A”表示,添加了原子读取、修改和写入内存以实现处理器间同步的指令。标准单精度浮点扩展,用“F”表示,增加了浮点寄存器、单精度计算指令和单精度加载和存储。标准 double 浮点扩展,用“D”表示,扩展了浮点寄存器,并添加了 double 计算指令、加载和存储。
引用 - RISC-V ISA 手册
关于c - RISCV 32 位基础和 64 位扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997468/