0%

王道-计算机组成原理-ch5-中央处理器

王道

中央处理器

p202

【考纲内容】

(一)CPU的功能和基本结构

(二)指令执行过程

(三)数据通路的功能和基本结构

(四)控制器的功能和工作原理

硬布线控制器

微程序控制器:微程序、微指令和微命令,微指令格式,微命令的编码方式,微地址的形成方式

(五)指令流水线

指令流水线的基本概念;指令流水线的基本实现

超标量和动态流水线的基本概念

【复习提示】

中央处理器是计算机的中心,也是本书的难点。其中,数据通路的分析、指令执行阶段的节拍与控制信号的安排、流水线技术与性能分析易出综合题。而关于各种寄存器的特点、指令执行的各种周期与特点、控制器的相关概念、流水线的相关概念也极易出选择题。

在学习本章时,请读者思考以下问题;

1)CPU分为哪几部分?分别实现什么功能?

2)指令和数据均存放在内存中,计算机如何从时间和空间上区分它们是指令还是数据?

3)什么是指令周期、机器周期和时钟周期?它们之间有何关系?

4)指令周期是否有一个固定值?为什么?

5)什么是微指令?它和第4章谈到的指令有什么关系?

6)什么是指令流水线?指令流水线相对于传统计算机体系结构的优势是什么?如何计算指令流水线的加速比?

请读者在本章的学习过程中寻找答案,本章末尾会给出参考答案。

总结一下, $\color{red}{\text{寄存器与字长之间的关系}}$
$\color{red}{\text{指令周期分为哪几个阶段,哪几个阶段会修改PC寄存器的值}}$
$\color{red}{\text{各种标志位的作用是啥,产生的时机又是啥}}$
$\color{red}{\text{哪些寄存器是透明的}}$

组件是否透明
暂存寄存器
累加寄存器
程序计数器$\color{red}{\times}$
通用寄存器组$\color{red}{\times}$
程序状态字寄存器$\color{red}{\times}$
指令寄存器$\color{green}{\checkmark}$
指令译码器
存储器地址寄存器
存储器数据寄存器

全部习题之间增加分割线
(^##### )
----------\n$1

CPU的功能和基本结构

CPU的功能

$\color{red}{\text{中央处理器}}$ (CPU)由 $\color{green}{\text{运算器}}$ 和 $\color{green}{\text{控制器}}$ 组成。其中, $\color{red}{\text{控制器}}$ 的功能是负责协调并控制计算机各部件执行程序的指令序列,包括 $\color{green}{\text{取指令}}$ 、 $\color{green}{\text{分析指令}}$ 和 $\color{green}{\text{执行指令}}$ ; $\color{red}{\text{运算器}}$ 的功能是 $\color{green}{\text{对数据进行加工}}$ 。CPU的具体功能包括:

1)指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制。

2)操作控制。一条指令的功能往往由若干操作信号的组合来实现。CPU 管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。

3)时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。

4)数据加工。对数据进行算术和逻辑运算。

5)中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理。

CPU的基本结构

在计算机系统中,中央处理器主要由运算器和控制器两大部分组成,如图5.1所示。

图片详情找不到图片(Image not found)
$\color{red}{\text{运算器}}$

运算器接收从控制器送来的命令并执行相应的动作,对数据进行加工和处理。运算器是计算机对数据进行加工处理的中心,它主要由算术逻辑单元(ALU)、暂存寄存器、累加寄存器(ACC)、通用寄存器组、程序状态字寄存器(PSW)、移位器、计数器(CT)等组成。

1) $\color{green}{\text{算术逻辑单元}}$ 。主要功能是进行算术/逻辑运算。

2) $\color{green}{\text{暂存寄存器}}$ 。用于暂存从主存读来的数据,该数据不能存放在通用寄存器中,否则会破坏其原有内容。暂存寄存器对应用程序员是透明的。

3) $\color{green}{\text{累加寄存器}}$ 。它是一个通用寄存器,用于暂时存放ALU运算的结果信息,可以作为加法运算的一个输入端。

4) $\color{green}{\text{通用寄存器组}}$ 。如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。

5) $\color{green}{\text{程序状态字寄存器}}$ 。保留田昇个之西界R标志(ZF)、进位标志(CF)等。PSW 中息,如溢出标志(OF)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成。

6) $\color{green}{\text{移位器}}$ 。对操作数或运算结果进行移位运算。

7) $\color{green}{\text{计数器}}$ 。控制乘除运算的操作步数。

$\color{red}{\text{控制器}}$

控制器是整个系统的指挥中枢,在控制器的控制下,运算器、存储器和输入/输出设备等功能部件构成一个有机的整体,根据指令的要求指挥全机协调工作。控制器的基本功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的。

控制器有硬布线控制器和微程序控制器两种类型(见5.4节)。

控制器由程序计数器(PC)、指令寄存器(IR)、指令译码器、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、时序系统和微操作信号发生器等组成。

1) $\color{green}{\text{程序计数器}}$ 。用于指出下一条指令在主存中的存放地址。CPU根据PC的内容去主存中取指令。因程序中指令(通常)是顺序执行的,所以PC有自增功能。

2) $\color{green}{\text{指令寄存器}}$ 。用于保存当前正在执行的那条指令。

3) $\color{green}{\text{指令译码器}}$ 。仅对操作码字段进行译码,向控制器提供特定的操作信号。

4) $\color{green}{\text{存储器地址寄存器}}$ 。用于存放要访问的主存单元的地址。

5) $\color{green}{\text{存储器数据寄存器}}$ 。用于存放向主存写入的信息或从主存读出的信息。

6) $\color{green}{\text{时序系统}}$ 。用于产生各种时序信号,它们都由统一时钟(CLOCK)分频得到。

7) $\color{green}{\text{微操作信号发生器}}$ 。根据R的内容(指令)、PSW的内容(状态信息)及时序信号产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。

控制器的工作原理是,根据指令操作码、指令的执行步骤(微命令序列)和条件信号来形成当前计算机各部件要用到的控制信号。计算机整机各硬件系统在这些控制信号的控制下协同运行,产生预期的执行结果。

注意:CPU内部寄存器大致可分为两类:一类是用户可见的寄存器,可对这类寄存器编程,如通用寄存器组、程序状态字寄存器;另一类是用户不可见的寄存器,对用户是透明的,不可对这类寄存器编程,如存储器地址寄存器、存储器数据寄存器、指令寄存器。

指令执行过程

指令周期

CPU从主存中 $\color{green}{\text{取出并执行一条指令的时间称为指令周期}}$ ,不同指令的指令周期可能不同。指令周期常用若干机器周期来表示,一个机器周期又包含若干 $\color{yellow}{\text{时钟周期}}$ (也称 $\color{yellow}{\text{节拍}}$ 或T周期,它是CPU操作的最基本单位)。每个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等。图5.2反映了上述关系。图5.2(a)为定长的机器周期,每个机器周期包含4个节拍(T);图5.2(b)所示为不定长的机器周期,每个机器周期包含的节拍数可以为4个,也可以为3个。

图片详情找不到图片(Image not found)

对于无条件转移指令JMP X,在执行时不需要访问主存,只包含取指阶段(包括取指和分析)和执行阶段,所以其指令周期仅包含取指周期和执行周期。

对于间接寻址的指令,为了取操作数,需要先访问一次主存,取出有效地址,然后访问主存,取出操作数,所以还需包括间址周期。间址周期介于取指周期和执行周期之间。

当CPU采用中断方式实现主机和I/O设备的信息交换时,CPU在每条指令执行结束前,都要发中断查询信号,若有中断请求,则CPU进入中断响应阶段,又称中断周期。这样,一个完整的 $\color{red}{\text{指令周期}}$ 应包括 $\color{green}{\text{取指}}$ 、 $\color{green}{\text{间址}}$ 、 $\color{green}{\text{执行}}$ 和 $\color{green}{\text{中断}}$ 4个周期,如图5.3所示。

图片详情找不到图片(Image not found)

上述4个工作周期都有CPU访存操作,只是访存的目的不同。取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点。

为了区别不同的工作周期,在CPU内设置4个标志触发器FE、IND、EX和 INT,它们分别对应取指、间址、执行和中断周期,并以“1”状态表示有效,分别由1→FE、1→ND、1→EX和1→INT这4个信号控制。

注意:中断周期中的进栈操作是将SP减1,这和传统意义上的进栈操作相反,原因是计算机的堆栈中都是向低地址增加,所以进栈操作是减1而不是加1。

指令周期的数据流

数据流是根据指令要求依次访问的数据序列。在指令执行的不同阶段,要求依次访问的数据序列是不同的。而且对于不同的指令,它们的数据流往往也是不同的。

  • $\color{red}{\text{注意到}}$ :虽然有三种总线,每种寄存器和内存之间的通信,只能经过一种特定的总线
取指周期

取指周期的任务是根据PC中的内容从主存中取出指令代码并存放在IR中。

取指周期的数据流如图5.4所示。PC 中存放的是指令的地址,根据此地址从内存单元中取出的是指令,并放在指令寄存器IR中,取指令的同时,PC加1。

图片详情找不到图片(Image not found)

取指周期的数据流向如下:

1)PC①MAR②地址总线 ${\textstyle\unicode{x2462}}$ 主存。

2)CU 发出控制信号④控制总线⑤主存。

3)主存⑥数据总线⑦MDR⑧IR(存放指令)。

4)CU发出读命令⑨PC内容加1。

间址周期

间址周期的任务是取操作数有效地址。以一次间址为例(见图5.5),将指令中的地址码送到MAR并送至地址总线,此后CU向存储器发读命令,以获取有效地址并存至MDR.

图片详情找不到图片(Image not found)

间址周期的数据流向如下:

1)Ad(IR)(或MDR① MAR②地址总线③主存。

2)CU 发出读命令④控制总线⑤主存。

3)主存⑥数据总线⑦MDR(存放有效地址)。

其中,Ad(IR)表示取出IR中存放的指令字的地址字段。

执行周期

执行周期的任务是根据IR中的指令字的操作码和操作数通过 ALU操作产生执行结果。不同指令的执行周期操作不同,因此没有统一的数据流向。

中断周期

中断周期的任务是处理中断请求。假设程序断点存入堆栈中,并用SP指示栈顶地址,而且进栈操作是先修改栈顶指针,后存入数据,数据流如图5.6所示。

图片详情找不到图片(Image not found)

中断周期的数据流向如下:

1)CU控制将SP减1,SP ① MAR②地址总线③主存。

2)CU发出写命令④控制总线⑤主存。

3)PC⑥ MDR⑦数据总线⑧主存(程序断点存入主存)。

4)CU(中断服务程序的入口地址)⑨PC。

指令执行方案

一个指令周期通常要包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。出于性能和硬件成本等考虑,可以选用3种不同的方案来安排指令的执行步骤。

  • $\color{green}{\text{单}}$ 指令周期,周期只有 $\color{green}{\text{一}}$ 种情况
  • $\color{green}{\text{多}}$ 指令周期,周期有 $\color{green}{\text{多}}$ 种情况
单指令周期

对所有指令都选用 $\color{green}{\text{相同的执行时间}}$ 来完成,称为单指令周期方案。此时每条指令都在固定的时钟周期内完成,指令之间串行执行,即下一条指令只能在前一条指令执行结束后才能启动。因此,指令周期取决于执行时间最长的指令的执行时间。对于那些本来可以在更短时间内完成的指令,要使用这个较长的周期来完成,会降低整个系统的运行速度。

多指令周期

对不同类型的指令选用不同的执行步骤来完成,称为 $\color{green}{\text{多指令周期方案}}$ 。指令之间串行执行,即下一条指令只能在前一条指令执行结束后才能启动。但可选用不同个数的时钟周期来完成不同指令的执行过程,指令需要几个周期就为其分配几个周期,而不再要求所有指令占用相同的执行时间。

流水线方案

指令之间可以并行执行的方案,称为流水线方案,其追求的目标是力争在每个时钟脉冲周期完成一条指令的执行过程(只在理想情况下才能达到该效果)。这种方案通过在每个时钟周期启动一条指令, $\color{green}{\text{尽量让多条指令同时运行,但各自处在不同的执行步骤中}}$ 。

数据通路的功能和基本结构

数据通路的功能

数据在功能部件之间传送的路径称为 $\color{red}{\text{数据通路}}$ 。路径上的部件称为 $\color{red}{\text{数据通路部件}}$ ,如 $\color{green}{\text{ALU}}$ 、 $\color{green}{\text{通用寄存器}}$ 、 $\color{green}{\text{状态寄存器}}$ 、 $\color{green}{\text{异常}}$ 和 $\color{green}{\text{中断处理逻辑}}$ 等。数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,这些都需要加以控制。

数据通路中专门进行数据运算的部件称为 $\color{red}{\text{执行部件}}$ 或 $\color{red}{\text{功能部件}}$ 。数据通路由 $\color{red}{\text{控制部件}}$ 控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号,并正确控制指令的执行流程。数据通路的功能是 $\color{green}{\text{实现CPU内部的运算器与寄存器及寄存器之间的数据交换}}$ 。

数据通路的基本结构

数据通路的基本结构主要有以下几种:

1) $\color{green}{\text{CPU 内部单总线方式}}$ 。将所有寄存器的输入端和输出端都连接到一条公共通路上,这种结构比较简单,但数据传输存在较多的冲突现象,性能较低。连接各部件的总线只有一条时,称为单总线结构;CPU中有两条或更多的总线时,构成双总线结构或多总线结构。图5.7所示为CPU内部总线的数据通路和控制信号。

2) $\color{green}{\text{CPU内部三总线方式}}$ 。将所有寄存器的输入端和输出端都连接到多条公共通路上,相比之下单总线中一个时钟内只允许传一个数据,因而指令执行效率很低,因此采用多总线方式,同时在多个总线上传送不同的数据,提高效率。

3) $\color{green}{\text{专用数据通路方式}}$ 。根据指令执行过程中的数据和地址的流动方向安排连接线路,避免使用共享的总线,性能较高,但硬件量大。

在图5.7中,规定各部件用大写字母表示,字母加“in”表示该部件的允许输入控制信号;字母加“out”表示该部件的允许输出控制信号。

图片详情找不到图片(Image not found)

注意: $\color{red}{\text{内部总线}}$ 是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线; $\color{red}{\text{系统总线}}$ 是指同一台计算机系统的各部件,如CPU、内存、通道和各类IO接口间互相连接的总线。

寄存器之间的数据传送

寄存器之间的数据传送可通过CPU内部总线完成。在图5.7中,某寄存器AX的输出和输入分别由AXout 和AXin控制。这里以PC寄存器为例,把PC内容送至MAR,实现传送操作的流程及控制信号为

PC→Bus PCout有效,PC内容送总线

Bus→MAR MARin有效,总线内容送MAR

主存与CPU之间的数据传送

主存与CPU之间的数据传送也要借助CPU内部总线完成。现以CPU 从主存读取指令为例说明数据在数据通路中的传送过程。实现传送操作的流程及控制信号为

PC→Bus→MAR PCout 和 MARin有效,现行指令地址→MAR
1→R CU发读命令
MEM(MAR)→MDR MDRin有效
MDR→BuS→IR MDRout和 IRin有效,现行指令→IR

执行算术或逻辑运算

执行算术或逻辑操作时,由于ALU本身是没有内部存储功能的组合电路,因此如要执行加法运算,相加的两个数必须在 ALU的两个输入端同时有效。图5.7中的暂存器Y即用于该目的。先将一个操作数经CPU内部总线送入暂存器Y保存,Y的内容在 ALU的左输入端始终有效,再将另一个操作数经总线直接送到ALU的右输入端。这样两个操作数都送入了ALU,运算结果暂存在暂存器Z中。

Ad(IR)→Bus→MAR MDRout和 MARin有效
1→R CU发读命令
MEM→数据线→MDR 操作数从存储器→数据线→MDR
MDR→Bus→Y MDRout 和 Yin有效,操作数→Y
(ACC)+(Y)→Z ACCout 和 ALUin有效,CU向ALU发加命令,结果→Z
Z→ACC Zout和 ACCin有效,结果→ACC

数据通路结构直接影响CPU内各种信息的传送路径,数据通路不同,指令执行过程的微操作序列的安排也不同,它关系着微操作信号形成部件的设计。

控制器的功能和工作原理

控制器的结构和功能

从图5.8可以看到计算机硬件系统的五大功能部件及其连接关系。它们通过数据总线、地址总线和控制总线连接在一起,其中点画线框内的是控制器部件。

图片详情找不到图片(Image not found)

现对其主要连接关系简单说明如下:

1)运算器部件通过数据总线与内存储器、输入设备和输出设备传送数据。2)输入设备和输出设备通过接口电路与总线相连接。

3)内存储器、输入设备和输出设备从地址总线接收地址信息,从控制总线得到控制信号,通过数据总线与其他部件传送数据。

4)控制器部件从数据总线接收指令信息,从运算器部件接收指令转移地址,送出指令地址到地址总线,还要向系统中的部件提供它们运行所需要的控制信号。控制器是计算机系统的指挥中心,控制器的主要功能有:

1)从主存中取出一条指令,并指出下一条指令在主存中的位置。

2)对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作。

3)指挥并控制CPU、主存、输入和输出设备之间的数据流动方向。

根据控制器产生微操作控制信号的方式的不同,控制器可分为硬布线控制器和微程序控制器,两类控制器中的PC和IR是相同的,但确定和表示指令执行步骤的办法以及给出控制各部件运行所需要的控制信号的方案是不同的。

硬布线控制器

硬布线控制器的基本原理是根据指令的要求、当前的时序及外部和内部的状态,按时间的顺序发送一系列微操作控制信号。它由复杂的组合逻辑门电路和一些触发器构成,因此又称组合逻辑控制器。

  • $\color{green}{\text{组合逻辑电路}}$ 和 $\color{green}{\text{时序逻辑电路}}$
硬布线控制单元图

指令的操作码是决定控制单元发出不同操作命令(控制信号)的关键。为了简化控制单元(CU)的逻辑,将指令的操作码译码和节拍发生器从CU分离出来,便可得到简化的控制单元图,如图5.9所示。

CU的输入信号来源如下:

1)经指令译码器译码产生的指令信息。现行指令的操作码决定了不同指令在执行周期所需完成的不同操作,因此指令的 $\color{green}{\text{操作码}}$ 字段是控制单元的输入信号,它与时钟配合产生不同的控制信号。

2)时序系统产生的机器周期信号和节拍信号。为了使控制单元按一定的先后顺序、一定的节奏发出各个控制信号,控制单元必须受时钟控制,即一个时钟脉冲使控制单元发送一个操作命令,或发送一组需要同时执行的操作命令。

3)来自执行单元的反馈信息即标志。控制单元有时需依赖CPU当前所处的状态产生控制信号,如BAN指令,控制单元要根据上条指令的结果是否为负来产生不同的控制信号。

图片详情找不到图片(Image not found)

图5.9 中,节拍发生器产生各机器周期中的节拍信号,使不同的微操作命令$C_i$(控制信号)按时间的先后发出。个别指令的操作不仅受操作码控制,还受状态标志控制,因此CU的输入来自操作码译码电路ID、节拍发生器及状态标志,其输出到CPU内部或外部控制总线上。

注意:控制单元还接收来自系统总线(控制总线)的控制信号,如中断请求、DMA请求。

硬布线控制器的时序系统及微操作

1)时钟周期。用时钟信号控制节拍发生器,可以产生节拍,每个节拍的宽度正好对应一个时钟周期。在每个节拍内机器可完成一个或几个需同时执行的操作。

2)机器周期。机器周期可视为所有指令执行过程中的一个基准时间。不同指令的操作不同,指令周期也不同。访问一次存储器的时间是固定的,因此通常以存取周期作为基准时间,即内存中读取一个指令字的最短时间作为机器周期。在存储字长等于指令字长的前提下,取指周期也可视为机器周期。

在一个机器周期里可完成若干微操作,每个微操作都需一定的时间,可用时钟信号来控制产生每个微操作命令。

3)指令周期。指令周期详见5.2.1节。

4)微操作命令分析。控制单元具有发出各种操作命令(控制信号)序列的功能。这些命令与指令有关,而且必须按一定次序发出,才能使机器有序地工作。

执行程序的过程中,对于不同的指令,控制单元需发出各种不同的微操作命令。一条指令分为3个工作周期:取指周期、间址周期和执行周期。下面分析各个子周期的微操作命令。
<!—
①取指周期的微操作命令。无论是什么指令,取指周期都需有下列微操作命令:

PC→MAR 现行指令地址→MAR

1→R 命令存储器读

M(MAR)→MDR 现行指令从存储器中读至MDR

MDR→IR 现行指令→IR

OP(IR)→CU 指令的操作码→CU译码

(PC)+1→PC 形成下一条指令的地址

②间址周期的微操作命令。间址周期完成取操作数地址的任务,具体微操作命令如下:

Ad(IR)→MAR 将指令字中的地址码(形式地址)→MAR

1→R 命令存储器读

M(MAR)→MDR 将有效地址从存储器读至MDR

③执行周期的微操作命令。执行周期的微操作命令视不同指令而定。

a.非访存指令。

CLA 清ACC 0→ACC

COM 取反 $\overline{ACC}$→ACC

SHR 算术右移 L(ACC)→R(ACC),$ACC_0$→$ACC_0$

CSL 循环左移 R(ACC)→L(ACC),$ACC_0$→$ACC_n$

STP 停机指令 0→G

b.访存指令

ADD X 加法指令 Ad(IR)→MAR

1→R

M(MAR)→MDR

(ACC)+ (MDR)→ACC

STA X 存数指令 Ad(IR)→MAR

1→w

ACC→MDR

MDR→M(MAR)

LDAX 取数指令 Ad(IR)→MAR

1→R

M(MAR)→MDR

MDR→ACC

c.转移指令

JMP X 无条件转移 Ad(IR)→PC

BAN X 条件转移(负则转) $A_0 \cdot$Ad(IR)+$\overline{A_0} \cdot$(PC)→PC —>

图片详情找不到图片(Image not found)
CPU 的控制方式

控制单元控制一条指令执行的过程,实质上是依次执行一个确定的微操作序列的过程。由于不同指令所对应的微操作数及复杂程度不同,因此每条指令和每个微操作所需的执行时间也不同。主要有以下3种控制方式。

1) $\color{green}{\text{同步控制方式}}$ 。所谓同步控制方式,是指系统有一个统一的时钟,所有的控制信号均来自这个统一的时钟信号。通常以最长的微操作序列和最烦琐的微操作作为标准,采取完全统一的、具有相同时间间隔和相同数目的节拍作为机器周期来运行不同的指令。同步控制方式的优点是控制电路简单,缺点是运行速度慢。

2) $\color{green}{\text{异步控制方式}}$ 。异步控制方式不存在基准时标信号,各部件按自身固有的速度工作,通过应答方式进行联络。异步控制方式的优点是运行速度快,缺点是控制电路比较复杂。

3) $\color{green}{\text{联合控制方式}}$ 。联合控制方式是介于同步、异步之间的一种折中。这种方式对各种不同的指令的微操作实行大部分采用同步控制、小部分采用异步控制的办法。

硬布线控制单元设计步骤

硬布线控制单元设计步骤包括:

1)列出微操作命令的操作时间表。先根据微操作节拍安排,列出微操作命令的操作时间表。操作时间表中包括各个机器周期、节拍下的每条指令完成的微操作控制信号。表5.1列出了CLA、COM、SHR等10条机器指令微操作命令的操作时间表。表中FE、IND 和EX为CPU 工作周期标志,$T_0~T_2$,为节拍,Ⅰ为间址标志,在取指周期的$T_2$时刻,若测得I=1,则IND触发器置“1”,标志进入间址周期;若I=0,则EX触发器置“1”,标志进入执行周期。同理,在间址周期的$T_2$时刻,若测得IND=0(表示一次间接寻址),则EX触发器置“1”,进入执行周期;若测得IND= 1(表示多次间接寻址),则继续间接寻址。在执行周期的$T_2$时刻,CPU 要向所有中断源发中断查询信号,若检测到有中断请求并满足响应条件,则INT触发器置“1”,标志进入中断周期。表中未列出INT触发器置“1”的操作和中断周期的微操作。表中第一行对应10条指令的操作码,代表不同的指令。若某指令有表中所列出的微操作命令,其对应的单元格内为1。

2)进行微操作信号综合。在列出微操作时间表后,即可对它们进行综合分析、归类,根据
微操作时间表可写出各微操作控制信号的逻辑表达式并进行适当的简化。表达式一般包括下列因素:

微操作控制信号=机器周期$\wedge$节拍$\wedge$脉冲$\wedge$操作码$\wedge$机器状态条件

根据表5.1便可列出每个微操作命令的初始逻辑表达式,经化简、整理可获得能用现有门电路实现的微操作命令逻辑表达式。

图片详情找不到图片(Image not found)

例如,根据表5.1可写出 M(MAR)—MDR微操作命令的逻辑表达式:

M(MAR)→MDR

=FE$\cdot T_1$+IND$\cdot T_1$;(ADD + STA + LDA + JMP + BAN)+EX$\cdot T_1$;(ADD +LDA)=$T_1${FE+ IND(ADD + STA+ LDA+JMP+BAN)+EX(ADD +LDA)}

式中,ADD、STA、LDA、JMP、BAN均来自操作码译码器的输出。

3)画出微操作命令的逻辑图。根据逻辑表达式可画出对应每个微操作信号的逻辑电路图,
并用逻辑门电路实现。

例如,M(MAR)-MDR的逻辑表达式所对应的逻辑图如图5.10 所示,图中未考虑门的扇入系数。

$\color{red}{\text{Q}}$ :什么是扇入系数

图片详情找不到图片(Image not found)

微程序控制器

微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生。

微程序控制的基本概念

微程序设计思想就是将每条机器指令编写成一个微程序,每个微程序包含若干微指令,每条微指令对应一个或几个微操作命令。这些微程序可以存到一个控制存储器中,用寻址用户程序机器指令的办法来寻址每个微程序中的微指令。目前,大多数计算机都采用微程序设计技术。

微程序设计技术涉及的基本术语如下:

1) $\color{green}{\text{微命令与微操作}}$ 。一条机器指令可以分解成一个微操作序列,这些微操作是计算机中最基本的、不可再分解的操作。在微程序控制的计算机中,将控制部件向执行部件发出的各种控制命令称为 $\color{red}{\text{微命令}}$ ,它是构成控制序列的最小单位。例如,打开或关闭某个控制门的电位信号、某个寄存器的打入脉冲等。微命令和微操作是一一对应的。微命令是微操作的控制信号,微操作是微命令的执行过程。

微命令有相容性和互斥性之分。相容性微命令是指那些可以同时产生、共同完成某一些微操作的微命令;而互斥性微命令是指在机器中不允许同时出现的微命令。相容和互斥都是相对的,一个微命令可以和一些微命令相容,和另一些微命令互斥。

注意:在组合逻辑控制器中也存在微命令与微操作这两个概念,它们并非只是微程序控制器的专有概念。

2) $\color{green}{\text{微指令与微周期}}$ 。微指令是若干微命令的集合。存放微指令的控制存储器的单元地址称为微地址。一条微指令通常至少包含两大部分信息:

① $\color{green}{\text{操作控制字段}}$ ,又称微操作码字段,用于产生某一步操作所需的各种操作控制信号。

${\textstyle\unicode{x2461}}$ $\color{green}{\text{顺序控制字段}}$ ,又称微地址码字段,用于控制产生下一条要执行的微指令地址。微周期通常指从控制存储器中读取一条微指令并执行相应的微操作所需的时间。

3)主存储器与控制存储器。主存储器用于存放程序和数据,在CPU外部,用RAM 实现;控制存储器(CM)用于存放微程序,在CPU内部,用ROM实现。

4)程序与微程序。 $\color{red}{\text{程序}}$ 是 $\color{green}{\text{指令的有序集合}}$ ,用于完成特定的功能; $\color{red}{\text{微程序}}$ 是 $\color{green}{\text{微指令的有序集合}}$ ,一条指令的功能由一段微程序来实现

微程序和程序是两个不同的概念。微程序是由微指令组成的,用于描述机器指令。微程序实际上是机器指令的实时解释器,是由计算机设计者事先编制好并存放在控制存储器中的,一般不提供给用户。对于程序员来说,计算机系统中微程序的结构和功能是透明的,无须知道。而程序最终由机器指令组成,是由软件设计人员事先编制好并存放在主存或辅存中的。

读者应注意区分以下寄存器:

①地址寄存器(MAR)。用于存放主存的读/写地址。

${\textstyle\unicode{x2461}}$ 微地址寄存器(CMAR)。用于存放控制存储器的读/写微指令的地址。

③指令寄存器(IR)。用于存放从主存中读出的指令。

④微指令寄存器(CMDR或uIR)。用于存放从控制存储器中读出的微指令。

微程序控制器组成和工作过程
微程序控制器的基本组成

图5.11所示为一个微程序控制器的基本结构,主要画出了微程序控制器比组合逻辑控制器多出的部件,包括:

${\textstyle\unicode{x2460}}$ 控制存储器。它是微程序控制器的核心部件,用于存放各指令对应的微程序,控制存储器可用只读存储器ROM构成。

${\textstyle\unicode{x2461}}$ 微指令寄存器。用于存放从CM中取出的微指令,它的位数同微指令字长相等。

${\textstyle\unicode{x2462}}$ 微地址形成部件。用于产生初始微地址和后继微地址,以保证微指令的连续执行。

${\textstyle\unicode{x2463}}$ 微地址寄存器。接收微地址形成部件送来的微地址,为在CM中读取微指令作准备。

图5.11微程序控制器的基本结构找不到图片(Image not found)
微程序控制器的工作过程

微程序控制器的工作过程实际上就是在微程序控制器的控制下计算机执行机器指令的过程,这个过程可以描述如下:

${\textstyle\unicode{x2460}}$ 执行取微指令公共操作。具体的执行是:在机器开始运行时,自动将取指微程序的入口地址送入CMAR,并从CM 中读出相应的微指令送入CMDR。取指微程序的入口地址一般为CM的0号单元,当取指微程序执行完后,从主存中取出的机器指令就已存入指令寄存器中。

${\textstyle\unicode{x2461}}$ 由机器指令的操作码字段通过微地址形成部件产生该机器指令所对应的微程序的入口地
址,并送入CMAR。

③从CM中逐条取出对应的微指令并执行。

④执行完对应于一条机器指令的一个微程序后,又回到取指微程序的入口地址,继续第①
步,以完成取下一条机器指令的公共操作。

以上是一条机器指令的执行过程,如此周而复始,直到整个程序执行完毕。

微程序和机器指令

通常,一条机器指令对应一个微程序。由于任何一条机器指令的取指令操作都是相同的,因此可将取指令操作的微命令统一编成一个微程序,这个微程序只负责将指令从主存单元中取出并送至指令寄存器。

此外,也可编出对应间址周期的微程序和中断周期的微程序。这样,控制存储器中的微程序个数应为机器指令数再加上对应取指、间址和中断周期等共用的微程序数。

注意:若指令系统中具有$n$种机器指令,则控制存储器中的微程序数至少是$n +1 $(1为公共的取指微程序)。

微指令的编码方式

微指令的编码方式又称微指令的控制方式,是指如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长。

直接编码(直接控制)方式

微指令的直接编码方式如图5.12所示。直接编码法无须进行译码,微指令的微命令字段中每位都代表一个微命令。设计微指令时,选用或不选用某个微命令,只要将表示该微命令的对应位设置成1或0即可。每个微命令对应并控制数据通路中的一个微操作。

这种编码的优点是简单、直观,执行速度快,操作并行性好;缺点是微指令字长过长,$n$个微命令就要求微指令的操作字段有$n$位,造成控制存储器容量极大。

图5.12微指令的直接编码方式找不到图片(Image not found)
字段直接编码方式

将微指令的微命令字段分成若干小字段,把互斥性微命令组合在同一字段中,把相容性微命令组合在不同字段中,每个字段独立编码,每种编码代表一个微命令且各字段编码含义单独定义,与其他字段无关,这就是字段直接编码方式,如图5.13所示。

这种方式可以缩短微指令字长,但因为要通过译码电路后再发出微命令,因此比直接编码方式慢。

微命令字段分段的原则:

${\textstyle\unicode{x2460}}$ 互斥性微命令分在同一段内,相容性微命令分在不同段内。

${\textstyle\unicode{x2461}}$ 每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间。

${\textstyle\unicode{x2462}}$ 一般每个小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作。

图5.13微指令的字段直接编码方式找不到图片(Image not found)
字段间接编码方式

一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,因此称为字段间接编码,又称隐式编码。这种方式可进一步缩短微指令字长,但因削弱了微指令的并行控制能力,因此通常作为字段直接编码方式的一种辅助手段。

微指令的地址形成方式

后继微地址的形成主要有以下两大基本类型:

1)直接由微指令的下地址字段指出。微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址,这种方式又称断定方式。

2)根据机器指令的操作码形成。机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。

实际上,微指令序列地址的形成方式还有以下几种:

①增量计数器法,即(CMAR)+1→CMAR,适用于后继微指令的地址连续的情况。

${\textstyle\unicode{x2461}}$ 根据各种标志决定微指令分支转移的地址。

③通过网络测试形成。

④由硬件直接产生微程序入口地址。

电源加电后,第一条微指令的地址可由专门的硬件电路产生,也可由外部直接向CMAR输入微指令的地址,这个地址即为取指周期微程序的入口地址。

微指令的格式

微指令格式与微指令的编码方式有关,通常分水平型微指令和垂直型微指令两种。

1)水平型微指令。从编码方式看,直接编码、字段直接编码、字段间接编码和混合编码都属于水平型微指令。水平型微指令的基本指令格式如图5.14所示,指令字中的一位对应-一个控制信号,有输出时为1,否则为0。一条水平型微指令定义并执行几种并行的基本操作。

图片详情找不到图片(Image not found)

水平型微指令的优点是微程序短,执行速度快;缺点是微指令长,编写微程序较麻烦。

2)垂直型微指令。垂直型微指令的特点是采用类似机器指令操作码的方式,在微指令中设置微操作码字段,采用微操作码编译法,由微操作码规定微指令的功能,其基本的指令格式如图5.15所示。一条垂直型微指令只能定义并执行一种基本操作。

图片详情找不到图片(Image not found)

垂直型微指令格式的优点是微指令短、简单、规整,便于编写微程序;缺点是微程序长,执行速度慢,工作效率低。

3)混合型微指令。在垂直型的基础上增加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快。

4)水平型微指令和垂直型微指令的比较如下:

${\textstyle\unicode{x2460}}$ 水平型微指令并行操作能力强、效率高、灵活性强;垂直型微指令则较差。

${\textstyle\unicode{x2461}}$ 水平型微指令执行一条指令的时间短;垂直型微指令执行的时间长。

${\textstyle\unicode{x2462}}$ 由水平型微指令解释指令的微程序,具有微指令字较长但微程序短的特点;垂直型
微指令则与之相反,其微指令字较短而微程序长。

④水平型微指令用户难以掌握,而垂直型微指令与指令比较相似,相对容易掌握。

微程序控制单元的设计步骤

微程序控制单元设计的主要任务是编写各条机器指令所对应的微程序。具体的设计步骤如下:

1)写出对应机器指令的微操作命令及节拍安排。无论是组合逻辑设计还是微程序设计,对应相同的CPU 结构,两种控制单元的微操作命令和节拍安排都是极相似的。如微程序控制单元在取指阶段发出的微操作命令及节拍安排如下:

$T_0$ PC→MAR,1→R
$T_1$ M(MAR)→MDR,(PC)+1-→PC
$T_2$ MDR→IR,OP(IR)→微地址形成部件

与硬布线控制单元相比,只在$T_2$节拍内的微操作命令不同。微程序控制单元在$T_2$节拍内要将指令的操作码送至微地址形成部件,即OP(IR)→微地址形成部件,以形成该条机器指令的微程序首地址。而硬布线控制单元在$T_2$,节拍内要将指令的操作码送至指令译码器,以控制CU 发出相应的微命令,即 OP(IR)→ID。

若把一个节拍T内的微操作安排在一条微指令中完成,上述微操作对应3条微指令。但由于微程序控制的所有控制信号都来自微指令,而微指令又存在控制存储器中,因此欲完成上述这些微操作,必须先将微指令从控制存储器中读出,即必须先给出这些微指令的地址。在取指微程序中,除第一条微指令外,其余微指令的地址均由上一条微指令的下地址字段直接给出,因此上述每条微指令都需增加一个将微指令下地址字段送至CMAR 的微操作,记为 Ad(CMDR)→CMAR。取指微程序的最后一条微指令,其后继微指令的地址是由微地址形成部件形成的,即微地址形成部件→CMAR。为了反映该地址与操作码有关,因此记为OP(IR)→微地址形成部件→CMAR。

综上所述,考虑到需要形成后继微指令地址,上述分析的取指操作共需6条微指令完成:

$T_0$ PC→MAR,1→R
$T_1$ Ad(CMDR)→CMAR
$T_2$ M(MAR)→MDR,(PC)+1→PC
$T_3$ Ad(CMDR)→CMAR
$T_4$ MDR→IR
$T_5$ OP(IR)→微地址形成部件→CMAR

执行阶段的微操作命令及节拍安排,分配原则类似。与硬布线控制单元微操作命令的节拍安排相比,多了将下一条微指令地址送至CMAR 的微操作命令,即 Ad(CMDR)→CMAR。其余的微操作命令与硬布线控制单元相同。

注意:这里为了理解,应将微指令和机器指令相联系,因为每执行完一条微指令后要得到下一条微指令的地址。

2)确定微指令格式。微指令格式包括微指令的编码方式、后继微指令地址的形成方式和微指令字长等。

根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数。由微指令数确定微指令的顺序控制字段的位数。最后按操作控制字段位数和顺序控制字段位数就可确定微指令字长。

3)编写微指令码点。根据操作控制字段每位代表的微操作命令,编写每条微指令的码点。

动态微程序设计和毫微程序设计

1)动态微程序设计。在一台微程序控制的计算机中,假如能根据用户的要求改变微程序,则这台机器就具有动态微程序设计功能。

动态微程序的设计需要可写控制寄存器的支持,否则难以改变微程序的内容。实现动态微程序设计可采用可擦除可编程只读存储器(EPROM)。

2)毫微程序设计。在普通的微程序计算机中,从主存取出的每条指令是由放在控制存储器中的微程序来解释执行的,通过控制线对硬件进行直接控制。

若硬件不由微程序直接控制,而是通过存放在第二级控制存储器中的毫微程序来解释的,这个第二级控制存储器就称为毫微存储器,直接控制硬件的是毫微微指令。

硬布线和微程序控制器的特点

1)硬布线控制器的特点。硬布线控制器的优点是由于控制器的速度取决于电路延迟,所以速度快;缺点是由于将控制部件视为专门产生固定时序控制信号的逻辑电路,所以把用最少元件和取得最高速度作为设计目标,一旦设计完成,就不可能通过其他额外修改添加新功能。

2)微程序控制器的特点。微程序控制器的优点是同组合逻辑控制器相比,微程序控制器具有规整性、灵活性、可维护性等一系列优点;缺点是由于微程序控制器采用了存储程序原理,所以每条指令都要从控制存储器中取一次,影响速度。

为便于比较,下面以表格的形式对比二者的不同,见表5.2。

图片详情找不到图片(Image not found)

指令流水线

指令流水线的基本概念

一条指令的执行过程可分解为若干阶段,每个阶段由相应的功能部件完成。如果将各阶段视为相应的流水段,则指令的执行过程就构成了一条指令流水线。采用流水线技术只需增加少量硬件就能把计算机的运算速度提高几倍,因此成为计算机中普遍使用的一种并行处理技术。

指令流水的定义

根据计算机的不同,具体的分法也不同。例如,图5.16把一条指令的执行过程分为如下 $\color{red}{\text{三}}$ 个阶段(或过程)。

图片详情找不到图片(Image not found)

$\color{green}{\text{取指}}$ :根据PC内容访问主存储器,取出一条指令送到IR中。

$\color{green}{\text{分析}}$ :对指令操作码进行译码,按照给定的寻址方式和地址字段中的内容形成操作数的有效地址EA,并从有效地址EA中取出操作数。

$\color{green}{\text{执行}}$ :根据操作码字段,完成指令规定的功能,即把运算结果写到通用寄存器或主存中。

当多条指令在处理器中执行时,可以采用以下两种方式。

1)顺序执行方式。前一条指令执行完后,才启动下一条指令,如图5.17(a)所示。假设取指、分析、执行三个阶段的时间都相等,用t表示,顺序执行n条指令所用时间T为

传统冯·诺依曼机采用顺序执行方式,又称串行执行方式。其优点是控制简单,硬件代价小;缺点是执行指令的速度较慢,在任何时刻,处理机中只有一条指令在执行,各功能部件的利用率很低。例如取指时内存是忙碌的,而指令执行部件是空闲的。

2)流水线执行方式。为了提高指令的执行速度,可以把取k+1条指令提前到分析第k条指令的期间完成,而将分析第k+1条指令与执行第k条指令同时进行,如图5.17(b)所示。采用此种方式时,执行n条指令所用的时间为

与顺序执行方式相比,采用流水线执行方式能使指令的执行时间缩短近2/3,各功能部件的利用率明显提高。但为此需要付出硬件上较大开销的代价,控制过程也更复杂。在理想情况下,每个时钟周期都有一条指令进入流水线,处理机中同时有3条指令在执行,每个时钟周期都有一条指令完成,每条指令的时钟周期数(即 CPI)都为1。

图片详情找不到图片(Image not found)

为了进一步获得更高的执行速度,还可以将流水段进一步细分。如将一条指令的执行过程分为 $\color{green}{\text{取指令}}$ 、 $\color{green}{\text{指令译码}}$ 、 $\color{green}{\text{执行}}$ 和 $\color{green}{\text{写回}}$ 四个阶段,就形成了 $\color{red}{\text{四级流水}}$ ;还可进一步分为 $\color{green}{\text{取指令(IF)}}$ 、 $\color{green}{\text{指令译码(ID)}}$ 、 $\color{green}{\text{取操作数(OF)}}$ 、 $\color{green}{\text{执行(EX)}}$ 和 $\color{green}{\text{写回(WB)}}$ ,就形成了 $\color{red}{\text{五级流水}}$ 。

  • 各缩写的全称
  • IF:instruction fetch
  • ID:instruction decode
  • EX:execute
  • M:memory
  • WB:write back

流水线设计的原则是如下:指令流水段个数以最复杂指令所用的功能段个数为准;流水段的长度以最复杂的操作所花的时间为准。假设某条指令的3个阶段所花的时间分别如下。①取指:200ps;分析:100ps;③执行: 150ps。不考虑数据通路中的各种延迟,该指令的总执行时间为450ps。按照流水线设计原则,每个流水段的长度为200ps,所以每条指令的执行时间为600ps,反正比串行执行时增加了150ps。因此,流水线方式并不能缩短一条指令的执行时间,但是,对于整个程序来说,可以大大增加指令执行的吞吐率。

为了利于实现指令流水线,指令集应具有如下特征:

1)指令长度应尽量一致,有利于简化取指令和指令译码操作。否则,取指令所花时间长短不易,使取指部件极其复杂,且也不利于指令译码。

2)指令格式应尽量规整,尽量保证源寄存器的位置相同,有利于在指令未知时就可取寄存器操作数,否则须译码后才能确定指令中各寄存器编号的位置。

3)采用Load/Store 指令,其他指令(如运算指令)都不能访问存储器,这样可把Load/Store指令的地址计算和运算指令的执行步骤规整在同一个周期中,有利于减少操作步骤。

4)数据和指令在存储器中“对齐”存放。这样,有利于减少访存次数,使所需数据在一个流水段内就能从存储器中得到。

流水线的表示方法

通常用时空图来直观地描述流水线的工作过程,如图5.18所示。

在时空图中,横坐标表示时间,即输入流水线中的各个任务在流水线中所经过的时间。流水线中各个流水段的执行时间都相等时,横坐标就被分割成相等长度的时间段。纵坐标表示空间,即流水线的每个流水段(对应各执行部件)。

在图5.18中,第一条指令$\text{I}_1$在时刻$t_0$进入流水线,在时刻$t_4$流出流水线。第二条指令$\text{I}——2$在时刻$t_1$进入流水线,在时刻$t_5$流出流水线。以此类推,每经过一个$\Delta t$时间,便有一条指令进入流水线,从时刻t4开始有一条指令流出流水线。

从图5.18中可以看出,当$t_8$ =$8\Delta t$ 时,流水线上便有5条指令流出。若采用串行方式执行指令,当$t_8$ =$8\Delta t$时,只能执行2条指令,可见使用流水线方式成倍地提高了计算机的速度。

图片详情找不到图片(Image not found)
流水线方式的特点

与传统的串行执行方式相比,采用流水线方式具有如下特点:

1)把一个任务(一条指令或一个操作)分解为几个有联系的子任务,每个子任务由一个专门的功能部件来执行,并依靠多个功能部件并行工作来缩短程序的执行时间。

2)流水线每个功能段部件后面都要有一个缓冲寄存器,或称锁存器,其作用是保存本流水段的执行结果,供给下一流水段使用。

3)流水线中各功能段的时间应尽量相等,否则将引起堵塞、断流。

4)只有连续不断地提供同一种任务时才能发挥流水线的效率,所以在流水线中处理的必须是连续任务。在采用流水线方式工作的处理机中,要在软件和硬件设计等多方面尽量为流水线提供连续的任务。

5)流水线需要有装入时间和排空时间。装入时间是指第一个任务进入流水线到输出流水线的时间。排空时间是指最后一个任务进入流水线到输出流水线的时间。

流水线的分类

按照不同的分类标准,可以把流水线分成多种不同的种类。下面从几个不同的角度介绍流水线的基本分类方法。

部件功能级、处理机级和处理机间级流水线

根据流水线使用级别的不同,流水线可分为部件功能级流水线、处理机级流水线和处理机间流水线。

$\color{red}{\text{部件功能级流水}}$ 将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加及结果规格化等4个子过程。

$\color{red}{\text{处理机级流水}}$ 把一条指令解释过程分成多个子过程,如前面提到的取指、译码、执行、访存和写回5个子过程。

处理机间流水是一种宏流水,其中每个处理机完成某一专门任务,各个处理机得到的结果需存放在与下一个处理机共享的存储器中。

单功能流水线和多功能流水线

按可以完成的功能,流水线可分为单功能流水线和多功能流水线。

$\color{red}{\text{单功能流水线}}$ 是指只能实现一种固定的专门功能的流水线; $\color{red}{\text{多功能流水线}}$ 是指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。

动态流水线和静态流水线

按同一时间内各段之间的连接方式,流水线可分为静态流水线和动态流水线。

$\color{red}{\text{静态流水线}}$ 指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。

$\color{red}{\text{动态流水线}}$ 指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。

线性流水线和非线性流水线

按流水线的各个功能段之间是否有反馈信号,流水线可分为线性流水线与非线性流水线。

$\color{red}{\text{线性流水线}}$ 中,从输入到输出,每个功能段只允许经过一次,不存在反馈回路。 $\color{red}{\text{非线性流水线}}$ 存在反馈回路,从输入到输出的过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。

流水线的每个子过程由专用的功能段实现,各功能段所需的时间应尽量相等。否则,时间长的功能段将成为流水线的瓶颈。

影响流水线的因素

在指令流水线中,可能会遇到一些情况使得流水线无法正确执行后续指令而引起流水线阻塞或停顿,这种现象称为流水线冲突(冒险)。导致流水线冲突的原因主要有3种: $\color{green}{\text{资源冲突}}$ (结构冒险)、 $\color{green}{\text{数据冲突}}$ (数据冒险)和 $\color{green}{\text{控制冲突}}$ (控制冒险)。

资源冲突

由于多条指令在同一时刻争用同一资源而形成的冲突称为资源冲突,即由硬件资源竞争造成的冲突,有以下两种解决办法:

1)前一指令访存时,使后一条相关指令(以及其后续指令)暂停一个时钟周期。

2)单独设置数据存储器和指令存储器,使取数和取指令操作各自在不同的存储器中进行。

事实上,现代计算机都引入了Cache机制,而L1 Cache通常采用数据Cache和指令Cache分离的方式,因而也就避免了资源冲突的发生。

数据冲突

在一个程序中,下一条指令会用到当前指令计算出的结果,此时这两条指令即为数据冲突。当多条指令重叠处理时就会发生冲突,数据冲突可分为三类(结合综合题3理解):

1) $\color{green}{\text{写后读}}$ (Read After Write,RAW)相关:表示当前指令将数据写入寄存器后,下一条指令才能从该寄存器读取数据。否则,先读后写,读到的就是错误(旧)数据。

2) $\color{green}{\text{读后写}}$ (Write After Read,WAR)相关:表示当前指令读出数据后,下一条指令才能写该寄存器。否则,先写后读,读到的就是错误(新)数据。

3) $\color{green}{\text{写后写}}$ (Write After Write,WAW)相关:表示当前指令写入寄存器后,下一条指令才能写该寄存器。否则,下一条指令在当前指令之前写,将使寄存器的值不是最新值。解决的办法有以下几种:

1)把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行,可分为硬件阻塞(stall)和软件插入“NOP”指令两种方法。

2)设置相关专用通路,即不等前一条指令把计算结果写回寄存器组,下一条指令也不再读寄存器组,而直接把前一条指令的 ALU的计算结果作为自己的输入数据开始计算过程,使本来需要暂停的操作变得可以继续执行,这称为数据旁路技术。

3)通过编译器对数据相关的指令编译优化的方法,调整指令顺序来解决数据相关。

解决的办法有以下几种:

1)把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行,可分为硬件阻塞(stall)和软件插入“NOP”指令两种方法。

2)设置相关专用通路,即不等前一条指令把计算结果写回寄存器组,下一条指令也不再读寄存器组,而直接把前一条指令的 ALU的计算结果作为自己的输入数据开始计算过程,使本来需要暂停的操作变得可以继续执行,这称为数据旁路技术。

3)通过编译器对数据相关的指令编译优化的方法,调整指令顺序来解决数据相关。

控制冲突

一条指令要确定下一条指令的位置,例如在执行转移、调用或返回等指令时会改变PC值,而造成断流,会引起控制冒险。解决的办法有以下几种:

1)对转移指令进行分支预测,尽早生成转移目标地址。分支预测分为简单(静态)预测和动态预测。静态预测总是预测条件不满足,即继续执行分支指令的后续指令。动态预测根据程序执行的历史情况,进行动态预测调整,有较高的预测准确率。

2)预取转移成功和不成功两个控制流方向上的目标指令。

3)加快和提前形成条件码。

4)提高转移方向的猜准率。

注意:Cache缺失的处理过程也会引起流水线阻塞。在不过多增加硬件成本的情况下,如何尽可能地提高指令流水线的运行效率是选用指令流水线技术必须解决的关键问题。

流水线的性能指标

  • $\color{red}{\text{Q}}$ :没怎么看懂

衡量流水线性能的主要指标有吞吐率、加速比和效率。下面以线性流水线为例分析流水线的主要性能指标,其分析方法和有关公式也适用于非线性流水线。

式中,$n$是任务数,$T_k$是处理完$n$个任务所用的时间。下面以流水线中各段执行时间都相等为例来讨论流水线的 $\color{green}{\text{吞吐率}}$ 。

图5.19所示为各段执行时间均相等的流水线时空图。在输入流水线中的任务连续的理想情况下,一条k段线性流水线能够在k+n-1个时钟周期内完成n个任务。在图5.19中,k为流水线的段数,△t为时钟周期。得出流水线的实际吞吐率为

连续输入的任务数$n\to \infty$时,得最大吞吐率为$TP_{max}= 1/\Delta t$ 。

图片详情找不到图片(Image not found)

完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比,称为流水线的 $\color{green}{\text{加速比}}$ 。

设$T_0$表示不使用流水线时的执行时间,即顺序执行所用的时间;$T_k$表示使用流水线时的执行时间,则计算流水线加速比(S)的基本公式为

若流水线各段执行的时间都相等,则一条k段流水线完成n个任务所需的时间为$T_k=(k + n-1)\Delta t$。而不使用流水线,即顺序执行$n$个任务时,所需的时间为$T_0= kn\Delta t$。将$T_0$和$T_k$值代入上式,得实际加速比为

流水线的效率

流水线的设备利用率称为流水线的 $\color{green}{\text{效率}}$ 。在时空图上,流水线的效率定义为完成$n$个任务占用的时空区有效面积,与$n$ 个任务所用的时间及$k$ 个流水段所围成的时空区总面积之比。因此,流水线的效率包含了时间和空间两个因素。

  • $\color{red}{\text{Q}}$ :啥玩意儿为啥还有空间的说法

$n$个任务占用的时空区有效面积就是顺序执行n个任务所使用的总时间$T_0$,而n 个任务所用的时间与k个流水段所围成的时空区总面积为 $kT_k$,其中$T_k$是流水线完成n个任务所使用的总时间,因此计算流水线效率(E)的一般公式为

若流水线的各段执行时间相等,上式中的分子部分是n 个任务实际占用的有效面积,分母部分是完成n个任务所用的时间与k个流水段所围成的总面积。因此,通过时空图来计算流水线的效率非常方便。

流水线的各段执行时间均相等,当连续输入的任务数$n \to \infty$时,最高效率为$E_{max}=1$。

超标量流水线的基本概念

超标量流水线技术

每个时钟周期内可并发多条独立指令,即以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件。

超标量计算机不能调整指令的执行顺序,因此通过编译优化技术,把可并行执行的指令搭配起来,挖掘更多的指令并行性,如图5.20所示。

图片详情找不到图片(Image not found)
超流水线技术

在一个时钟周期内再分段,在一个时钟周期内一个功能部件使用多次。

不能调整指令的执行顺序,靠编译程序解决优化问题,如图5.21所示。

图片详情找不到图片(Image not found)
超长指令字

由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件。

本章小结

CPU分为哪几部分?分别实现什么功能?

CPU分为运算器和控制器。其中运算器主要负责数据的加工,即对数据进行算术和逻辑运算。控制器是整个系统的指挥中枢,对整个计算机系统进行有效的控制,包括指令控制、操作控制、时间控制和中断处理。

指令和数据均存放在内存中,计算机如何从时间和空间上区分它们是指令还是数据?

从时间上讲,取指令事件发生在“取指周期”,取数据事件发生在“执行周期”。从空间上讲,从内存读出的指令流流向控制器(指令寄存器),从内存读出的数据流流向运算器(通用寄存器)。

什么是指令周期、机器周期和时钟周期?它们之间有何关系?

CPU每取出并执行一条指令所需的全部时间称为指令周期;机器周期是在同步控制的机器中,执行指令周期中一步相对完整的操作(指令步)所需的时间,通常安排机器周期长度=主存周期;时钟周期是指计算机主时钟的周期时间,它是计算机运行时最基本的时序单位,对应完成一个微操作所需的时间,通常时钟周期=计算机主频的倒数。

指令周期是否有一个固定值?为什么?

由于计算机中各种指令执行所需的时间差异很大,因此为了提高CPU的运行效率,即使在同步控制的机器中,不同指令的指令周期长度都是不一致的,即指令周期对不同的指令来说不是一个固定值。

什么是微指令?它和上一章谈到的指令有什么关系?

控制部件通过控制线向执行部件发出各种控制命令,通常把这种控制命令称为微命令,而一组实现一定操作功能的微命令的组合,构成一条微指令。许多条微指令组成的序列构成微程序,微程序完成对指令的解释执行。指令,即指机器指令。每条指令可以完成一个独立的算术运算或逻辑运算操作。在采用微程序控制器的CPU中,一条指令对应一个微程序,一个微程序由许多微指令构成,一条微指令会发出很多不同的微命令。

什么是指令流水线?指令流水线相对于传统计算机体系结构的优势是什么?如何计算指令流水线的加速比?

指令流水线是把指令分解为若干子过程,通过将每个子过程与其他子过程并行执行,来提高计算机的吞吐率的技术。采用流水线技术只需增加少量硬件就能把计算机的运算速度提高几倍,因此成为计算机中普遍使用的一种并行处理技术,通过在同一个时间段使用各功能部件,使得利用率明显提高。

流水线的加速比指的是完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。一条k段流水线理论上的最大加速比为 $S_{max}$ = k。因此,在现代计算机中提高流水线段数有利于提高计算机的吞吐量。具体的加速比要使用时空图来计算。

常见问题和易混淆知识点

流水线越多,并行度就越高。是否流水段越多,指令执行越快?

$\color{red}{\text{错误}}$ ,因为如下:

1)流水段缓冲之间的额外开销增大。每个流水段有一些额外开销用于缓冲间传送数据、进行各种准备和发送等功能,这些开销加长了一-条指令的整个执行时间,当指令间逻辑上相互依赖时,开销更大。

2)流水段间控制逻辑变多、变复杂。用于流水线优化和存储器(或寄存器)冲突处理的控制逻辑将随流水段的增加而大增,这可能导致用于流水段之间控制的逻辑比段本身的控制逻辑更复杂。

有关指令相关、数据相关的几个概念

1)两条连续的指令读取相同的寄存器时,会产生读后读(Read After Read,RAR)相关,这种相关不会影响流水线。

2)某条指令要读取上一条指令所写入的寄存器时,会产生写后读(Read After Write,RAW)相关,它称数据相关或真相关,影响流水线。按序流动的流水线只可能出现RAW相关。

3)某条指令的上条指令要读/写该指令的输出寄存器时,会产生读后写(Write After Read,WAR)和写后写(Write After Write, WAW)相关。在非按序流动的流水线中,既可能发生RAW相关,又可能发生WAR相关和 WAW相关。

对流水线影响最严重的指令相关是数据相关。