我要开始研究RISC-V了,从0开始学起。如果你想快速读这本书,快速汲取其中的精华,就看我的读书笔记叭!
本文只针对RISC-V的相关内容大纲进行整理,对于蜂鸟E200处理器的内容基本上简要略过。且内容只是大纲部分,便于对本文有全局的理解,以及便于今后的翻阅查找。
第一部分 CPU与RISC-V综述
该部分将介绍CPU的一些基础背景知识、RISC-V架构的诞生和特点。
第1章 一文读懂CPU之三生三世
主要介绍CPU的基础知识、指令集架构的历史、国产CPU的发展现状及原因、CPU的应用领域、各领域的主流架构、RISC-V的诞生背景等。
1.1 CPU概述
区分“处理器”和“处理器核”,“CPU”和“Core”
“处理器核”/“Core”:处理器内部最核心的部分,真正的处理器内核
“处理器”/“CPU”:完整的SoC,包含了处理器内核和其他的设备或者存储器。
区分CPU主要标准:CPU的灵魂——指令集架构(Instruction Set Architecture,ISA)
指令集:一组指令的集合,而指令是指处理器进行操作的最小单元(譬如加减乘除操作或者读/写存储器数据)
指令集架构:简称“架构”或者“处理器架构”。
有了指令集架构,便可以使用不同的处理器硬件实现方案来设计不同性能的处理器
微架构(Microarchitecture):处理器的具体硬件实现方案
CISC与RISC
指令集架构主要分为:
复杂指令集(Complex Instruction Set Computer,CISC):常用指令+不常用的特殊指令
精简指令集(Reduced Instruction Set Computer,RISC):常用指令
32位与64位架构
处理器架构的位数:通用寄存器的宽度,其决定了寻址范围的大小、数据运算能力的强弱
注意:处理器指令集架构的宽度和指令的编码长度无关
通常:
- 通用寄存器的宽度(指令集架构的位数):越多越好,更大的寻址范围和更强的运算能力
- 指令编码的长度:越短越好,节省代码的存储空间
常见的架构位数:8、16、32、64
知名的ISA
x86、SPARC、MIPS、Power、Alpha、ARM、ARC、Andes、C-Sky
CPU的应用领域
- 服务器领域:Intel x86
- PC领域:Intel x86
- 嵌入式领域
- 智能手机和手持设备(移动领域)
- 实时嵌入式领域
- 深嵌入式领域
1.2 为什么国产CPU尚未足够成功
细数国内自主开发CPU的公司与现状,以及它们选择的指令集流派
MIPS系——龙芯和君正
x86系——北大众志、兆芯、海光
Power系——中晟宏芯
Alpha系——申威
ARM系——飞腾、华为海思、展讯、华芯通
对于一款CPU而言,绝对的硬件技术水平不是最重要的,指令集架构(ISA)对于CPU极其重要。
目前商业主流的指令集架构在不同的领域已经各自出现了明显霸主的格局
- x86统治PC和服务器领域
- ARM通知移动手持领域,同时向PC和服务器领域进军
- ARM在嵌入式领域的绝对优势
1.3 ARM的统治地位
全世界有几十家大的半导体公司都使用ARM公司的授权,从ARM公司购买其设计的ARM处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM处理器芯片进入市场。
ARM架构处理器分为两种
- 由ARM公司开发并出售的IP,也俗称为公版ARM
- 由芯片公司基于ARM架构授权自主开发的私有内核,俗称为定制自研ARM
ARM Cortex系列分为三大类
- Cortex-A:面向性能密集型系统的应用处理器核
- 用于高性能低功耗应用处理器领域的32位和64位RISC处理器系列
- Cortex-R:面向实时应用的高性能核
- Cortex-M:面向各类嵌入式应用的微控制器核
至今,ARM架构已经应用到全球85%的智能移动设备中,其中有超过95%的智能手机都基于ARM的设计,基本上使得其他架构的处理器失去了进入该领域的可能性。
1.4 RISC-V简介
RISC-V由美国加州大学伯克利分校的Krste Asanovic教授、Andrew Waterman和Yunsup Lee等开发人员于2010年发明。
之所以发明一套新的指令集架构,而不是使用成熟的x86或者ARM架构,是因为这些架构经过多年的发展变得极为复杂和冗繁,并且存在着高昂的专利和架构授权问题
开源
免费
开发出了完整的软件工具链以及若干开源的处理器实例
一款指令集架构(ISA)最终能否取得成功,很大程度上取决于软件生态环境。
应用RISC-V,你也可以设计自己的处理器
第2章 RISC-V架构
本章将对RISC-V架构的设计思想进行深入浅出的介绍
2.1 RISC-V架构的设计哲学
简单可靠
架构篇幅:小
- 目前的"RISC-V架构文档"分为“指令集文档”和“特权架构文档”。
- 篇幅均为100多页
- RISC-V基金会网站,免费下载
模块化的架构
- RISC-V是一个模块化的架构,不仅短小精悍,其不同的部分还能以模块化的方式组织在一起,从而试图通过一套统一的架构满足各种不同的应用
- x86和ARM不具备
基本指令数目仅有40多条,加上其他的模块化扩展指令总共几十条指令
2.2 RISC-V指令集架构简介
模块化的指令子集
- RISC-V的指令集使用模块化的方式进行组织,每一个模块使用一个英文字母标识。RISC-V最基本也是唯一强制要求实现的指令集部分是由I字母表示的基本整数指令子集。使用该整数指令子集,便能够实现完整的软件编译器。其他的指令子集部分均为可选的模块,包括M/A/F/D/C。
- 特定组合“IMAFD”,称为通用组合,G表示
- 提高代码密度,可选的压缩指令子集,C表示,编码长度为16bit,普通的非压缩指令的长度为32bit.
- 进一步减少面积,提供嵌入式架构,E表示,主要用于追求极低面积与功耗的深嵌入式场景。该架构仅需要支持16个通用整数寄存器,而非嵌入式的普通架构则需要支持32个通用整数寄存器。
可配置的通用寄存器组
- 支持32位或64位的架构
- 32位架构由RV32表示,每个通用寄存器的宽度为32比特
- 64位架构由RV64表示,每个通用寄存器的宽度为64比特
- RISC-V架构的整数通用寄存器组,包含32个(I架构)或者16个(E架构)通用整数寄存器,其中证书寄存器0被预留为常数0,其他的31个(I架构)或者15个(E架构)为普通的通用整数寄存器。
- 如果使用浮点模块(F或D),则需要另外一个独立的浮点寄存器组,包含32个通用浮点寄存器。如果仅使用F模块的浮点指令子集,则每个通用浮点寄存器的宽度为32比特,如果使用了D模块的浮点指令子集,则每个通用浮点寄存器的宽度为64比特。
规整的指令编码
简洁的存储器访问指令
- 使用读指令Load和写指令Store指令访问存储器,其他指令无法访问
- 存储器访问的基本单位是字节。
- 读和写指令支持一个字节(8位)、半字(16位)、单字(32位)为单位的存储器读写操作
- 64位架构还可支持双字(64位)为单位的存储器读写操作
- 地址对齐
- 小端格式
- 不支持地址自增自减模式
- 松散存储器模型
高效的分支跳转指令
简洁的子程序调用
不使用无条件码执行
无分支延迟槽
不使用零开销硬件循环
简洁的运算指令
- 最基本的整数指令子集(I)支持的运算包括加法、减法、移位、按位逻辑操作和比较操作
- 整数乘除法指令子集(M)支持的运算包括有符号或者无符号的乘法和除法操作
- 单精度浮点指令子集(F)与双精度浮点指令子集(D)支持的运算包括浮点加减法、乘除法、乘累加、开平方根和比较等操作,同时提供整数与浮点、单精度与双精度浮点之间的格式转换操作。
- 任何运算指令错误均不产生异常,而是产生某个特殊的默认值,同时设置某些状态寄存器的状态位。
优雅的压缩指令子集
- RVC
- 16位指令的压缩策略是将一部分普通最常用的32位指令中的信息进行压缩重排得到,因此每一条16位长的指令都能找到其一一对应的原始32位指令。
特权模式
- RISC-V定义了3种工作模式——特权模式
- 机器模式 M mode(必选)
- 监督模式 S mode
- 用户模式 U mode
CSR寄存器
- 定义了一些控制和状态寄存器(Control and Status Register,CSR),用于配置或记录一些运行状态。是处理器核内部的寄存器,使用自己的地址编码空间,和存储器寻址的地址区间完全无关。
- 专用CSR指令
中断和异常
矢量指令子集
自定制指令扩展