1. RISCV指令集架构
RISC-V本身就是模块化的指令集,可以灵活的进行组合,具有相当强的可配置型。关于RISCV软件生态的兼容性可参见:https://zhuanlan.zhihu.com/p/86283932
截至20191213版本的 unprivileged ISA spec,RISCV目前支持的指令集架构有:
- I/E 基本整数指令子集
RISCV处理器必须支持的指令集
I 需要32个通用整数寄存器,而E只需要16个通用寄存器
- M 标准扩展
整数乘法与除法指令 - A 标准扩展
原子性指令和Load-Reserved / Store-Conditional指令 - F 标准扩展
单精度浮点指令 - D 标准扩展
双精度浮点指令
riscv架构规定,处理器可以只实现F扩展指令子集而不支持D扩展指令,若支持D扩展指令则必须支持F扩展指令。
- Q 标准扩展
支持四精度浮点指令 - L 标准扩展
支持十进制浮点指令 - C 标准扩展
支持编码长度为16位的压缩指令
该扩展可以提高代码密度,对需要低内存占用的应用程序很重要
- B 标准扩展
位操作
包含用于位操作的指令,包括旋转和位设置/清除指令。
- L 标准扩展
动态转换语言 - T 标准扩展
事务存储器 - P 标准扩展
打包SIMD指令
用于嵌入式DSP处理器或者SIMD压缩指令,关于packed-SIMD扩展详情可见该文第5点并行性:https://blog.csdn.net/qq_39815222/article/details/106867911
- V 标准扩展
向量操作指令,用于高性能运算
该扩展明确的规范在riscv-v-spec中,功能基本包含上述P扩展。
详情参见:https://blog.csdn.net/qq_39815222/article/details/109570539
- Zam 标准扩展
非对齐原子性指令 - Ztso 标准扩展
TSO存储模型标准扩展
存储器模型详情参见:https://blog.csdn.net/qq_39815222/article/details/107029271
- Zicsr 控制和状态寄存器指令
- 其他扩展指令
RISC-V规范允许添加自定义ISA扩展指令,这将是RISCV处理器和其他处理器区分的差异化因素。根据RISCV软件生态的要求,定制ISA扩展不能破坏与主要规范的共性,因此即使自定义指令集,处理器仍然符合RISCV规范,并且可以运行来自生态系统的通用软件堆栈。
但是设计这种自定义ISA扩展需要进行大量的工作:
- 需要对该扩展指令集进行说明;
- 需要将扩展指令集规范添加到C编译器,模拟器,调试器和其他工具中,并验证是否为所有这些不同的工具添加了相同的内容。 即将新指令添加到RISCV现有的工具链中,以便编程工具可以传递和编译指令,同时需要向指令集模拟器添加新代码,以便能识别新的扩展指令。
- 扩展CPU的RTL代码,并且验证对RTL的任何更改。
2. 指令编码格式
在RSIC-V中,所有指令都是32位的,并且在存储器中必须在4字节边界对齐。由于是RSIC架构,指令关于原寄存器和目的寄存器的编码格式固定。
在基本ISA中,分别有R/I/S/B四种指令格式,当然在此基础上有U/J两种变种。
rs1,rs2是源寄存器地址,rd是目的寄存器地址,opcode是指令操作码,funct是功能码(操作码的数据宽度)
例如sw rs2, imm(rs1)
- 指令编码种类
- R型:用于register-register的算术运算
- I型:opcode一样,差别在func3和func7。一般用于register-immediate的算术运算和load操作
- S型:操作的长度不同是由不同的funct3指定。用于store操作
- B型:S型指令的变种,用于分支转移操作
- U型:用于高20bit立即数操作
- J型:U型指令的变种,用于直接跳转指令
- R4型:RV32F/D、RV64F/D标准指令扩展使用
- 一些特征
- load/store指令中
- 某些要素位置固定的目的
方便流水线的设计,例如译码的同时可以取数
3. 指令类型
具体指令解释参考链接:https://www.cnblogs.com/mikewolf2002/p/11196680.html
- 存储器访问指令
数据传送指令只能完成读一个操作数或写一个操作数,并不能进行运算。
RISCV架构推荐使用地址对齐的存储器读写操作,但也支持地址非对齐的操作。
load/store指令使用基址寻址方式
RISCV仅支持小端模式的memory读写
RISCV读写存储器不支持自增或自减模式。
见链接:https://blog.csdn.net/qq_39815222/article/details/107224255
- 整数计算指令
整数计算指令又分为register-register类型和register-immediate类型
算术指令能完成读两个寄存器、对它们进行运算和写回运算的操作。
- 控制转移指令
控制转移指令分无条件跳转指令和条件跳转指令
转移指令的调用可分为保存现场和恢复现场,RISCV调用则较为简洁,它使用公用的程序库(专门用来保存和恢复现场),省去了保存和恢复的诸多指令。
保存现场:进入子程序后要用store指令,将当前上下文(通用寄存器等的值)保存到系统存储器的堆栈区(后入先出)
恢复现场:退出子程序时,用load指令将之前保存的上下文从系统存储器的堆栈区读出来
- 控制和状态寄存器指令
用户级模式只能访问少数几个只读计数器,而在机器模式和监督者模式下则能访问其他的CSR寄存器
- CSR指令
- 定时器和计数器
- 环境调用和断点
用于子程序的调用
4. RISC-V寄存器文件
寄存器文件又称为寄存器堆,是CPU中多个寄存器组成的阵列,现代CPU一般设置了32个通用寄存器和其他的一些特殊功能寄存器,RSIC-V公布的寄存器文件主要包含通用寄存器组、控制状态寄存器和一些特殊寄存器。
- RISCV公布的寄存器文件
- 通用寄存器组
如果指令集定义为I,则包含32个通用寄存器,用来保存整数数值,分别用x0-x31表示,实际应是31个通用寄存器,x0是硬件连接的0。通常没有硬件连线的子程序返回地址连接寄存器,但在一个过程调用中,标准软件调用约定使用寄存器x1来保存返回地址。
若定义为E(嵌入式架构),则包含16个通用整数寄存器,仅支持32位,,分别用x0-x15表示
若定义为F/D(单精度/双精度),则另外增加32个独立的通用浮点寄存器,分别用f0-f31表示 - 控制状态寄存器(CSR)
用于配置和记录一些运行的状态,CSR是Core内的寄存器,使用专门的12位地址编码空间。 - 特殊寄存器:
1)程序计数器(PC)
PC是指令存放在存储器中的地址,可以反映在某些通用寄存器或特殊寄存器中。但在RSIC-V架构中,程序要读取PC值,只能通过某些指令间接获得,如AUIPC指令。
2)hi
- 设置32个通用寄存器的原因
- 数量32意味着寄存器的地址位数只需要5,因此一般的指令(包含目的寄存器和原寄存器)只需要10-15位即可,留给更多的位空间给操作码和立即数,若增加寄存器数量,则指令位数势必增大,这就需要更大的指令存储器
- 其次是访问时间,指令存储器越大,从中访问数据的速度也会变慢。此时需要给计算机提供更慢的时钟,以容纳较大的寄存器文件
- 汇编中寄存器别称
- x1~x4 供系统使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82513.html