1.我们知道,CPU是电脑的中央处理单元,CPU到底是怎么连续的执行指令的。我们以MIPS为例,探究一下。

2.基础的知识我们需要知道,CPU执行一条指令时分为五个阶段的:(1)在内存取指令(2)根据指令读寄存器(3)利用寄存器中的数据ALU(4)访问内存(5)写寄存器。一般是这五个阶段,但是很多指令并不是说这五个阶段全部都在做事情。比如add,它只有四个阶段,其中不涉及到内存的访问。但是,又有指令五个阶段都要做事情,比如lw。既然是通用的CPU,我们尽可能的支持夺得指令,或者说是一种短板效应。

3.知道了这些,我们分析一下,CPU如果是一条一条的执行指令,那么就会出现这种情况,比如add,在执行它的时候,他被执行到第二阶段,第一个取指令的操作就空了下来,同理,越来越多的操作被空闲。这显示是不行的,对于追求效率的CPU是不能容忍的,于是在基于工厂流水线的启发:提出了基于流水线形式工作的CPU。大概就是这个样子。

这是五条指令在一起工作,上一条使用完资源以后,下一条紧接着继续。十分的紧凑,没错,这样就让CPU连续不空闲的工作,看上去似乎很不错。

4.流水线的困境。虽然上边基于流水线的设计,使得CPU得到了很高的效率,但是也面临这一些困境,或者说冒险。这些词是根据英文 Hazards翻译而来。

5.结构困境:

我们观察这样一种执行的指令的顺序:我们注意到,第一条指令和第四条指令在同一个阶段都是在访问内存,其中第一条是在写内存,第二条是在读内存。这两种操作在某种意义下是相反的,你不可能又读又写吧,这显然是不合理的。为了解决这个问题,人们发明了缓存技术。使用两个一级缓存,一个读一个写。即保证了效率,又解决了冲突。

同样的问题也发生在了寄存器上:

我们发现,存在两条指令一条写寄存器,一条读寄存器。这也是不合理的。但是由于寄存器的读写速度很快,并且,肯定是要先写后读的,因为后边的指令可能要用到上面指令得到的数据,所以规定先写后读。这样,结构困境被完美解决。

6.控制困境:我们知道,程序时不可避免要出现分支的,就像这样:

但是我们很快就可以发现问题,因为分支的结果是在ALU之后才能知道的,所以你当前分支后边的两条指令到底执行什么,这是不可预料的。有可能跳转,也有可能不跳转,所以把那些指令装载进来,这是一个很大的问题。针对这个问题,人们提出了三种解决方案:

(1)空指令等待:既然beq这种分支指令只能再ALU之后才能得到结果,那好吧,我在你出结果之前啥也不干,给你两条空指令,比如再a0寄存器加0什么的。那么其实结构就像是这样:

这虽然解决了问题,但是引入了两条空指令,这对CPU这种追求效率的部件来说时不能忍的。然后,人们又提出了第二种解决方案。

(2)人们仔细分析发现,问题的根本原因是在ALU这个位置再整个执行程序流程的后边,如果把它提前,问题不久容易了一些嘛,所以人们提出再Reg中加一个分支比较器,然后空出一个单个的时间段,这样似乎又好了很多。

这样虽然好了很多,但是,还是又空闲,你说人们怎么就这么贪心呢?CPU一直工作,插个空闲让人家休息会不行吗,计算机科学家说:不行!它得一直给我干活!行吧,那就干呗。

(3)新的概念引入,人们发现,这样虽然不时一整个空指令进去了,但是还是不是很满意,于是就继续反思自己。然后发现可能是自己的思想有问题:为什么分支会产生这样的问题,因为分支只是做了干了一个活。我现在重新定义分支,我让你依次就是执行两条指令,什么意思呢?就是说,计算机科学家发现,如果我让分支一次执行两条指令,其中一条是分支,另一条是与它无关的指令。这样再执行完这两条指令之后,分支的结果也产生了,还顺便执行了一条其他的指令。但是这里面有很多问题:什么叫做与分支无关的指令,你怎么找到这样的指令,这样的指令一定存在吗?对于前两个问题,汇编器会帮我们做,至于最后一个问题,答案是这样的指令还就真的不一定存在。注意,时不一定,不是一定。但是这种设计使得CPU的效率再很多时候都能达到100%,即使找不到这样的指令,也是50%。这种设计的方式叫做分支延迟:Delay-Branch

我来解释一下这个图,主要是解释Delay-Branch。看都右边,我们发现再beq之前,其实ori用到的数据和beq用到的没关系,所以就可以调整一下位置,把or拿到beq的后边,这样再beq完成的时候,or也完成,效率达到100%。

7.我们花了很大的力气解决了控制困境,但是问题总是解决不完的。毕竟是CPU,怎么能随随便便成功。我们来看一下这个程序执行的过程:

放在流水线上就是这样的结果:

我们可以看到:由于t0使用的很频繁,导致再还没有结果算出来被写回来的时候,就已经开始用了。数据的即时依赖产生了数据困境。当然了,这些小问题可是难度到我们的计算机科学家。针对这个问题,计算机科学家马上提出了前馈机制来解决。

Forwarding:

其实我们知道,ALU之后数据的结果已经出来了,那么你先别写了,先拿来给我用用。先把数据的结果反馈出去,这就叫做前馈。嗯,似乎很不错,直到遇见了这张图:

这张图中,结果再内存访问之后才出来,实在是太慢了,前馈都没办法。这可咋办?没事,我们的计算机科学家总是有办法的,他们还是根据刚才的想法,插入一些空指令,使得前馈可以继续下去。大概就是这样:

这样就成功的解决了问题。这样我们CPU的流水线控制也基本结束了,其实CPU也就是这样吧,哈哈。

基于流水线的CPU的设计相关推荐

  1. 基于MIPS的五级流水线微处理器(CPU)设计、modelsim仿真通过、verilog编写

    基于MIPS的五级流水线微处理器(CPU)设计 摘要 本设计为一个五级流水线CPU,此CPU结构为MIPS结构.流水线CPU与单周期和多周期CPU相比较,提高了指令的执行速度,改善了CPU的整体吞吐率 ...

  2. 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现

    将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...

  3. 计算机组成与系统结构实验-基于微程序控制的CPU设计

    本文章主要是为了通俗的解释计算机组成实验的微程序汇编的实现方法: 实验目的 在掌握部件单元电路实验的基础上,初步了解如何基于微程序控制进行CPU设计. 实验软件 Dais-CMStudio 实验要求 ...

  4. 计算机流水线生产管理知识,(生产管理知识)基于的自动生产线控制系统的设计.pdf...

    (生产管理知识)基于的自动生产线 控制系统的设计 摘要 随着科学技术的发展,人类社会对产品的功能与质量的要求越来越高,产品 更新换代的周期越来越短,产品的复杂程度也随之增高,传统的大批量生产方式 受到 ...

  5. 基于Basys2的八位CPU的设计与FPGA实现

    目录 一.设计指标(鲲鲲提的要求,直接贴过来) 二.设计思路: 1.完整的8位CPU的设计: 2.本次设计思路: 三.Verilog实现 1.RAM: 2.指令寄存器IR 3.ALU 4.CPU 5. ...

  6. CPU GPU设计工作原理《转》

    我知道这非常长,可是,我坚持看完了.希望有幸看到这文章并对图形方面有兴趣的朋友,也能坚持看完.一定大有收获.毕竟知道它们究竟是怎么"私下勾搭"的.会有利于我们用程序来指挥它们... ...

  7. RISC-V CPU课程设计报告【计算机组成原理课设】

    博主在ujs大二完成的计算机组成原理课设,内容是RISC-V CPU设计.(当时也是做的快吐血了~~) 完成情况(写在前面) 在本次计算机组成原理课程设计中,我完成一个基于RISC-V指令集架构的模型 ...

  8. CPU GPU设计工作原理

    转自:http://blog.csdn.net/claien/article/details/6965135 要说到设计的复杂程度,那还是CPU了!这个不用讨论,很简单的道理你看看显卡芯片的更新速度和 ...

  9. 06|手写CPU(一):迷你CPU架构设计与取指令实现

    06|手写CPU(一):迷你CPU架构设计与取指令实现 你好,我是LMOS. 经过上一节课的学习,我们已经知道了一个基于RISC-V指令集设计的CPU,必须要实现哪些指令.从这节课开始,我们就可以着手 ...

最新文章

  1. nginx的gzip压缩功能
  2. union 中的注意事项
  3. 32岁的老程序员面试没通过,一问原因,挺突然的...
  4. PHP学习2——基本语法
  5. max分发-(网络系统克隆)
  6. 【备忘】visual studio调试状态下显示lua调用栈
  7. 关于armv7指令集的一个直观数据
  8. 2017-2018-2 20179202《网络攻防技术》第一周作业
  9. Java面向对象(3) —— 抽象类、接口、内部类、匿名内部类
  10. Python学习之路:函数介绍
  11. python打出由边框包围的_python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)...
  12. F - 数据结构实验之链表四:有序链表的归并
  13. 基于设备树的TQ2440 DMA学习(3)—— DMA控制器驱动
  14. 浅谈测试职业的发展空间
  15. 非常使用的mongodb的聚合函数(使用SpringDataMongoDb)
  16. 第十届蓝桥杯 省赛研究生组 真题解析(Python)
  17. 编译protoc方法名称被自动大写
  18. 国产免费虚拟化OVM与 OpenStack对比
  19. RuntimeError: CUDA error: invalid device ordinal
  20. 无卷积!金字塔视觉Transformer(PVT):用于密集预测的多功能backbone

热门文章

  1. 互联网公司营利排行榜.可以不用单独找这些公司名了.
  2. visual studio code中将.tpl文件识别为html文件并高亮
  3. WeGame登录卡死死机无法打开任务管理器只能强制重启的解决方案
  4. Code Furture !
  5. 点击下载 Android版 APP,AI录屏自动点击器
  6. 从天鸽互动收购无他相机,看网络直播新玩法
  7. 别错过!监理工程师报名流程!
  8. echars 地图添加引导线效果
  9. 关于录音器材,你想要知道的都在这里
  10. 调试Alinx的AXU4EV-P MPSoCs踩坑记录