芯片原厂必学课程 - 第十篇章 - 基于 RISC-V SoC 的 1024 点 FFT 设计
10-02-03 RISC-V 指令集架构相关概述
新芯设计:专注,积累,探索,挑战
引言
本章《RISC-V 指令集及其经典的硬件架构》简要概述了 RISC-V 的指令集架构及其经典的 RISC-V CPU 的硬件架构。首先,简单地介绍了 RISC-V 的起源及其发展历程,以及 RISC-V 指令集架构的详细内容及其基本特点。接着,给出了较为经典的 RISC-V 内核的硬件架构及其设计特性。最后,对 RISC-V 指令集架构与 RISC-V 硬件架构设计进行了相关的总结。
NOTES:本文来自《芯片原厂必学课程 - 第十篇章 - 基于 RISC-V SoC 的 1024 点 FFT 设计》技术专栏
🌏 一、RISC-V 指令集架构相关概述
在计算机体系架构中,指令是 CPU 能够识别的最小二进制串,也是指引 CPU 工作的最基本信号。一组指令的集合称为指令集,而基于一套指令集设计的硬件方案即为指令集架构,亦称为处理器硬件架构。指令集架构不仅是 CPU 的设计理念,也是区分不同 CPU 的关键标准,更是决定了不同 CPU 的能效、功能及其应用领域等等。只要是遵循同一指令集架构来实现的处理器,就都可以运行相同的软件程序。例如,基于 Intel X86 架构的不同的 Intel 处理器上,都可以运行一样的 PC 软件,反之,同样的 PC 软件却无法运行在基于 ARM 架构的 Cortex-A 系列的处理器上。
RISC-V 相比于在个人计算机市场上占据主导地位的 Intel X86 架构和在嵌入式移动设备领域上处于核心地位的 ARM 架构,其具有可定制、高能效、简单灵活、开源免费等许多的无与伦比的特性。现如今,RISC-V 已普遍应用于数字信号处理、物联网、5G 和边缘计算等领域。
其实,RISC-V 指令集架构在 CPU 中不仅定义了基于指令的硬件单元的集合,还包括了数据格式、寻址方式、存储模型之类的软件功能。RISC-V 指令集作为搭载软件与硬件之间的桥梁,不仅决定了其硬件架构的特性,也决定了其软件编译的性能。
首先,基于 RISC-V ISA 的 RISC-V 编译器可以编译相关的软件程序,从而生成 RISC-V 指令集汇编与二进制代码。紧接着,基于 RISC-V ISA 的 RISC-V 处理器可以执行一系列的指令命令,来驱动最底层的硬件逻辑。其中,包括了数据运算、程序控制、指令跳转以及加载存储等基本的硬件操作。最终,硬件逻辑与操作系统互相配合,操控着系统总线与外围接口,进而实现相应的系统功能。
可见,指令集架构对于一款 CPU 的软硬件设计与实现、面积与性能、生态与功能等至关重要。然而,纵观整个指令集架构的历史长河,基于 RISC 架构的指令集百花齐放。例如,斯坦福大学研发的 MIPS、Synopsys 公司推出的 ARC、以及 DEC 公司设计的 Alpha 等等。那么,为何偏偏选择 RISC-V,这绝不是偶然的。其实,答案就在 RISC-V 的架构文档中。仔细阅读 RISC-V 的相关文档就能够体会到 RISC-V ISA 的设计不仅是一种先进的理念,更是一种具有创新性、革命性、突破性的重要意义。这里,RISC-V 独特的特点主要归纳如下:
✅ RISC-V 指令集是完全开源的:RISC-V 基金会官网公开了详细的指令集架构文档与设计规范、基于 RISC-V 架构的处理器、基于 RISC-V 的编译器以及基于 RISC-V 开发的软件编译工具链等等;
✅ 具有可扩展的、可自定义的指令:RISC-V 可以在基本整数指令集实现的基础之上,根据自己不同的设计领域或者特殊的适配场景,来拓展相应的指令集或者自定义相关的指令集。这一点是 ARM 和 X86 架构所不具备的,也是极具开创性的特点之一;
✅ 具有较少数量的指令:基于 32 位的基本整数指令集仅 47 条,就可以实现最基本功能的 32 位 RISC-V 嵌入式处理系统。可见,RISC-V 汲取了前面的指令集架构的设计经验,坚决抛弃复杂冗余的指令以及毫无意义的操作,追求极简的、精简的指令集架构;
✅ 按照指令功能来划分模块:32 位的 RISC-V 按照其功能属性,划分了 I、M、A、F、D、C 六个模块。通过指令集的模块化与可配置化,一方面可以令处理器的设计更加清晰,另一方面也可以针对不同的适用场景灵活选择不同的模块组合;
✅ 完整的 RISC-V 开发工具链:对于处理器来说,单有指令集架构是不够的,还必须配套完整的软件生态。RISC-V 已经具备了较为成熟的 IDE 集成开发环境、GCC 工具链、GDB 调试器、Spike 模拟器以及相关的库等等;
✅ 汇集开源的 CPU IP 的设计、SoC 的集成、平台的开发、流片的经历、产品的应用等等:例如 Rocket Core、Andes Core、PULPino SoC、兆易创新 GD32VF103 系列 MCU 以及蜂鸟 E200 系列的内核及其 SoC 系统等等。
RV32I 表示 32 位 RISC-V 架构的基本整数指令集,这是任何一款基于 32 位 RISC-V 架构的 CPU 都要实现一个基本指令集。其中,RV 是 RISC-V 的缩写,数字 32 代表着寄存器的宽度和指令的长度,I 是整数的英文首字母。只有在 RV32I 指令集实现的前提之下,RISC-V CPU 才能够对其 SoC 芯片进行相关的配置、引导、启动以及系统上电初始化,以满足 RISC-V 嵌入式系统运行的基本要求。
对于 RV32I 中的每一条指令,都有其统一且规范的指令编码格式。通过编码分类,不仅有利于缩短关键路径、统一数据通路与简化控制通路,还可以实现译码模块的并行处理与硬件加速等等。RV32I 一共分为 6 种指令格式,每一种指令格式都对应着具体的指令功能。
另外,为了支持特定的场景,在满足 RV32I 基本整数指令集的条件下,根据具体的软件程序及其应用领域,可以自定义多种标准扩展指令集的集合方式。在 RISC-V 的指令集架构中,一共定义了 5 种标准扩展指令集,分别是 M、A、F、D 和 C。RISC-V 架构设计师可以根据处理器应用的不同领域来组合不同的指令集模块,从而达到最佳的能效比。例如,针对低功耗小型设备的嵌入式领域,可以选择基本指令集I加上压缩指令集 C,针对乘法除法运算比较多的算法,可以选择基本指令集I加上标准整数乘法和除法的指令集 M 等等。
每一种标准扩展指令集也有其特定的指令格式,由于各种指令格式的数量比较多,仅以标准整数乘法和除法的扩展指令为例。通过对比 RV32I 指令格式,可以发现 RV32M 和 RV32I 中的 R 型指令的指令格式是一样的。主要都是对于源寄存器 rs1 和源寄存器 rs2 的两个操作数之间进行乘法或者除法,然后保存到目的寄存器 rd 中。不同的是,RISC-V 处理器会增加一个专门的乘法和除法的硬件模块来支持该指令的执行。
关于 RISC-V 的指令集的更加详细的资料,可以在 RISC-V 基金会网站上查阅。其中,包含了“指令集文档”和“特权架构文档”等等。