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

系列文章目录

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



一、流水线硬件结构

  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——第三篇:流水线控制逻辑》
基于五级流水线CPU分支预测+实验报告+项目说明 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 1. 项目简介 **项目内容:** 1. 实现基于局部历史的分支指令方向预测。 2. 实现基于全局历史的分支指令方向预测。 3. 实现竞争的分支指令方向预测。 本次实验实现分支预测功能基于上学期实现五级流水线CPU。因此我在五级流水线CPU的基础上实现了branchPredict分支预测模块。本次实验我实现的是**竞争的分支指令方向预测**,CPU线路图如下图所示 竞争的分支指令方向预测结果分析 这里由于此前基于局部历史以及全局历史的PHT饱和计数器的初值均设置为01,使得这里仅有的三条指令均预测为“不跳转”。为了方便展示竞争的预测结果,这里将LPHT的值初始化为11,使得三条指令的基于局部历史的分支预测为“跳转”。 第一条跳转指令正确方向为“不跳转”,因此基于全局历史的分支预测结果正确,而基于局部历史的分支预测结果错误,CPHT的值-1;第二条跳转指令正确方向为“跳转”,因此基于局部历史的分支预测结果正确,而基于全局历史的分支预测结果错误,CPHT的值+1;第三条跳转指令正确方向为“跳转”,因此基于局部历史的分支预测结果正确,而基于全局历史的分支预测结果错误,CPHT的值+1; 更多详情介绍见项目说明!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Strive_LiJiaLe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值