前言:本文主要简单介绍RISC-V指令集,其中参考了浙江大学mooc《计算机组成与设计:RISC-V》和《手把手教你设计CPU——RISC-V处理器》,如果文章中有描述不恰当的地方,欢迎指正。

文章目录

  • 1、RISC-V指令集简介
  • 2、指令格式介绍
  • 3、RISC-V 32个通用寄存器介绍
  • 4、RISC-V 指令集
    • 4.1、RISC-V 指令分类
    • 4.2、6种基本指令格式具体介绍
      • 4.2.1、R型指令
      • 4.2.2、I 型指令
      • 4.2.3、S型指令
      • 4.2.4、B型指令
      • 4.2.5、U型指令
      • 4.2.6、J型指令
  • 总结

1、RISC-V指令集简介

RISC-V(英文发音为"risk-five")架构主要由美国加州伯克利分校(简称伯克利)的Krste Asanovic教授和Yunsup Lee等开发人员于2010年发明。经过几年的发展,伯克利为RISC-V架构开发了完整的软件工具链以及若干开源的处理器实例(例如Pocket Core和BOOM Core),并且得到了计算机体系结构领域的泰斗David Patterson的大力支持。
与大多数指令集架构相反,RISC-V指令集架构最大的特点就是开放,无论学术机构还是商业组织都可以免费地用于所有需要的设备中,允许任何人设计、制造和销售RISC-V芯片和软件。

2、指令格式介绍

指令(又称机器指令):是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
一条指令通常要包括操作码字段和地址码字段两部分:

3、RISC-V 32个通用寄存器介绍

RISC-V32I基础指令集共定义了32个32位的通用寄存器,分别标记为x0~x31。寄存器x0固定连接到常数0,还有一个额外的用户可见程序计数器pc寄存器,它保存当前指令的地址。32个寄存器的详细功能如下图所示:

4、RISC-V 指令集

4.1、RISC-V 指令分类

根据RISC-V指令的共性,主要将其分为以下6种指令格式:
根据RISC-V指令集之间的共性,其主要可分为以下6种指令格式(R、I、S、B、U、J)。

  1. R型指令——用于寄存器与寄存器之间算术运算操作;
  2. I 型指令——用于寄存器与立即数之间算术运算和读存储器操作;
  3. S型指令——用于写存储器;
  4. B型指令——用于分支转移操作(属于S型指令的变体,之前也叫SB型指令);
  5. U型指令——用于高20比特位立即数操作;
  6. J型指令——用于直接跳转(属于U型指令的变体,之前也叫UJ型指令)。

6种基本指令的格式如下图所示为:

——opcode表示7位指令操作码,用于区分不同的指令;
——funct3表示3位的功能码,funct7表示7位的功能码,用于辅助区分不同种类的指令;
——rs1和rs2表示两个5位的源寄存器;
——rd表示5位的目的寄存器,用于存储指令的运算结果;
——imm表示不同长度的立即数,一般会扩展为32位再进行运算操作;

4.2、6种基本指令格式具体介绍

4.2.1、R型指令

R型指令是最为常用的运算指令,主要用于寄存器与寄存器之间算术运算操作。如下图所示,具有两个5位的源寄存器地址、一个5位目的寄存器地址、一个7位的funct7功能码、一个3位的funct3功能码和7位的opcode操作码。

如上图R型指令格式所示,通过低7位的opcode(0110011)可以得出指令为R型指令,然后将32位的指令按照R型指令的格式划分相应的区域。由funct3(000)和funct7(0000000)可以得出指令执行add操作。rs1对应x19(10011),rs1对应x10(01010),rd1对应x18(10010),即将寄存器19的值加上寄存器10的值并将其运算结果存放到寄存器18这个地址上。注:RISC-V并无减法指令,可以通过加负数来实现减法,减少了指令集数量,这也符合RISC-V精简的原则。注:x10、x18和x19对应上面的32个通用寄存器。

其他R型指令操作如下图所示:

4.2.2、I 型指令

I 型指令主要用于寄存器与立即数之间算术运算和读存储器操作。如下图所示,具有一个5位的源寄存器地址、一个5位目的寄存器地址、一个12位的imm立即数、一个3位的funct3功能码和7位的opcode操作码。

如上图 I 型指令格式所示,通过低7位的opcode(0010011)可以得出指令为 I 型指令,然后将32位的指令按照I型指令的格式划分相应的区域。由funct3(000)可以得出指令执行addi操作。rs1对应x1(00001),立即数imm(1111_1100_1110 = -50)通过符号位扩展成32位,rd1对应x15(01111),即将寄存器1的值加上立即数(-50)并将其运算结果存放到寄存器15这个地址上。

其他I型指令操作如下图所示:

4.2.3、S型指令

S型指令主要用于写存储器的S型指令。如下图所示,具有两个5位的源寄存器地址、一个12位的imm立即数、一个3位的funct3功能码和7位的opcode操作码。

如上图S型指令格式所示,通过低7位的opcode(0100011)可以得出指令为S型指令,然后将32位的指令按照S型指令的格式划分相应的区域。由funct3(010)可以得出指令执行sw操作。rs1对应x2(00001)作为基地址,立即数imm(0000_0000_1000 = 8)通过符号位扩展成32位作为地址偏移量,rs1对应x14(01110)作为,即将寄存器2的值加上立即数(8)的值作为地址,并将此地址的值存入到寄存器14中。

其他S型指令操作如下图所示:

4.2.4、B型指令

B型指令主要用于分支转移操作的B型指令(属于S型指令的变体,之前也叫SB型指令)。如下图所示,具有两个5位的源寄存器地址、一个12位的imm立即数、一个3位的funct3功能码和7位的opcode操作码。


如上图B型指令格式所示,通过低7位的opcode(1100011)可以得出指令为B型指令,然后将32位的指令按照B型指令的格式划分相应的区域。由funct3(000)可以得出指令执行beq操作。rs1对应x19(10011),rs2对应x10(01010),立即数imm(0000_0000_1000 = 8),即若寄存器x19中的值与寄存器x10的值相等,则跳转到立即数所示的地址中;若不相等则不实行跳转。

其他B型指令操作如下图所示:

4.2.5、U型指令

U型指令主要用于高20比特位立即数操作的U型指令。如下图所示,具有一个5位的目的寄存器地址、一个20位的imm立即数和7位的opcode操作码。

如上图U型指令格式所示,也是通过低7位的opcode可以得出其指令类型,然后将32位的指令按照相应的型指令的格式划分相应的区域。例如执行lui x10,0x87654指令,即将0x87654存入到x10寄存器中的高20位中,剩余的12位低位补零。

4.2.6、J型指令

J型指令主要用于直接跳转的J型指令(属于U型指令的变体,之前也叫UJ型指令)。如下图所示,具有一个5位的目的寄存器地址、一个20位的imm立即数和7位的opcode操作码。

如上图U型指令格式所示,也是通过低7位的opcode可以得出其指令类型,然后将32位的指令按照相应的型指令的格式划分相应的区域。jal常用于子函数的调用,例如执行jal ra,FuncName指令,即跳转到要执行的子函数FuncName中,并将当前PC+4的值存入到寄存器rd中,方便执行完子函数后跳回。

总结

若需要更为全面的学习RISC-V的基础知识,推荐浙江大学mooc《计算机组成与设计:RISC-V》,《手把手教你设计CPU——RISC-V处理器》。此外,B站和中国大学MOOC(慕课)等网站也有相应的视频可供学习。

CPU设计——RISC-V指令集相关推荐

  1. RISC-V CPU设计(一)---RV32I指令集介绍

    RV32I是RISC-V最基本的指令集,包括6种,其中4种为核心的类型(R/I/S/U).下面给出了这6种指令的格式 指令详情如下 R型指令 包含两个源寄存器和一个目的寄存器编号,都是5位的(32个寄 ...

  2. Risc-V单周期CPU设计思考

    Risc-V单周期CPU设计思考 今年学校课程改革,计算机组成课开始教学Risc-V,写单周期CPU的时候发现网上好像大多都是MIPS的CPU设计,所以就把自己关于设计Verilog的一些思路整理出来 ...

  3. 从零开始的RISCV架构CPU设计(2)-CISC与RISC

    系列文章目录 上一节:从零开始的RISCV架构CPU设计(1)-CPU开源资料说明 文章目录 系列文章目录 前言 一.什么是CISC 二.什么是RISC 三.CISC与RISC 3.1 指令集实现架构 ...

  4. 基于RISC-V指令集的CPU设计和FPGA实现(二)

    RISC-V 指令集分析 其实接下来的指令介绍我刚开始不太确定要不要写,因为对于 CPU 设计和实现而言略有拖沓,但是熟练掌握指令格式还是对写 CPU 有帮助的.接下来的部分假如学过 RISC-V 指 ...

  5. 基于 FPGA 的 RISC CPU 设计(2)详细的模块设计思路及其 Verilog 代码

    引言         其实,一个 CPU 的设计中,各个子模块都是比较基本的.比较简单的,只是组合起来的一个整体架构会比较复杂而已,无论是时序路径,还是数据通路和控制通路,这里,主要详细介绍整个微架构 ...

  6. 在VIVADO上实现的非常简易的RISC-V CPU设计(来自《Verilog数字系统设计》夏宇闻著)

    在VIVADO上实现的非常简易的RISC-V CPU设计 一.实验要求重述: 1.实验目的 2.实验要求: 二.学习准备: 1.什么cpu? 2.cpu需要具有哪些部件? 3.什么是RISC_CPU? ...

  7. RISC V (RV32+RV64) 架构 整体介绍

    文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...

  8. 暑期实训CPU设计(四)

    基于MIPS指令集的简单CPU设计(20条指令)代码及注释 数据通路图: 自底向下,一个模块一个模块来 ALU: alu.v module alu (a,b,aluc,r,z); input [31: ...

  9. CPU的RISC和CISC架构的区别

    CPU的RISC和CISC架构的区别 有关RISC和CISC的区别方面, 之前就有一些零零碎碎的理解, 这里再次做一次总结, 以求深入. CISC架构的代表: x86, C51 RISC架构的代码:a ...

  10. 深入浅谈,CPU设计原理

    首先,声明这是一篇转载文,这篇文章是,从卡饭论坛 看到的一篇文章<深入浅谈,CPU设计原理>,是一篇连载,文章,卡饭论坛,是我高中的时候,经常去的论坛,里面有很多好的文章,推荐给大家.也许 ...

最新文章

  1. ccie对java有用吗,Java和ccie有啥区别
  2. easyui datagrid不是相邻的能合并单元格吗_万能的Ctrl+E快捷键,学会能一键批量解决Excel中90%的问题!...
  3. 开发环境搭建(1)——JDK安装
  4. nfs参数介绍与写法示例及报错( Operation not permitted)
  5. [CQOI2017] 老C的键盘(树形dp + 组合数)
  6. PostgreSQL函数(存储过程)----笔记
  7. 数据结构 快速排序的三种实现 (hoare版本 挖坑法 前后指针版本)与非递归实现
  8. 如何使用移动硬盘加密
  9. AcWing 898. 数字三角形
  10. 服务器中文档存储在哪,云服务器存储在哪
  11. Python数据结构,线性结构:栈、队列、双端队列、列表
  12. 计算机安装应用程序卸的步骤,怎么彻底删除电脑安装的软件程序
  13. 开票软件V2.0.49_ZS_20220630开票接口
  14. VMware+WinDBG_配置_资料
  15. Matthew Dean Schwartz《Quantum Field Theory and The Standard Model》(马修·迪恩·施瓦茨《量子场论与标准模型》)中文目录
  16. 各大网站JQuery的CDN库
  17. Sketch 插件导出切片
  18. Linux 30岁,这些年经历了什么?
  19. android优化大师下载最新版,安卓优化大师
  20. BIT-MiniCC——parser(lab5语法分析器)

热门文章

  1. Efficient Protocols for Set Membership and Range Proof 学习笔记
  2. 最新微软产品MAK激活密钥
  3. Zynq系列--Uboot移植
  4. 关键字:c++builder(BCB) C# WebService EAccessViolation
  5. 0602 信用卡防盗刷学习总结
  6. 关于JAVAFX的鼠标单击事件案例
  7. 凸优化基础知识—对偶(Duality)
  8. Photoshop CS5软件安装教程
  9. 时光飞逝,博客两周年啦
  10. 本地安全管理审核UDF 第2版 - lsasecur.au3