处理器体系结构

来源:互联网 发布:wifi软件 编辑:程序博客网 时间:2024/05/16 01:04

之前我们有简单的提到CPU,这一章我们来了解下CPU是如何实现和工作的,以及流水线处理器的原理。

指令集体系结构

指令集体系结构,包括各种状态元素、指令集和它们的编码、一组编程规范和异常事件处理。

  • 程序员可见的状态
    每条指令都会读取或修改处理器状态的某些部分,这称为程序员可见的状态。
    这里写图片描述

  • 指令
    下图给出了指令的简单描述,左边是汇编码表示,右边是字节编码表示。
    这里写图片描述
    对于字节编码,每条指令需要1~6个字节不等,这里我们来解读下字节编码:

    • 指令指示符:
      这里写图片描述
      每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码(code)部分,低4位是功能(function )部分。

    • 寄存器指示符:
      这里写图片描述
      8个程序寄存器中每个都有相应的0-7的寄存器标识符。源放在rA,目的放在rB。

    • 常数字:
      有些指令需要一个附加的4字节常数字,作为立即数数据。需要注意的是,因为不允许从一个存储器地址直接传送到另一个存储器地址,所以源和目的只有一个会需要立即数。

    如下示例:

    ```rmmovl %esp, 0x12345(%edx) --字节编码--> 404245230100```

    从指令指示符表中查出rmmovl的第一个字节为40;源寄存器%esp应该编码放在rA字段中,而目的寄存器%edx应该编码放在rB字段中,根据寄存器编号,我们得到寄存器指示符字节42;最后,偏移量编码放在4字节的常数字中,首先在0x12345的前面填上0变成4个字节,变成字节序列00 01 23 45,写成按字节反序就是45 23 01 00。所以得到404245230100。

  • 异常
    在程序员可见的状态中,状态码stat描述程序执行的总体状态。
    这里写图片描述
    当遇到这些异常的时候,可以调用异常处理程序进行处理。

CPU部件构成

  • 组合逻辑

    • 逻辑门:通过电阻、电容、二极管、三极管等硬件,实现的基本和常用逻辑运算的电子电路。
      这里写图片描述

    • 位级组合逻辑
      通过逻辑门,可以实现各种组合逻辑,如检测位相等:
      这里写图片描述

    • 字级组合逻辑
      通过将逻辑门组合成大的网,可以构造出能计算更加复杂函数的组合电路。通常,我们设计能对数据字(word)进行操作的电路。
      这里写图片描述

      这里写图片描述

    • 算术/逻样单元(ALU)
      这个电路有三个输入:标号为A和B的两个数据输人,以及一个控制输入。根据控制输入的设置,电路会对数据输入执行不同的算术或逻辑操作。
      这里写图片描述

  • 存储器设备
    存储器设备在时钟的变化时候,会将当前的状态输出,并且根据输入更新当前的状态。
    这里写图片描述
    这里写图片描述
    这里写图片描述

  • 时钟信号
    一个周期性的信号,决定什么时候要把新值加载到设备中。硬件上可以由晶振实现。

CPU顺序实现

有了实现处理器所需要的部件(组合逻辑、存储器设备、时钟),我们来了解下CPU顺序实现。顺序实现就是在一个周期中完成处理一条完整指令所需的所有步骤。

  • 处理阶段

    • 取指(fetch):取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值。从指令中抽取出指令指示符字节的两个四位部分,称为icode(指令代码)和ifun(指令功能)。它可能取出一个寄存器指示符字节,指明一个或两个寄存器操作数指示符rA和rB。它还可能取出一个四字节常数字valC。它按顺序方式计算当前指令的下一条指令的地址valP。也就是说,valP等于PC的值加上已取出指令的长度。
    • 译码(decode):译码阶段从寄存器文件读入最多两个操作数,得到值valA和/或valB。通常,它读人指令rA和rB字段指明的寄存器,不过有些指令是读寄存器%esp的。
    • 执行(execute):在执行阶段,算术/逻辑单元(ALU)要么执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值我们称为valE。在此,也可能设置条件码。对一条跳转指令来说,这个阶段会检验条件码和 (ifun给出的)分支条件,看是不是应该选择分支。
    • 访存(memory):访存阶段可以将数据写人存储器,或者从存储器读出数据。读出的值为valM。
    • 写回(write back):写回阶段最多可以写两个结果到寄存器文件。
    • 更新PC ( PC update):将PC设置成下一条指今的地址。

    示例如下:
    这里写图片描述

  • 硬件结构
    这里写图片描述
    上图是执行计算的硬件结构的抽象表示,我们看下硬件单元与各个处理阶段的关联:

    • 取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC增加器计算valP,即增加了的程序计数器。
    • 译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器值valA和valB。
    • 执行:执行阶段会根据指令的类型,将算术/逻辑单元(ALU)用于不同的目的。对整数操作,它要执行指令所指定的运算。对其他指令,它会作为一个加法器来计算增加或减少栈指针,或者计算有效地址,或者只是简单地加0,将一个输人传递到输出。
      条件码寄存器(CC)有三个条件码位。ALU负责计算条件码的新值。当执行一条跳转指令时,会根据条件码和跳转类型来计算分支信号Cnd。
    • 访存:在执行访存操作时,数据存储器读出或写人一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。
    • 写回:寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。

    这里写图片描述
    上图是所需的详细硬件,图例如下:

    • 浅灰色方框表示硬件单元。这包括存储器、ALU等等。在我们所有的处理器实现中,都会使用这一组基本的单元。我们把这些单元当作“黑盒子”,不关心它们的细节设计。
    • 控制逻挥块是用灰色圆角矩形表示的。这些块用来从一组信号源中进行选择,或者用来计算一些布尔函数。我们会非常详细地分析这些块的,包括给出HCL描述。
    • 线路的名字在白色圆角方框中说明。它们只是线路的标识,而不是什么硬件元素。
    • 宽度为字长的数据连接用中等粗度的线表示。每条这样的线实际上都代表一簇犯根线,并列地连在一起,将一个字从硬件的一个部分传送到另一部分。
    • 宽度为字节或更窄的数据连接用细线表示。根据线上要携带的值的类型,每条这样的线实际上都代表一簇4根或8根线。
    • 单个位的连接用虚线来表示。这代表芯片上单元与块之间传递的控制值。
  • 时序
    对于组合逻辑电路,不需要时序控制——只要输人变化了,值就通过逻辑门网络传播。存储设备需要时钟信号来控制,它触发新值的装载,即写操作。指令寄存器(IR)只用来读指令,我们视它为逻辑组合。
    下图是一个用时钟来控制状态元素的更新的例子:
    这里写图片描述

    每个时钟周期所做的工作:

    • 读上一周期产生的结果
    • 通过组合逻辑产生结果

流水线原理

CPU的顺序实现不能够充分利用硬件单元,因为每个单元只在整个时钟周期的一部分时间内才被使用,所以我们引用流水线,这里主要了解其思想。

  • 非流水线
    这里写图片描述

  • 三阶流水线
    这里写图片描述
    寄存器存的就是中间状态的值。

  • 流水线的划分
    上图可以看出,实现流水线需要我们对组合逻辑进行阶段划分。而有时组合逻辑并不能被划分为多个延迟较小的单元。
    这里写图片描述
    其中,510 = (150+20)*3

  • 流水线过深
    流水线过深的话,由于存在寄存器延迟,收益反而可能会下降。
    这里写图片描述

1 0
原创粉丝点击