【【萌新的RiscV学习之流水线控制-9】】

news2024/11/27 23:52:32

萌新的RiscV学习之流水线控制-9

我们按照在之前的单周期设计加入控制单元 那么我们能够在后续的设计中提供方便 我们也在流水线中加入一个control单元
在这里插入图片描述
我们先按照书上的指令op码值介绍一遍基本功能
在这里插入图片描述
接下来我们讲述control 的 控制效果 关于这些串口判别的使用
在这里插入图片描述
由于控制线从 EX 阶段开始,我们可以在指令译码阶段为之后的阶段创建控制信号。传递这些控制信号最简单的方式就是扩展流水线寄存器以包含这些控制信息。
在这里插入图片描述
最后三个阶段的七条控制线。需要注意的是,在 EX 阶段使用了七条控制线中的两条,剩下的五条被传递到扩展的 EX/MEM 流水线寄存器中以保持控制线;在MEM 阶段中使用了三条控制线,最后两条传递到 MEM/WB 寄存器用于WB 阶段
在这里插入图片描述
我们在上面讲述的更多的是关于理论方面的讲解 我们接下来讲述关于具体指令的实际应用
sub x2 ,x1,x3
and x12 , x2 , x5
or x13 , x6 , x2
add x14, x2,x2
sd x15 , 100(x2)
我们会发现所有的后四条指令都采用了第一条指令中的x2值 所以我们在指令的确切使用中要注意选取合适的数据
在这里插入图片描述
在第五个时钟周期之前,对寄存器 x2 的读操作并不能返回 sub 指令的结果。因此,图中的 add sd 指令可以得到正确结果-20, 但是 and or 指令却会得到错误的结果 10 。在这种类型的图中,每当相关线在时间线上表示为后退时(箭头指向左上方),这个问题就会变得很明显。
在第三个时钟周期也就是 sub 指令的 EX 指令阶段结束时就可以得到想要的结果。那么在 and or 指令中是什么时候才真正需要这个数据呢?答案是and or 指令的 EX 阶段开始的时候,分别对应第四和第五个时钟周期。因此,只要可以一得到相应的数据就将其前递给等待该数据的单元,而不是等待其可以从寄存器堆中读取出来,就可以不需要停顿地执行这段指令了。
它这边的说法是我们看似是从这个寄存器内部取到数据但是 我想要寄存器编号
但是我们真正想要的是数据 我们可以在上一部分的EX阶段直接取到得到后的数据
在这里插入图片描述
命名流水线寄存器字段是一种更精确的表示相关关系的方法。例如, ID/EX. Register Rs I 表示一个寄存器的编号,它的值在流水线寄存器 ID.EX 中,也就是这个寄存器堆中第一个读端口的值。该名称的第一部分,也就是点号的左边,是流水线寄存器的名称;第二部分是寄存器中字段的名称。使用这种表示方法,可以得到两对冒险的条件:la. EX/MEM.Re gisterRd = ID/EX.Re gisterRsl 1 b. EX/MEM.Re gisterRd = ID/EX.Re gisterRs2 2a. MEM/WB.Re gisterRd = ID/EX.Re gisterRsl 2b. MEM/WB.Re gisterRd = ID/EX. Re gisterRs2 在本节开头的代码中,指令序列中的第一个冒险发生在寄存器 x2 上,位于 sub 指令sub x2, x l, x3 的结果和 and 指令 and xl2, x2, x5 的第一个读操作数之间。这个冒险可以在 and 指令位于 EX 阶段、 sub 指令位于 MEM 阶段时被检测到,因此这种冒险属la 类型:EX/MEM.Re gisterRd = ID/EX.Re gister Rs 1 = x2

这种一劳永逸的方法是错误的,并不是所有的指令都会写回寄存器,所以这个策略是不正确的,它有时会在不应该前递的时候也将数据前递出去。一种简单的解决方案是检查 Re Writ 信号是否是有效的:检查流水线寄存器在 EX MEM 阶段的 WB 控制字段以确定 Re Write 信号是否有效。
在这里插入图片描述
因此,只要流水线寄存器保存了将要被前递的数据,后续的指令就可以得到所需的数据。
各流水线寄存器之间的相关关系会随着时间向前移动,因此可以通过前递在流水线寄存器中找到的结果,以提供 and 指令或 or 指令所需的 ALU 的输入。流水线寄存器中的值表示所需的值在被写入寄存器堆之前就是可用的。我们假设寄存器堆可以前递在同一时钟周期内要被读写的数据,这样 add 指令就不需要停顿了,不过这些值来自流水线寄存器而不是寄存器堆。寄存器堆前递,即读操作获得的值是本时钟周期内写操作的结果,这就是为什么第五个时钟周期中显示寄存器 x2 在前半个周期内的值为 10 而在周期结束时的值为-20
如果我们可以从任何流水线寄存器而不仅仅是 ID/EX 中得到 ALU 的输入,那就可以前递正确的数据。通过在 ALU 的输入上添加多选器再辅以适当的控制,就可以在存在数据冒险的情况下全速运行流水线。

现在,假设需要前递的指令只有这四种形式: add sub and or 指令。下图是ALU 和流水线寄存器在添加前递之前和之后的“特写。还有一个是 ALU 多选器的控制线的值,它选择寄存器堆的值或是被前递的值中的一个。

这个前递控制将发生在 EX 阶段,因为 ALU 前递多选器在 EX 阶段。因此,我们必须ID 阶段通过 ID/EX 流水线寄存器将操作数寄存器编号传递出去,以决定是否需要前递值。在加入前递机制之前, ID/EX 流水线寄存器无须保存 rs 字段和 rs2 字段,但是因为前递机制的需要,现在要将保存 rsl rs2 所需的空间添加到 ID/EX 流水线寄存器中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

状态压缩dp,291. 蒙德里安的梦想

291. 蒙德里安的梦想 - AcWing题库 求把 NM 的棋盘分割成若干个 12 的长方形,有多少种方案。 例如当 N2,M4 时,共有 5 种方案。当 N2,M3 时,共有 3 种方案。 如下图所示: 输入格式 输入包含多组测试用例…

【yolov5】原理详解

一.模型框架 二.对Yolov5的描述 Yolov5的模型主要由 输入、Backbone、Neck、Head、输出 五部分组成。2.1 输入 输入 640x640x32.2 backbone Backbone:负责提取输入图像的特征。 在Yolov5中,常见的Backbone网络包括CSPDarknet53或ResNet。这些网络都是…

uniapp使用scroll-into-view实现锚点定位和滚动监听功能【楼层效果 / 侧边导航联动效果】

大佬网址&#xff1a; https://blog.csdn.net/weixin_47136265/article/details/132303570 效果 代码 <template><!-- 这里面有2个bug&#xff0c;已经解决&#xff0c;需要知道的地方1.methods里的scrollEvt(e)方法里面的 this.tabIndex index ! -1 ? index :…

python -m pip install --upgrade pip失败

显示这样的报错&#xff1a; You are using pip version 9.0.1, however version 23.2.1 is available. You should consider upgrading via the python -m pip install --upgrade pip command. 换源安装 python -m pip install --upgrade pip -i https://pypi.douban.com/s…

2023-9-30 JZ34 二叉树中和为某一值的路径

题目链接&#xff1a;二叉树中和为某一值的路径 import java.util.*;/** public class TreeNode {* int val 0;* TreeNode left null;* TreeNode right null;* public TreeNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、…

1.物联网射频识别,RFID概念、组成、中间件、标准,全球物品编码——EPC码

1.RFID概念 RFID是Radio Frequency Identification的缩写&#xff0c;又称无线射频识别&#xff0c;是一种通信技术&#xff0c;可通过无线电讯号识别特定目标并读写相关数据&#xff0c;而无需与被识别物体建立机械或光学接触。 RFID&#xff08;Radio Frequency Identificati…

MyBatis的一级缓存和二级缓存:原理和作用

MyBatis的一级缓存和二级缓存&#xff1a;原理和作用 引言 在数据库访问中&#xff0c;缓存是一种重要的性能优化手段&#xff0c;它可以减少数据库查询的次数&#xff0c;加快数据访问速度。MyBatis作为一款流行的Java持久层框架&#xff0c;提供了一级缓存和二级缓存来帮助…

机器学习之广义增量规则(Generalized Delta Rule)

文章目录 广义增量规则的公式s型函数的增量规则 广义增量规则的公式 对于单层神经网络的增量规则&#xff0c;已经过时啦&#xff0c;现在存在一种更广义的增量规则形式。对于任意激活函数&#xff0c;增量规则表示如下式它与前一节的delta规则相同&#xff0c;只是ei被替换为…

案例突破——再探策略模式

再探设计模式 一、背景介绍二、 思路方案三、过程1. 策略模式基本概念2. 策略模式类图3. 策略模式基本代码策略类抽象策略类Context类客户端 4. 策略模式还可以进行优化的地方5. 对策略模式的优化&#xff08;配置文件反射&#xff09; 四、总结五、升华 一、背景介绍 在做项目…

ccf_csp第一题汇总

ccf_csp第一题汇总 printf()输出格式大全&#xff08;附 - 示例代码&#xff09;现值计算AcWing 4699. 如此编码AcWing 4509. 归一化处理(小数位数根号函数)AcWing 4454. 未初始化警告AcWing 4280. 序列查询AcWing 4006. 数组推导(小陷阱)AcWing 3292. 称检测点查询AcWing 3287…

git你学“废”了吗?——git本地仓库的创建

git你学“废”了吗&#xff1f;——git本地仓库的创建&#x1f60e; 前言&#x1f64c;初识gitgit 本地仓库的创建1、基于centos7环境下 git的下载2、设置自己的用户名和邮箱 查看.git中的结构区分清楚版本库和工作区 查看git中的相关内容查看仓库的状态 总结撒花&#x1f49e;…

给奶牛做直播之一

一、前言 前几天看了薇亚写的一本书《人生是用来改变的》&#xff0c;和同事聊的时候同事问我这本书讲了什么&#xff0c;我回想了一下说主要是讲&#xff1a;我很辛苦&#xff0c;我很上进&#xff0c;我很牛逼&#xff0c;我很善良&#xff01;话说成功人士放个屁都是香的&am…

[题]修剪草坪 #单调队列优化

题目 洛谷上的题目 Acwing上的题目 根据y总的一波分析&#xff0c;我们得出……公式就是一切…… 所以&#xff0c;我要学会推公式…… 推公式…… 公式…… #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 1e5 10; int n, m; ll s[N…

知识库系统都有哪些?知识库系统功能和介绍

知识库的建立是企业数字化转型的重要一步&#xff0c;能够为企业的可持续发展奠定坚实的基础。使用HelpLook创建的知识库知识库系统已经成为当前很多人的选择。 HelpLook可以实现并制作企业帮助中心设计、产品说明书、常见问题手册、在线知识库、企业文档制作。 点击注册使用&…

pip version 更新

最近报了一个错&#xff1a; 解决办法&#xff1a; 在cmd输入“conda install pip” conda install pip 完了之后再输入&#xff1a; python -m pip install --upgrade pip ok.

面试题六:Promise的使用,一文详细讲解

含义 Promise是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;回调函数和事件&#xff09;更合理更强大。 所谓Promise&#xff0c;简单说就是一个容器&#xff0c;里面保存着某个未来才会结束的事件 (通常是一个异步操作)的结果。从语法上说&#xff0c;P…

WPF 01

xaml是声明性语言 每见到一个标签&#xff0c;就意味着xaml为我们声明一个标签对应的对象。 在XAML中为对象属性赋值 1. AttributeValue形式 <Grid><Rectangle Width"100" Height"80" Stroke"Black" Fill"Blue" RadiusX&q…

Mybatis 二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.csd…

oracle分组合并数值带顺序

比如&#xff1a;有如下一张设备电子围栏位置坐标的表&#xff08;tb_equ_point&#xff09;。 equ_name:设备电子围栏名称 point_id:点位坐标id point_x:点位x坐标 point_y:点位y坐标。 附数据&#xff1a; INSERT INTO "tb_equ_point" ("EQU_NAME",…