计算机组成与设计(4)-----处理器

思维导图

    前两章中简要概述了指令的形式及其作用,处理器的主要功能就是在规定的时间内处理指令.

    处理器是如何处理指令的呢?从硬件结构上讲,处理器有数据通路和控制器构成.其中,数据通路的主要功能是根据指令处理数据的流通,在此过程之中,会读取或者写入数据,也会对数据进行算术等处理,如何判断是进行写入还是读取或者是其他的操作呢?这就会使用到控制器的控制单元,他会将指令解码形成不同的控制信号,以控制数据通路的组成构建进行不同的操作

    本文将由简到繁的描述数据通路是如何构成以及如何实现的.然后写控制单元是如何实现的,两者有时如何协调工作的.最后将简要描述处理器的流水线是怎样实现的,会遇到什么问题.

一.数据通路

1.1数据通路的组成

数据通路的功能部件包括两种逻辑单元:

  • 组合单元:用于处理数据的单元.他会接受数据并进行处理,然后输出数据.相同的输入数据就会产生相同的输出数据.如ALU
  • 状态单元:用于记录状态的存储单元.计算机可以根据其记录的值进行恢复.比如寄存器或者存储器.状态单元至少有两个输入,                    一个输出.两个输入分别是写入的数据和决定何时可以写入的时钟信号.一个输出是上个时钟信号写入的数据.状态                   单元随时可读.

数据通路的具体部件是用于操作或者保存处理器中数据的单元,包括:

  • 指令存储器
  • 数据存储器
  • 寄存器堆
  • ALU
  • 加法器

1.2数据通路的实现

   我们将实现可以处理 存储器访问指令:sw,lw. 算术逻辑指令:add,sub,and,or,slt和分支指令:beq,j的处理器.(图中的英文RegWrite     表示控制信号,控制功能部件的具体操作,后文再说)

   首先分析以上指令将会使用那些构成部件:

  • 无论执行什么指令,都需要指令存储器以获取和保存当前需要执行的指令,需要程序计算器指向当前指令的地址,而下一条指令可能就是本次执行指令的地址+4,所以需要一个加法器计算下一条指令的地址.

扫描二维码关注公众号,回复: 3681840 查看本文章
  • 除了j指令外,其余指令都需要使用寄存器,而寄存器在寄存器堆中,因为指令最多会读取两个寄存器,写入一个寄存器,所以,寄存器堆有两个读端口,一个写端口.只通过寄存器号以确定是哪个寄存器.也需要使用算术逻辑单元(ALU)进行计算,比如add,sub等等. 

  • 数据存取指令还需要数据存储单元,以保存从存储器中获取的数据,符号扩展单元,将指令中的偏移量由16位扩展至32位.

  •  此外,多选器会根据控制信号从多个输入数据中选择一个输出

                                                                                    

以上便是实现这些指令所需要的功能部件.

以下是这些功能部件是如何搭配,协作,以实现具体指令.

  • 公共部分,可以实现取出当前指令及程序计数器的自增.取出的指令会被其他部分使用.

  • 分支指令的实现部分,如beq $s1,$s2,25.会读取两个寄存器的值,并设置新的指令地址

  • 存取指令的实现部分,如lw $s1,25($s2)  sw $s1,25($s2),会同存储器读取数据或者写入数据.此部分会使用到数据存储单元,不单单列举.

                                                 

  • 最后,将所有的部分汇合在一起,形成数据通路的结构.

二.控制器

     数据通路对于处理器的简单实现并不完整,其中,多选器选择哪一个数据输出,数据存储器到底是进行写入操作还是读取操作,ALU执行加法还是减法,寄存器堆中的寄存器是写入还是读取,这些判断是由控制器的控制单元生成的控制信号进行控制的.

2.1ALU的控制

控制单元会根据指令生成控制信号,控制ALU的操作,以下是上述指令可能会生成的4位控制信号.

控制信号又是如何生成的呢?控制单元会使用指令的2位ALUOp位字段和funct字段,通过真值表的方式生成控制信号.

最后,是指令和控制信号的映射关系

 

 上图中funct字段为XXXXXX代表当前指令不需要funct字段即可生成控制信号.

2.2主控制单元的控制

主控制单元生成的控制信号会对其他功能部件进行控制,控制信号长1位

本文中的指令有R型和L型,其具体格式如下,其中x:x表示在指令中的位置.

而根据不同的指令,可能会生成如下控制信号:

所以,将数据通路和控制单元融合后,会形成处理器的简单实现,此处理器实现了add,sub,and,or,beq,sw,lw,等指令.浅颜色的线条表示控制信号.

 特别的,如果需要实现跳转指令,则需要在上图的基础上再添加一部分.首先,跳转指令j的实现方式是当前PC+4的高4位和j指令的26位立即数组合而成.所以需要添加一个多选器和控制信号Jump,当操作码为2时,该控制信号有效.

  • j型指令格式

最终的处理器的简单实现如下:

 三.指令级并行

上文中设计的处理器如果每次只处理一条指令,显然不符合现在计算机对速度的追求.所以有了流水线技术.它通过多条指令的重叠执行以提高处理器的执行效率.它不提高单挑指令的处理速度,而是提高整体的吞吐率,也可以说是功能部件的利用率来提高处理速度.也有一种被称之为多发射的技术,可以一次执行多条指令.

3.1流水线

  • 3.1.1流水线的原理

举例,现在需要处理一批衣服的清洗工作(一批指令的处理),每一件衣服(每一条指令)的处理步骤有4

  1. 放入洗衣机
  2. 清洗后烘干
  3. 堆叠整齐
  4. 收纳入柜

下图是清洗一件衣服(每次清洗一件)和流水线(每次清洗一批)清洗的区别:

假设:处理指令的每一步最多消耗一个周期.(200ps),所以指令的处理步骤如下:

    将一个步骤称为一个流水线级数,上述流水线级数为4,当存在相当大量的指令需要执行时,流水线执行效率=一次一条/流水线级数.当然,如果需要执行的指令数量偏少,不会有那么高的效率,而流水线会引入其他的开销,也会减低指令执行的效率.

  • 3.1.2流水线冒险

当流水线的下一条指令不能执行时,我们将这种情况称之为冒险.有三种常见的流水线冒险:

  • 1.结构冒险:因为缺乏必要的硬件支持而导致指令不能再下一个时钟周期执行的情况.比如,在上图中,如果只有一个存储器的话,第一条指令访问存储器时,第四条指令也会访问存储器,就会发生结构冒险.
  • 2.数据冒险:无法提高指令所需要的数据而导致指令不能再规定的时钟周期内执行的情况.比如,一条加法指令后紧跟着一条需要加法指令结果进行输入的减法指令.就会发生数据冒险,因为减法指令只能等待加法指令执行完毕后,在执行,而解决数据冒险的方法称之为前推,即在加法指令得到结果而又没有完全执行完时,减法指令可以利用加法指令的结果开始执行,如下图:

  •  3.控制冒险(分支冒险):取到的指令不是预期的指令,即决策依赖于一条指令(分支指令)的结果,而其他的指令正在执行中.比如:分支指令正在执行,将要跳转到其他地址而非下一条地址.就会发生控制冒险.控制冒险的解决方法一般有两种:
  • 一种是阻塞:在确定分支地址后再执行下一条该执行的指令,如下图:
  • 一种是预测,即预测将要执行那条指令,如果预测错误,则保证已执行的指令不会生效,然后在正确的分支地址重新执行,如下图:

 3.2多发射

    多发射是复制自己内部部件的数量,使得每个流水级可以启动多条指令的技术.

    而多发射必须处理两个问题,一是发射槽中的指令数量.一个时钟周期内执行多少条指令,这个问题的解决不同的多发射机制有不同的处理办法..另一个问题是如何处理控制冒险和数据冒险,现在一般使用一种被称之为推测的技术

  • 推测:编译期或处理器推测指令的结果以消除执行其他指令对该结果的依赖.编译期会添加额外的指令检查推测结果的正确性并在推测结果错误是提供专门的修复方法,而处理器经常会缓存推测的结果直至确认推测的正确性.如果推测正确,则将推测结果写入寄存器堆和存储器,如果错误,则清除缓存,并重新执行正确的指令.
  • 发射槽:多发射需要使用发射槽,发射槽是在给定时钟周期内能够发射指令的位置.类似于短跑比赛的起点位置.

多发射的实现主要有两种,他们的主要区别在于决策是在指令编译阶段做出还是在指令执行做出.

  • 3.2.1静态多发射处理器

静态多发射的决策在指令编译阶段做出,静态多发射会在给定时钟周期内发射多条指令,称之为发射包,发射包可以在编译期生成,也可以在有处理器动态生成,不同的静态多发射在于如何处理潜在的数据冒险和控制冒险.

  • 3.2.2动态多发射处理器

动态多发射的决策在指令执行阶段做出.动态多发射处理器通常包含动态流水线调度:

  • 动态流水线调度:对指令进行重新排序以避免阻塞的硬件支持

在这种处理器中,流水线被划分为3个部分:

  • 取指与发射单元:取指并译码,然后将每条指令发送到相应的功能单元执行.
  • 功能单元:每个功能单元都有自己的缓冲区(保留站),用来保存操作数和操作,当缓冲区包含了需要的所有操作数且功能单元就绪时,会计算结果.安全后,将结果写回寄存器堆和存储器.
  • 提交单元:提交单元含有一个缓冲区,称为重排序缓冲区,用于暂时保存执行结果,安全时,就会将结果写回寄存器对或存储器.

                    

其中乱序执行值执行的指令被堵塞时,不会影响导致的指令等待,顺序提交指流水线的执行结果以取指顺序写回.

猜你喜欢

转载自blog.csdn.net/zh328271057/article/details/83046764