RISCV Reader笔记_2 RV32I

news2024/11/19 5:46:23

RV32I

完整的RV32I指令集可以用下面的式子中出现单词的首字母表示:

1687338520518

比如这一条:

set less than {immediate} {unsigned}

也就是slt slti sltu sltiu这4个指令。

RISCV指令格式如下。R 寄存器操作,I 立即数或load访存,S store访存,B 条件跳转,U长立即数,J无条件跳转。

1687338873850

RV和其他指令集的优势:

  • 首先格式统一,解码速度快;

  • 然后提供3个寄存器存数据,提供少于3个寄存器但是需要用到3个操作数的ISA指令需要多用一条mv指令转移数据。

  • 寄存器位置固定,不像其他比如arm的寄存器一会能做源操作数一会做dest操作数,这样判断逻辑简单,甚至在解码完成之前就可以去寄存器里把数取完。

  • 总是包含符号扩展,这样符号扩展也可以在解码完成前就执行。

全0和全1是非法的异常和错误,帮助调试。

可以看出RV32I用的相当节省,给后面扩展指令留了很多可能。而且还有很多微操作来提高性能,比如这些指令的数值大多数位是相等的,简化控制逻辑;BJ 指令地址需要<<1来 *2 使得节约位数的情况下表示更大范围的地址;立即数的排布也有讲究。

整数计算

add, sub, and, or, xor 和大多数ISA一样,两个32位寄存器做运算。并且立即数总是进行符号扩展,这样sub其实可以用负数的add代替。

slt 也有立即数和有无符号的扩展。比较结果生成01的布尔值。

lui 是加载立即数到高20位,而auipc是加载到pc的高20位,和12位jalr立即数偏移量结合跳转到32位pc地址。

和其他指令集相比的优化之处在于:

  • RV 中对寄存器操作没有按半字或字节的计算操作,全是整个寄存器计算操作。虽然按部分位访存会节省能量,但是按部分位进行算术运算比较耗能量。RV采用单独移位指令来处理。
  • RV 用移位和加减代替乘除指令,缩小芯片面积。

我们可以使用异或操作来不使用额外寄存器的情况下交换两个寄存器的值。

r1=r1^r2

r2=r1^r2

r1=r1^r2

不过其实RV寄存器数量充足,一般用不到这个骚操作。

Load Store

lw sw 处理字

lh sh 处理半字

lb sb 处理 byte

加u是有符号

不管数据是整字,半字还是字节,都先被扩展为32位再处理,保证计算可以正确进行。

ls的寻址方式是和x86类似的12位位偏移寻址模式。

image-20230624231236278

这一段不是完全理解,等学过arm和x86汇编也许理解会更为透彻。

相比arm和x86,rv支持未对齐数据的访问。简化了整体设计。

RV 选择了小字节序。

条件分支

bne beq bge blt 以及大于等于和小于的无符号版。

分支指令的寻址方式是 12 位的立即数乘以 2,符号扩展它,然后将得到值加到 PC 上作为分支的跳转地址。这种跳转方式被称为是相对寻址。为什么可以通过乘2的方式扩展?因为RV指令长度都是2字节的倍数,这点后面还会讲。因此可以用立即数*2的方式表示相对地址。

rv省去了条件码(比如0000代表EQ 这样表示判断结果状态)和x86中的一些循环指令(如loop),省去了一些隐式状态。

无条件跳转

jal,把当前pc+4存入ra且跳转。

如何实施无返回的无条件跳转?把全0的x0寄存器替换ra,因为x0无法修改。

jal x0, 0x1000	# 跳转到0x1000,不返回的跳转

减少了复杂的跳转指令。

杂项

csrrc、csrrs、csrrw、csrrci、csrrsi、csrrwi 这些是访问64位时钟的,我们一次就能访问32位。

ecall 是像运行时环境发出请求的,比如系统调用,转调试模式。

fence 是外部可见的访存请求。RV 的 IO 是和访存方式一样的访问方式,而不是专门设计一些单独指令。EBU5476 Microprocessor System Design 知识点总结_5 GPIO_灰海宽松的博客-CSDN博客

而且为实现字符串处理,RV 实现了字节存取而不是设计单独指令(x86:别按着我骂)。

总结优势

1687620706864

  • 32 位字节可寻址的地址空间

  • 所有指令均为 32 位长

  • 31 个寄存器,全部 32 位宽,寄存器 0 硬连线为零

  • 所有操作都在寄存器之间(没有寄存器到内存的操作。这里我不太理解,可能lw和sw不算吧)

  • 加载/存储字加上有符号和无符号加载/存储字节和半字

  • 所有算术,逻辑和移位指令都有立即数版本的指令

  • 立即数总是符号扩展

  • 仅提供一种数据寻址模式(寄存器+立即数)和 PC 相对分支

  • 无乘法或除法指令

  • 一个指令,用于将大立即数加载到寄存器的高位,这样加载 32 位常量到寄存器只需要两条指令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C51单片机期末复习第八章单片机接口技术

一 总线&#xff1a; 传送同类信息的连线 三总线&#xff1a; 地址总线AB&#xff0c;数据总线DB,控制总线CB 目录(ppt给的没啥用&#xff0c;乱还不全)&#xff1a; 8.1 单片机的系统总线 8.2 简单并行I/O口扩展 8.3 可编程并行I/O口扩展 8.4 D/A转换与DAC0832应用 8…

稀疏表:最大公约数

问题描述 给定一个数组, 每次操作可以选择数组中任意两个相邻的元素 x , y x, y x,y 并将其 中的一个元素替换为 gcd ⁡ ( x , y ) \operatorname{gcd}(x, y) gcd(x,y), 其中 gcd ⁡ ( x , y ) \operatorname{gcd}(x, y) gcd(x,y) 表示 x x x 和 y y y 的最大公约数。 请…

MIT 6.S081 教材第五章内容 -- 中断与设备驱动--下

MIT 6.S081 教材第五章内容 -- 中断与设备驱动--下 引言关于RISC-V特权级架构说明RISC-V特权模式OpenSBI介绍RISC-V启动过程RISC-V中的异常M模式下的异常1. 硬件中断的处理&#xff08;以时钟中断为例&#xff09;2. M模式下的异常相关寄存器3. 同步异常的处理 S模式下的异常1.…

chatgpt赋能python:Python散点图介绍:如何用Python绘制散点图?

Python散点图介绍&#xff1a;如何用Python绘制散点图&#xff1f; Python是一门流行的编程语言&#xff0c;用于解决各种问题和编写各种应用程序。其中&#xff0c;数据可视化是Python应用程序中非常重要的组成部分。散点图是最常用的数据可视化图形之一&#xff0c;它能够清…

拓扑排序:神经网络

题目链接 神经网络 题目大意 在兰兰的模型中&#xff0c;神经网络就是一张有向图&#xff0c;图中的节点称为神经元&#xff0c;而且两个神经 元之间至多有一条边相连&#xff0c;下图是一个神经元的例子&#xff1a; 图中&#xff0c; X 1 — X 3 X_1—X_3 X1​—X3​是信…

从类加载到双亲委派:深入解析类加载机制与 ClassLoader

目录 前言Class 文件介绍如何生成 class 文件观察 Bytecode 方法class 文件到底是什么样的呢&#xff1f; Class 加载、链接、初始化加载、类加载器双亲委派Launcher 核心类ClassLoader 相关源码ClassLoader 相关问题自定义简单 ClassLoader自定义加密 ClassLoader打破双亲委派…

动态ip与静态ip的概念、区别、应用场景

动态ip与静态ip的区别 前言一、介绍IP地址的概念和作用1.1、IP地址的定义1.2、IP地址的作用 二、动态IP和静态IP的区别2.1、动态IP和静态IP的定义2.2、动态IP和静态IP的特点2.3、动态IP和静态IP的优缺点比较 三、动态IP和静态IP的应用场景3.1. 动态IP的应用场景3.2. 静态IP的应…

利用numpy解决解方程组的基本问题

1 问题 进入大学&#xff0c;我们接触了线性代数&#xff0c;利用线性代数解方程组比高中慢慢计算会好了许多&#xff0c;快捷许多&#xff0c;我们作为编程人员&#xff0c;有没有用python解决解方程组的办法呢&#xff1f; 2 方法 我们提出使用python的numpy解方程。 找到用于…

11- C程序的组成结构 (C语言)

一、C程序的基本组成结构 1、源文件: 后缀为.c 的文件2、头文件&#xff1a;后缀为.h的文件 注意&#xff1a; 源文件 功能&#xff1a;实现程序功能头文件 功能&#xff1a;函数的声明、全局变量的声明、宏定义、类型的声明一个由C语言所组成的项目中 只允许有一个main函数 …

离散数学大作业任务书

目 录 实际的练习题目、系统的总功能和各子模块的功能………………………………………………………………………………1 1.1题目及问题描述………………………………………………………………1 1.2功能概述………………………………………………………………………1 1.3技…

02 | 日志系统:一条SQL更新语句是如何执行的?

以下内容出自《MySQL 实战 45 讲》 02 | 日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f; 查询语句的那套流程&#xff0c;更新语句也会走一遍。 更新流程中和查询不一样的是&#xff0c;更新流程中涉及了两个重要的日志模块。redo log (重做日志) 和 binglog&a…

如何编写用于Neo-Hookean材料的Abaqus VUMAT Fortran子例程

引言 大家好&#xff0c;我是一个热爱编程、研究有限元分析的普通程序员。我非常感谢你们能够抽出宝贵的时间来阅读我的文章&#xff0c;你们的支持是我前行的动力。今天&#xff0c;我们将讨论一个非常专业的话题&#xff0c;即如何编写用于Neo-Hookean材料的Abaqus VUMAT Fo…

Unreal 5 实现UI制作

这一篇讲解一下unreal engine里面的内置ui插件UMG&#xff0c;虚幻示意图形界面设计器&#xff08;Unreal Motion Graphics UI Designer&#xff09;(UMG) 是虚幻引擎内置的一套ui制作工具&#xff0c;通过它我们能够实现平面ui&#xff0c;场景hud内容 实现背景图片填充整个…

【MySQL数据管理】:插入、修改、删除操作

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL数据插入、修改、删除的讲解✨ 目录 前言一、插入数据二、修改数据三、删除数据四、总结 一、插入数据 使用INSERT INTO语句来向表中插入数据 ✨语法&#xff1a; 给指定字段添加数据 INSERT INTO 表名 (字段…

ctfshow web入门 php特性web98-102

1.web98 get会被post方式覆盖&#xff0c;传入的参数需要等于flag&#xff0c;才能读取到flag值,如果直接传http_flagflag,返回的结果会是一个空数组&#xff0c;因为get变量被覆盖了&#xff0c;而post没有传参 payload: get 11 post HTTP_FLAGflag 2.web99 array_push在数组…

机器视觉初步8:特征提取专题

文章目录 1.角点检测2.纹理特征提取3.特征描述符匹配3.1 Harris角点描述符3.2 SIFT&#xff08;尺度不变特征变换&#xff09;描述符3.3 SURF&#xff08;加速稳健特征&#xff09;描述符 4.基于深度学习的特征提取 在机器视觉中&#xff0c;特征提取是从目标图像中提取有用的视…

C语言:打印菱形(输入菱形上半部分行数)

题目&#xff1a; 用C语言在屏幕上输入以下图案&#xff1a; 思路&#xff1a; 总体思路&#xff1a; &#xff08;一&#xff09;. 输入菱形上半部分行数 -- scanf()函数 &#xff08;二&#xff09;. 使用 for循环 进行 菱形上半部分三角形 的打印&#xff0c; 菱形上半部分…

基于5G网络的视频远程操控应用实践——低延迟视频技术及应用

本次分享将分为三个部分&#xff1a;第一部分介绍低延迟视频所涉及到的关键技术&#xff0c;包括低延迟视频编解码、视频传输、视频处理低延时框架、视频采集和显示&#xff1b;第二部分重点介绍5G环境下低延迟视频对抗弱网提出的要求&#xff0c;包括&#xff1a;弱网状态的探…

Vulcanexus-一体化ROS2工具集

Vulcanexus机器人操作系统ROS2一站式工具集&#xff08;GalacticHumble&#xff09;2022 Humble Hierro v2 x86_64 arm64 Ubuntu Jammy (22.04) Vulcanexus是ROS 2的一站式工具集&#xff0c;用于构建机器人应用程序。它固定了DDS中间件&#xff0c;使用了Fast DDS&#xff…

word文件未保存 如何恢复

问题 word文件未保存 如何恢复 详细问题 笔者关闭已编辑完成的word文件&#xff0c;误触不保存&#xff0c;再次打开文件恢复至编辑前的状态&#xff0c;如何恢复至编辑完成后的状态 解决方案 文件 → \rightarrow →打开 → \rightarrow →恢复未保存的文件 或 1、打开 …