RISC-V指令集架构------RV32I基础整数指令集

2023-05-16

0. 基本整数指令集的分类

    RISC-V指令集分为基础指令集和扩展指令集,此外又根据不同的处理器位宽分为32位、64位和128位指令集,比如RV32I就表示32位处理器的基本整数指令集,此外,为了进一步的支持嵌入式处理器,还拓展了RV32R指令集,上边这些各类指令的具体含义和意义都可以在RISC-V的官方网站上找到:Specifications – RISC-V International (riscv.org)

    下边本文主要学习和介绍RV32I的基础指令集,其他指令集与之仅有微小的差异。

     前段时间动手写了一个基于RV32I的五级流水线RISC-V处理器,犹豫了一段时间要不要专门分享以下设计流程这样子,但又觉得现在RISC-V的开源项目已经太多了,即使写完也不一定会有用,这个处理器的详细架构图在我的另一个博客 RISC-V指令集_努力学习的小英的博客-CSDN博客icon-default.png?t=N176https://blog.csdn.net/qq_38798111/article/details/129695667?spm=1001.2014.3001.5502

是一个比较经典的五级流水,然后做了一些小小的优化,看如果感兴趣的人多的话,就再写一下,目前还是先把指令集更新完成。

1. 基本整数指令集

    RV32I指令集中包括算术、逻辑、位移、比较、分支、存储和加载运算指令,可以完成一个处理器的所有基本功能,是一个最小的处理器。但如果想要在其基础上增加性能或增加对其他场景的兼容能力,可以可选的增加一些拓展指令如F型浮点运算等。

   RV32I中共包括六种类型的指令:

  • R型指令:寄存器类型指令,用于在寄存器之间执行算术、逻辑和比较运算。这些指令使用三个寄存器参数。
  • I型指令:立即数类型指令,用于在寄存器和立即数(常数)之间执行算术、逻辑、移位和分支等操作。这些指令使用两个寄存器参数和一个立即数参数。
  • S型指令:存储类型指令,用于将寄存器中的数据存储到存储器中。这些指令使用两个寄存器参数和一个偏移量参数。
  • B型指令:分支类型指令,用于根据条件跳转到不同的代码段。这些指令使用两个寄存器参数和一个偏移量参数。
  • U型指令:无条件跳转类型指令,用于无条件跳转到指定的地址。这些指令使用一个立即数参数。
  • J型指令:跳转类型指令,用于跳转到指定的地址。这些指令使用一个寄存器参数和一个偏移量参数。

这六种类型指令的指令格式如下:

     其中:

  • opcode:操作码,每个指令类型都有只属于自己的编码值,用于区分不同的指令类型;
  • rd:目标寄存器,需要写入的通用寄存器,该Bit域是寄存器的地址;
  • func7,func3:表示指令的功能,同一指令类型中通过这几个bit域来区分具体功能(数字“7”代表是占用7-bit位宽,数字“3”同样);
  • rs1:源寄存器1,需要读取的通用寄存器,该Bit域是寄存器的地址;
  • rs2:源寄存器2,需要读取得通用寄存器,该Bit域是寄存器的地址;
  • imm:立即数,该Bit域的数值可直接用于计算,是常数。

2. RV32I的寄存器

    可以看到上述的六种类型寄存器一方面可以将存储器的数据读取到寄存器中,或将寄存器中数据写入到存储器,另一方面也可以操作寄存器与寄存器、寄存器与立即数间进行各类运算。所以需要使用一定的寄存器堆来缓存中间数据,这类寄存器堆的速度要求极高,需要与处理器主频一致,所以其大小也受到了限制,对于RV32I来说,一共有32个32bits的寄存器:

 其中x0,为固定的常数0寄存器,其余的寄存器理论上可以互相通用,但为了方便起见,不同的寄存器尝尝会有一些特定的场合,比如一些寄存器就会专门用来保存函数调用时的返回地址等,这里不做过于详细的讨论(其实我也不特别懂,等到真的去编写编译器应该就会更深入的研究一下,哈哈哈)。

3. RV32I的指令概述

    上边说到RV32I一共有六种类型的指令,先把所有的指令列出来,然后下一章详细的对每一个指令的作用和流程进行介绍:

 4. RV32I指令集的详细介绍

4.1 R型指令

4.1.1 ADD指令(ADD rd,rs1,rs2):

  • 把寄存器x[rs2]加到寄存器x[rs1]上,结果写入x[rd],忽略算数溢出。

4.1.2 SUB指令(SUB rd,rs1,rs2)

  • x[rs1]减去x[rs2],将结果写入x[rd],忽略算数溢出。

 4.1.3 XOR指令(XOR rd,rs1,rs2)

  • 异或,x[rs1]和x[rs2]按位异或,将结果写入x[rd]

4.1.4 OR指令(OR rd,rs1,rs2)

  • 或,x[rs1]和x[rs2]按位或后,将结果写入x[rd]

4.1.5 AND指令(AND rd,rs1,rs2)

  • 与,将寄存器x[rs1]和x[rs2]按位相与后,将结果写入x[rd]

4.1.6 SLL指令(SLL rd,rs1,rs2)

  • 逻辑左移(Shift Left Logical),把寄存器x[rs1]左移x[rs2]位,空的位置填0后,将结果写入x[rd]。x[rs2]的低5位(如果是RV64I则是低6位)代表移动位数,其余高位则忽略。

4.1.7 SRL指令(SRL rd,rs1,rs2)

  • 逻辑右移,把寄存器x[rs1]右移x[rs2]位,空的位置填0后,将结果写入x[rd]。x[rs2]的低5位(如果是RV64I则是低6位)代表移动位数,其余高位则忽略。

4.1.8 SRA指令(SRA rd,rs1,rs2)

  • 算数右移(Shift Right Arithmetic),把寄存器x[rs1]右移x[rs2]位,空位用x[rs1]最高位填充,结果写入x[rd]。x[rs2]的低5位(如果是RV64I则是低6位)代表移动位数,其余高位则忽略。

4.1.9 SLT指令(SLT rd,rs1,rs2)

  • 小于则置位(Set if Less Than),比较x[rs1]和x[rs2]中的数,如果x[rs1]更小,则像x[rd]写入1,否则写入0。

4.1.10 SLTU指令(SLTU rd,rs1,rs2)

  • 无符号小于则置位(Set if Less Than,Unsigned),比较x[rs1]和x[rs2],比较时视为无符号数,如果s[rs1]更小,则向x[rd]写入1,否则写入0。

4.2 I型指令

4.2.1 ADDI指令(ADDI rd,rs1,immediate)

  • 加立即数(Add Immediate),吧符号位拓展的立即数加到寄存器x[rs1]上,结果写入x[rd],忽略算数溢出。

4.2.2 XORI指令(XORI rd,rs1,immediate)

  • 立即数异或(Exclusive-OR Immediate),x[rs1]和有符号位扩展的immediate按位异或,结果写入x[rd]。

4.2.3 ORI指令(OR rd,rs1,immediate)

  • 立即数或(OR immediate),将寄存器x[rs1]和有符号位扩展的立即数immediate按位或,结果写入x[rd]。

4.2.4 ANDI指令(ANDI rd,rs1,immediate)

  • 立即数与(And immediate),把符号位扩展的立即数和寄存器x[rs1]上的值按位与,结果写入x[rd]。

4.2.5 SLLI指令(SLLI rd,rs1,shamt)

  • 立即数逻辑左移(Shift Left Logical Immediate),把寄存器x[rs1]左移shamt位,空出的位置填入0,结果写入x[rd]。对于RV32I,仅当shamt[5]=0时,指令才是有效的

4.2.6 SRLI指令(SRLI rd,rs1,shamt)

  • 立即数逻辑右移(Shift Right Logical Immediate),把寄存器x[rs1]右移shamt位,空出的位置填入0,结果写入x[rd]。对于RV32I,仅当shamt[5]=0时,指令才是有效的。

4.2.7 SRAI指令(SRAI rd,rs1,shamt)

  • 立即数算数右移(Shift Right Arithmetic Immediate),把寄存器x[rs1]右移shamt位,空位用x[rs1]的最高位填充,结果写入x[rd]。对于RV32I,仅当shamt[5]=0时指令是有效的。

4.2.8 SLTI指令(SLTI rd,rs1,immediate)

  • 小于立即数则置位(Set if Less Than Immediate),比较x[rs1]和有符号扩展的immediate,如果x[rs1]更小,向x[rd]写入1,否则写入0。

4.2.9 SLTIU指令(SLTIU rd,rs1,immediate)

  • 无符号小于立即数则置位(Set if Less Than Immediate, Unsigned),比较x[rs1]和有符号扩展的immediate,比较时视为无符号数,如果x[rs1]更小,向x[rd]写入1,否则写入0。

4.2.10 LB指令(LB rd,offset(rs1))

  • 字节加载(Load Byte),从地址x[rs1]+sign-extend(offset)读取一个字节,经符号位扩展后写入x[rd]。

4.2.11 LH指令(LH rd,offset(rs1))

  • 半字节加载(Load Halfword),从地址x[rs1]+sign-extend(offset)读取两个字节,经符号位扩展后写入x[rd]。

4.2.12 LW指令(LW rd,offset(rs1))

  • 字加载(Load Word),从地址x[rs1]+sign-extend(offset)读取四个字节,写入x[rd]。对于RV64I,需要进行符号位扩展。

4.2.13 LBU指令(LBU rd,offset(rs1))

  • 无符号字节加载(Load Byte,Unsigned),从地址x[rs1]+sign-extend(offset)读取一个字节,经零扩展后写入x[rd]。

4.2.14 LHU指令(LHU rd,offset(rs1))

  • 无符号半字加载(Load Halfword,Unsigned),从地址x[rs1]+sign-extend(offset)读取两个字节,经零扩展后写入x[rd]。

4.2.15 JALR指令(JALR rd,offset(rs1))

  • 跳转并寄存器链接(Jump and Link Register),把pc寄存器设置为x[rs1]+sign-extend(offset),把计算出的地址的最低有效位设为0 ,并将源pc+4的值写入x[rd]。

4.2.16 ECALL指令

  • 环境调用(Environment Call),通过引发环境调用异常来请求执行环境。

4.2.17 EBREAK指令

  • 环境端点(Environment Breakpoint),通过抛出端点异常的方式请求调试器。

4.3 S型指令

4.3.1 SB指令(SB rs2,offset(rs1))

  • 存字节(Store Byte)将x[rs2]的低字节存入内存地址x[rs1]+sign-extend(offset)。

4.3.2 SH指令(SH rs2,offset(rs1))

  • 存半字(Store Halfword),将x[rs2]的低位2字节存入内存地址x[rs1]+sign-extend(offset)。

4.3.3 SW指令(SW rs2,offset(rs1))

  • 存字(Store Word),将x[rs2]的低4个字节存入内存地址x[rs1]+sign-extend(offset)。

4.4 B型指令

4.4.1 BEQ指令(beq rs1,rs2,offset)

  • 相等时跳转分支(Branch if Equal),如果寄存器x[rs1]和寄存器x[rs2]的值相等,把pc的值设置为当前值加上符号位扩展的偏移offset。

4.4.2 BNE指令(bne rs1,rs2,offset)

  • 不相等时分支(Branch if Not Equal),如果寄存器x[rs1]和寄存器x[rs2]的值不相等,把pc的值设为当前值加上符号位扩展的偏移offset。

4.4.3 BLT指令(blt rs1,rs2,offset)

  • 小于时分支(Branch if Less Than),如果寄存器x[rs1]的值小于寄存器x[rs2]的值(均视为二进制补码),那么把pc的值设为当前值加上符号位扩展的偏移offset。

4.4.4 BGE指令(bge rs1,rs2,offset)

  • 大于等于时分支(Branch if Greater Than or Equal),如果寄存器x[rs1]的值大于等于寄存器x[rs2]的值(均视为二进制补码),那么把pc值设置为当前值加上符号位扩展的偏移offset。

4.4.5 BLTU指令(bltu rs1,rs2,offset)

  • 无符号小于时分支(Branch if Less Than,Unsigned),如果寄存器x[rs1]的值小于寄存器x[rs2]的值(均视为无符号数),那么把pc的值设置为当前值加上符号位扩展的偏移offset。

4.4.6 BGEU指令(bgeu rs1,rs2,offset)

  • 无符号大于等于时分支(Branch if Greater Than or Equal,Unsigned),如果寄存器x[rs1]的值大于等于寄存器x[rs2]的值(均视为无符号数),那么把pc值设为当前值加上符号位扩展的偏移offset。

4.5 U型指令

4.5.1 LUI指令(lui rd,immediate)

  • 高位立即数加载(Load Upper Immediate),将符号位扩展的20位立即数immediate左移12位,并将低12位置零,写入x[rd]中。

4.5.2 AUIPC指令(auipc rd,immediate)

  • PC加立即数(Add Upper Immediate to PC),把符号位扩展的20位立即数加到pc上,结果写入x[rd]。

4.6 J型指令

4.6.1 JAL指令(jal rd,offset)

  •  跳转并链接(Jump and Link),把下一条指令的地址(pc+4)存储到x[rd]寄存器,然后把pc设置为当前值加上符号位扩展的offset。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RISC-V指令集架构------RV32I基础整数指令集 的相关文章

  • python实现视频转文字

    最近在做视频转文本的工作 xff0c 遇到了不少问题 xff0c 记录一下 本博客包括以下内容 xff1a 1 如何将视频转换成音频 2 如何调用科大讯飞API实现音频转文字 首先 xff0c 视频转文本 xff0c 如果调用科大讯飞API
  • centos7安装gitlab-ce

    安装gitlab ce 首先安装依赖 xff1a yum install curl openssh server openssh clients postfix policycoreutils python启动所需服务 systemctl
  • vue使用element-plus创建项目

    vue cli创建项目 报错 找到windows powershell 管理员 xff0c 必须以管理员身份执行 xff0c 输入 set ExecutionPolicy RemoteSigned 选择创建方式 Default Uue 3
  • java zip文件解压(含有密码解压)

    maven需要加入以下依赖 xff1a lt dependency gt lt groupId gt net lingala zip4j lt groupId gt lt artifactId gt zip4j lt artifactId
  • pcl用PCLVisualizer可视化ply数据,显示界面卡死问题

    pcl用PCLVisualizer可视化ply数据 xff0c 显示界面卡死问题 在addPointCloud后面加一句viwer gt spin
  • 2020-11-08

    超级好用的免费PDF转word网站 超级PDF https xpdf net 一个超级好用的PDF处理网站 xff0c 功能强大 这个网站提供了丰富的PDF转换 xff0c 处理功能 xff0c 支持OCR识别 操作简单 xff0c 速度快
  • 2021-04-23

    看起来像传指针的传值的函数参数传递 span class token keyword void span span class token function func span span class token punctuation sp
  • 3D slicer编译过程中遇到的问题总结

    3D slicer编译过程中遇到的问题总结系列一 1 xff0c 有关python部分编译 1 gt 已启动生成 项目 python setuptools 配置 Debug x64 1 gt Creating directories for
  • Haskell大世界+思考

    文章目录 基石般灵活表现自由的抽象范式编程语言是什么 xff1f 推荐论文大佬建议MetaHaskell 实现类型系统语言抽象 模式问题解决方案 Haskell在工业界有哪些实际的应用 xff1f 关于fp的一些思考递归是循环的超集 同样是
  • Promox VE(PVE) 连接wifi配置

    pve一个管理虚拟机和容器的平台 xff0c 由于是开源免费的 xff0c 被很多小伙伴用来搭建自己的 34 all in one 34 主机 我也看过很多相关文章和教程 xff0c 看着大家玩的不亦乐乎 xff0c 再看着自己半退役的笔记
  • vscode的conda环境切换和快捷键终端切换文件所在路径

    最近miniconda太多环境 xff0c vs code编辑切换太麻烦 xff0c 于是整个快捷键 cmd 43 shift 43 p设置user settingup json 34 terminal integrated shell w
  • SonarLint黄线警告python:S125

    SonarLint黄线警告python S125 刚安装了SonarLint到我的vscode上 xff0c 发现有黄线警告说我的代码风格不好 黄线的原因是 xff1a 程序员不应该注释掉代码 xff0c 因为它使程序膨胀 xff0c 降低
  • mark点Z3学习资料整理

    文章目录 Anything is NothingLess is MoreSMTz3 classeslogic programming Reasoning符号推理策略strategiesFixed point关系代数datalog程序分析验证
  • windows和wsl设置代理

    wsl查看host ip用脚本试试查看具体当下宿主机和wsl自身不同的两个ip或者 分配固定ip 或者cmd用ipconfig看或者localhost 127 0 0 1 xff0c 然后区分socks5还是http协议 xff0c 然后查
  • 数学物理计算机的思考

    一些关于数学物理计算机的妄言 如果说冥冥之中有一种真理 自然世界的运作规律 61 真理 61 自然科学 xff0c 致敬牛顿的那本著名的几何书 xff0c 我会把它叫做 自然哲学 以下我说的每句话 xff0c 都蕴涵着我自己的生活经历 xf
  • 一个知乎提问引发的(思考)[https://www.zhihu.com/question/263431508/answer/574084280]

    表示很喜欢这个问题 xff0c 深有同感 xff01 这个问题也让我这种杂家谈谈想法吧 xff0c 看题主应该是骨骼精奇的奇才 xff0c 我假想读者是 小学生 xff0c 所以 xff0c 觉得我啰嗦的大大 xff0c 忍忍吧 xff0c
  • Johnson算法PlantSimulation解决两机器多作业排版问题

    生产系统仿真应用教程PlantSimulation 周金平Johnson算法代码写错了的源代码 xff1a is i j m n y integer do y 61 Jobs ydim m 61 1 n 61 y for i 61 1 to
  • 组成原理---补码加减法,原码一两位乘法,补码一两位乘法,754标准

    翻转课堂 xff0c 学生讲课 xff0c 笔记顺便贴上来吧 万一有人需要呢 这里754标准其实可以看https blog csdn net xingqingly article details 18981671 xff0c 我没有把尾数规
  • POSIX 网络API原理

    1 POSIX 网络API 网络编程常用的API xff1a 2 IO函数的内部过程分析 2 1 Socket socket作为网络编程的第一个函数 xff0c 主要作用是用于创建句柄和对应的TCB控制块 xff1b 建立起文件描述符和内部
  • 卷积神经网络(CNN)的平移不变性和旋转不变性。

    文章目录 不变性的介绍不变性的原理 不变性的介绍 不变性意味着即使目标的外观发生了某种变化 xff0c 但是你依然可以把它识别出来 旋转不变性和平移不变性 xff1a 通俗的讲 xff0c 我给你一张图片 xff0c 你识别出来这是只狗 x

随机推荐

  • ubuntu22.04版本APPimage启动报错问题解决

    文章目录 前言 xff1a 报错信息解决方法结果展示你以为就完了 xff1f 天真 xff01 结果展示2结语 前言 xff1a 因为个人比较喜欢提前使用一些较新的软件 系统之类的东西 xff0c 所有在ubuntu22刚发行就选择了升级
  • 音视频封装原理简介

    1 什么是数据化封住和解封装 xff1f 2 视频数据的封装 3 什么是音视频的封装格式 4 封装格式
  • wsl 配置 java 环境以及使用 vscode 调试

    wsl 配置 java 环境以及使用 vscode 调试 原文 xff1a https blog csdn net huiruwei1020 article details 107775782 按照原文我无法运行 xff0c 按照Stack
  • L13. hrtimer使用实例(高精度定时器)

    1 简介 随着内核不断更新演进 xff0c 内核对定时器的分辨率要求越来越高 硬件的高速发展也逐渐能够满足内核的这一要求 xff0c 因此内核针对硬件提供的便利 xff0c 开始设计了更高分辨率的定时器 xff08 hrtimer xff0
  • 鸿蒙操作系统下载

    简介 华为最近开源了自产的操作系统 Harmony 凑一波热闹 xff0c 下载源码看看 横看成岭侧成峰 xff0c 远近高低各不同 由于目前水平有限 xff0c 所以不对鸿蒙操作系统做出过多评价 xff0c 只是下载来学习一下 愿景是希望
  • 5. C++ 抽象类

    1 简介 抽象类往往用来表征对问题领域进行分析 设计中得出的抽象概念 xff0c 是对一系列看上去不同 xff0c 但是本质上相同的具体概念的抽象 通常在编程语句中用 abstract 修饰的类是抽象类 在C 43 43 中 xff0c 含
  • C++并发编程 - 互斥锁(lock_guard和unique_lock)

    C 43 43 并发编程 互斥锁 在多线程的编程中 xff0c 共享数据的修改限制是必不可少的环节 期望的是 当一个线程访问共享数据期间 xff0c 此数据不应该被其他线程修改 xff1b 当某个线程修改了共享数据 xff0c 应通知其他线
  • CMake搭建编译环境总结

    前言 交叉编译算是每个嵌入式开发者都会经历的一道坎吧 xff0c 通俗的描述就是搭建Arm板代码编译环境 xff0c 让代码能够在Arm板子上跑起来 常用到的编译工具为Makefile和CMake xff0c 本篇记录下CMake的常用技巧
  • C++ lambda表达式

    lambda表达式 目录 一 开篇二 lambda初识三 lambda基本用法四 lambda表达式捕获列表五 总结六 参考 一 开篇 lambda表达式是C 43 43 11引进的一个新特性 xff0c 其写法比较新颖 xff0c 经常被
  • 网络编程 - Linux socket编程

    前言 socket 套接字 是网络编程编程的一种技巧 通过socket不仅可以实现跨进程通信 xff0c 还可以实现跨主机的网络通信 使用这种技术 xff0c 就可以实现全国各地的通讯 例如 xff1a 深圳的一台电脑接收来自北京一台电脑发
  • 记一次STM32F3单片机无法下程序解决方法

    不知道什么操作导致keil5下载STM32F3的程序时报以下错误 xff1a JLink info DLL V4 90 compiled Jul 28 2014 10 35 20 Firmware J Link OB STM32F072 C
  • SpringBoot集成MyBatis-Plus代码生成器(V3.5.1)

    1 说明 MyBatis Plus在3 5 1版本之后 xff0c 改变了代码生成器的用法 xff0c 由于对历史版本的不兼容 xff0c 这次重新梳理一份新的用法 3 5 1版本之前的代码生成器请参考 xff1a SpringBoot集成
  • 插上串口设备导致鼠标乱飘

    今天再一次遇见这种怪事 xff0c 屏幕上鼠标到处乱飘不受控制 xff0c 之前也遇到过 xff0c 没仔细研究 最终在网上搜寻答案发现是插上串口设备导致的问题 xff0c 因为串口一直不停的发送数据 xff0c 会导致电脑将其误识别成鼠标
  • openstack(queens)部署Zun服务

    zun安装手册 Zun是Openstack中提供容器管理服务的组件 xff0c 本文使用的是centos7上的openstack xff08 queens xff09 环境 目录 zun安装手册 3 在controller节点上安装zun服
  • Supervisor 定期重启指定进程

    简介 supervisor 是用 Python 开发的一套通用的进程管理程序 xff0c 能将一个普通的命令行进程变为后台 daemon xff0c 并监控进程状态 xff0c 异常退出时能自动重启 它是通过 fork exec 的方式把这
  • linux 源码安装 xrdp

    前言 xrdp可以做两件事 xff0c 第一件事就是可以使得linux支持RDP协议 xff0c 使得linux桌面能够通过mstsc连接 xff0c 第二件事就是RDP代理 xff0c 我们能通过xrdp连接到其他人的RDP资源 前者 x
  • 编译openssl时发生错误

    编译openssl时发生错误 error OPENSSL ALGORITHM DEFINES no longer supported 原理参考 xff08 由于同时安装了openssl 1 1和openssl 1 0 xff09 版本 xf
  • Linux 非源码安装 xrdp

    基本环境说明 我的是Centos 7 mini 或者 Ubuntu最小化安装 xff0c 想通过mstsc连接到xrdp xff0c 再通过xrdp连接到 Centos 7 mini xff0c 不安装桌面 xff0c 只打开 xterm
  • Selenium常用实战功能指南

    文章目录 自动化前言元素定位的几种方法id定位name定位link text定位partial link text定位xpath定位 xff08 重点 xff09 css定位常见问题 元素操作的常用方法基本方法send keys textg
  • RISC-V指令集架构------RV32I基础整数指令集

    0 基本整数指令集的分类 RISC V指令集分为基础指令集和扩展指令集 xff0c 此外又根据不同的处理器位宽分为32位 64位和128位指令集 xff0c 比如RV32I就表示32位处理器的基本整数指令集 xff0c 此外 xff0c 为