打印
[RISC-V MCU 应用开发]

RISC-V架构生态及相关学习记录

[复制链接]
640|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.RISC-V架构的两个特性

RISC-V,第五代精简指令处理器。

RISC-V指令集,可以在理解上类比于主流商用Inter的x86,ARM的指令集,用于CPU读取、翻译从而指挥计算机进行相应操作。它在RISC(基于精简指令集计算)的原理上不断发展,建立起完全开源的ISA架构(开放指令架构)。

与x86、ARM这种成熟的商业架构相比,RISC-V指令集成除开源之外,另一个最大的优势就是其模块化的架构:根据具体场景选择指令集中模块的组合,以最小的系统代价满足不同应用。譬如针对于小面积低功耗嵌入式场景,用户可以选择 RV32IC 组合的指令集,仅使用 Machine Mode(机器模式);而高性能应用操作系统场景则可以选择譬如 RV32IMFDC 的指令集,使用 Machine Mode(机器模式)与 User Mode(用户模式)两种模式。而他们共同的部分则可以相互兼容。

短小精悍的架构以及模块化的哲学,使得 RISC-V 架构的指令数目非常的简洁。基本的 RISC-V 指令数目仅有 40 多条,加上其他的模块化扩展指令总共几十条指令,但基于RISC-V指令集架构可以设计服务器CPU、家用电器CPU、工控CPU和传感器中的CPU,应用前景十分广泛。

2.RISC-V指令集特性

2.1 模块化的指令集

RISC-V模块化的意义在于它是由一个强制性的基本ISA和许多ISA扩展组成。

RISC-V的指令集使用模块化的方式进行组织,每一个模块使用一个英文字母来表示。

RISC-V最基本也是唯一强制要求实现的指令集部分是由I字母表示的基本整数指令子集,使用该整数指令子集,便能够实现完整的软件编译器。


使用特权

评论回复

相关帖子

沙发
豌豆爹|  楼主 | 2023-7-5 11:39 | 只看该作者
其他的指令子集部分均为可选的模块,具有代表性的模块包括M/A/F/D/C。

为了提高代码密度,RISC-V架构也提供可选的“压缩”指令子集,由英文字母C表示。压缩指令的指令编码长度为16比特,而普通的非压缩指令的长度为32比特。以上这些模块的一个特定组合“IMAFD”,也被称为“通用”组合,由英文字母G表示。因此RV32G表示RV32IMAFD,同理RV64G表示RV64IMAFD。

通过以上的模块化指令集,能够选择不同的组合来满足不同的应用。譬如,追求小面积低功耗的嵌入式场景可以选择使用RV32EC架构;而大型的64位架构则可以选择RV64G。

除了以上模块,还有一些扩展在不断完善和进行。

2.2 可配置的通用寄存器组

RISC-V架构支持32位或者64位的架构,32位架构由RV32表示,其每个通用寄存器(Register File,Regfile)的宽度为32比特;64位架构由RV64表示,其每个通用寄存器的宽度为64比特。

RISC-V架构的整数通用寄存器组,包含32个(I架构)或者16个(E架构)通用整数寄存器,其中整数寄存器0被预留为常数0,其他的31个(I架构)或者15个(E架构)为普通的通用整数寄存器。

如果使用了浮点模块(F或者D),则需要另外一个独立的浮点寄存器组,包含32个通用浮点寄存器。如果仅使用F模块的浮点指令子集,则每个通用浮点寄存器的宽度为32比特;如果使用了D模块的浮点指令子集,则每个通用浮点寄存器的宽度为64比特。
2.3 规整的指令编码

在流水线中能够尽早尽快的读取通用寄存器组,往往是处理器流水线设计的期望之一,这样可以提高处理器性能和优化时序。RISC-V的指令集编码非常的规整,指令所需的通用寄存器的索引(Index)都被放在固定的位置,因此指令译码器(Instruction Decoder)可以非常便捷的译码出寄存器索引然后读取通用寄存器组。


2.4 简洁的存储器访问指令

与所有的RISC处理器架构一样,RISC-V架构使用专用的存储器读(Load)指令和存储器写(Store)指令访问存储器(Memory),其他的普通指令无法访问存储器。

存储器访问的基本单位是字节(Byte)。RISC-V的存储器读和存储器写指令支持一个字节(8位),半字(16位),单字(32位)为单位的存储器读写操作,如果是64位架构还可以支持一个双字(64位)为单位的存储器读写操作。

为了提高存储器读写的性能,RISC-V架构推荐使用地址对齐的存储器读写操作(地址非对齐的存储器操作也支持)。处理器可以选择用硬件来支持,也可以选择用软件来支持。

RISC-V架构仅支持小端格式。

RISC-V架构的存储器读和存储器写指令不支持地址自增自减的模式。

RISC-V架构采用松散存储器模型(Relaxed Memory Model)。(松散存储器模型对于访问不同地址的存储器读写指令的执行顺序不作要求,除非使用明确的存储器屏障(Fence)指令加以屏蔽)

2.5 高效的分支跳转指令/中断

RISC-V架构有两条无条件跳转指令(Unconditional Jump),jal与jalr指令。

跳转链接(Jump and Link)指令jal可用于进行子程序调用,同时将子程序返回地址存在链接寄存器(Link Register:由某一个通用整数寄存器担任)中。跳转链接寄存器(Jump and Link-Register)指令jalr指令能够用于子程序返回指令,通过将jal指令(跳转进入子程序)保存的链接寄存器用于jalr指令的基地址寄存器,则可以从子程序返回。

RISC-V架构有6条带条件跳转指令(Conditional Branch)

带条件的跳转指令跟普通的运算指令一样直接使用2个整数操作数,然后对其进行比较,如果比较的条件满足时,则进行跳转。因此,此类指令将比较与跳转两个操作放到了一条指令里完成。

对于没有配备硬件分支预测器的低端CPU,为了保证其性能,RISC-V的架构明确要求其采用默认的静态分支预测机制,即:如果是向后跳转的条件跳转指令,则预测为“跳”;如果是向前跳转的条件跳转指令,则预测为“不跳”,并且RISC-V架构要求编译器也按照这种默认的静态分支预测机制来编译生成汇编代码,从而让低端的CPU也能得到不错的性能。RISC-V架构特地定义了所有的带条件跳转指令跳转目标的偏移量(相对于当前指令的地址)都是有符号数,并且其符号位被编码在固定的位置。因此,这种静态预测机制在硬件上非常容易实现,硬件译码器可以轻松的找到这个固定的位置,并判断其是0还是1来判断其是正数还是负数,如果是负数则表示跳转的目标地址为当前地址减去偏移量,也就是向后跳转,则预测为“跳”。当然对于配备有硬件分支预测器的高端CPU,则可以采用高级的动态分支预测机制来保证性能。

异常发生 --> 硬件更改寄存器 --> 软件读取寄存器判断 --> 异常处理
系统会读取mcause寄存器判断何种异常从而跳转异常处理
RISC-V硬件不会保存上下文,需要软件保存和恢复

中断和异常机制往往是处理器指令集架构中最为复杂而关键的部分。RISC-V架构定义了一套相对简单基本的中断和异常机制,但是也允许用户对其进行定制和扩展。


使用特权

评论回复
板凳
豌豆爹|  楼主 | 2023-7-5 11:39 | 只看该作者
2.6 简洁的运算指令

RISC-V架构对任何的运算指令错误(包括整数与浮点指令)均不产生异常,而是产生某个特殊的默认值,同时,设置某些状态寄存器的状态位。RISC-V架构推荐软件通过其他方法来找到这些错误。

2.7 优雅的压缩指令子集

基本的RISC-V基本整数指令子集(字母I表示 )规定的指令长度均为等长的32位,这种等长指令定义使得仅支持整数指令子集的基本RISC-V CPU非常容易设计。但是等长的32位编码指令也会造成代码体积(Code Size)相对较大的问题。

为了满足某些对于代码体积要求较高的场景(譬如嵌入式领域),RISC-V定义了一种可选的压缩(Compressed)指令子集,由字母C表示,也可以由RVC表示。RISC-V具有后发优势,从一开始便规划了压缩指令,预留了足够的编码空间,16位长指令与普通的32位长指令可以无缝自由地交织在一起,处理器也没有定义额外的状态。

RISC-V压缩指令的另外一个特别之处是,16位指令的压缩策略是将一部分普通最常用的的32位指令中的信息进行压缩重排得到(譬如假设一条指令使用了两个同样的操作数索引,则可以省去其中一个索引的编码空间),因此每一条16位长的指令都能一一找到其对应的原始32位指令。因此,程序编译成为压缩指令仅在汇编器阶段就可以完成,极大的简化了编译器工具链的负担。

2.8 特权模式

RISC-V架构定义了三种工作模式,又称特权模式(Privileged Mode):

Machine Mode:机器模式,简称M Mode。

Supervisor Mode:监督模式,简称S Mode。

User Mode:用户模式,简称U Mode。

RISC-V架构定义M Mode为必选模式,另外两种为可选模式。通过不同的模式组合可以实现不同的系统。

RISC-V架构也支持几种不同的存储器地址管理机制,包括对于物理地址和虚拟地址的管理机制,使得RISC-V架构能够支持从简单的嵌入式系统(直接操作物理地址)到复杂的操作系统(直接操作虚拟地址)的各种系统。

一些相关寄存器

控制和状态寄存器(Control and Status Register,CSR),用于配置或记录一些运行的状态。CSR寄存器是处理器核内部的寄存器,使用其自己的地址编码空间和存储器寻址的地址区间完全无关系。
CSR寄存器的访问采用专用的CSR指令,包括CSRRW、CSRRS、CSRRC、CSRRWI、CSRRSI以及CSRRCI指令。

mtvec异常入口地址寄存器,指定异常处理的pc地址,软件可以更改其值。
mcause 软件可读取寄存器,查看异常原因。
mepc 保存原PC,用于异常返回,可读写,软件可以更改。
mtral 异常值。如果存储器访问,mtral为存储器地址;如果非法指令,mtral为非法指令编码。
mstatus 机器模式状态。MIE=1,该模式下中断全局打开,为0关闭。进入异常和退出时都会更改此寄存器。

3.RISC-V架构的生态

2018年11月,中国开放指令生态(RISC-V)联盟(下简称“RISC-V中国联盟”)成立,发布了中科院计算所翻译的中文版《RISC-V手册》。

3.1 RISC-V的一些硬件平台

平头哥半导体 支持RISC-V第三代指令系统架构处理器CK902

芯来科技 开源RISC-V处理器项目蜂鸟E203

兆易创新GD32VF103

嘉楠科技K210

其他RISC-V MCU硬核

FPGA软核SoC

3.2 RISC-V的软件开发环境

厂家提供IDE

IAR

Segger

基于开源软件或terminal调试

3.3 RISC-V实现

RISC-V内核在微控制器、微处理器和SoC中都可以进行移植和延伸。

除了基于RISC-V制造芯片之外,RISC-V在许多领域,比如编译器、模拟器、开发环境、操作系统等,都在逐渐形成生态。

4.文档下载指路

RISC-V 架构文档” 分为 “指令集文档”(riscv-spec-v2.2.pdf)和 “特权架构文档”(riscv-privileged-v1.10.pdf),可在RISC-V基金会的网站上(https://riscv.org/specifications/)无需注册便可免费下载。

5.一些对比

CISC CPU具有少量的寄存器和大量指令集,其中大多数可以访问内存。CISC运行在单个指令中递增变量。

RISC CPU具有大量的寄存器和非常适度的指令集,内存访问仅限于少数加载和存储指令。RISC需要用加载和存储来访问内存。
————————————————
版权声明:本文为CSDN博主「我朝山海而去」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47983247/article/details/125220154

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

513

主题

1960

帖子

5

粉丝