当前位置: 首页 > news >正文

RISC-V指令格式

RISC-V指令格式

  • 1 RISC-V指令集命名规范
  • 2 RISC-V指令集组成
    • 2.1 基础整数指令集
    • 2.2 扩展指令集
  • 3 RISC-V指令格式
    • 3.1 指令表述
    • 3.2 指令格式

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。

1 RISC-V指令集命名规范

前面提到过RV32I,这是什么含义呢?
我们看看RISC-V的命名规范,是如何定义的,就明白了。

RISC-V命名规范:RV[###][abc……xyz]

  • RV:用于标识 RISC-V 体系架构的前缀,即 RISC-V 的缩写。
  • [###]:用于标识处理器的字宽,也就是 处理器的寄存器宽度(单位为 bit),通常可以为32、64、128。
  • [abc…xyz]:标识该处理器支持的,指令集模块集合。

因此,RV32I,表示RISC-V的32位整数指令集,它是RISC-V 的核心,是冻结的,永远不会改变。
也就是说,RISC-V的所有指令集合名称,全部是以RV打头,加位宽,加模块名来组成的,后续识别也就很简单了。

2 RISC-V指令集组成

RISC-V指令集,是以一个基础整数指令集,为核心模块,根据需要再选择多个扩展指令集,组合而成的。

用一个公式简单表达,即:

RISC-V指令集 = 1个基础整数指令集 + 多个可选的扩展指令集

在RISC-V指令集架构中,G表示通用组合,全称为RV32G(32位)或RV64G(64位)。这个通用组合由一系列指令子集模块组成,其中包括I、M、A、D、F等模块。这些模块组合在一起,形成一个完整的指令集。
因此,G是RISC-V指令集架构中通用处理器所包含的指令集的表示。

也就是说,用公式表示,即:

G = I + M + A + D + F

I表示基础整数指令集;M/A/D/F表示具体扩展指令集,含义见后续。

2.1 基础整数指令集

基础指令集是固定的,永远不会改变。扩展指令集类似一种插件的思想。
RISC-V协议规定的,基础整数指令集,一共有4种,如下所示:
在这里插入图片描述
高字长的基础整数指令集向下兼容。
其中嵌入式指令集(Embedded)是基础整数指令集的子集,在一些小型的嵌入式场景中适用。

设计时,只需要从4种指令集中,任选一种即可。

目前RV128I,需要根据实际使用来改进设计规范,因此尚未冻结。

2.2 扩展指令集

RISC-V 允许在实现中以可选的形式实现,其他标准化和非标准化的指令集扩展。
RISC-V协议规定的,扩展指令集,就比较多了,如下所示:
在这里插入图片描述

  • M:乘法和除法指令(RV32M,RV64M)
  • A:原子指令(RV32A,RV64A)
  • F:单精度浮点指令(RV32F,RV64F)
  • D:双精度浮点指令(RV32D,RV64D)

特定组合“IMAFD”被称为 “通用(General)”组合,用英文字母 G 表示,比如:

它们与RV32I统称为RV32G,或者与RV64I统称为RV64G
RV32G,表示32位RISC-V通用处理器,指令集组合。
RV64G,表示64位RISC-V通用处理器,指令集组合。

3 RISC-V指令格式

3.1 指令表述

在RISC-V中,指令是通过如下图方式,表述的:
在这里插入图片描述
图中,从左到右连接带下划线的字母,即可描述若干条指令。

  • 大括号{ } 内列举了每组指令的所有变体。
  • 这些变体通过带下划线的字母,和不表示任何字母的下划线_ 区分。

例如,上图表示slt、slti、sltu、sltiu 这4 条RV32I 指令。

3.2 指令格式

RISC-V 只有6 种指令格式,每条指令都是32 位。

  • R 型指令,用于寄存器间操作
  • I 型指令,用于短立即数和取数(load)操作
  • S 型指令,用于存数(store)操作
  • B 型指令,用于条件分支跳转
  • U 型指令,用于长立即数
  • J 型指令,用于无条件跳转

这6 种指令格式定义,如下图所示:

在这里插入图片描述

  • opcode,表示操作码,固定占用[6:0]。
  • rd (Destination Register),表示目的寄存器,固定占用[11:7](若存在)。
  • funct3,表示操作字段,固定占用[14:12](若存在)。
  • funct7,表示操作字段,固定占用[31:25](若存在)。
  • rs1 (Source Register #1),表示第一个源操作数寄存器,固定占用[19:15](若存在)。
  • rs2 (Source Register #2),表示第二个源操作数寄存器,固定占用[24:20](若存在)。
  • imm,表示立即数,位域位置不固定,不同类型指令有不同定义。

RISC-V的所有指令,全部都是基于这6种格式来建立的。

为帮助程序员,所有位全为0 的指令,是一条非法的指令。因此,错误地易于编程/编译/链接跳转到被清零的内存区域将立即触发自陷,从而帮助调试。
类似地,所有位全为1 的指令,也是非法指令,这能在发生其他常见错误时触发自陷,如访问未编程的非易失性内存设备、断开连接的内存总线或损坏的内存芯片。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024.2.5 vscode连不上虚拟机,始终waiting for server log
  • 极值图论基础
  • C#的Char 结构的像IsLetterOrDigit(Char)等常见的方法
  • 【OpenVINO™】在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5 (下篇)
  • 【Spring MVC篇】参数的传递及json数据传参
  • 蓝桥杯基础知识7 vector
  • 【java】Hibernate访问数据库
  • 【知识整理】招人理念、组织结构、招聘
  • re:从0开始的CSS学习之路 9. 盒子水平布局
  • .NET命令行(CLI)常用命令
  • ubuntu20.04-编译安装Qt5.15.2-C++
  • 动漫风博客介绍页面源码
  • Spring Cloud使用ZooKeeper作为注册中心的示例
  • Nginx实战:1-安装搭建
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Rating组件
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CSS盒模型深入
  • git 常用命令
  • github从入门到放弃(1)
  • java第三方包学习之lombok
  • mockjs让前端开发独立于后端
  • php ci框架整合银盛支付
  • Python进阶细节
  • python学习笔记 - ThreadLocal
  • SpingCloudBus整合RabbitMQ
  • SQLServer之创建数据库快照
  • VUE es6技巧写法(持续更新中~~~)
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 翻译--Thinking in React
  • 仿天猫超市收藏抛物线动画工具库
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于webpack 的 vue 多页架构
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端面试之CSS3新特性
  • 我看到的前端
  • 智能合约开发环境搭建及Hello World合约
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​渐进式Web应用PWA的未来
  • ​一些不规范的GTID使用场景
  • ###C语言程序设计-----C语言学习(3)#
  • #java学习笔记(面向对象)----(未完结)
  • #VERDI# 关于如何查看FSM状态机的方法
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2)STL算法之元素计数
  • (javascript)再说document.body.scrollTop的使用问题
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (PySpark)RDD实验实战——求商品销量排行
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (办公)springboot配置aop处理请求.
  • (二)丶RabbitMQ的六大核心
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...