RSIC-V指令集架构
1. 指令类型
有关指令执行参考链接:https://blog.csdn.net/qq_39815222/article/details/106969845
- 存储器访问指令
l型和s型指令是RISCV架构专门用来访问存储器的指令,其他任何指令均无法访问存储器。load/store指令是让寄存器和存储器进行数据交换,虽然不存在运算,但是都会经过完整的数据通路(包括运算器)。
- RISCV架构推荐使用地址对齐的存储器读写操作,但也支持地址非对齐的操作。
- RISCV仅支持小端模式的memory读写
- RISCV读写存储器不支持自增或自减模式。
- 指令执行中控制器的作用:(以sw为例)
1)在当前时钟下的PC值建立后,PC值被存入指令存储器和加法单元。加法单元得到PC+4;同时从指令存储器中取出的指令机器码,根据机器码中的寄存器编号直接访问寄存器文件,其中指令中立即数字段送给立即数生成单元,指令的机器码送给控制器;
2)控制器获得机器码后根据指令格式进行译码,产生控制信号,其中PC选择信号PCSel为0,立即数编码选择信号ImmSel为S(表明为Store指令),控制立即数生成单元生成S型立即数编码,由于sw指令没有写回寄存器的操作,所以写使能端信号RegWEn为0,写回选择信号WBSel也为*,表示不影响结果;sw不涉及操作数的比较,因此对分支比较器的控制信号BrUn和比较结果信号BrLT、BrEq都无作用;B操作数选择信号Bsel为1,选择立即数生成单元输出的立即数值接入ALU的B操作数端口,A操作数选择信号Asel为0,选择寄存器文件输出的DataA接入ALU的A操作端口;ALU的控制信号ALUSel为add,控制ALU输出加法运算结果,作为数据存储器的访问地址值;数据存储器读写控制信号MemRW=write,表示写使能有效;使接入存储器输入数据段的寄存器文件原寄存器2的内容保存到存储器中。
3)最后下一时钟上升沿到来时,将更新的PC+4值写入到PC寄存器,同时原寄存器2的内容写入到数据存储器中。
- 算术指令
-
子程序调用指令
子函数调用可分为保存现场和恢复现场,RISCV调用则较为简洁,它使用公用的程序库(专门用来保存和恢复现场),省去了保存和恢复的诸多指令。
- 保存现场
进入子程序后要用store指令,将当前上下文(通用寄存器等的值)保存到系统存储器的堆栈区(后入先出) - 恢复现场
退出子程序时,用load指令将之前保存的上下文从系统存储器的堆栈区读出来
2. 指令编码格式
- RISC-V本身就是模块化的指令集,可以灵活的进行组合,具有相当多的可配置型。
例如某处理器核支持 RV64GC(RV64IMAFDC) 模块化指令集:
64位:64位地址空间,即通用寄存器宽度为64位
I:基本整数指令子集,支持32个通用整数寄存器
M:支持整数乘法与除法指令
A:支持存储器原子操作指令和Load-Reserved / Store-Conditional指令
F:支持单精度浮点指令
D:支持双精度浮点指令
C:支持编码长度为16位的压缩指令,提高代码密度
Machine Mode Only:只支持机器模式
- 单指令格式
由于是RSIC架构,指令关于原寄存器和目的寄存器的编码格式固定。
例如某RSIC-V指令存储器中add指令内容为:
3. RISC-V寻址空间划分
- 数据和指令寻址空间
例如64位的RISC-V架构,指令和数据寻址空间为2的32次方。 - CSR寻址空间
专用的12为地址编码空间。
4. RISC-V寄存器文件
寄存器文件又称为寄存器堆,是CPU中多个寄存器组成的阵列,RSIC-V寄存器文件主要包含通用寄存器组、控制状态寄存器和一些特殊寄存器
- 通用寄存器组
如果指令集定义为I,则包含32个通用寄存器,分别用x0-x31表示
若定义为E(嵌入式架构),则包含16个通用整数寄存器,仅支持32位,,分别用x0-x15表示
若定义为F/D(单精度/双精度),则另外增加32个独立的通用浮点寄存器,分别用f0-f31表示 - 控制状态寄存器(CSR)
用于配置和记录一些运行的状态,CSR是Core内的寄存器,使用专门的12位地址编码空间。 - 程序计数器(PC)
PC是指令存放在存储器中的地址位置。可以反映在某些通用寄存器或特殊寄存器中。但在RSIC-V架构中,程序要读取PC值,只能通过某些指令间接获得,如AUIPC指令。
5. RSIC-V工作模式
- 机器模式
必选项,另外两种可选,通常为简单的嵌入式系统 - 监督模式
若支持该模式,另外两种须均支持,该模式下可以实现类似Unix的操作系统 - 用户模式
此类系统实现用户和机器模式的区分,从而实现资源保护