流水线处理机及其设计精讲
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-流水线处理机及其设计精讲
————————————————————————————————作者: ————————————————————————————————日期:
6.3.3 流水线各级信号的产生
至此,我们已经描述过了所有3种指令类型的流水线操作。下面我们来总结控制信号的产生方法。控制信号分布在流水线处理机的各级,我们当然可以在它们要被使用的流水线级产生,例如SIMM可在EXE级产生。但这样,除了译码将会造成本级一些延迟之外,还要使用流水线寄存器来传递必要的信息,例如指令操作码等。我们采用的方法是,控制信号集中在ID级由译码电路产生,并使用流水线寄存器把每一个控制信号传递到它被使用的流水线级。我们把所有的控制信号归纳在表6.4中。表6.5列出了除了ALUOP的各控制信号的产生表达式。表6.6列出了ALUOP控制信号的产生表达式。
由以上表达式,我们可以有如图6.29所示的控制电路。图中使用了流水线寄存器来把控制信号传递到合适的流水线级。我们可以看出,流水线控制部件的设计方法与非流水线单周期处理机的控制部件的设计方法非常类似,而有限状态机和微程序的设计方法显得不太适合。
表6.4 流水线各级控制信号的定义
流水线级控制信号注释
IF级BTAKEN转移发生
ID级SST 选择store(rd)
EXE级
SIMM选择立即数ALUOP ALU操作码WZ 写Z标志
MEM级WMEM 写存储器
WB级
SLD 选择load
WREG 写寄存顺堆表6.5控制信号的产生表达式
BTAKEN=branch+bne Z+beqZ
SST=store
SIMM=andi+ori+addi+subi+load+store
WZ=andi+ori+addi+subi+and+or+add+sub WMEM=store
SLD=load
WREG=andi+ori+addi+subi+and+or+add+sub+load
表6.6 ALU控制信号的产生表达式
指令ALUOP1 ALUO
P0
操作指令ALUOP1
ALUO
P0
操作
and 0 0 与andi0 0 与or0 1 或ori 0 1 或add 1 0加addi 1 0 加
sub 1 1减subi 1 1 减
load 1 0 加store 1 0 加
ALUOPl=add+addi+sub+subi+load+store
ALUOPO=or+ori+sub+subi
图6.29 流水线处理机的数据路径和控制部件
6.4 结构相关及解决方法
流水线处理机的设计存在3个非常著名的问题(hazard)。它们是
(1)结构相关问题(structural hazard);
(2)数据相关问题(datahazard);
(3)转移相关问题(branch hazard)。
我们将在本节简要介绍第一个问题,下面两节分别介绍第二和第三个问题。结构相关(structural dependence)问题指的是,由于硬件资源不充足而导致流水线不畅通。我们将举3个例子来说明结构相关问题及其相应的解决方案。,
第一个例子,也是最典型的例子,就是设想只为流水线处理机配备一个外部公共存储器模块。这在现代计算机系统设计中是常见的。它的好处是程序和数据可以共享这个存储器模块,二者之间的界限是可以动态调整的。使用分开的两个外部指令存储器模块和数据存储器模块的计算机被称为具有哈佛(Harvard)结构的计算机。依程序类型的不同,有的需要较大的程序空间和较小的数据空间;有的则需要较小的程序空间和较大的数据空间。在这种情况下,哈佛结构的存储器不能被灵活、充分地利用。
然而,如果只采用一个存储器模块而不采取任何其它的措施,则会出现结构相关问题,造成流水线堵塞。图6.30示出了由于存储器端口资源的不充足而使取指令和load/store 指令访问存储器的动作不能同时进行。
图6.30单个存储器模块所造成的流水线堵塞
图6.30中的存储器模块只有一套访问端口。当load/store指令访问存储器时,必须暂停取指令操作。当然也可以让取指令优先而暂停load/store指令的存储器访问操作。然而,不管是哪一种情况,计算机的性能将会有很大的损失。那么,采用一个外部存储器模块的现代计算机是如何解决这个问题的呢?说起来很简单,如图6.31所示,在处理机内部,设置两个分开指令和数据的高速缓冲存储器(CACHE)。把存储器中经常使用的程序段和数据分别放在指令CACHE和数据CACHE中。访问CACHE命中时,处理机可直接从CACHE 得到指令和数据,而不再访问外部存储器。有关CACHE的原理和结构,我们将在9章详细讨论。
再举第二个例子。把ALU指令的WB级提前一个周期。由以前的描述可知,ALU指令在EXE级结束时已把结果放在了流水线寄存器R,在MEM级不做任何运算,只是把它传递到流水线寄存器C,以便在WB级写入寄存器堆。我们可以把这样的数据路径加以改造,使ALU指令提前一个周期i即在通常的MEM级就把结果写入寄存器堆。如果load指令仍用5个周期,则势必在有的周期有两个数据要同时写入寄存器堆;而有的周期则没有一个数据要写入,见图6,32(a)。由于寄存器堆只有一个写端口,势必造成有些ALU写操作被延后。解决这个问题的方法有3种:第一种就是前面已经描述过的方法,即ALU指令也用5个周期;第二种是设计两个写端口的寄存器堆;第三种是改造load指令的格式,消除存储器地址计算周期。办法是直接用一个寄存器操作数作为地址访问存储器,其指令格式形如loadrd,(fsl),即把由rsl指定的寄存器操作数拿来直接作为存储器的地址,把访问到的存储器数据写入寄存器rd,见图6.32(b)。这样做会带来一个额外的好处,这就是store指令可以有store(rsl),rs2之类的格式,即把寄存器rsl的内容直接作为存储器地址i把寄存器rs2的内容写入存储器,从而可以省去寄存器堆前面的多路器以及相应的控制信号SST。