5.1 流水线数据相关问题

我们在第4章实现的五级流水线结构非常easy。假设依照“简单即美(Simple is Beautiful)的标准,那么我们的流水线是美的,可是不完美,由于现实往往是复杂的,一个简单的流水线是解决不了如此多的现实问题的,本节探讨的数据相关问题就是当中一个问题。在我们实现逻辑、移位操作等其他指令之前。必须先讨论这个问题,由于这个问题已经影响到測试程序的编写了。

流水线中常常有一些被称为“相关”的情况发生,它使得指令序列中下一条指令无法依照设计的时钟周期运行,这些“相关”会减少流水线的性能。

流水线中的相关分为三种类型。

(1)结构相关:指的是在指令运行的过程中,因为硬件资源满足不了指令运行的要求,发生硬件资源冲突而产生的相关。

比方:指令和数据都共享一个存储器。在某个时钟周期,流水线既要完毕某条指令对存储器中数据的訪问操作,又要完毕兴许的取指令操作。这样就会发生存储器訪问冲突。产生结构相关。

(2)数据相关:指在流水线中运行的几条指令中。一条指令依赖于前面指令的运行结果。

(3)控制相关:指流水线中的分支指令或者其它须要改写PC的指令造成的相关。

结构相关、控制相关将在兴许指令分析中讨论,本节重点讨论数据相关的问题。流水线数据相关又分为三种情况:RAW、WAR、WAW。

  • RAW:Read After Write,如果指令j是在指令i后面运行的指令。RAW表示指令i将数据写入寄存器后,指令j才干从这个寄存器读取数据。

    如果指令j在指令i写入寄存器前尝试读出该寄存器的内容。将得到不对的数据。

  • WAR:Write After Read。如果指令j是在指令i后面运行的指令,WAR表示指令i读出数据后,指令j才干写这个寄存器。如果指令j在指令i读出数据前就写该寄存器,将使得指令i读出的数据不对。
  • WAW:Write After Write,如果指令j是在指令i后面运行的指令,WAW表示指令i将数据写入寄存器后,指令j才干将数据写入这个寄存器。如果指令j在指令i之前写该寄存器,将使得该寄存器的值不是最新值。

对于第4章建立的原始OpenMIPS五级流水线而言,从ori指令的实现过程能够知道,仅仅有在流水线回写阶段才会写寄存器(实际上其余指令也是一样的,在后面实现其余指令时,对这一点会更加清楚),因此不存在WAW相关。又由于仅仅能在流水线译码阶段读寄存器、回写阶段写寄存器,所以不存在WAR相关。所以OpenMIPS的流水线仅仅存在RAW相关。RAW相关有三种情况。

(1)相邻指令间存在数据相关

考虑例如以下代码。

1   ori $1,$0,0x1100        # $1 = $0 | 0x1100 = 0x1100
2   ori $2,$1,0x0020        # $2 = $1 | 0x0020 = 0x1120

第1条ori指令会写寄存器$1。随后的第2条ori指令须要读出$1的数据,可是第1条ori指令在回写阶段才会将其运算结果写入$1,而第2条ori指令在译码阶段就须要读取$1的值。此时第1条ori指令还处于运行阶段,所以得到的必定不是第1条ori指令计算得出的结果,按这个值运算,必定会出错。

如图5-1所看到的。

这样的情况能够称为相邻指令间存在数据相关。针对OpenMIPS详细情况。也能够称为流水线译码、运行阶段存在数据相关。

(2)相隔1条指令的指令间存在数据相关

考虑例如以下代码。

1   ori $1,$0,0x1100        # $1 = $0 | 0x1100 = 0x1100
2   ori $3,$0,0xffff        # $3 = $0 | 0xffff = 0xffff
3   ori $2,$1,0x0020        # $2 = $1 | 0x0020 = 0x1120

第1条ori指令会写寄存器$1。第3条ori指令在译码阶段须要读取寄存器$1,此时第1条ori指令还处于訪存阶段。所以得到的必定也不是正确的值。

如图5-2所看到的。这样的情况能够称为相隔1条指令的指令间存在数据相关。针对OpenMIPS详细情况。也能够称为流水线译码、訪存阶段存在数据相关。

(3)相隔2条指令的指令间存在数据相关

考虑例如以下代码。

1   ori $1,$0,0x1100        # $1 = $0 | 0x1100 = 0x1100
2   ori $3,$0,0xffff        # $3 = $0 | 0xffff = 0xffff
3   ori $4,$0,0xffff        # $4 = $0 | 0xffff = 0xffff
4   ori $2,$1,0x0020        # $2 = $1 | 0x0020 = 0x1120

第1条ori指令会写寄存器$1,第4条ori指令在译码阶段须要读取寄存器$1。此时第1条指令处于回写阶段,在回写阶段最后的时钟上升沿才会将运算结果写入$1,所以第4条ori指令得到的不是正确的寄存器$1的值。如图5-3所看到的。这样的情况能够称为相隔2条指令的指令间存在数据相关,针对OpenMIPS详细情况,也能够称为流水线译码、回写阶段存在数据相关。

当中相隔2条指令存在数据相关(即流水线译码、回写阶段存在数据相关)这样的情况,在第4章设计的Regfile模块中已经得到了解决,Regfile模块部分代码例如以下。

module regfile(......
);....../****************************************************************
***********           第三段:读port1的读操作           *********
*****************************************************************/// raddr1是读地址、waddr是写地址、we是写使能、wdata是要写入的数据always @ (*) begin......end else if((raddr1 == waddr) && (we == `WriteEnable) && (re1 == `ReadEnable)) beginrdata1 <= wdata;......end/****************************************************************
***********           第四段:读port2的读操作            *********
*****************************************************************/// raddr2是读地址、waddr是写地址、we是写使能、wdata是要写入的数据always @ (*) begin......end else if((raddr2 == waddr) && (we == `WriteEnable) && (re2 == `ReadEnable)) beginrdata2 <= wdata;......endendmodule

在读操作中有一个推断,假设要读取的寄存器。是在下一个时钟上升沿要写入的寄存器。那么就将要写入的数据直接作为结果输出。如此就攻克了相隔2条指令存在数据相关的情况。

对于相邻指令间存在数据相关、相隔1条指令的指令间存在数据相关这两种情况。有三种解决方法。

(1)插入暂停周期:当检測到相关时,在流水线中插入一些暂停周期,如图5-4所看到的。

(2)编译器调度:编译器检測到相关后,能够改变部分指令的运行顺序,如图5-5所看到的。

(3)数据前推:将计算结果从其产生处直接送到其它指令须要处或全部须要的功能单元处,避免流水线暂停。如图5-6所看到的的样例,新的$1值实际在第1条ori指令的运行阶段已经计算出来了。能够直接将该值从第1条ori指令的运行阶段送入第2条ori指令的译码阶段,从而使得第2条ori指令在译码阶段得到$1的新值。也能够直接将该值从第1条ori指令的訪存阶段送入第3条ori指令的译码阶段,从而使得第3条ori指令在译码阶段也得到$1的新值。

读者须要注意,第(3)种方法有一个前提就是新的寄存器的值能够在运行阶段计算出来,假设是载入指令,那么就不满足这个前提,由于载入指令在訪存阶段才干获得终于结果。这是一种load相关,本书将在实现载入存储指令的时候考虑这样的情况,本章暂不考虑。

转载链接:https://www.cnblogs.com/zfyouxi/p/5219160.html

CPU-流水线的数据相关问题相关推荐

  1. 自己动手写CPU(2)流水线数据相关问题

    自己动手写CPU(2)流水线数据相关问题 问题定义 流水线中经常有一些被称为"相关"的情况发生,它使得指令序列中下一条指令无法按照设计的时钟周期执行,这些"相关" ...

  2. 自己动手写CPU之第五阶段(1)——流水线数据相关问题

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...

  3. 用scala写一个基本五级流水线CPU(二)解决数据冒险

    用scala写一个基本五级流水线CPU(二)解决数据冒险 ctime:2020-06-27 10:17:34 +0900|1593220654 标签(空格分隔): 技术 硬件 所谓数据冒险,即后面的指 ...

  4. verilog实现多周期处理器之——(三)数据相关问题及其解决

    本文于自己动手写CPU之第五阶段--流水线数据相关问题 "相关"问题 流水线中常常有一些被称为"相关"的情况发生,它使得指令序列中下一条指令无法依照设计的时钟周 ...

  5. CPU流水线与指令乱序执行

    青蛙见了蜈蚣,好奇地问:"蜈蚣大哥,我很好奇,你那么多条腿,走路的时候先迈哪一条啊?" 蜈蚣听后说:"青蛙老弟,我一直就这么走路,从没想过先迈哪一条腿,等我想一想再回答你 ...

  6. 为什么CPU流水线会提高代码执行效率?

    关注.星标公众号,不错过精彩内容 素材来源:网络 编辑整理:strongerHuang 为什么有些CPU的主频更低,但运算效率却更高呢? 比如:51单片机30M主频,STM32单片机20M主频,执行相 ...

  7. CPU流水线与指令重排序

    目录 1. Compiler Reordering 2. CPU 流水线 2.1. 从汽车装配谈起 2.2. 现代CPU的流水线 3. 超长流水线的瓶颈 3.1. 性能瓶颈 3.2. 功耗瓶颈 3.3 ...

  8. 计算机组成原理 — CPU — 流水线与执行周期

    目录 文章目录 目录 CPU 流水线 时钟周期.机器周期.指令周期和总线周期 CPU 流水线 不同的 CPU 指令集架构在执行指令的过程会有所差别,以经典的 RISC(精简指令集架构)为例,存在以下步 ...

  9. CPU流水线的探秘之旅

    英文原文:A Journey Through the CPU Pipeline 编译:@deuso_ICT 作为程序员,CPU 在我们的工作中扮演了核心角色,因此了解处理器内部的工作方式对程序员来说不 ...

最新文章

  1. R语言数据类型及数据类型判断
  2. oracle服务器不识别tc服务,记一次ORACLE无法启动登陆事故
  3. 笑到打鸣~ | 今日趣图
  4. div中直接绑定富文本值
  5. LeetCode 1276. 不浪费原料的汉堡制作方案(解方程)
  6. 【es】ElasticSearch master 选举
  7. (c语言)输入某年某日,判断这一天是这一年的第几天?
  8. Android学习笔记---27_网络通信之通过GET和POST方式提交参数给web应用,以及使用httpClient,来给web项目以post方式发送参数
  9. 锐捷交换机 查看端口流量信息
  10. NetBeans Weeldy News 刊号 # 53 - Apr 23, 2009
  11. 熵的理解(玻尔兹曼分布)
  12. python清理数据
  13. “沉迷单车的追风少年”的2021年年末总结
  14. 绿米Aqara、飞利浦等设备,如何与智汀使用同一个APP实现跨品牌互联?
  15. 创建型设计模式(待更新)
  16. 如何在服务里面删除应用(比如说删除掉服务里面的tomcat)?
  17. java 汉字转拼音原理_java 汉字转拼音
  18. 【ROS】rosbag
  19. MySQL学习-修改表结构
  20. 关于LAMMPS能量最小化

热门文章

  1. java百钱百鸡算法
  2. L2正则化(L2 Regularization)
  3. svn在idea中的使用
  4. 机电照明工程软件测试大纲,2019最新大纲 | 公路水运工程试验检测考试大纲《交通工程》...
  5. OpenCL——OpenCL的基本介绍
  6. 基于.NET平台常用的框架整理
  7. 解决:微信小程序只有调试或真机打开调试模式时可以访问网络,手机预览不能访问网络
  8. MATLAB快速获取二维图像/矩阵最大值和位置
  9. 对数线性模型(Log-Linear Model)一种判别式模型的创建框架
  10. Python 文字小游戏