RISC-V - 学习1

415 阅读4分钟

CISC: 复杂指令集架构,不仅包含处理器常用的指令,还包含许多不常用的特殊指令。

RISC :精简指令集架构,只包含了处理器常用的指令,而对于不常用的操作,则通过执行多条 常用指令的方式 达到同样的效果。

RISC-V 架构

模块化的指令集

RISC-V的指令集使用模块化的方式进行组织,使用整数指令子集,便能够实现完整的软件编译器,其他的指令集均为可选的模块。

IMAFD称为通用组合,用英文字母G表示。

压缩指令的编码长度位16位,普通的未压缩指令的编码长度为32位。

追求小面积,低功耗的嵌入式场景,选择使用RV32EC架构,而对于大型64位架构,选择RV64G。

可配置的通用寄存器组

RISC-V支持32位或64位架构,RV32 RV64每个通用寄存器的宽度为64位。

规整的指令编码

在流水线中尽快地读取通用寄存器组,往往是处理器流水线设计的期望之一,这可以提高处理器性能和优化时序。

RV32I规整的指令编码格式。因此指令译码器可以非常方便地译码出寄存器索引,然后读取通用寄存器组。

简洁的存储器访问指令

RISC-V架构使用专用的存储器读指令和存储器写指令访问存储器,使用其他的普通指令无法访问存储器。 存储器访问的基本单位是字节。

RISC-V架构的存储器读写指令,支持以一字节,半字,字(32位)为单位的存储器读写操作。64架构的甚至还支持双字(64位)为单位的存储器读写操作。

高效的分支跳转指令

RISC-V架构有两条无条件跳转指令,即jal指令和jalr指令。跳转链接指令jal可用于进行子程序调用,同时将子程序返回地址存放在链接寄存器。跳转链接寄存器jalr指令能够用于从子程序返回。通过将jal指令所在的链接寄存器作为jalr指令的基地址寄存器,jarl指令可以从子程序返回。

简洁的子程序调用

进入子函数之后需要用存储器写指令将当前的上下文保存到系统存储器的栈区。

在退出子程序时,需用用存储器读指令来讲当前保存的上下文,从系统存储区的栈区读出来,这个过程为恢复现场。

为了加速保存现场和恢复现场的过程,有的RISC架构发明了一次写多个寄存器的值到存储器中的的指令,或者一次从存储器中读多个寄存器的值。

无条件码执行

放弃使用带条件码的指令的方式,对于任何的条件判断都是用普通的带条件分支的跳转指令。

无分支延迟槽

由强大的分支预测电路保证cpu能够准确地预测跳转,提高性能。

零开销硬件循环指令

简洁的运算指令

RISC-V使用模块化的方式组织不同的指令子集,基本的整数指令子集支持加减乘除按位逻辑操作和比较操作。

优雅的压缩指令子集

可选的压缩指令子集。

特权模式

机器模式 M模式 监督模式 S模式 用户模式 U模式

CSR

定义了一些控制与状态寄存器CSR,用于配置或记录一些运行的状态。

中断和异常

中断和异常机制往往是处理器指令集架构中最复杂与关键的部分,RISC-V定义了一套相对简单的中断和异常机制。

P扩展指令子集

矢量指令子集

自定义指令扩展

希望指令集可以更加规整,简单,从而使处理器具有更高的主频与更小的面积。

RISC-V架构特点在于极简,模块化,以及可定制扩展。通过这些指令集的组合或者扩展,构建适用于任何一个领域的微处理器。

RISC-V软件工具链

RISC-V的软件工具链由开源社区维护。

riscv-tools:

riscv-gnu-toolchain: