5.1 CPU的功能和基本结构
CPU的功能
- 指令控制:完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
- 操作控制:一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
- 时间控制:对各种操作加以时间上的控制。时间控制要为为条指令按时间顺序提供应有的控制信号。
- 数据加工:对数据进行算术和逻辑运算。
- 中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理。
- 运算器的功能:对数据进行加工
- 控制器的功能:协调并控制计算机各部件执行程序和指令序列,基本功能包括取指令、分析指令、执行指令
- 取指令:自动形成指令地址;自动发出取指令的命令。
- 分析指令:操作码译码(分析本条指令要完成什么操作);产生操作数的有效地址
- 执行指令:根据分析指令得到的“操作命令”和“操作数地址”,形成操作信号控制序列,控制运算器、存储器以及I/O设备完成相应的操作。
- 中断处理:管理总线及输入输出;处理异常情况(如掉电)和特殊请求(如打印机请求打印一行字符)
运算器的基本结构
- 算术逻辑单元:主要功能是进行算术/逻辑运算
- 通用寄存器组:如AX、BX、CX、DX、SP等,用于存放各种操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。
通用寄存器组既可以传到ALU的A端口,又可以传到ALU的B端口。这种连线方式称为专用数据通路方式(根据指令执行过程中的数据和地址的流动方向安排连接线路)。连线方式如下图所示:
上图使用多路选择器解决多个寄存器同时连接ALU的问题,根据控制信号选择一路数据。除此之外还可以使用三态门控制某一路是否输出。
专用数据通路的连线方式性能高,基本不存在数据冲突现象,但结构复杂,硬件量大,不易实现。
另一种连接方式为CPU内部单总线方式:将所有寄存器的输入端和输出端都连接到一条公共的通路上。这种方式的结构简单,容易实现,但数据传输存在较多冲突现象,性能较低。 - 暂存寄存器:使用CPU内部单总线方式的运算器内部需要提供暂存寄存器,用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容。如果两个操作数分别来自主存和寄存器\(R_0\),最终运算结果存入\(R_0\)中,那么从主存中取来的操作数直接放入暂存器,就不会破坏运算前\(R_0\)的内容。最终运算结果也存在一个暂存寄存器中,等信号稳定后传到\(R_0\)上。这个过程如下图所示:
- 累加寄存器:一个通用寄存器,用于暂时存放ALU运算的结果信息,用于实现加法运算。
- 程序状态字寄存器(PSW):保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志、符号标志、零标志、进位标志等。PSW中的这些位参与并决定位操作的形成。
- 移位器:对运算结果进行移位运算。
- 计数器:控制乘除运算的操作步骤。
控制器的基本结构
- 程序计数器:用于指出下一条指令在主存中的存放地址。CPU就是根据PC的内容去主存中取指令的。因为程序中指令(通常)是顺序执行的,所以PC有自增功能。
- 指令寄存器:用于保存当前正在执行的那条指令。
- 指令译码器:仅对操作码字段进行译码,向控制器提供特定的操作信号。
- 微操作信号发生器:根据IR的内容(指令)、PSW的内容(状态信息)及时序控制信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。
- 时序系统:用于产生各种时序信号,它们都是由统一时钟(CLOCK)分频得到。
- 存储器地址寄存器MAR:用于存放所要访问的主存单元的地址。
- 存储器数据寄存器MDR:用于存放向主存写入的信息或从主存中读出的信息。MDR的输入和输出数据的线路分别有两组。其中输入数据有\(MDR_{in}\)和\(MDR_{in}E\),\(MDR_{in}\)有效时CPU向MDR输入数据;\(MDR_{in}E\)有效时外部数据总线向MDR输入数据。输出信号也有两个:\(MDR_{out}\)和\(MDR_{out}E\),\(MDR_{out}\)有效时,MDR向CPU输出数据;\(MDR_{out}E\)有效时MDR向外部数据总线的输出数据。
- 用户可见的寄存器有:PC PSW ACC 通用寄存器组
- 用户不可见寄存器:IR 暂存寄存器、移位寄存器、MAR MDR
5.2 指令执行过程
指令周期
- 指令周期:CPU从主存中每取出并执行一条指令所需的全部时间。
- 指令周期可分为取指周期和执行周期两部分。
取指周期会根据PC的值取出指令,并对指令进行译码。
不同指令的执行时间不同。 - 指令周期常常用若干机器周期来表示,机器周期又叫CPU周期。一个机器周期又包含若干时钟周期(也称为节拍、T周期或CPU周期,它是CPU操作的最基本单位)。
- 机器周期的长度可能固定也可能不固定。定长指令周期和不定长指令周期如下图所示:
每个指令周期内机器周期数可以不等,对于不定长的机器周期来说,每个机器周期内的节拍数也可以不等。例如:- 空指令NOP:指令周期 = 取指周期。
- 加法指令ADD:指令周期 = 取指周期 + 执行周期。
- 乘法指令MUL:指令周期 = 取指周期 + 执行周期,其中乘法指令的执行周期比加法指令的执行周期更长。
- 具有间接寻址的指令:指令周期 = 取指周期 + 间址周期 + 执行周期。(间址周期是将形式地址转变为有效地址的时间)
- 带有中断周期的指令:指令周期 = 取指周期 + 间址周期 + 执行周期 + 中断周期(中断周期是坚持有没有中断,如果有则响应中断的周期。)
- 指令周期流程:
- 如何确定当前指令执行到哪个周期了?
可以设置4个触发器FE、IND、EX、INT(触发器可以存放一个二进制位)。这四个触发器分别对应取指周期、间址周期、执行周期和中断周期。如果当前在取指周期,则FE = 1,其余是0. 间址周期时IND = 1,其余为0.
四个工作周期都有CPU访存操作,只是访存的目的不同。取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点。
指令周期的数据流向
取指周期
- 当前指令地址送至存储器地址寄存器,记作:\((PC) \rightarrow MAR\)
- CU发出控制信号,经控制总线传到主存,这里是读信号,记作:\(1 \rightarrow R\)
- 将MAR所指主存中的内容经数据总线送人MDR,记作:\(M(MAR) \rightarrow MDR\)
- 将MDR的内容(此时是指令)送人IR,记作:\((MDR) \rightarrow IR\)
- CU发出控制信号,形成下一条指令地址,记作:\((PC) + 1 \rightarrow PC\)
间址周期
- 将指令的地址码送到MAR,记作:\(Ad(IR) \rightarrow MAR\)或\(Ad(MDR) \rightarrow MAR\)
- CU发出控制信号,启动主存做读操作,记作:\(1 \rightarrow R\)
- 将MAR所指主存中的内容经数据总线送入MDR,记作:\(M(MAR) \rightarrow MDR\)
- 将有效地址送至指令的地址码字段,记作:\((MDR) \rightarrow Ad(IR)\)。这一步是用有效地址替换IR中的指令里的形式地址。
- 后面该进行执行周期,但是不同指令执行周期数据流向不同,所以无法统一说明。
中断周期
中断:暂停当前任务去完成其他任务。为了能够恢复当前任务,需要保存断点。一般用堆栈来保存断点,这里用SP表示栈顶地址,假设SP指向栈顶元素,进栈操作是先修改指针,后存入数据。
- CU控制SP-1,修改后的地址送入MAR,记作:\((SP) - 1 \rightarrow SP, (SP) \rightarrow MAR\)。
本质上是将断点存入某个存储单元,假设其地址为a, 故可记作:\(a \rightarrow MAR\) - CU发出控制信号,启动主存做写操作,记作:\(1 \rightarrow W\)
- 将断点(PC的内容)送人MDR,记作:\((PC) \rightarrow MDR\)
前三条是为了保存当前断点,即将目前执行过的指令的PC值存到主存中。 - CU控制将中断服务程序的入口地址(由向量地址形成部件产生)送人PC,记作:\(向量地址 \rightarrow PC\)
指令执行方案
一个指令周期通常要包括及各时间段(执行步骤),每个步骤完成指令的一个部分,几个依次执行的步骤完成这条指令的全部功能。
指令的几种执行方案如下:
- 单指令周期:
任意指令的指令周期都会延长至和最慢的指令周期相同。指令之间串行执行;指令周期取决于执行时间最长的指令执行时间。
优点:所有指令都选用相同的执行时间来完成。
缺点:会有时间的浪费。 - 多指令周期:
对不同类型的指令选用不同的步骤来完成。指令之前串行执行;可选用不同个数的时钟周期来完成不同指令的执行过程。需要设计更复杂的硬件。 - 流水线方案:
在每一个时钟周期启动一条指令,尽量让多条指令同时运行,各自处在不同的执行步骤中,指令之间并行的执行。
5.3 数据通路的功能和基本结构
数据通路的功能
- 数据通路:数据在功能部件之间传送的路径。(信息从哪里开始,中间经过哪些部件,最后传到哪里)
- 由控制部件产生的控制信号建立数据通路。
- 数据通路的基本结构:
- CPU内部单总线方式。
- CPU内部多总线方式。
- 专用数据通路方式。
单总线结构
- 内部总线是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线;
- 系统总线是指同一台计算机系统的各部件,如CPU、内存、通道和各类I/O接口之间互相连接的总线。
- 数据传输大概可以分为3类:
- 寄存器之间
- 寄存器与主存
- 寄存器与ALU
下面将重点讨论不同结构的数据通路对这三种数据传输方式的实现。
- CPU内部单总线方式结构如同所示:
- 寄存器之间的数据传送:
比如把PC内容送至MAR,实现传送操作的流程及控制信号为:
\((PC) \rightarrow Bus\), PCout有效,PC内容送到总线上。(Bus是总线的英文)
\(Bus \rightarrow MAR\), MARin有效,总线内容送MAR - 主存与CPU之间的数据传送:
比如CPU从主存中读取指令,实现传送操作的流程及控制信号为:
\((pc) \rightarrow Bus \rightarrow MAR\), PCout和MARin有效,\(现行指令地址 \rightarrow MAR\)
\(1 \rightarrow R\), CU发出读命令
\(MEM(MAR) \rightarrow MDR\), MDRinE有效
\(MDR \rightarrow Bus \rightarrow IR\), MDRout和IRin有效,\(现行指令 \rightarrow IR\) - 执行算术或逻辑运算:
比如一条加法指令,微操作序列及控制信号为:
\(Ad(IR) \rightarrow Bus \rightarrow MAR\), MDRout和MARin有效
\(1 \rightarrow R\), CU发出命令
\(MEM(MAR) \rightarrow 数据线 \rightarrow MDR\), MDRinE有效
\(MDR \rightarrow Bus \rightarrow Y\), MDRout和Yin有效,\(操作数 \rightarrow Y\)
\((ACC) + (Y) \rightarrow Z\), ACCout和ALUin有效,CU向ALU发送加命令。
专用通路结构
专用数据通路的一个示例图如下:
取指周期
\((PC) \rightarrow MAR\),\(C_0\)有效
\((MAR) \rightarrow 主存\),\(C_1\)有效(MAR左边连接的是主存)
\(1 \rightarrow R\), 控制单元向主存发送读命令。
\(M(MAR) \rightarrow MDR\), \(C_2\)有效
\((MDR) \rightarrow IR\), \(C_3\)有效
\((PC) + 1 \rightarrow PC\)
\(Op(IR) \rightarrow CU\), \(C_4\)有效
5.4 控制器的功能和工作原理
硬布线控制器的设计
- 微命令:CU发出一个微命令,可完成对应微操作。如:微命令1使得\(PC_{out}\)、\(MAR_{in}\)有效。完成对应的微操作1: \((PC) \rightarrow MAR\).
一个节拍内可以并行完成多个“相容的”微操作;
同一个微操作可能在不同指令的不同阶段被使用;
不同指令的执行周期所需要的节拍数各不相同。为了简化设计,选择定长机器周期,以可能出现的最大节拍数为准(通常以访存所需节拍数作为参考)
若实际所需节拍数较少,可将微操作安排在机器周期末尾几个节拍上进行。 - 根据指令操作码、目前的机器周期、节拍信号、机器状态条件,即可确定现在这个节拍下应该发出哪些“微命令”。
- 首先需要把指令寄存器IR的n为操作码经由操作码译码器传给控制单元CU。
- 其次需要把FE IND EX INT这4个信号传给CPU(事实上这四个触发器集成在CU内部)
- 节拍发生器也要接给CU,每个时钟周期发出一个节拍信号。节拍信号循环发出。
- 最后给CU输入标志(来自执行单元的反馈信息,可能来自运算器的PSW、ACC的符号位等;也可能来自I/O设备、主存)
- CU的每个输出的控制信号对应一个微命令,也就是对应一个微操作。
- 硬布线控制器的输入输出示意图如下:
- 设计步骤:
- 分析每个阶段的微操作序列(取值、间址、执行、中断四个阶段)
- 选择CPU的控制方式
- 安排微操作时序
- 电路设计
- 安排微操作时序的原则:
- 微操作的先后顺序不得随意更改
- 被控对象不同的微操作尽量安排在一个节拍内完成
- 占用时间较短的微操作尽量安排在一个节拍内完成并允许有先后顺序。
- 电路设计的步骤:
- 列出操作时间表
- 写出微操作命令的最简表达式
- 画出逻辑图
- 硬布线控制器的特点:
指令越多,设计和实现就越复杂,因此一般用于RISC(精简指令集系统)
如果扩充一条新的指令,则控制器的设计就需要大改,一次扩充指令较困难。
由于纯硬件实现控制,因此执行速度很快。微操作控制信号由组合逻辑电路即时产生。
微程序控制器的基本原理
- 程序:由指令序列组成
- 微程序:由微指令序列组成,每一种指令对应一个微程序。
- 指令是对程序步骤的描述,是对微指令功能的封装。
- 微指令是对指令执行步骤的描述。
- 微操作强调的是CPU要做什么,微命令侧重CU要发出什么控制信号。微操作和微命令是一一对应的。微指令中可能包含多个微命令。
微程序控制器的基本结构
微程序控制器和基本结构如下图所示:
- 控制存储器CM:用于存放各指令对应的微程序,控制存储器可用只读存储器ROM构成。CM按地址寻访。
- 微地址寄存器CMAR:别名\(\mu PC\)。接收微地址形成部件送来的微地址,为在CM中读取微指令做准备。
- 地址译码器:将地址码转化为存储单元控制信号。
- 微指令寄存器CMDR:别名\(\mu IR\),用于存放从CM中取出的微指令,它的位数和微指令字长相等。
- 微地址形成部件:产生初始微地址和后续微地址,以保证微指令的连续执行。
- 顺序逻辑电路:保证微指令的执行顺序,输入信号有标志和CLK。
微程序控制器的工作原理
- 取指周期、间址周期和中断周期的微指令都是一样的,在CM中只需要存储一份,而其余指令的执行周期各有不同,需要分别存储。
- 根据指令地址码的寻址特征位判断是否要跳过间址周期。
- 取指周期通常是公用的,所以如果某指令系统中有n条指令,则CM中微程序的个数至少是n+1个。(加的1是取指周期微程序)
- 一些早期的CPU、物联网设备的CPU可以不提供间接寻址和中断功能,因此这类CPU可以不包含间址周期和中断周期的微程序段。
- 物理上,取指周期、执行周期看起来像两个微程序,但逻辑上应该把它们看成一个整体。引起一条指令对应一个微程序的说法是正确的。
微指令的设计
微指令的格式
相容性微命令:可以并行完成的微命令。
互斥性微命令:不允许并行完成的微命令。
-
水平型微指令:一条微指令能定义多个可并行的微命令。
基本格式:
优点:微程序短,执行速度快;
缺点:微指令长,编写微程序较为麻烦。 -
垂直型微指令:一条微指令只能定义一个微命令,由微操作码字段规定具体功能。
基本格式:
优点:微指令短,简单,规整,便于编写微程序。
缺点:微程序长,执行速度慢,工作效率低。 -
混合型微指令:在垂直型的基础上增加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快。
微指令的编码方式
微指令的编码方式又称为微指令的控制方式,它是指如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长。
- 直接编码(直接控制)方式:
在微指令的操作控制字段中,每一位代表一个我操作命令。某位为1表示该控制信号有效。
优点:简单直观,执行速度快,操作并行性好。
缺点:微指令字长过长,n个微指令就要求微指令的操作字段有n位,造成控存容量极大。 - 字段直接编码方式:
将微指令的控制字段分成若干段,每段经译码后发出控制信号。
优点:可以缩短微指令字长
缺点:要通过译码电路后再发出微命令,因此比直接编码方式慢。
微命令字段的分段原则:- 互斥性微命令分在同一段内,相容性微命令分在不同段内。
- 每个小段中包含的信息位不能太多,否则增加译码线路的复杂性和译码时间。
- 一般每小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作。
- 字段简介编码方式:
一个字段的某些微命令需要由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,故称为字段间接编码,又称为隐式编码。
优点:进一步缩短微指令字长
缺点:削弱了微指令的并行控制能力,故通常作为字段直接编码方式的一种辅助手段。
微指令的地址形成方式
- 断定法(微指令的下地址字段指出):微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址,这种方式又称为断定方式。
- 根据机器指令的操作码形成:当机器指令取至寄存器后,微指令的地址由操作码经微地址形成部件形成。
- 增量计数法:\((CMAR) + 1 \rightarrow CMAR\)
- 分支转移:
转移方式:指明判断条件;
转移地址:知名转移成功后的去向。
- 通过测试网络:测试网络就是顺序逻辑
- 由硬件产生微程序入口地址
第一条微指令地址:由专门硬件产生(用专门的硬件记录取指周期微程序首地址)
中断周期:由硬件产生在此之前微程序首地址(用专门的硬件记录)
微程序控制单元的设计
设计步骤:
- 分析每个阶段的微操作序列
例如取指阶段:
T0 PC -> MAR
T0 1 -> R
T1 M(MAR) -> MDR
T1 (PC) + 1 -> PC
T2 MDR -> IR
T2 OP(IR) -> 微地址形成部件
-
写出对应机器指令的微操作命令及节拍安排
上面的微指令中标记T0的划分为微指令a、T1为微指令b,T2为微指令c。
另外还需考虑如何读出这3条微指令,以及如何转入下一个机器周期。
如何读出3条微指令?
取指周期的第一条微指令地址由硬件自动给出。用微指令a的下地址表示b的地址。所以每执行完成一条微指令,都需要一个节拍把这条微指令的下地址传给CMAR。
如何转入下一个机器周期?
将“OP(IR) -> 微地址形成部件”这条指令经由微地址形成部件后产生的微地址传给CMAR。
执行周期内每条微指令执行之后都需要一个节拍执行:Ad(CMDR) -> CMAR -
确定微指令格式:
根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数。
根据CM中存储的微指令总数,确定微指令的顺序控制字段的位数。最后按操作控制字段位数和顺序控制字段位数确定微指令字长。 -
编写微指令码点:
根据操作控制字段每一位代表的微操作命令,编写每一条微指令的码点。
微程序设计分类
- 静态微程序设计和动态微程序设计:
- 静态:微程序无需改变,CM采用ROM
- 动态:通过改变微指令和微程序改变机器指令有利于仿真,采用EPROM
- 毫微程序设计:
基本概念:
微程序设计用微程序解释机器指令
毫微程序设计用毫微程序解释微程序
硬布线与微程序的比较
5.5 指令流水线
指令流水的定义
一条指令的执行过程可以分为多个阶段(或过程)。根据计算机的不同,具体的分法也不同。
存在特定的划分方式使得不同的机器周期用到的硬件不同。
- 顺序执行方式:
根据传统的冯诺依曼结构顺序执行指令的优点时控制简单,硬件代价小。缺点是执行指令的速度较慢,在任何时刻,处理机中只有一条指令在执行,各功能部件的利用率很低。 - 一次重叠执行方式:
执行过程的图像如下:
优点,程序执行时间缩短了1/3,各功能部件的利用率明显提高。
缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂。 - 二次重叠执行方式:
执行过程的图像如下:
与顺序执行方式相比,指令的执行时间缩短近2/3.这是一种理想的指令执行方式,在正常情况下,处理机中同时有3条指令在执行。
注:也可以把每条指令的执行过程分成4个或5个阶段,分成5个阶段是比较常见的做法。
流水线的表示方法
- 指令执行过程图:主要用于分析指令执行过程以及影响流水线的因素。
- 时空图(空间,指不同的阶段所对应的不同硬件资源):主要用于分析流水线的性能
流水线的性能指标
- 吞吐率:指单位时间内流水线所完成的任务数量,或是输出结果数量。
- 设任务数为n;处理完成n个任务所用时间为\(T_k\), 则计算流水线吞吐率(TP)的最基本的公式为\(TP = \cfrac{n}{T_k}\).
- 理想情况下,流水线的时空图如下:
- 一条指令的执行分为k个阶段,每个阶段耗时\(\Delta t\), 一般取\(\Delta t\) = 一个时钟周期。
n条指令执行结束的时间\(T_k = (k + n - 1)\Delta t\)
流水线的吞吐率:\(TP = \cfrac {n}{(k + n - 1)\Delta t}\)
当n趋于无穷时,等到的最大吞吐率为\(TP_{max} = \cfrac {1}{\Delta t}\) - 装入时间:第一条指令从取指一直到结束所用的时间。
- 排空时间:最后一条指令从取指一直到结束所用的时间。
- 加速比:完成同样的一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。
设\(T_0\)表示不使用流水线时的执行时间,即顺序执行所用的时间;\(T_k\)表示使用流水线时的执行时间。则计算流水线加速比(S)的基本公式为\(S = \cfrac {T_0}{T_k}\)
假设一条指令的执行分为k个阶段,每个阶段耗时\(\Delta t\)
\(T_0 = nk\Delta t\)
\(T_k = (k + n - 1)\Delta t\)
\(S = \cfrac {T_0}{T_k} = \cfrac {nk\Delta t}{(k + n - 1)\Delta t} = \cfrac {nk}{k + n - 1}\)
n趋于无穷时\(S_{max} = k\) - 效率:流水线的设备利用率称为流水线的效率。
在时空图上,流水线的效率定义为完成n个任务占用的时空区域有效面积与n个任务所用的时间与k个流水段所围成的时空区总面积之比。
流水线效率\(E = \cfrac {n个任务占用k时空区有效面积}{n个任务所用的时间与个流水段所围成的时空区总面积} = \cfrac {T_0}{kT_k}\)
当n趋于无穷时,最高效率\(E_{max} = 1\)
机器周期的设置
将机器周期分为5各阶段,分别为IF、ID、EX、M、WB。
其中,IF(instruction fetch)表示取指令,ID(instruction decode)译码,EX(execute)执行,M(Memory)访存,WB(write back)写回。
这种5段式指令流水线是MIPS架构提出的。MIPS是第一个RISC。
各阶段的实际耗时不同。但为了流水线的顺利运行,将每个阶段的耗时取成一样的,以最长耗时为准。
流水线每一个功能段部件后面都要有一个缓冲寄存器,或称为锁寄存器,其作用是保存本流水段的执行结果,提供给下一流水段使用。
- IF阶段的instruction Cache是存指令的Cache。我们默认大部分的指令都可以在Cache中找到,不需要访存。
- M阶段的Data Cache是存数据的Cache。这样对指令和数据的访存可以并行的执行。
- ID阶段除了译码还要完成取数操作。操作数是从寄存器中取,因为MIPS是一种RISC,参与运算的操作数都是从寄存器中取。如果要来自主存,必须先从主存中取出到寄存器中,然后再进行运算。
- WB阶段有可能写回到主存中,也肯能写回到通用寄存器中。也可能不需要写回。
影响流水线的因素
结构相关(资源冲突)
- 由于多条指令 在同一时刻争用统一资源而形成的冲突称为结构相关。
- 例:
当第一条指令执行到M时,Instr3开始取指,如果这两部都需要访问主存,就会出现结构相关(资源冲突)。另外如果第一条load指令的WB阶段访问的和instr3是同一个寄存器,也会形成资源冲突。 - 解决方法:
- 后一相关指令暂停一个周期
- 资源重复配置: 数据存储器 + 指令存储器(两个存储器分开)
数据相关(数据冲突)
- 数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据相关。
- 例:
这些指令对r1的计算需要前一个先算完后一次才能用前面的结果。 - 解决方法:
- 把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,知道数据相关问题消失后再继续执行。可分为硬件阻塞(stall)和软件插入“NOP”两种方法。
- 数据旁路技术(转发机制)
- 编译优化:通过编译器调整指令顺序来解决数据相关。
控制相关(控制冲突)
- 当流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制冲突。
- 例:
- 解决方法:
- 转移指令的分支预测。简单预测(永远猜ture或false)、动态预测(根据历史情况动态调整)
- 预取转移成功和不成功两个控制流方向上的目标指令。
- 加快和提前形成条件码
- 提高转移方向的猜准率
流水线的分类
- 部件功能级、处理机级和处理机间级流水线
根据流水线使用的级别不同,流水线可分为部件功能级、处理机级和处理机间级流水线。
部件功能级流水就是将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化4个子过程。
处理机级流水线:把一条指令解释过程分成多个子过程,如取指、译码、执行、访存以及写回5个子过程。
处理机间级流水:一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。 - 单功能和多功能流水线:
按流水线可完成的功能划分。
单功能流水线指能实现一种固定的专门功能的流水线。
多功能流水线指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。 - 动态流水线和静态流水线:
按同一时间内各段之间的连接方式划分。
静态流水线指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。
动态流水线指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。 - 线性流水线和非线性流水线
按流水线的各个功能段之间是否有反馈信号划分。
线性流水线中,从输出到输入,每个功能段只允许经过一次,不存在反馈回路。
非线性流水线存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。
流水线的多发技术
- 超标量技术:
每个时钟周期内可并发多条独立指令
要配置多个功能部件
不能调制指令的执行顺序
有的CPU支持指令的乱序发射,这种采用超标量技术的CPU不支持。
通过编译优化技术,把可并行执行的指令搭配起来。
- 超流水技术:
把一个时钟周期再分段。
在一个时钟周期内一个功能部件使用多次
超流水技术是一种时分复用技术
不能跳转指令的执行顺序。
靠编译程序解决优化问题。
- 超长指令字:
有编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码的超长指令字(可达几百位)
采用多个处理部件
五段式指令流水线
常考的5类指令:
- 运算类
- LOAD
- STORE
- 条件转移指令
- 无条件转移指令
通常,RISC处理器只有“取数LOAD”和存数“STORE”指令才能访问主存。
运算类指令的执行过程
- 算术指令的描述方式:
-加法指令(两个寄存器相加):ADD Rs, Rd 即将两个寄存器的值相加之后存到Rd中。
-加法指令(寄存器与立即数相加):ADD #996, Rd 将Rd里的值+996之后存回Rd
-算术左移指令:SHL Rd 将Rd算术左移两位存回Rd - 运算指令的执行过程:
- IF: 根据PC从指令Cache取指令至IF段的锁存器
- ID:取出操作数至ID段锁存器
- EX: 运算,将结果存入EX段锁存器
- M:空段
- WB:将运算结果写回指定寄存器
LOAD指令的执行过程
- LOAD指令的描述方式:
- LOAD Rd, 996(Rs),功能:将主存中地址为996 + (Rs)的内容存入寄存器Rd中。
或简写为LOAD Rd, mem,功能:将主存地址为mem的内容取出,存到Rd中。
- LOAD Rd, 996(Rs),功能:将主存中地址为996 + (Rs)的内容存入寄存器Rd中。
- LOAD指令的执行过程:
- IF: 根据PC从指令Cache取指到IF的锁存器中
- ID: 将基址寄存器的值放到锁存器A,将偏移量的值放到Imm
- EX: 运算,得到有效地址
- M: 从数据Cache中取数并放到锁存器
- WB:将取出的数写回寄存器。
STORE指令的执行过程
- STORE指令的描述方式:
- STORE Rs, 996(Rd), 将寄存器Rs里的值存到地址为996+(Rd)的主存单元中。
- STORE指令的执行过程:
- IF:根据PC从指令Cache取指令至IF段的锁存器
- ID: 将基址寄存器的值放到锁存器中,将偏移量的值放到Imm。将要存的数放到B中
- EX:运算,得到有效地址。并将锁存器B的内容放到锁存器Store中。
- M:写入数据Cache
- WB: 空段。
条件转移指令的执行过程
- 条件转移指令的描述方式:
- beq Rs, Rt, #偏移量
若(Rs)==(Rt), 则(PC) + 指令字长 + (偏移量 * 指令字长) -> PC;否则(PC) + 指令字长 -> PC - bne Rs, Rt, #偏移量
若(Rs)!=(Rt), 则(PC) + 指令字长 + (偏移量 * 指令字长) -> PC;否则(PC) + 指令字长 -> PC
- beq Rs, Rt, #偏移量
- 条件转移指令的执行过程:
- IF:根据PC从指令Cache取指令至IF段的锁存器
- ID: 进行比较的两个数放到锁存器A、B;偏移量放入Imm
- EX: 运算,比较两个数
- M: 将目标PC值写回PC
- WB:空段
无条件转移指令
- 无条件转移指令的描述:
jmp #偏移量
功能:(PC) + 指令字长 + (偏移量 * 指令字长) -> PC - 无条件转移指令的执行过程:
- IF:根据PC从指令Cache取指令至IF段的锁存器
- ID:偏移量放入Imm
- EX: 将目标PC值写回PC
- M: 空段
- WB:空段
- 由于转移类指令可能出现控制冲突,所以写回PC这个操作要尽可能早的进行。