手把手代码实现五级流水线CPU——第二篇:分支预测流水线

news2024/11/15 2:05:54

系列文章目录

第三篇:流水线控制逻辑
第一篇:初级顺序流水线


文章目录

  • 系列文章目录
  • 一、流水线硬件结构
  • 二、流水线各阶段的实现
  • 实现原理


一、流水线硬件结构

  1. 取指阶段
    PC增加器:用来计算下一条指令的地址valP

  2. 译码阶段
    一次译码操作读出俩个寄存器的值,寄存器读出端口与算数逻辑单元输入相连

  3. 执行阶段
    ALU会根据指令功能(ifun)来执行指定的运算,得到运算结果valE,同时还会设置条件码寄存器(CC),对于跳转指令,执行阶段会根据条件码和跳转条件来产生信号Cnd(此时Cnd信号传入NewPC,使得下一条指令地址为跳转后的地址)

    ALU除了执行算数逻辑指令,还要计算有效的访存地址

    以及栈指针的运算(加减8),因此ALU输出端口会与数据内存的地址逻辑单元相连

  4. 访存阶段
    可将数据写入内存,或者从内存读出数据

    写入的数据可以由寄存器文件提供,也可以是指令中的常数字段

  5. 写回阶段
    寄存器文件有两个写入端口M和E,E与ALU输出端相连,可供ALU结果写回寄存器

    端口M与数据内存的输出端口相连,可供内存读出结果写回寄存器(例如ret返回从数据内存在读出的地址值valm)

  6. 更新PC值
    根据当前执行的指令(icode),以及执行的状态来判断。如果是跳转指令,那接下来是顺序执行还是执行跳转,需要根据cnd来判断

    如果当前执行返回指令,那么返回地址就要从内存(栈)中得到

    指令在执行过程中发生异常,如取到无效指令或读取内存出现了错误,都由stat模块来处理

在这里插入图片描述

二、流水线各阶段的实现

  1. 取指阶段:预测下一指令的地址

    顺序执行:下一条指令的地址可以通过当前指令的地址加上之前指令的长度计算得出(valP)

    跳转指令:PC预测逻辑单元会直接将这两条指令中的常数字段(valC)作为下一条指令的地址

    返回指令:ret,下一条指令的地址需要从栈中读出,PC预测单元会采用与顺序执行的指令一样的方法来简单处理

    PC选择逻辑单元:纠错部件

    1.pc预测逻辑单元出错了,pc选择单元根据实际执行情况来改正预测错误。例如当前阶段取到ret指令,下一条指令要等待ret经过译码、执行、访存(栈)之后才得到正确地址
    2.改正方法:通过判断指令类型(icode),如果是ret,就把流水线寄存器W(含有正确指令地址)的访存结果(W_valM)作为下一条指令的地址;
    3.如果是跳转指令,需要等待指令经过执行后才能判断是否跳转,PC选择逻辑是通过信号Cnd来判断是否进行跳转,如果不跳转,证明分支预测错误需要改正
    
  2. 译码阶段

    需要判断究竟是直接采用转发的数据还是从寄存器文件中读取数据,判断的依据是根据当前需要读取的寄存器ID值与转发的目的寄存器的ID值是否相等

    转发的数据来源:

    1.ALU计算结果;
    2.内存的输出数据;
    3.访存阶段时,对寄存器写入端口E还没有进行写入的数据;
    4.写回阶段,对寄存器写入端口M还没有进行写入的数据;
    5.写回阶段时,对寄存器写入端口E还没进行写入的数据。如果没有转发源,就使用寄存器的输出值
    

    其中Sel+Fwd单元实现了将valP和valA信号合并功能,减少了流水线寄存器中状态的数量,比如jne指令在译码阶段不对寄存器进行任何操作

实现原理

  1. 在顺序结构之间插入流水线寄存器,然后对信号进行重新排列,就可得到流水结构
  2. 第一个寄存器F用来保持PC的预测值,第二个寄存器D,位于取值阶段和译码阶段之间,这些信息即将进入译码阶段来处理
  3. 第三个寄存器E位于译码阶段和执行阶段之间,保存了最新译码指令的状态以及从寄存器文件中读出数值
  4. 第四个寄存器M,保存了执行指令的结果
  5. 最后一个寄存器W,位于访存和反馈路径之间
    在这里插入图片描述
    具体控制逻辑与完整代码见第三篇文章
    《手把手代码实现五级流水线CPU——第三篇:流水线控制逻辑》

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

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

相关文章

学习vue的准备工作

一、前提: 1、vscode安装: https://blog.csdn.net/m0_55400356/article/details/1260267332、node.js安装: 已安装 16.0 或更高版本的 Node.js; https://www.runoob.com/nodejs/nodejs-install-setup.html3、安装vue&#xff…

hadoop之ranger权限配置(二)

文章目录一、编译ranger(node12)二、安装前环境准备(node12)三、安装RangerAdmin(node12)(root)五、Ranger Hive-plugin(node10)六、Ranger Hdfs-plugin(node10、11&…

ansible远程控制及其相关操作

1.控制主机和受控主机通过root用户通过免密验证方式远程控住受控主机实施对应(普通命令,特权命令)任务(以下所有结果均见截图) (1)控住主机--server通过主机名匹配对应连接的受控主机 [rootserver ~]#vim /etc/hosts …

一本通 1267:【例9.11】01背包问题(详细代码+严谨思路+清晰图片)

经典01背包问题 这里给你3种方法 目录 DFS 思路: 代码: DFS记忆化 思路: 代码: 动态规划 思路: 代码: DFS 时间复杂度 :O(2^n) 思路: DFS求出所有选法,再用…

Git Stash、Git Merge、Git Rebase、Git Revert

GIT 日常使用总结git stashgit mergegit rebase将多个commit合并成一个commitgit revert撤销修改撤销commit 但是不撤销add 的内容撤销addGIT Rebase 补充说明:git stash git stash:将修改后的代码存储到本地的一个栈结构,将工作区和暂存区恢…

37-Vue之ECharts高级-交互API

交互API前言全局ECharts对象echartsInstance对象前言 本篇来学习下ECharts中交互API的使用 全局ECharts对象 全局 echarts 对象是引入 echarts.js 文件之后就可以直接使用的 init :初始化ECharts实例对象,使用主题 registerTheme:注册主题…

Avatar和虚拟场景如何影响用户VR社交行为

对于VR社交来讲,虚拟场景(社交环境)、Avatar(虚拟化身)是两个重要的元素,一个代表了人们在VR中互动的空间,而另一个则代表他们在这个空间中所扮演的角色。现阶段,Avatar有多种形态&a…

已解决import tensorflow.contrib.layers as layers导包错误

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘cudart64_110.dll’; dlerror: cudart64_110.dll not found I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not ha…

opencv-python常用函数解析及参数介绍(八)——轮廓与轮廓特征

轮廓与轮廓特征前言1.获取轮廓通过膨胀与腐蚀获得轮廓通过梯度获取轮廓通过边缘检测获取轮廓2.寻找轮廓参数及作用对比3.轮廓特征前言 在前面的文章中我们已经学会了使用膨胀与腐蚀、使用梯度、使用边缘检测的方式获得图像的轮廓,那么在获得轮廓后我们可以对图像进…

​赛分科技冲刺科创板上市:拟募资8亿元,复星、高瓴为股东​

近日,苏州赛分科技股份有限公司(下称“赛分科技”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,赛分科技计划募资8亿元,将用于20万升/年生物医药分离纯化用辅料、研发中心建设项目&#xf…

《收获,不止Oracle》读书笔记一

当今时代 技术人员,真正的差距其实在意识 1.忽略了知识的重点 20%的知识,解决80%的问题 2.从未考虑知识落地 知识要落地, 要思考应用的场合。 学习任何技术都是一样的,没有思考过你所学的某项技术有什么用,没有想…

P1827 [USACO3.4] 美国血统 American Heritage

题目描述 农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。 你的任务是在被给予奶牛家谱的“树中序遍历…

计算机网络 | 湖科大教书匠

一、因特网概述 1、网络、互联网和因特网 网络是由若干结点和连接这些结点的链路组成 多个网络还可以通过路由器互联起来,这样就构成了一个覆盖范围更大的网络,互联网 因此,互联网是网络的网络(Network of Networks&#xff0…

hadoop+ranger+kerberos页面权限配置(四)

一、原理介绍 hdfs 指令测试:hdfs dfs -mkdir /ranger 原理:根据路径进行文件夹操作赋权。一旦指定文件夹权限,则该用户可以操作该文件夹及该文件夹底下的子文件夹。 yarn 指令测试:hadoop jar /home/hadoop/module/hadoop-3.2.2…

跨平台数据库管理器DbGate

本文软件由网友 zxc 推荐;隔了很久才开始写,又隔了很久才想起来发 😂 什么是 DbGate ? DbGate 是跨平台的数据库管理器。支持 MySQL、PostgreSQL、SQL Server、MongoDB、SQLite 等的数据库管理器。能够在 Windows、Linux、Mac 下运…

Z函数(扩展KMP)

1,定义 z函数存储字符串s(长度n&#xff0c;下标从0开始&#xff09;与其所有后缀s[i,n-1](0<i<n-1)的最大公共前缀LCP的值&#xff08;一般默认z[0]0,有时是n) 2,思路 叫他扩展KMP是有原因的&#xff0c;因为思想相近&#xff0c;我们求取z[i]&#xff0c;尝试利用前…

20230102单独编译原厂RK3588开发板的开发板rk3588-evb1-lp4-v10的Android12的内核

20230102单独编译原厂RK3588开发板的开发板rk3588-evb1-lp4-v10的Android12的内核 2023/1/2 20:52 《RK3588_Android12_SDK_Developer_Guide_CN.pdf》 原厂的开发板rk3588-evb1-lp4-v10单独编译内核的方式&#xff1a; cd kernel-5.10 export PATH../prebuilts/clang/host/linu…

redis的常见命令

Redis 所有的 key&#xff08;键&#xff09;都是字符串。在谈基础数据结构时&#xff0c;我们讨论的是存储值的数据类型&#xff0c;主要包括常见的 5 种数据类型&#xff0c;分别是&#xff1a;String、List、Set、Zset、Hash 数据结构介绍 Redis 是一个 key-value 的数据库…

Java基础漏洞(一)

最近在复习一些Java基础&#xff0c;填补自己的知识漏洞。 1.转义字符 (1)\t代表的是制表符&#xff0c;\n代表的是空格&#xff0c;\r则代表的是回车 public class Main{public static void main(String[] args) {System.out.println("年龄\t性别\t身高\n18\t男\t183&…

《小猫猫大课堂》4——数组,操作符,常见关键字

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…