您好,欢迎访问三七文档
第三章CPU的设计3.1引言如果说前面指令集的设计是计算机处理器设计的蓝图,那么如何实现将直接影响到指令集的性能,而处理器实现中的一些问题也会或多或少地影响到指令集的设计。RISC思想的提出,就是针对CISC指令集处理器实现中的困难,从简化指令集出发,降低处理器实现的复杂度,达到降低处理器的开发成本,提高处理器并行度的目的。处理器实现直接影响到两个重要的性能指标:每条指令实现时钟数(clockperinstruction,CPI)和时钟频率。正象一个木桶能装水的多少取决于它最短一块木头的长度,处理器中各部件最慢的一个决定了处理器的时钟频率,所以处理器的设计必须使每个部件都能以相近的速率协调运行。通常,我们把处理器又分为两部分:一部分执行算术逻辑运算,以完成计算机的计算功能,通常称为数据通道,另一部分则解释计算机机器指令代码,并按这些代码发出控制信号控制数据通道的工作以完成指令,称为控制器。前者由ALU(算术逻辑运算模块,Arithmeticlogicunit)和一些寄存器构成,为处理器工作时数据实际流过的路径,故称为数据通道;后一部分则是处理器中的主控部分,是将指令转换为实际硬件动作的桥梁,故而设计上最复杂,也最容易体现一种处理器的特色。一般处理器的设计主要就是指控制器设计。3.2数据通道(datapath)数据通道是处理器中处理数据的部件,数据从主存取出,经数据通道的处理,得到所需要的结果后,再送回主存存放。整个数据通道的执行受控制器的控制,实际上也就是受指令的控制。图3.1典型的数据通道组成示意图图3.1是一个典型的数据通道组成示意图,在图中也表示出了控制器、主存与数据通道的密切关系,数据通道本身由一个算术逻辑部件(ArithmeticLogicUnits,ALU)和一些寄存器组成,并包括两者间的通信渠道。在冯·纽曼体系中,程序数据的地位是等同的,一起存储在主存中,为了得到适由数据通道执行的指令,首先必须在主存中寻找到指令。这项工作由一个叫程序计数器(ProgramCounter,PC)的部件来完成。PC是一个专用的寄存器,存放当前所执行指令的地址,供控制器读取指令时使用。同时,这个寄存器必须随时改变存放的内容,以便使程序能按序执行下去。比如,在正常情况下,每条指令执行前都必须将PC中的值增加一个指令长度,取顺序执行的下一条指令,这项工作则由ALU完成。ALU不仅是一个可以完成PC递增功能的部件,还是一个通用的计算功能模块。它能独立完成所有的基本运算如加,减,与,或,异或和移位等,另外还可以在控制器的控制下完成一些更复杂的运算如乘除等,同时也能够对数据不加处理而直接传送。由于冯纽曼体系计算机的基本功能就是数值计算,因此ALU具有十分重要的地位。与寄存器部件不同,它是一种非记忆的逻辑部件,其输出完全依赖于当前输入;而寄存器部件则具有内部状态,其输出由当前输入和内部状态共同决定,建去的输入会影响内部状态,从而使寄存器具有记忆。MAR和MDR是为了访问内存而设的。MAR即MemoryAddressRegister,存放访问内存的地址,MDR则是memorydataregister,存放从内存取回的数据,它们的作用在后面还要讲到。此外,Temp是一个数据访问中起着暂存作用的寄存器,IAR专为中断使用。上述这些寄存器为专用寄存器,它们的特点是一般对用户是透明的,用户或者不能直接控制它们的内容(如PC和IAR),或者完全是处理器内部实现的细节,用户根本不知道它们的存在(如MAR,MDR,Temp等)。这些寄存器为了完成处理器的某些特定功能而设,而不能自由地用于数据计算,这也是专用寄存器这个名称的来由。与专用寄存器相对应的是通用寄存器,顾名思义,它们就是能被用户自动地用于数据计算中的寄存器。在许多计算机中,以R1,R2...Rn来命名它们,它们的使用没有差别。多个通用寄存器合起来组成一个寄存器堆(registerfile),它们也是存贮器层次结构中的最高层,属于最小也是最快的数据暂存部件。因此,如何最大限度地在计算中利用通用寄存器是提高编译器性能的关键。内部总线将各寄存器与ALU连接起来,在我们的例子中,这样的总线共有三条:两条源总线S1,S2和一条目的总线Dest。S1,S2传递ALU的源操作数级ALU,Dest则将ALU运算的结果送回各寄存器,这时,ALU若执行直接传输功能(PASS1,将S1上的数据传到Dest或PASS2,将S2上的数据传到Dest),就可以作为源和目的总线间的传输通道,完成数据在寄存器间的数据传递。通用寄存器、一部分专用寄存器(如PC和IAR)和标志寄存器flag加在一起,就构成了程序状态(state)的主要部分,如果我们能保存这些寄存器的内容也就是说程序状态,那么以后我们只要将这些寄存器的值如数恢复成原先的,并重新开始运行,只要程序的输入不变,就能得到原先的运行结果,这一点对地多进程思想的出现具有重要影响。当然实际程序状态除了包括寄存器外,还应包括内存中一些单元的值。数据通道的实现影响着处理器主频大小。数据计算到整个通道所以通道中最慢的部件就限制了整个处理器的主频。又因为它是处理器中实际进行数据处理的部分,因此许多处理器优化技术如流水线(pipeline)、指令级并行(instructorlevelparallel,ILP)都是围绕着它展开的。3.3指令执行原理在讨论控制器的工作原理之前,我们先介绍一下数据通道应怎样工作,才能完成指令。一般说来,一条指令的执行分为五步:1.取指令(instructionfetch)。在这一步中,由PC指示地址上的指令被取到指令寄存器IR中。表示成MAR-PC;IR-M[MAR]PC的值首先传给MAR是因为在我们的例子中,PC不直接与主存相连2.解码/寄存器读出。(instructiondecode/registerfetch)。在这一步中,控制器对读入指令进行解码,要操作的寄存器操作数从寄存器堆中放入A,B,为交ALU计算作计算作最后准备。设置寄存器A,B,C和设置MAR,MDR的理由是类似的。ALU和主存都属于无时钟部件,其输出值单纯由当前输入决定,而不象寄存器一样,按时钟(clock)而动作,输出值由有时钟触发时的输入决定,并一直保持到下一个时钟。所以,为了保持计算和读存结果电信号的相对稳定,就必须在它们的输入设置寄存器。A,B能保证ALU的计算结果稳定到被C保存为止,MAR,MDR则能使储存信号稳定到主存能稳定地读出或写入信息。还要让PC进行自增以便使它指向下一条指令。为了简便起见,设所有指令长度为4,于是我们有如下表示式:A-Rs1,B-Rs2;PC-PC+4Rs1,Rs2为两个源操作寄存器指令解码能与寄存器读出并行操作是有条件的,在我们的指令集中,假设了寄存器操作数始终处在指令的同一位置,这样,在指令解码的同时,控制器就能知道该将哪个寄存器的内容放入A,B。3.执行/有效地址计算(Execution/effectiveaddress)这一步的主角是ALU,根据不同的指令,由ALU计算数值或有效地址。根据三种指令的不同情况讨论:·访存指令:MAR-A+IR地址部分,MDR-Rd(如为写指令)Rd为目的寄存器(IR)·ALU指令:ALU输出-A操作B或立即数操作由解码决定·跳转/条件跳转ALU输出-PC+相对地址;条件-(A操作0)(如为条件跳转)在条件为真时,跳转实行,条件中的操作由解码决定,如指令为bf,则操作为等于。无条件跳转则视为条件永真的跳转。我们模型的load/store结构决定了执行和有效地址计算可以在同一步之内完成。在我们的模型中,没有一条指令既需要执行ALU功能,又需要计算有效地址。4.访存/完成跳转。(memoryaccess/branchcompletion)只有两类指令要用到这一步,访存指令和跳转指令,ALU指令无需执行这步。根据访存指令,表示为①MDR-M[MAR]或②M[MAR]-MDR对读存,执行①,写存执行②。对跳转指令,表示为if(条件为真),PC-ALU输出条件由一步计算,这一步根据条件实际改变PC值4.写回(write-back)表示为Rd-C或MDR对ALU指令,将ALU的计算结果送入目的寄存器,对读存,将MDR读入目的寄存器。这就是执行指令要完成的步骤,控制器的目的就是要让数据通路按此步骤工作。3.4控制器控制器的设计是处理器设计中最困难的一部分,也是在新处理器的设计和调试中最容易出问题的部分,因为实际上,处理器的另一部分数据通道只是一个执行机构,没有什么很特别的地方,关键还在于如何控制数据通道。于是在控制器设计中,我们不得不同时考虑两个因素:实现的简单和运行的效率。实现简单有于降低控制器设计的难度,减少错误,也就是缩短了设计和实现的时间,降低了设计成本。而作为处理器内部的总控者,控制器是计算机主控的主控,它的运行效率微小变化都会对计算机性能造成很大影响,所以控制器又必须有很高的效率。不幸的是,这两方面的要求经常是互相矛盾的。下面我们分别介绍控制器两种最常用的设计与实现途径:硬连线控制(Hardwiredcontrol)和微程序控制(microprogrammedcontrol)3.4.1硬连线控制在硬连线控制中,控制器可看作一个有限状态图(finite-statediagram)。每个状态对应一个时钟周期,各状态中有一些特定的输出对应着各时钟周期中数据通道要做的工作。每个状态在一定的输入下有一个出口,指向在此输入下状态应转向的下一状态。一条指令要经几个时钟周期完成,从而也对应着多个状态。图3.2就是每条指令的头几步状态转换图。图3.2每条指令头几步状态转换图硬连线逻辑的复杂性是很大的,举个例子来说,一般一个load-store型CPU控制器至少也要50个状态(具体状态后面将举例描述)。为表示这50个状态就需要6位(log250)。同时,我们还需要几位数据通道和存贮器的反馈输入,来参与决定状态转换,如图3.2中的访存未结束。当然,参与决定状态的还有指令码,如图3.2中就是根据指令码译码结果转换到以后状态的。这样决定硬连线逻辑控制器,状态转换的就有了三个量:当前状态(用6位表示),数据通道及存贮器反馈输入(用3位表示)及指令码(设为12位,6位操作码,6位操作数)。这样的控制器通常要40线输出控制,于是复杂度就是50×(6+3+12)×40。这是一个相当巨大的数字。当然,我们应该注意到,指令码中的操作数对硬连线控制的状态变化不产生影响,于是只需要6位操作码就够了。但即使如此,复杂度还是很大的。如果我们用ROM来进行这样的状态转换,在其中就必须存贮26+3+6=221个单元,每个单元为40位长,共需约10MB的ROM,这样的存贮容量对处理器控制器来就显然是不可能的,所以需要使用一些办法来降低硬连线控制的成本,通常使用可编程逻辑阵列(Programmedlogicarray,PLA)可以降低控制器所需存贮容量。PLA的基本思想是利用控制器存贮内容之间的相关性简化其存贮内容,删去冗余的信息。为此付出的代价是增加了一些地址译码的时间。PLA采用对输入项与输出间逻辑表达式的简化,来减少存储,在控制器,这样的部件中,常用计算机琰辅助进行简化,简化后,象前面例子中那样规模的控制器,其存贮容量可降为几百个字节。PLA简化的效果和输入项的编码方式有密切关系,一个精心设计的输入编码可大大减少控制器所需存贮量。输入中主要的就是状态量的编码和指令操作码的编码。比如,状态量编码时如果尽可能把相邻状态(有相到直接转移关系的状态)的码编得相似,只差一位或两位,控制器就会大大简化,这种状态编码问题就称为状态指派问题(state-assignmentproblem)。图3.3硬连线逻辑控制器示意图3.4.2微程序控制硬连线控制的复杂度是和其状态数和输入输出数有关的,且随着状态数的增加,输入数也随之增加,从而使复杂性成倍增长。从而给逻辑设计,状态指派和输出表达式简化等带来很大困难。为了降低控制器设计的复杂度,Mauric
本文标题:第三章CPU的设计
链接地址:https://www.777doc.com/doc-2212113 .html