第5 章 中央处理器 计算机所有功能通过执行程序完成,程序由指令序列构成。计算机采用“存储程序”的 工作方式,即计算机必须能够自动地从主存取出一条条指令执行,而专门用来执行指令的部 件就是中央处理器(centralprocessingunit,CPU)。在CPU 中控制指令执行的部件是控制 器,控制器可采用硬连线路方式实现,也可采用微程序设计方式实现,也有一些CPU 采用 硬连线路和微程序控制相结合的方式实现。 本章主要介绍CPU 的基本功能和基本组成,以及单周期和多周期处理器的工作原理 和设计方法。有关流水线处理器的基本设计原理在第6章介绍。 5.1 CPU 概述 5.1.1 CPU 的基本功能 CPU 的基本职能是周而复始地执行指令。CPU 在执行指令过程中可能会遇到一些异 常情况和外部中断。例如,对指令操作码译码时,可能会发现有不存在的“非法操作码”;在 访问指令或数据时可能发现“缺页”(即要访问的信息不在主存);外部设备可能会请求中断 CPU 的执行等。因此,CPU 除了执行指令外,还要能够发现和处理异常情况和中断请求。 程序由指令序列和所处理的数据组成。指令按顺序存放在内存连续单元中,将要执行 的指令的地址由PC给出。CPU 取出并执行一条指令的时间称为指令周期,不同指令的指 令周期可能不同。 通常,CPU 执行一条指令的大致过程如下。 (1)取指令。从PC指出的内存单元中取出指令送到指令寄存器(IR)。 (2)对IR中的指令操作码译码并计算下条指令地址。不同指令的功能不同,即指令涉 及的操作过程不同,因而需要不同的操作控制信号。 (3)计算源操作数地址并取源操作数。根据寻址方式确定源操作数地址计算方式,若 源操作数是存储器数据,则需要一次或多次访存,例如,对于间接寻址或两个操作数都在存 储器的指令,需要多次访存;若源操作数是寄存器数据,则直接从寄存器取数,无须访存。 (4)对操作数进行相应的运算。在ALU 或加法器等运算部件中对取出的操作数进行 运算。 (5)目的操作数地址计算并存结果。根据寻址方式确定目的操作数的地址计算方式, 130 计算机组成与系统结构(第3版) 将运算结果存入存储单元中,或存入通用寄存器中。 对于上述过程的第(1)步和第(2)步,所有指令的操作都一样,都是取指令、指令译码并 修改PC;而对于第(3)~(5)步,不同指令的操作可能不同,它们完全由第(2)步译码得到的 控制信号控制,即每条指令的功能由第(2)步译码得到的控制信号决定。 上述这些基本操作可以用形式化的方式来描述,所用的描述语言称为寄存器传送级 (registertransferlevel,RTL)语言。本书RTL 语言规定:R[r]表示通用寄存器r的内容, M[addr]表示存储单元addr的内容;M[R[r]] 表示寄存器r的内容所指存储单元的内容; 表示PC 所指存储单元的内容;i PC 表示PC 的内容,M[PC] SEXT[mm]表示对imm 进行 符号扩展,ZEXT[mm] mm 进行零扩展; 即传送源在右, i表示对i传送方向用←表示, 传送目 的在左。 5.2 CPU 的基本组成 1. 随着超大规模集成电路技术的发展,更多的功能模块被集成到CPU 芯片中,包括 cache、MMU 、浮点运算逻辑、异常和中断处理逻辑等,因而CPU 的内部组成越来越复杂,甚 至在一个CPU 芯片中集成了多个处理器核。但是,不管CPU 多复杂,数据通路(datapath) 和控制器(controlunit)是其两大基本组成部分。控制器也称为控制部件。 通常把数据通路中专门进行数据运算的部件称为执行部件(executionunit)。指令执 行所用到的元件有两类:组合逻辑元件(也称操作元件)和存储元件(也称状态元件)。连接 这些元件的方式有两种:总线方式和分散连接方式。数据通路就是由操作元件和状态元件 通过总线或分散方式连接而成的进行数据存储、处理和传送的路径。 1. 操作元件 操作元件属于组合逻辑元件,其输出只取决于当前的输入。如图5.数据通路中 1所示 , 最常用的操作元件有多路选择器(MUX )、加法器(Adder)、算术逻辑部件(ALU)等 。 图5. 1 数据通路中的常用组合逻辑元件 图中虚线表示控制信号,多路选择器需要控制信号Select确定选择哪个输入被输出;加 法器不需要控制信号控制,因为它的操作是确定的;ALU 需要有操作控制信号OP,由它确 定ALU 进行哪种操作。 2. 状态元件 状态元件属于时序逻辑电路,具有存储功能,输入状态在时钟控制下被写到电路中,并 保持电路的输出值不变,直到下一个时钟到达。输入端状态由时钟信号决定何时被写入,输 出端状态随时可以读出。最简单的状态元件是D触发器,有时钟输入CLK 、状态输入端D 和状态输出端Q。图5. 2是D触发器的定时示意图。 中央处理器 第 5 章 131 图5. 2D 触发器定时示意 图5.2所示D触发器采用下降沿触发,要使输出状态能正确随输入状态改变,必须满足 以下时间约束。 (1)在时钟下降沿到达前一段时间内,输入端D必须稳定有效,这段时间称为建立时间 (setuptime )。 (2)在时钟下降沿到达后一段时间内,输入端D必须继续保持稳定不变,这段时间称为 保持时间(holdtime )。 在满足上述两个约束条件的情况下,经过时钟下降沿到来后的一段锁存延迟(Clk-to-Q 时间), 输出端Q的状态改变为输入端D的状态,并一直保持不变,直到下个时钟到来。 数据通路中的寄存器是一种典型的状态存储元件, n 个D触发器可构成一个 n 位寄存 器。根据功能和实现方式的不同,有各种不同类型的寄存器。例如:①带“写使能”输入的 暂存寄存器,可用于实现指令寄存器、通用寄存器组(generalpurposeregisterset,GPRs)① 等;②输出端带一个三态门的寄存器,通常用于与总线相连的寄存器,可通过三态门来控制 信息是否打到总线上;③带复位(即清0)功能的寄存器;④带计数(自增)功能的寄存器; ⑤带移位功能的寄存器。 这些不同类型的寄存器都在时钟信号和相应控制信号(如“写使能”“三态门开启”“清 0”““) 3是数据通路中的暂存寄存器和 自增”左移/右移”的控制下完成信息存储功能。图5. 通用寄存器组的外部结构示意图。 图5. 3 暂存寄存器和通用寄存器组的外部结构 1)暂存寄存 器 3(a) writeenable) 如图5.所示,暂存寄存器有一个写使能(信号WE,当WE=0时,时 钟信号(CLK)边沿到来不会改变输出值;当WE=1时,时钟边沿到来后,经过Clk-to-Q时 ① 通用寄存器组(generalpurposeregisterset,GPRs), 有的英文原版教材用registerfiles表示,可译为寄存器组或 寄存器堆。 231 计算机组成与系统结构(第3版) 间的延迟,输出端(DataOut)开始变为输入端(DataIn)的值,表示输入信息被写入寄存器。 若数据通路中某个寄存器在每个时钟到来时都需要写入信息,则该寄存器无须WE 信号。 2)通用寄存器组 3(所示的通用寄存器组, 32 个暂存寄存器可以构成一个如图5.b) 每个寄存器地址是一 个5位的二进制编码。它有以下两个读口:busA和busB,分别由Ra和Rb 给出地址。读 操作属于组合逻辑操作,无须时钟信号控制,当地址Ra和Rb 到达后,经过一个“取数时间” 的延迟,在busA和busB上的信息开始有效。它还有一个写口:busW 上的信息写入的地 址由RW 指定。写操作属于时序逻辑操作,需要时钟信号CLK 的控制。在WE 为1的情况 下,时钟触发边沿到来后经过Clk-to-Q时间延迟,从busW 传来的值开始写入RW 指定的寄 存器中。 5.3 数据通路与时序控制 1. 指令执行过程中的每个操作步骤都有先后顺序,为了使计算机能正确执行指令,CPU 必须按正确的时序产生操作控制信号。由于不同指令对应的操作序列长短不一,序列中各 操作执行时间也不相同,因此,需要考虑用怎样的时序方式来控制。 1. 早期计算机的三级时序系统 早期计算机通常采用机器周期、节拍和脉冲三级时序对数据通路操作进行定时控制。 一个指令周期可分为取指令、读操作数、执行并写结果等多个基本工作周期,称为机器周期。 一个机器周期内要进行若干步操作。例如,存储器读周期有送主存地址、发送读写命 令、检测数据有无准备好、取数据等步骤。因此,有必要将一个机器周期再划分成若干节拍, 每个动作在一个节拍内完成。为了产生操作控制信号并使某些操作能在一拍时间内配合工 作,常在一个节拍内再设置一个或多个工作脉冲。 2. 现代计算机的时钟信号 现代计算机中,已不再采用三级时序系统,机器周期的概念已逐渐消失。整个数据通路 中的定时信号就是时钟信号,一个时钟周期就是一个节拍。 如图5.4所示,数据通路可看成由组合逻辑元件和状态元件交替组合而成,即数据通路 的基本结构为“…—状态元件—组合逻辑元件—状态元件—…” 。 图5. 4 数据通路和时钟周期 图5.4所示的数据通路中,虚线框内是组合逻辑元件,所有组合逻辑电路都从状态元件 接收输入,并将输出写入状态元件中。所有状态元件在同一时钟信号控制下写入信息。假 中央处理器 定采用下降沿(负跳变)触发,则所有状态元件在时钟下降沿到来时开始写入信息,经过触发 器的锁存延迟(即Clk-to-Q)后输出开始有效。假定每个时钟的下降沿是一个时钟周期的开 始时刻,则一个时钟周期内整个处理过程如下:经过Clk-to-Q时间,前一个时钟周期内组 合逻辑生成的信号被写入状态元件,并输出到随后的组合逻辑电路进行处理,经过若干级门 延迟,得到的处理结果被送到下一级状态元件的输入端,然后必须稳定一段时间(setuptime)才能开始下个时钟周期,并在时钟信号到达后还要保持一段时间(holdtime )。 假定各级组合逻辑电路的传输延迟(即最长延迟)为longestdelay,考虑时钟偏移(clock skew)①,根据上述分析可知,数据通路的时钟周期(cycletime)应为cycletime=Clk-to-Q+ longestdelay+setuptime+clockskew。假定各级组合逻辑电路中最短延迟为shortest delay,为了使数据通路能正常工作,则应满足以下时间约束:Clk-to-Q+shortestdelay> holdtime 。 5.单周期处理器设计 2 处理器设计涉及数据通路和控制电路的设计,其设计过程如下。 第1步:分析每条指令的功能。 第2步:根据指令的功能给出所需的元件,并考虑如何将它们互连。 第3步:确定每个元件所需控制信号的取值。 第4步:汇总所有指令涉及的控制信号,生成反映指令与控制信号之间关系表。 第5步:根据关系表,得到每个控制信号的逻辑表达式,据此设计控制电路。 一个指令系统常常有几十到几百条指令,实现一个完整指令系统的处理器是一项非常 复杂、烦琐的任务。为了能清楚说明处理器设计过程和基本原理,本节以实际的MIPS 指令 系统为例来说明。有关MIPS 指令系统参见4.1节,5再次给出了MIPS 的3种指令 3.图5. 格式。由于篇幅的限制,不可能介绍所有指令的实现,为此,选择了具有代表性的若干条 指 令作为实现目标 。 图5. 5 MIPS 指令格式 ① 时钟偏移(clockskew): 由于器件工艺和走线延迟等原因造成的同步系统中时钟信号的偏差,这种时间偏差使 得时钟信号不能同时到达不同的状态元件而导致同步定时错误,所以需要在时钟周期中增加时钟偏移时间来避免这种 错误。也有人把clockskew翻译为时钟扭斜或时钟歪斜。 331 第 章 计算机组成与系统结构(第3 版) 本节选择以下11条MIPS指令作为实现目标。 5条R-型指令: add rd, rs, rt sub rd, rs, rt subu rd, rs, rt slt rd, rs, rt sltu rd, rs, rt 5条I-型指令: ori rt, rs, imm16 addiu rt, rs, imm16 lw rt, rs, imm16 sw rt, rs, imm16 beq rs, rt, imm16 1条J-型指令: j target 这些指令比较具有代表性,包含了R-型、I-型和J-型3种类型指令;既有算术/逻辑运算 指令,又有取数/存数指令;既有条件转移指令,又有无条件转移指令;既有需要考虑溢出判 断的指令,又有无须考虑溢出的指令;既有对带符号数判断大小的指令,又有对无符号数判 断大小的指令。关于这些指令的介绍内容,涵盖了大部分指令的基本实现技术。 5.2.1 指令功能的描述 设计处理器的第一步先要确认每条指令的功能,表5.1给出了上述11条MIPS指令功 能的RTL描述。其RTL描述采用5.1.1节的规定。因为每条指令的第一步都是取指令并 PC加4,使PC指向下条指令,所以表中除第一条add指令外,其余指令都省略了对第一步 的描述。 表5.1 11条目标指令功能的RTL描述 指 令功 能说 明 addrd,rs,rt subrd,rs,rt M[PC],PC←PC+4 R[rd]←R[rs]± R[rt] 从PC所指的内存单元中取指令,并PC加4 从rs、rt中取数后相加减,若溢出则异常处 理,否则结果送rd suburd,rs,rt R[rd]←R[rs]-R[rt] 从rs、rt中取数后相减,结果送rd(不进行溢 出判断) sltrd,rs,rt if(R[rs]<R[rt]) R[rd]←1 elseR[rd]←0 从rs、rt中取数后按带符号整数来判断两数 大小,小于则rd中置1,否则,rd中清0(不进 行溢出判断) slturd,rs,rt if(R[rs]<R[rt]) R[rd]←1 elseR[rd]←0 从rs、rt中取数后按无符号数来判断两数大 小,小于则rd中置1,否则,rd中清0(不进行 溢出判断) 134 中央处理器 第 续表 5 章 531 指令功能说明 orirt,rs,imm16 R[rt]←R[rs]|ZEXT(imm16) 从rs取数、将imm16进行零扩展,然后两者 按位或,结果送rt addiurt,rs,imm16 R[rt]←R[rs]+SEXT(imm16) 从rs取数、将imm16进行符号扩展,然后两 者相加,结果送rt(不进行溢出判断) lwrt,rs,imm16 Addr←R[rs]+SEXT(imm16) R[rt]←M[Addr] 从rs取数、将imm16进行符号扩展,然后两 者相加,结果作为访存地址Addr,从Addr中 取数并送rt swrt,rs,imm16 Addr←R[rs]+SEXT(imm16) M[Addr]←R[rt] 从rs取数、将imm16进行符号扩展,然后两 者相加,结果作为访存地址Addr,将rt送 Addr中 beqrs,rt,imm16 Cond←R[rs]-R[rt] if(Condeq0) PC←PC+4+(SEXT(imm16)×4) 做减法以比较rs和rt中内容的大小,并计算 下条指令地址,然后根据比较结果修改PC。 转移目标地址采用相对寻址,基准地址为下 条指令地址(即PC+4),位移量为立即数 imm16经符号扩展后的值的4倍。因此,转 移目标指令的范围为相对于当前指令的前 32767到后32768条指令 jtarget PC←PC<31:28>||target<25:0> ||00 第一步无须进行PC+4而直接计算目标地 址,符号||表示“拼接”,PC最后两位为00 2.数据通路的设计 5.2 在对所有指令进行功能分析的基础上,可以进行数据通路的设计。为简化数据通路设 计,假定所用的数据存储器和指令存储器皆为一种理想存 储器。如图5.理想存储器有一个32位数据输入端 6所示, DataIn,一个32位数据输出端DataOut,还有一个读写公用 的地址输入端Addres 。控制信号有一个写使能信号WE, 写操作受时钟信号CLK的控制,假定采用下降沿触发,即 在时钟下降沿开始写入信息。图5. 6 理想存储器外部结构 该理想存储器的读操作是组合逻辑操作,即在地址 Addres 有效后,经过一个“取数时间”,数据输出端DataOut上数据有效;写操作是时序逻 辑操作,即在WE为1的情况下,当时钟CLK边沿到来时,DataIn开始写入存储单元中。 1.算术逻辑部件的设计 上述11条指令涉及带溢出判断的加法和减法、带符号整数的大小判断、无符号整数的 大小判断、相等判断以及各种逻辑运算等。为了支持这11条指令包含的运算,ALU必须具 有相应的功能。 图5. 7给出了一个实现上述11条指令中运算的ALU 。该ALU的输入为两个32位操 作数A和B,其中,核心部件是加法器,加法器的输出除两个数的和Add-Result以外,还有 631 计算机组成与系统结构(第3版) 进位标志Add-cary、零标志Zero、溢出标志Add-Overflow和符号标志Add-Sign。有关加 法器的实现可参见第3章内容。在操作控制端ALUctr的控制下,在ALU中执行加、减、按 位或、带符号整数比较小于置1和无符号数比较小于置1等运算,Result作为ALU运算的 结果被输出,同时,零标志Zero和溢出标志Overflow也被作为ALU的结果标志信息输出。 图5. 711条目标指令的ALU实现 从图5.ALU的操作由一个“产生的控制信 7可以看出,ALU操作控制信号生成部件” 号来控制,其输入是ALUctr,输出有4个控制信号:①SUBctr用来控制ALU执行加法还 是减法运算,当SUBctr=1时,做减法,当SUBctr=0时,做加法;②OPctr用来控制选择哪 种运算的结果作为Result输出,因为所实现的11条指令中只可能有加/减、按位或、小于置 1这3种运算,所以OPctr有两位;③OVctr用来控制是否要进行溢出判断,当OVctr=1 时,进行溢出判断,此时,若结果发生溢出,则溢出标志Overflow为1,当OVctr=0时,无须 溢出判断,此时,即使结果发生溢出,溢出标志Overflow也不为1;④SIGctr信号控制ALU 是执行“带符号整数比较小于置1”还是“无符号数比较小于置1功(”) 能,当SIGctr=0,则执行 “无符号数比较小于置1,(”) 当SIGctr=1时,则执行“带符号整数比较小于置1”。 根据表5.1列出的每条指令的功能,可以了解到各条指令在ALU中所进行的运算,由 此可列出各条指令对应的4种ALU操作控制信号取值,如表5.2可知,u、 2所示。 从表5.指令addilw、sw和beq转移目标地址计算的ALU控制信号取值一 样,都是进行加法运算并不判溢出,记为addu操作;指令subu和beq判0操作的ALU控制 信号可看成一样,都做减法运算并不判溢出,记为subu操作。因此,这11条指令可以归纳 为以下7种操作:addu、add 、or、subu、sub、sltu、slt,需要3位对其进行编码,因而ALU的 中央处理器 第 表5. 2 11 条目标指令对应的4种ALU 操作控制信号取值 5 章 731 指令功能运算类型SUBctrOPctr OVctrSIGctr addrd,rs,rt R[rd]←R[rs]+R[rt] 加(判溢出) 0 00 1 × subrd,rs,rt R[rd]←R[rs]-R[rt] 减(判溢出) 1 00 1 × suburd,rs,rt R[rd]←R[rs]-R[rt] 减(不判溢出) 1 00 0 × sltrd,rs,rt if(R[rs]<R[rt]) R[rd]←1 elseR[rd]←0 减(不判溢出) 带符号整数比 较大小1 10 0 1 slturd,rs,rt if(R[rs]<R[rt]) R[rd]←1 elseR[rd]←0 减(不判溢出) 无符号数比较 大小1 10 0 0 orirt,rs,imm16 R[rt]←R[rs]|ZEXT(imm16) 按位或(不判 溢出) × 01 0 × addiurt,rs,imm16 R[rt]←R[rs]+SEXT(imm16) 加(不判溢出) 0 00 0 × lwrt,rs,imm16 Addr←R[rs]+SEXT(imm16) R[rt]←M[Addr] 加(不判溢出) 0 00 0 × swrt,rs,imm16 Addr←R[rs]+SEXT(imm16) M[Addr]←R[rt] 加(不判溢出) 0 00 0 × beqrs,rt,imm16 Cond←R[rs]-R[rt] 减(判0) 1 ×× 0 × if(Condeq0) PC←PC+(SEXT(imm16)×4) 加(不判溢出) 0 00 0 × jtarget PC<31:2>←PC<31:28>|| taret<25:0> 无须ALU 运算× ×× × × g 注:×表示无论取什么值都不影响运算结果。 操作控制输入端ALUctr至少有三位。 在对ALUctr进行编码时,可以根据这些ALU 操作和4种ALU 操作控制信号的对应 关系进行优化,例如,把加减控制(SUBctr)、溢出判断(OVctr)和符号控制(SIGctr)等信号 分别对应到不同的位来进行控制。表5.tr的一种三位编码方案。 3给出了ALUc 表5.r的三位编码及其对应的操作类型和ALU 控制信号 3 ALUct ALUctr<2:0> 操作类型SUBctr OVctr SIGctr OPctr<1:0> OPctr的含义 000 addu 0 0 × 00 选择加法器的结果输出 001 add 0 1 × 00 选择加法器的结果输出 010 or × 0 × 01 选择“按位或”结果输出 011 (未用) 100 subu 1 0 × 00 选择加法器的结果输出 101 sub 1 1 × 00 选择加法器的结果输出 110 sltu 1 0 0 10 选择小于置位结果输出 111 slt 1 0 1 10 选择小于置位结果输出 计算机组成与系统结构(第3 版) 根据表5.3得到各输出控制信号的逻辑表达式如下: SUBctr=ALUctr<2> OVctr=!ALUctr<1>&ALUctr<0> SIGctr=ALUctr<0> OPctr<1>=ALUctr<2>& ALUctr<1> OPctr<0>=!ALUctr<2>ALUctr<1>& !ALUctr<0> 根据上述逻辑表达式,不难实现图5.7中的“ALU 操作控制信号生成部件”。 如果要实现更多指令,则ALU 必须支持更多的运算,如取负(neg)、取反(not)、与 (and)、异或(xor)、或非(nor)等,如果在ALU 中考虑所有这些情况的话,需在图5.7所示的 ALU 中增加相应的取负、按位取反、按位与、按位异或、按位或非等逻辑电路,同时ALU 输 出结果选择控制信号OPctr的位数需扩充到至少3位,ALUctr的位数需扩充到4位。 2.取指令部件的设计 从上述指令功能的RTL描述中,可以看出,每条指令的第一步都是完成取指令并计算 图5.8 取指令部件示意图 下条指令地址的功能。因此,在数据通路中,需要 专门设计一个取指令部件来完成上述功能。 图5.8是取指令部件的示意图。假定指令专门 存放在指令存储器中,它只有读操作,读指令操作 可看成组合逻辑操作,因此无须控制信号的控制, 只要给出指令地址,经过一定的“取数时间”后,指 令被送出。指令的地址来自PC,有专门的下地址 逻辑来计算下条指令的地址,然后送PC。因为是 单周期处理器,每个时钟周期执行一条指令,所以 每来一个时钟,PC的值都会被更新一次,因而,PC 无须“写使能”信号控制。下地址逻辑中,要区分是顺序执行还是转移执行。若是顺序执行, 则执行PC+4;若是转移执行,则要根据当前指令是分支指令还是跳转指令来计算转移目标 地址。 3.R-型指令的数据通路 图5.9是R-型指令相关的数据通路示意图,用它可以完成对两个寄存器Rs和Rt内容 的运算并将结果写入Rd寄存器。像add和sub等指令还要判断结果是否溢出,只有不溢 出时才写结果到Rd,否则转异常处理程序执行。 指令中Rs和Rt是两个源操作数寄存器编号,Rd是目的寄存器编号,因此,寄存器堆 的两个读地址端Ra和Rb应分别与Rs和Rt相连,写地址端Rw与Rd相连。ALU 运算结 果连到寄存器堆的写数据端busW,控制信号RegWr为“写使能”信号,只有在RegWr信号 为1且不溢出的情况下,运算结果才写入寄存器堆,显然R-型指令执行时,RegWr信号应该 为1。11条目标指令中有5条R-型指令:add、sub、subu、slt和sltu,根据表5.2可知,它们分 别对应ALU 的5种操作:add、sub、subu、slt和sltu,因此,可根据不同的指令,控制将不同 的操作编码送到ALU 操作控制端ALUctr,以便在ALU 中进行不同指令所对应的运算。 当前时钟周期内执行的运算结果总是在下一个时钟到来时,开始写到寄存器堆中。为 138