版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章 CPU的设计3.1引言如果说前面指令集的设计是计算机处理器设计的蓝图,那么如何实现将直接影响到指令集的性能,而处理器实现中的一些问题也会或多或少地影响到指令集的设计。RISC思想的提出,就是针对CISC指令集处理器实现中的困难,从简化指令集出发,降低处理器实现的复杂度,达到降低处理器的开发成本,提高处理器并行度的目的。处理器实现直接影响到两个重要的性能指标:每条指令实现时钟数(clock per instruction , CPI)和时钟频率。正象一个木桶能装水的多少取决于它最短一块木头的长度,处理器中各部件最慢的一个决定了处理器的时钟频率,所以处理器的设计必须使每个部件都能以相近的速
2、率协调运行。通常,我们把处理器又分为两部分:一部分执行算术逻辑运算,以完成计算机的计算功能,通常称为数据通道,另一部分则解释计算机机器指令代码,并按这些代码发出控制信号控制数据通道的工作以完成指令,称为控制器。前者由ALU(算术逻辑运算模块, Arithmetic logic unit)和一些寄存器构成,为处理器工作时数据实际流过的路径,故称为数据通道;后一部分则是处理器中的主控部分,是将指令转换为实际硬件动作的桥梁,故而设计上最复杂,也最容易体现一种处理器的特色。一般处理器的设计主要就是指控制器设计。3.2数据通道(datapath)数据通道是处理器中处理数据的部件,数据从主存取出,经数据通
3、道的处理,得到所需要的结果后,再送回主存存放。整个数据通道的执行受控制器的控制,实际上也就是受指令的控制。图3.1 典型的数据通道组成示意图图3.1是一个典型的数据通道组成示意图,在图中也表示出了控制器、主存与数据通道的密切关系,数据通道本身由一个算术逻辑部件(Arithmetic Logic Units,ALU)和一些寄存器组成,并包括两者间的通信渠道。在冯纽曼体系中,程序数据的地位是等同的,一起存储在主存中,为了得到适由数据通道执行的指令,首先必须在主存中寻找到指令。这项工作由一个叫程序计数器(Program Counter ,PC)的部件来完成。PC是一个专用的寄存器,存放当前所执行指令
4、的地址,供控制器读取指令时使用。同时,这个寄存器必须随时改变存放的内容,以便使程序能按序执行下去。比如,在正常情况下,每条指令执行前都必须将PC中的值增加一个指令长度,取顺序执行的下一条指令,这项工作则由ALU完成。ALU不仅是一个可以完成PC递增功能的部件,还是一个通用的计算功能模块。它能独立完成所有的基本运算如加,减,与,或,异或和移位等,另外还可以在控制器的控制下完成一些更复杂的运算如乘除等,同时也能够对数据不加处理而直接传送。由于冯纽曼体系计算机的基本功能就是数值计算,因此ALU具有十分重要的地位。与寄存器部件不同,它是一种非记忆的逻辑部件,其输出完全依赖于当前输入;而寄存器部件则具有
5、内部状态,其输出由当前输入和内部状态共同决定,建去的输入会影响内部状态,从而使寄存器具有记忆。MAR和MDR是为了访问内存而设的。MAR即Memory Address Register,存放访问内存的地址,MDR则是memory data register,存放从内存取回的数据,它们的作用在后面还要讲到。此外,Temp是一个数据访问中起着暂存作用的寄存器,IAR专为中断使用。上述这些寄存器为专用寄存器,它们的特点是一般对用户是透明的,用户或者不能直接控制它们的内容(如PC和IAR),或者完全是处理器内部实现的细节,用户根本不知道它们的存在(如MAR, MDR, Temp等)。这些寄存器为了完成
6、处理器的某些特定功能而设,而不能自由地用于数据计算,这也是专用寄存器这个名称的来由。与专用寄存器相对应的是通用寄存器,顾名思义,它们就是能被用户自动地用于数据计算中的寄存器。在许多计算机中,以R1,R2.Rn来命名它们,它们的使用没有差别。多个通用寄存器合起来组成一个寄存器堆(registerfile),它们也是存贮器层次结构中的最高层,属于最小也是最快的数据暂存部件。因此,如何最大限度地在计算中利用通用寄存器是提高编译器性能的关键。内部总线将各寄存器与ALU连接起来,在我们的例子中,这样的总线共有三条:两条源总线S1,S2和一条目的总线Dest。S1,S2传递ALU的源操作数级ALU,Des
7、t则将ALU运算的结果送回各寄存器,这时,ALU若执行直接传输功能(PASS1,将S1上的数据传到Dest或PASS2,将S2 上的数据传到Dest),就可以作为源和目的总线间的传输通道,完成数据在寄存器间的数据传递。通用寄存器、一部分专用寄存器(如PC和IAR)和标志寄存器flag加在一起,就构成了程序状态(state)的主要部分,如果我们能保存这些寄存器的内容也就是说程序状态,那么以后我们只要将这些寄存器的值如数恢复成原先的,并重新开始运行,只要程序的输入不变,就能得到原先的运行结果,这一点对地多进程思想的出现具有重要影响。当然实际程序状态除了包括寄存器外,还应包括内存中一些单元的值。数据
8、通道的实现影响着处理器主频大小。数据计算到整个通道所以通道中最慢的部件就限制了整个处理器的主频。又因为它是处理器中实际进行数据处理的部分,因此许多处理器优化技术如流水线(pipeline)、指令级并行(instructor level parallel, ILP)都是围绕着它展开的。3.3指令执行原理在讨论控制器的工作原理之前,我们先介绍一下数据通道应怎样工作,才能完成指令。一般说来,一条指令的执行分为五步:1.取指令(instruction fetch)。在这一步中,由PC指示地址上的指令被取到指令寄存器IR中。表示成 MAR - PC ; IR - MMARPC的值首先传给MAR是因为在我
9、们的例子中,PC不直接与主存相连2.解码/寄存器读出。(instruction decode/register fetch )。在这一步中,控制器对读入指令进行解码,要操作的寄存器操作数从寄存器堆中放入A,B,为交ALU计算作计算作最后准备。设置寄存器A,B,C和设置MAR,MDR的理由是类似的。ALU和主存都属于无时钟部件,其输出值单纯由当前输入决定,而不象寄存器一样,按时钟(clock)而动作,输出值由有时钟触发时的输入决定,并一直保持到下一个时钟。所以,为了保持计算和读存结果电信号的相对稳定,就必须在它们的输入设置寄存器。A,B能保证ALU的计算结果稳定到被C保存为止,MAR,MDR则能
10、使储存信号稳定到主存能稳定地读出或写入信息。还要让PC进行自增以便使它指向下一条指令。为了简便起见,设所有指令长度为4,于是我们有如下表示式:A - Rs1 , B - Rs2 ; PC - PC+4Rs1,Rs2为两个源操作寄存器指令解码能与寄存器读出并行操作是有条件的,在我们的指令集中,假设了寄存器操作数始终处在指令的同一位置,这样,在指令解码的同时,控制器就能知道该将哪个寄存器的内容放入A,B。3.执行/有效地址计算(Execution/ effective address)这一步的主角是ALU,根据不同的指令,由ALU计算数值或有效地址。根据三种指令的不同情况讨论:访存指令:MAR -
11、 A+IR地址部分 , MDR-Rd(如为写指令)Rd为目的寄存器(IR)ALU指令:ALU输出 - A 操作 B或立即数操作由解码决定跳转/条件跳转ALU输出 - PC+相对地址;条件 - (A操作0)(如为条件跳转)在条件为真时,跳转实行,条件中的操作由解码决定,如指令为bf,则操作为等于。无条件跳转则视为条件永真的跳转。我们模型的load/store结构决定了执行和有效地址计算可以在同一步之内完成。在我们的模型中,没有一条指令既需要执行ALU功能,又需要计算有效地址。4.访存/完成跳转。(memory access / branch completion)只有两类指令要用到这一步,访存指
12、令和跳转指令,ALU指令无需执行这步。根据访存指令,表示为MDR - MMAR 或 MMAR - MDR对读存,执行,写存执行。对跳转指令,表示为if(条件为真),PC - ALU输出条件由一步计算,这一步根据条件实际改变PC值4.写回(write-back)表示为Rd - C或MDR对ALU指令,将ALU的计算结果送入目的寄存器,对读存,将MDR读入目的寄存器。这就是执行指令要完成的步骤,控制器的目的就是要让数据通路按此步骤工作。3.4控制器控制器的设计是处理器设计中最困难的一部分,也是在新处理器的设计和调试中最容易出问题的部分,因为实际上,处理器的另一部分数据通道只是一个执行机构,没有什么
13、很特别的地方,关键还在于如何控制数据通道。于是在控制器设计中,我们不得不同时考虑两个因素:实现的简单和运行的效率。实现简单有于降低控制器设计的难度,减少错误,也就是缩短了设计和实现的时间,降低了设计成本。而作为处理器内部的总控者,控制器是计算机主控的主控,它的运行效率微小变化都会对计算机性能造成很大影响,所以控制器又必须有很高的效率。不幸的是,这两方面的要求经常是互相矛盾的。下面我们分别介绍控制器两种最常用的设计与实现途径:硬连线控制(Hardwired control)和微程序控制(microprogrammed control)3.4.1硬连线控制在硬连线控制中,控制器可看作一个有限状态图
14、(finite-state diagram)。每个状态对应一个时钟周期,各状态中有一些特定的输出对应着各时钟周期中数据通道要做的工作。每个状态在一定的输入下有一个出口,指向在此输入下状态应转向的下一状态。一条指令要经几个时钟周期完成,从而也对应着多个状态。图3.2就是每条指令的头几步状态转换图。图3.2 每条指令头几步状态转换图硬连线逻辑的复杂性是很大的,举个例子来说,一般一个load-store型CPU控制器至少也要50个状态(具体状态后面将举例描述)。为表示这50个状态就需要6位(log250)。同时,我们还需要几位数据通道和存贮器的反馈输入,来参与决定状态转换,如图3.2中的访存未结束。
15、当然, 参与决定状态的还有指令码,如图3.2中就是根据指令码译码结果转换到以后状态的。这样决定硬连线逻辑控制器,状态转换的就有了三个量:当前状态(用6位表示),数据通道及存贮器反馈输入(用3位表示)及指令码(设为12位,6位操作码,6位操作数)。这样的控制器通常要40线输出控制,于是复杂度就是50(6+3+12)40。这是一个相当巨大的数字。当然,我们应该注意到,指令码中的操作数对硬连线控制的状态变化不产生影响,于是只需要6位操作码就够了。但即使如此,复杂度还是很大的。如果我们用ROM来进行这样的状态转换,在其中就必须存贮26+3+6=221个单元,每个单元为40位长,共需约10MB的ROM,
16、这样的存贮容量对处理器控制器来就显然是不可能的,所以需要使用一些办法来降低硬连线控制的成本,通常使用可编程逻辑阵列(Programmed logic array ,PLA)可以降低控制器所需存贮容量。PLA的基本思想是利用控制器存贮内容之间的相关性简化其存贮内容,删去冗余的信息。为此付出的代价是增加了一些地址译码的时间。PLA采用对输入项与输出间逻辑表达式的简化,来减少存储,在控制器,这样的部件中,常用计算机琰辅助进行简化,简化后,象前面例子中那样规模的控制器,其存贮容量可降为几百个字节。PLA简化的效果和输入项的编码方式有密切关系,一个精心设计的输入编码可大大减少控制器所需存贮量。输入中主要
17、的就是状态量的编码和指令操作码的编码。比如,状态量编码时如果尽可能把相邻状态(有相到直接转移关系的状态)的码编得相似,只差一位或两位,控制器就会大大简化,这种状态编码问题就称为状态指派问题(state-assignment problem)。图3.3 硬连线逻辑控制器示意图3.4.2微程序控制硬连线控制的复杂度是和其状态数和输入输出数有关的,且随着状态数的增加,输入数也随之增加,从而使复杂性成倍增长。从而给逻辑设计,状态指派和输出表达式简化等带来很大困难。为了降低控制器设计的复杂度,Maurice Wilkes发明了一种新的控制器设计方法,称为微程序控制(microprogrammed con
18、trol)。微程序控制的基本思想是编写固化在控制器里的微程序,对于每条机器指令码,编写一段程序来实现它的功能。微程序由微指令组成,每条微指令对应一个时钟节拍的操作。这样就把控制器的设计从复杂的逻辑设计转化为简单的编程问题,并且可以利用上许多程序设计中的技术与技巧,如进行条件转移,函数调用等,微程序控制形式的控制器如图3.4所示。图3.4微程序控制器示意图如图所示,微程序执行地址由机器指令,数据通路来的信号及内部转移地址决定。当一条指令执行时,微指令地址选择逻辑选出此条指令所需执行的微程序开始地址开始执行,并将地址填入微指令程序计数器(uPC)。微指令可以是按序执行,通过累加器递增得到下一条应执
19、行的微指令地址;也可以进行跳转或条件跳转,由微指令本身给出下一条微指令的地址。而在有些机器中,所有下条微指令地址都由上一条微指令提供。因为既然要进行跳转,在微指令中反正都必须包含一个地址域,这样做并不付出什么代价,反而可节约累加器等硬件。微程序存贮器一般由ROM构成,但也有用可改写存贮器的,如IBM360计算机。因为改写微程序就意味着改变指令的功能,所以使用可改写的微指令存贮器实际上还为用户自行重新设计指令集提供了可能。微指令的结构目的寄存器 ALU操作源寄存器1源寄存器2常数外部操作跳转条件跳转地址 3b 4b 4b 4b 5b 3b 4b 6b图3.5 微指令的结构微指令和机器指令一样,具
20、有自己的内部结构,分成几个不同的域,执行各自的功能。与机器指令不同的是,它的操作码直接作为电子控制信号送到数据通路控制其工作,而不象机器指令中那样还要经过控制器的解释。图3.5是微指令格式一个最简单的例子。目的寄存器域控制着一个数据通路中一个寄存器的输入端,其中的内容表示数据能从目的总线进入哪个寄存器。源寄存器1源寄存器2分别控制从寄存器到S1和S2总线的数据流动,表示哪个寄存器能向S1/S2 总线输出数据。此外ALU操作输出给ALU的运算信号,条件,跳转地址完成与微指令跳转有关的功能。存放微指令的存贮器称作控存(control store),减少控存的容量是微指令控制器最重要的目标之一,因为
21、可以减少CPU芯片面积,降低硬件成本。要做到这一点,方法是精简微程序和缩短微指令长度,前者不仅可以减少控存,还可以减少每条指令所需时钟周期数CPI,加快运算速度。所以有时宁可用修改硬件的方法来做到。后者则可以通过对微指令各域编码的方法实现。例如,目的寄存器,要对每个寄存器的输入端进行控制,如果有N个寄存器就需要N位来实现控制,但如果规定了每次只能有一个寄存器接收数据,就可以根据这一点对此域编码,输出1表示对PC寄存器写入,3表示对C寄存器写入等。从而只需要log2N位就可完成对N个寄存器的写入控制。当然编码就意味着增加一些硬件电路来解释这些信号,而不是直接使用它们,这样的微指令编制方式称垂直微
22、代码(vertical microcode),而完全不编码的微指令称水平微代码(horizontal microcode)。垂直微代码微指令短,所占控存少,格式紧凑但要附加硬件电路,硬件开销较大;水平微代码无需加解释电路,信号直接用于控制,时延短,硬件开销小,但微指令长度长,所占控存多,开销较大。通常的机器微指令是这两种的一个折衷。图3.6是三族机器(VAX,IBM360,IBM370)控存大小与微指令长度的关系图。在图中,我们可以看到,对同族机器,控存大小几乎是要样的,差别只是在微指令长度上。控存的大小对于同族机器一般总是一样的,所以对控制器设计者来说,将指令简单机型的微指令进行编码并不节约
23、什么,反而增加了硬件解释电路。因此对同族机器,一般总是将指令复杂的多作编码,缩短微指令长度;而将指令简单的少作编码,尽量利用控存空间,节约硬件解释电路。图3.8三族机器(VAX,IBM360,IBM370)控存大小与微指令长度的关系图例 设图3.1中机器微指令的三个域源寄存器1,源寄存器2,目的寄存器如图3.7所示,比较垂直微代码和水平代码指令长度。解:由图3.7,目的寄存器有6个,加上一种无目的寄存器的操作(如条件转移指令中,运算结果只影响标志位,而不写入任何一个寄存器),共需7种输出,故水平微代码长度为7,而垂直微代码长度为log27=3;源寄存器1和源寄存器2具有9种情况,其中8种相同,
24、而图3.1中,A,B两寄存器实际上相互独立,4寄存器不可能输出到源总线2,B寄存器也不能输出到源总线1,故而实际上可共用一对信号,于是它们各应有9种输出,水平微代码长度为9,垂直微代码长度log29=4,三个域水平微代码总长度7+9+9=25bit垂直微代码总长度3+4+4=11bit,编码使每条微指令节约了14bit 目的寄存器源寄存器1/源寄存器20无A/B1CTemp2TempPC3PCIAR4IARMAR5MARMDR6MDRIR(16位立即数)7 IR(16位立即数)8 常数图3.7 图3.1中机器微指令的源寄存器1,源寄存器2,目的寄存器三个域控制器设计的衡量标准及优化控制器设计优
25、劣的衡量标准主要有四:首先是机器的平均CPI和机器所能达到的时钟频率;其次是实现的硬件开销,包括硬连线中的连线数或微指令控制中的控存大小等;最后还必须考虑完成这样一个控制器所须的设计时间。优化的目的就是要考虑以上几条,对这几个指标进行优化。优化中最有效的是增强外围辅助硬件电路功能,减少状态数(硬连线控制中)或微指令条数(在微程序控制中)。这样不仅减少了硬件复杂性,即硬连线中的接线数和微程序中的控存大小;还可以减少每条指令的CPI,可谓一举两得,下面就是一个这样的例子:例:如果对图S1所描述的CPU作一改进,使PC和MAR一样可以直接为内存访问提供地址,则机器性能提高多少(设原平均CPI为7,且
26、此改进对时钟频率不产生影响)。答:若PC可直接访问内存,则图3.2的状态转换图中,无需PC - MAR这一步,改进后的状态转换图见图3.8,比图3.2少了一个状态,由于这一步取指步骤是每条指令都必须进行的,故每条指令都是PI都少了1,于是性能提高1/(7-1)=17%图3.8 图3.2状态转换图的改进另一种减少平均CPI的方法则具有更强的针对性。它的思想来源于admahl定理,在控制器设计中尽量缩短那些最常用的指令的CPI。这些措施包括对最常用指令进行细化,编写适于多种情况的不同版本,如VAX8800就为CALLS转子指令设计了多种版本,根据寄存器保存情况的不同分别使用最有针对性的优化版本,从
27、而可减少平均CPI。但这种方法的关键在于找出哪些是最常用的指令。这可以通过统计指令的使用频率做到,而对于处理器设计阶段,只有通过仿真设计中的处理器工作情况才能做到。通过微指令控制器增加一些硬连线控制,也可以减少CPI。例如,在在对内存操作期间,通常的微程序必须循环检测等待内存操作完成信号的到来。这样当内存操作完成后,还必须多用一个时钟周期从控存中读出下一条微指令后,才能继续执行下去,为了节约这一个时钟周期,可以用一种叫作stall的技术,即不采用循环检测,而是在开始内存操作时,暂停微指令的执行,直等到内存操作完成后,才解除暂停状态,继续往下执行。因为stall期间只是暂停了下一条微指令的执行而
28、并未执行别的微指令,节约了一条微指令的装入时间。对内存的操作在处理器操作中所占比重是比较大的,如在VAX780中,20%的时钟周期是在等待内存操作,这一步改进可对处理器性能改善产生不小影响。还有一种减少CPI的方法是采用并行化方法,也就是在同一时钟周期里完成更多的操作,对硬连线逻辑,这种方法意味着要求更多的输出线,对微指令控制,这种方法意味着要有更宽的微指令。在图3.6中我们可以看到,每一族机器中最快的机器,其微指令也最长,就是这种并行化的结果,但是,这种方法的应用范围是有限的,要受到整个指令执行中,所遇到的各个环节速度的牵制。比如在8086这样的微处理器中,如果在处理器数据通路内加一条总线,
29、加上6位的控制信号,可以使大部分指令的执行这一步(第三步)花的时间从3个时钟周期减少到2个。但是,由于这样的改动并不加快所有微指令的操作,另一些不能并行的微指令与已并行化的微指令一起使用,从而最后无法体现出这种并行化的优势。优化控制器也体现在优化硬件,降低硬件成本上。比如,通过编写微程序公共过程,使得一部分指令为各微程序模块共享,可以减少微指令总条数,从而减少所需控存容量。另一种常用的办法是利用机器指令中的某些域直接用作控制信号,这些控制信号可分为两类,一类可作为寄存器选择信号,另一种是机器指令中某些域用作ALU操作信号。intel8086微处理器就同时使用了这两种技术。由于一部分控制信号由机
30、器指令直接产生,控存所占空间就可以大大缩减。这样做的唯一缺点是控制信号一部分由硬连电路产生,从而增加了硬件电路设计调试的复杂性。上面所说的第二种方法实际上是一种微程序控制器与硬连电路控制器的混合设计方法,从而我们也可看到硬连控制和微程序控制不是截然分开的,在实用中常吸取它们各自的优点,组成一种混合的优化电路。3.5中断如果说控制器的设计是整个处理器设计中的难点,那么中断处理部分就是控制器设计的难点。中断是处理器的一项重要技术,在有某些重要事件发生时产生,用来使处理器转入对这些事件的处理。这些事件包括软硬件错误,一些有实时要求的事件,和用户请求服务等。下面列举了11种中断情况:I/O设备请求 用
31、户程序进行操作系统调用 指令跟踪断点算术运算溢出,包括上溢(overflow)和下溢(underflow)页中断(在采用虚存的系统中,使用的当前页不在内存中)内存访问未对齐(misaligned)(在要求对齐(alignment)的系统中,访问未对齐的地址)违反内存保护(程序企图访问无权访问的内存区)使用未定义的指令硬件故障电源失效(参见图3.9)IBM360VAXMotorola 680x0Intel80x86I/O请求输入/输出中断设备中断例外(0-7级自动向量)向量中断系统调用调用中断例外(自陷的变例)例外-在macintosh中(未实现指令)中断(INT指令)指令跟踪执行无例外(跟踪错
32、)例外(自陷)中断(单步中断)断点无例外(断点错)例外(非法指令或断点)中断(断点自陷)算术运算溢出程序中断(上溢或下溢例外)错)例外(整数上溢自陷或浮点数下溢错)例外(浮点协处理器错)中断(上溢自陷或算术单元例外)缺页中断无例外(不能传递错)例外(内存管理单元错)中断(缺页)内存访问不对齐程序中断(特殊例外)无例外(地址错)无使用未定义指令程序中断(操作例外)例外(操作码/保留错)例外(非法指令或断点未实现指令)中断(非法操作码)硬件故障机器检查中断例外(机器检查放弃)例外(总线错)无电源失效机器检查中断紧急中断无不中可屏蔽中断违反内存保护程序中断(保护例外)例外(访问控制违反错)例外(总线
33、错)中断(保护例外)图3.9 11种中断情况在三种处理器中的不同叫法中断在不同的计算机系统中有不同的叫法,如图3.9所示,Intel和IBM仍将所有的都称为中断(interrupts),而Motorola将它们称为例外(exceptions),DEC则根据不同情况,将它们称作例外(exception),错(faults),自陷(traps),放弃(abort),或中断(interrupts)。我们这里仍将它们统一称为中断。但无论如何,中断在处理器工作中占着非常重要的地位。图3.10列出了VAX8800在运行VMS操作系统时,中断发生的频率将在一个实时操作系统下,中断发生频率会更高。但还不仅于此
34、,中断是不使用指令而改变控制流的情况,所以会给数据运算的正常进行带来很多的问题,直接影响时钟频率的提高,甚至危及整个处理器设计方案的可靠性。中断可以按以下几种标准,分成不同的类别:1.同步中断与异步中断,如果一个中断总是在同样数据和同样内存映象下程序运行到同一地址时发生,则称这个中断为同步中断(synchronous interrupt)与它相对的是一些硬件产生的中断,如I/O中断,只与外设本身的关态有关,则称它们为异步中断(asynchronous interrupt)2.用户请求(user request)的中断和强迫的(coerced)中断,如果中断是由用户请求发生的,称为用户请求的中断
35、,否则就是强迫中断。 事件发生平均时间间隔内部时钟中断10.0ms软件中断1.0ms所有硬件中断(总计)2.1ms所有中断(总计)0.9ms图3.10 VAX8800在运行VMS时的中断发生时间间隔(据Clark ,Bannon ,and Keller1988)3.用户可以屏蔽的(user maskable)中断和用户不能屏蔽的(user unmaskable)中断,如果用户可以让处理器不理会一个中断,则称这个中断是用户可屏蔽的。通常一些牵涉到硬件错误的中断,如电源失效是不可屏蔽的。4.在指令运行中产生的(within instructions)中断和在指令间产生的(between instr
36、uction)中断,这是以中断产生的时间分类,下面可以看到,这种中断对于控制器设计将带来最大的影响。5.可重新执行的(resume)中断和应中止系统运行的(terminate)中断。如果能中断发生就会导致程序停止运行,则称中断为中止系统运行的中断。前面所说的11种中断按此分类如下:同步/异步用户请求/强迫用户可屏蔽/不可屏蔽在指令间/在指令中发生可重新执行/不可重新执行I/O中断异步强迫不可屏蔽指令间可重新执行系统调用同步用户请求不可屏蔽指令间可重新执行指令跟踪同步用户请求可屏蔽指令间可重新执行断点同步用户请求可屏蔽指令间可重新执行整数运算上溢同步强迫可屏蔽指令中终止性浮点运算溢出同步强迫可屏
37、蔽指令中可重新执行缺页同步强迫不可屏蔽指令中可重新执行不对齐内存访问同步强迫可屏蔽指令中终止性违反内存保护同步强迫不可屏蔽指令中终止性使用未定义指令同步强迫不可屏蔽指令中终止性硬件故障异步强迫不可屏蔽指令中终止性电源失效异步强迫不可屏蔽指令中终止性图3.11 11种中断的分类对控制器设计来说,最难实现的是那些在指令运行中发生,且要重新运行的中断。因为此时还必须保存当前运行指令的状态,以便以后重新运行。要处理中断,首先必须检测中断,这也是控制器所要完成的主要任务。在指令间发生的中断可以在一条指令运行前或一条指令运行结束后检测,难点在于在指令执行中发生的中断,这就要求每执行一个时钟节拍,就必须对此
38、时钟节拍所操作后可能出现的所有中断都进行检测。图3.12画出了对图3.4状态图的改进,使它可以在有一拍操作结束后都可以检测中断。图3.12改进后可检测中断的状态图在图3.12中,采用了IAR作为中断发生时暂存原执行程序指令地址的寄存器。这样一个寄存器是程序员可见的(Programmer-Visible),以便软件中断服务程序可以进一步对它进行操作和保存以适应嵌套中断的情况,在一个中断返回时,控制器可以将IAR的地址重新放回PC,以便继续运行。但实际上中断的检测和处理并不一定都象图3.12中那样简单。尤其是保存中断发生时的状态这步。对于在指令执行中发生的中断,因为仍然必须保存指令执行前的状态,所
39、以显得特别困难,我们把这些能保存一个中断发生时指令开始状态的能力称为重运行能力(restartable)。许多早期的计算机,包括超级计算机,都未具备这种能力,因为当时实现这种能力需要增加复杂的电路,影响运算速度。DEC VAX是DEC公司第一种具有重运行能力的计算机,它采用变长指令格式,这就意味着很可能在取了一条指令的前50个字节后,才发现后面几个字节不在内存中而产生缺页中断。严重的问题还在于每条指令可能有多达6个的操作数,有个操作数都可能产生访存不对齐中断或缺页中断,从而必须对所有的这些都进行检查。这还不是最严重的问题,重运行能力要求保存在中断发生时执行指令的开始状态,但VAX的某些指令,如
40、自增寻址指令和自减寻址指令在操作数读入阶段就改变了地址寄存器的值,使得以后发生中断时单纯保存PC的值不能代表处理器的可重新运行状态。为此,还必须记录下中断发生前,指令已进行过的操作,以便在中断时能撤消(undo)这些工作而恢复原指令开始时的情况,VAX使用一个历史队列(history queue)来记录各寄存器的状态和对它们进行过的操作,在早期的VAX中,则记录下指令开始执行前所有寄存器的值,以便在中断产生时保存,这种方法比前一种要使用更多的存贮空间用于保存各寄存器,因为前者保存的只是对寄存器的改动,后者保存的是所有寄存器的值。但这些方法仍没有彻底解决状态保存的问题。VAX有许多运行时间很长的
41、指令,不能留待指令开始或结束时才处理中断,比如MOVC3可以拷贝最多216字节的数据,耗时几十毫秒,为减少中断响应的时延,尤其是减少紧急情况中断(如一些有实时要求的外部中断)响应时延,这类指令不得不在执行途中进行中断处理,这就会给控制器设计带来许多问题,即使能解决这些问题,并顺利地实现对此指令的撤消,撤消所花的时间也是可观的(几十毫秒),由图3.10可以看到硬件中断平均毫秒就会出现一次,导致整个中断响应或不能进行或陷入无休止的对MOVC3指令的反复撤消之中。DEC采用分解的方法来解决MOVC3指令的问题。首先,这个指令的三个操作数:源地址,传输长度和目的首地址从内存中取出,放入通用寄存器R1,
42、R2和R3中,如果此时发生中断,这些寄存器的内容复原,MOVC3以后重新开始执行。这个第一阶段执行完毕后,开始第二阶段,从源地址向目的地址拷贝,每拷贝一个字节R2减1,此时若发生中断,就将机器状态字的第一部分做完(first part done ,FPD)位置位,当中断返回时,先检查机器状态字中FPD位,若FPD位未置,则从头开始指令运行,若FPD已置,则就按R1,R2,R3寄存在的当前值(保护过的)继续运行,拷贝数据,这样处理就既加快了中断响应速度,又解决了长运行时间指令中断响应的难题。IBM机器也有类似的问题,IBM360/370中有MVC指令,可一次传递多达256字节的数据,如果没有虚存
43、,这样的传递问题不大,但370机器引入了虚存,从而在传递过程中会出现缺页中断-一个必须处理的中断。为了防止这样的中断导致麻烦,370控制器在运行MVC指令前先检查要用的页调入所有这些页进内存以确保在执行期间不会出现中断。这样的办法可以绕开指令执行中的中断处理,除了缺页中断以外的中断,IBM370控制器都将它们推迟到指令结束后为止。但如果对指令时间更长的指令,如MOVCL,可以一次传递多达224字节数据,等到指令结束再处理指令执行期间产生的中断就费时太多了,这时就只好采用与前面介绍过的VAX机器中类似的办法来解决。实际上,这种分步处理的办法也是IBM首先采用的。从上面我们可以看到,长指令虽然能为
44、用户提供强大的功能,但也给处理器设计,特别是控制器设计带来了很多困难。而在RISC类load-store指令集中,这些问题就不会出现,从而就简化了控制器设计。正是由于这样的好处,才使RISC类指令集被越来越多的处理器所采用。3.6总结:一种控制器的设计实例这一节我们通过实际设计一个load-store型的控制器的例子来加深读者对本章内容的了解。我们先用硬连线逻辑来实现,再用微程序。我们在这里先引入一个小小的示例指令集(图3.14)这个指令集虽小,但它涵盖了一般处理器指令的各种类型,足以说明问题。这样一个指令集是load-store类型的,包括四类指令:内存访问指令(memory access
45、instruction),ALU指令(ALU instructions)跳转指令(jump instruction)和条件设置指令(set instructions)。利用这个指令集,我们可以完成一般处理器的各种计算功能,采用的处理器结构沿用了图3.7中的结构,并设定每条指定长度为4字节。类型指令名指令格式说明内存访问指令载入指令load Rd,内存地址从指定内存地址读入内容到Rd寄器内存访问指令存贮指令store RS1,内存地址将RS寄存器内容存入指定内存地址ALU指令加指令ADD Rd,Rs1,Rs2或ADD Rd,Rs1,立即数将Rs1与Rs2或立即数相加后的结果存入Rd寄存器Rd -
46、Rs1+Rs2/立即数ALU指令减指令SUB,Rd,Rs1,Rs2或SUB Rd,Rs1,立即数将Rs1与Rs2或立即数相减的结果存入Rd寄存器Rd - Rs1-Rs2/立即数ALU指令与指令AND Rd,Rs1,Rs2或ANDRd,Rs1,立即数Rd-Rs1&Rs2或R2-Rs1&立即数ALU指令或指令OR Rd,Rs1,Rs2或OR Rd,Rs1,立即数Rd-Rs1|Rs2或R2-Rs1|立即数ALU指令异或指令XOR Rd,Rs1,Rs2或XOR Rd,Rs1,立即数Rd-Rs1Rs2或R2-Rs1立即数ALU指令寄存器左移指令SL Rd,Rs1,Rs2或SLRd,Rs1,立即数Rd-R
47、s1Rs2或R2-Rs1立即数ALU指令右移指令SR Rd,Rs1,Rs2或SR Rd,Rs1,立即数RdRs2或R2立即数跳转指令无条件绝对跳转JMP Rs跳转到Rs寄存器内容所指地址开始执行跳转指令无条件相对跳转指令JR 立即数跳转到距当前运行地址位移为指定立即数的地址继续执行跳转指令为真条件跳转指令BT Rs,立即数当RS=1时跳到距当前选定了地址位移为指定立即数的地址继续执行跳转指令为假条件跳转指令BF Rs,立即数当RS=0时跳到距当前选定了地址位移为指定立即数的地址继续执行跳转指令自陷指令TRAP立即数中断当前程序,转向立即数所指地址执行跳转指令转子程序CALL Rs, Rd转到R
48、s寄存器所指地址继续执行将PC保存到Rd条件设置指令相等设置SEQ Rd,Rs1,Rs2当Rs1=Rs2(Rs1=立即数)时置Rd为1,否则置其为0条件设置指令大于设置SGT Rd,Rs1,Rs2当Rs1Rs2(Rs1=立即数)时置Rd为1,否则置0条件设置指令小于设置SLT Rd,Rs1,Rs2当Rs1Rs2(Rs1=立即数)时置Rd为1,否则置0数据传送指令从A送至中断地址寄存器MOVR2I将中断地址寄存器的内容送到A寄存器数据传送指令从中断寄存器送到AMOVI2R将A寄存器的内容送到A寄存器图3.14一个处理器指令集示例硬连线控制设计和程序设计一样,我们采用逐步求精的方法进行设计,首先定
49、出指令执行的粗框状态图,每条指令的取址/译码/寄存器读出这一步都是相同的,如图3.15所示,然后再根据指令的类型,转入不同的执行过程。下面我们就分别细化这些框图,取址/指令译码/寄存器读出的框图见图3.16。在图中,根据例1中的讨论,我们对图3.1中的处理器结构进行了一点改进,使PC寄存器可直接访问内存,从而节约了状态数。图3.15指令状态框图图3.16取指,指令译码,寄存器读出部分状态转换图内存访问指令,寄存器指令,无条件/条件跳转和条件设置指令数据传送指令分别如图3.17-图3.21所示列出状态图。在这些讨论中,我们略去了关于中断检测的细节,有兴存的读者可自行思考如何加上它们,另外在关于立
50、即数的操作中,读者应注意到立即数是指令的一部分,存在IR中图3.18 内存访问指令图3.18 ALU指令图3.19 条件设置指令图3.20 条件跳转指令图3.21 无条件跳转指令这样的控制器设计只是一个原型,通过改变硬件电路或增加状态,还可以减少一些指令所需经历的状态数(CPI),例如,对寄存器型指令,如果我们改变硬件电路,使ALU源操作数既可来自寄存器(如A,B)又可来自IR的立即数,就可以节约将B暂存入Temp的一个状态,甚至节约掉Temp寄存器。(图3.23)另一种减少寄存器型指令CPI的方法是将立即数寄存器运算与寄存器-寄存器运算分开来,各用一类状态表达。与前一种方法相比,这种方法不用
51、外加硬件连结,但是增加了一倍的状态数。(图3.24)。图3.23寄存器型指令的改进之一图3.24寄存器型指令的改进之二在设计状态图后,硬连线控制器的设计就只剩下一些程式化的简单工作如:分析每个状态要使用的控制信号;对每个状态指派状态序号;以及根据上面两步的工作结果,设计相应的PLA控制器。微程序控制的实现方法微程序的实现中,我们仍沿用图3所示的微程序格式。为了实现一个指令集,首先要定义一些微指令域的含义。我们首先定义微指令的ALU域,这个域可出现八种命令,用于ALU控制,其含义如下1)ADD:加, D=S1+S22)SUB:减, D=S2-S13)RSUB:减,D=S2-S14)AND:与D=
52、S1&S25) OR:或D=S1|S26)XOR:异或D=S1S27)PassS2:传递S2到D,D=S28)SL:左移D=S1S210)PassS1:传递S1到D,D=S1其中,D表示经ALU处理后,送到目的总线上的值,S1,S2分别表款来自两条源总线的ALU两个输入。另一个有必要加以说明的域是Misc域,这是微指令执行的外部操作。在我们的微指令集中,这样的操作共有五种,分别是:1)读指令:从内存将当前要执行的指令读入指令寄存器IR。(Instrread)2)读数据:从内存读数据到MDR。(Dataread)3)写数据:向内存写数据。(Datawrite)4)读寄存器:从寄存器堆将数据读到接
53、口寄存器A,B。(AB-RF)5)写寄存器:把已存到接口寄存器C的数据写入寄存器堆。(RF-C)最后一个需说明的域是跳转条件域,在我们的设计中。共有四种跳转情况:1)继续执行下一条微指令,这是正常的顺序执行格式2)无条件跳转至某一地址3)条件跳转,共有五种条件应予判断;是否有挂起中断检测那些指令间发生的中断,如有则跳转至中断处理程序地址(Int)存贮器访问是否完成通常若未完成则应停在当前微指令上直至完成(Mem)ALU输出是否为0判断ALU的输出是否为0,即每一位均为0(Zero)ALU输出是否为负判断ALU的输出是否为负数,即补码表示时,它的首位为1(negative)载入操作符是否为载入(load)4)分支跳转,即跟据指令操作符,转向相应的微程序入口执行,这发生在取指令之后,依照对指令的解码跳转至相应微程/序入口(Decode1)寄存器和条件设置指令中,依照不同的指令转入不同的微程序执行。(Decode2)除此之外,微指令中另外几个域的语法规范说明如下:Dest:这个域中只出现专用和接口寄存器名,意味着将目的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高职石油化工技术(石油炼制工艺)试题及答案
- 2025年大学二年级(乳品工程)乳品加工技术试题及答案
- 2025年大学地理(冰川地理)试题及答案
- 2025年大学机械设计制造(机械设计基础)试题及答案
- 2025年中职安全(技巧训练)试题及答案
- 2025年中职学前教育(幼儿歌曲教唱)试题及答案
- 2025年中职建筑智能化工程施工(智能设备安装)试题及答案
- 2025年高职(高分子材料工程技术)高分子材料成型工艺模拟试题及解析
- 2026年河南信息统计职业学院单招综合素质考试备考题库带答案解析
- 2026年池州职业技术学院单招职业技能考试参考题库带答案解析
- 2026年广西贵港市华盛集团新桥农工商有限责任公司招聘备考题库及参考答案详解
- 2026年市场集团有限公司所属企业(温岭浙江工量刃具交易中心股份有限公司)公开招聘工作人员备考题库及1套完整答案详解
- 2026青海西宁市湟源县水务发展(集团)有限责任公司招聘8人参考考试试题及答案解析
- 2023-2024学年北京市海淀区八年级上学期期末考试物理试卷含详解
- 2024版房屋市政工程生产安全重大事故隐患判定标准内容解读
- GB 21258-2024燃煤发电机组单位产品能源消耗限额
- JB∕T 13026-2017 热处理用油基淬火介质
- 人教版高一化学方程式大全
- DB64 1996-2024 燃煤电厂大气污染物排放标准
- 邻近铁路营业线施工安全监测技术规程 (TB 10314-2021)
- 生物化学第30章蛋白质降解和氨基酸的分解代谢
评论
0/150
提交评论