Appearance

第 8 章 中央处理器

第一讲 中央处理器概述

指令执行过程

组成指令功能的四种基本操作

  • 读取主存,写入寄存器(读数、取数)
  • 读取寄存器,写入主存(存结果)
  • 读取寄存器,写入到另一寄存器或 ALU(取数、存结果)
  • 逻辑和算数运算(PC+1、计算地址、运算)

CPU 的基本组成

  • 执行部件 - 数据通路(Datapath)
    • ALU、GPRs、数据通路等所有执行指令的功能部件,是指令执行过程中,数据经过的路径
  • 控制部件 - 控制器(Control Unit)
    • 指令译码器和控制信号生成器、IR、PC,负责对指令进行译码,生成指令对应的控制信号,控制数据通路的动作

数据通路的基本结构

  • 数据通路由两类元件组成
    • 组合逻辑元件(操作元件)
    • 时序逻辑元件(状态元件、存储元件)
  • 连接方式
    • 总线连接方式
    • 分散连接方式
  • 功能
    • 进行数据存储、处理、传送
  • 定义:数据通路是由操作元件和组合元件通过总线或分散链接方式,进行数据存储、处理、传送

操作元件:组合逻辑电路

加法器、算术逻辑部件、多路选择器、译码器(特指 n2n 译码器)

  • 均为组合逻辑电路,输出只取决于当前的输入
  • 所有输入到达后,经过一定的逻辑门延时,输出端改变,并保持到下一次改变,不需要时钟信号

状态元件:时序逻辑电路

特点:

  • 具有存储功能,在时钟控制下输入被写入到电路中,直到下一个时钟到达
  • 输入端状态决定何时被写入,输出端状态随时可以读出 定时方式:规定信号何时写入状态元件或何时从状态元件读出
  • 边沿触发(edge-triggered):值只在时钟边沿改变,每时钟周期改变一次
    • 上升沿触发(rising edge)
    • 下降沿触发(falling edge)
D 触发器

  • 建立时间(Setup Time):边沿之前输入 D 必须稳定的时间
  • 保持时间(Hold Time):边沿之后输入 D 必须保持的时间
  • Clock-to-Q time(锁存延迟(Latch Prop)、触发器传播延迟):在时钟边沿,输出并不能立即变化

存储元件

  • 寄存器
    • 有一个写使能(Write Enable-WE)信号
      • 0:时钟边沿到来时,输出不变
      • 1:时钟边沿到来时,输出开始变为输入
    • 若每个时钟边沿都写入,则不需要 WE 信号
  • 寄存器组
    • 两个读口(组合逻辑操作)
    • 一个写口(时序逻辑操作):写使能为 1 的情况下,始终边沿到来时,busW 传来的值开始被写入到 RW 指定的寄存器中
  • 理想存储器(idealized memory)
    • 结构
      • Data Out:32 位读出数据
      • Data In:32 位写入数据
      • Address:读写共用一个 32 位地址
    • 读操作(组合逻辑操作)
    • 写操作(时序逻辑操作)

数据通路与时序控制

  • 同步系统(Synchronous system)
    • 所有动作有专门的时序信号来定时
    • 由时序信号规定何时发出什么动作
  • 时序信号:通讯系统中用于进行同步控制的定时信号,如时钟信号
  • 指令周期:取并执行一条指令的时间,每条指令的指令周期未必相同
  • Cycle Time = Clk-to-Q + Longest Delay Path + Setup Time
    • 约束条件:(Clk-to-Q + Shortest Deylay) > Hold Time

计算机性能与 CPU 时间

  • 计算机有两种不同的性能
    • Time to do the task
      • 响应时间(response time)
      • 执行时间(execution time)
      • 等待时间或时延(latency)
    • Tasks per day, hour, sec, ns ...
      • 吞吐率(throughput)
      • 带宽(bandwidth)
  • 基本性能评价标准:CPU 的执行时间

计算机性能的测量

使用执行时间来衡量:

  • 程序往往被多个程序共享使用,因此,用户感觉到的程序执行时间,并不是程序真正的执行时间
  • 通常把用户感觉到的响应时间分成以下两个时间:
    • CPU 时间:指 CPU 真正花在程序执行上的时间,包括:
      • 用户 CPU 时间:用来运行用户代码的时间
      • 系统 CPU 时间:为了执行用户程序而需要运行操作系统程序的时间
    • 其他时间:指等待 I/O 操作完成或 CPU 花在其他用户程序的时间
  • 系统性能和 CPU 性能不等价
    • 系统性能(System performace)
    • CPU 性能(CPU performance)

CPU 执行时间的计算

CPI :Cycles Per Instruction
CPU=CPU×=÷=×CPI×CPU=×CPICPI=CPU

CPI 用来衡量以下各方面的综合结果:

  • 指令集(ISA)
  • 微体系结构
  • 程序(编译器、算法)
CPU==××=×CPI×
指令个数CPI时钟频率
编程XX
编译器X(X)
指令集设计XX
微结构XX
电路/器件工艺X
CPI 的计算

假定 CPIiCi 分别为第 i 类指令的 CPI 和指令条数,则程序的总时钟数为:i=1nCPIi×Ci,故 CPU=×i=1nCPIi×Ci 假定 Fi 表示各指令 CPI 在程序中出现的频率,则程序的总和 CPI 为:CPI=i=1nCPIi×Fi, where Fi=CiInstruction Count 已知 CPU 时间、时钟频率、总时钟数、指令条数,则程序的平均 CPI 为:CPI=CPU×=

单靠 CPI 无法反应 CPU 性能!

早期性能指标

定点指令执行速度:MIPS=Instruction CountSecond×106 浮点操作速度:MFLOPS=FP OperationsSecond×106

第二讲 单周期数据通路设计

实现目标概述(RV32I 中的 9 条指令)

设计处理器的步骤

ISA 确定后,进行处理器设计的大致步骤

  1. 分析每条指令的功能,并用 RTL(Register Transfer Language)来表示
  2. 根据指令的功能给出所需的元件,并考虑如何将它们互连
  3. 确定每个元件所需控制信号的取值
  4. 汇总所有指令所涉及到的控制信号,生成一张反映指令与控制信号之间的表
  5. 根据表得到每个控制信号的逻辑表达式,据此设计控制器电路
1-3 为数据通路设计,3-5 为控制器的设计

数据通路的实现目标包括:

  • 3 条 R 型指令:
    • add rd, rs1, rs2
    • slt rd, rs1, rs2 (Set on Less Than)
    • sltu rd, rs1, rs2 (Set on Less Than Unsigned)
  • 2 条 I 型指令:
    • ori rd, rs1, imm12(Or Immediate)
    • lw rd, rs1, imm12(Load Word)
  • 1 条 S 型指令
    • sw rs1, rs2, imm12(Save Word)
  • 1 条 B 型指令
    • beq rs1, rs2, imm12(Branch on Equal)
  • 1 条 U 型指令
    • lui rd, imm20(Load Upper Immediate)
  • 1 条 J 型指令
    • jal rd, imm20(Jump & Link) 每条指令的第一步都是取指令并 PC+=4,I 型指令的立即数为符号扩展,即使是逻辑运算,也有符号扩展。

扩展器部件的设计

  • 作用:处理立即数,结构为:
    • 立即数拼接器:根据指令格式,对指令中的立即数进行拼接和符号扩展,形成 32 位立即数。
    • ExtOp:控制选择和输入指令相匹配的立即操作数输出
  • 电路实现:
    • 直接连导线即可实现拼接和符号扩展的功能
    • 使用可编程逻辑器件也可以实现这些功能
  • 注意:
    • B-型和 J-型指令的最后一位会在符号扩展时补 0,等价于进行了左移 1 位的操作

算术逻辑部件的设计

  • 作用:实现 add, or, slt, sltu, srcB 操作
  • 功能:
    • ALUctr = add 时,OPctr = 00
    • ALUctr = or 时,OPctr = 01
    • ALUctr = scrB 时,OPctr = 10(此时是直接输出操作数 B)
    • ALUctr = slt/sltu 时,Opctr = 11
  • 对应指令:
    • add, lw, sw, jal 指令:使用 add 操作
    • ori 指令:使用 or 操作
    • slt, sltu 指令:分别对应 slt 和 sltu 操作
    • lui 指令:使用 srcB 操作(电路设计导致)
    • beq 指令:使用 sub 操作判断 0
  • 电路实现:使用组合逻辑电路即可实现

取指令部件的设计

  • 作用:每条指令都有的公共操作:
    • 取指令:M\[PC]
    • 更新 PC:PC ← PC + 4
    • 转移时,PC 内容再次被更新为“转移目标地址”
  • 结构:
  • 电路实现:使用时序逻辑电路

R-型指令的数据通路

  • add, slt, slut 功能:R[rd] ← R[rs1] op R[rs2]
  • 操作:
    • 根据 PC 读取指令
    • 将以下字段送控制器:
      • 操作码 opcode
      • 功能码 funct3
    • 将以下字段送 GPRs:
      • rs1 送 Rs1 输入端
      • rs2 送 Rs2 输入端
      • rd 送 Rd 输入端
  • 有关控制器信号:
    • RegWr:寄存器写入控制
    • ALUctr:ALU 操作控制

I-型指令的数据通路

  • ori 功能:R[rd] ← R[rs1] or SEXT(imm12)
  • 有关控制器信号:
    • RegWr:寄存器写入控制
    • ALUctr:ALU 操作控制
    • ALUBSrc:操作数 B 的选择
    • ExtOp:扩展器操作数控制,为 immI

U-型指令的数据通路

  • lui 功能:R[rd] ← imm20||000H
  • 操作:直接将扩展器的结果输出给 R[Rd]
  • 有关控制器信号:
    • RegWr:寄存器写入控制
    • ALUctr:ALU 操作控制,为 srcB
    • ALUBSrc:操作数 B 的选择
    • ExtOp:扩展器操作数控制,为 immU
    • (如果需要使用到 PC,则还有一个额外电路控制 PC 的输入)

Load/Store 指令的数据通路

  • lw 指令(I-型)功能:R[rd] ← M[R[rs1]] + SEXT(imm12)
  • sw 指令(S-型)功能:M[R[rs1]]+SEXT(imm12) ← R[rs2]
  • 有关控制器信号:
    • RegWr:寄存器写入控制
    • ALUctr:ALU 操作控制,为 srcB
    • ALUBSrc:操作数 B 的选择
    • ExtOp:扩展器操作数控制,为 immI/immS
    • MemWr:存储器写入控制
    • MemtoReg:控制寄存器写入来源

B-型指令的数据通路

  • beq 功能:条件跳转
if(R[rs1] == R[rs2])
    PC ← PC + (SEXT(imm12)×2)
else PC ← PC + 4
  • 有关控制器信号:
    • Branch:接入取指令部件的下地址逻辑中,用来控制跳转
    • ExtOp:扩展器操作数控制,为 immB
  • 下地址逻辑:由多路选择器、加法器、与门实现

J-型指令的数据通路

  • jal 功能:PC ← PC + SEXT(imm[20:1]<<1); R[rd] ← PC + 4
  • 有关控制信号:
    • Jump:接入下地址逻辑中,用来控制跳转
    • ExtOp:扩展器操作数控制,为 immJ
  • 地址的计算:
    • PC+SEXT(imm[20:1]<<1) 在下地址逻辑的加法器中完成
    • R[rd] ← PC+4 在算术逻辑部件中实现
    • ALUBSrc 因此扩展成两位,结果一般存储在 x0 中

完整的单周期数据通路

第三讲 单周期控制器的设计

指令开始时取指令部件中的动作

取指令:Instruction ← M[PC]

  • 对所有指令都相同
  • 新指令取出后还没有译码,所以控制信号的值还是原来指令的旧值

指令译码后 R-型指令操作过程

RegWrExtOpALUctrALUASrcALUBSrc
add rs1, rs2, rd1xadd00
slt rs1, rs2, rd1xslt00
sltu rs1, rs2, rd1xsltu00
JumpBranchMemWrMemtoReg
add rs1, rs2, rd0000
slt rs1, rs2, rd0000
sltu rs1, rs2, rd0000
  • I-型,U-型与 R-型时序类似,只有控制信号上的差异

指令译码后 Load/Store 指令操作过程

  • lw 指令涉及访问主存,消耗的时间较大

时钟周期的确定

  • 找数据通路中的关键路径

第四讲 多周期处理器的设计

多周期处理器思想

  • 单周期处理器时钟周期必须以最复杂的指令所需时间为准,过长
  • 解决思路:
    • 将指令执行分为多个阶段,每个阶段在每个时钟周期内完成
      • 时钟周期以最复杂的阶段所花时间为准
      • 尽量分成大致相等的若干阶段
      • 规定每个阶段最多只能完成一次访存或一次 GPRs 读写或一次 ALU 运算
    • 每步都设置状态单元,每步执行结果都在下个时钟开始保存到相应单元
  • 多周期处理器的好处:
    • 时钟周期短
    • 不同指令所用周期数可以不同,如 Load:5 周期,Jump:3 周期
    • 允许功能部件在一条指令执行过程中被重复使用,如
      • Adder + ALU(多周期时只用一个 ALU,在不同周期可重复使用)
      • Inst. / Data mem(多周期时合用,不同周期中重复使用)

实现举例:简单指令系统

只有一种指令格式:

可实现如下功能:

  • R-型:R[Rt]←R[Rs] op R[Rt],两个寄存器内容运算,结果送寄存器
  • I-型运算:R[Rt]←R[Rs] op EXT[imm16],寄存器内容和立即数计算
  • Load:R[Rt]←M[R[Rs]+imm16],地址为寄存器内容加立即数
  • Store:M[R[Rs]+SEXT[imm16]]←R[Rt],地址为寄存器内容加立即数
  • Jump:PC←PC+SEXT[imm16],跳转目标地址为PC内容加立即数 得到有限状态机:

多周期控制器的实现

多周期控制器无法用组合逻辑电路设计出,应当是一个时序逻辑电路。实现方式有两种:

  • 用硬连线路(PLA)实现
    • 初始表示(有限状态机)→顺序控制(次态方程)→逻辑表示(逻辑函数)→实现技术(PLA+触发器)
  • 用 ROM 存放微程序实现
    • 初始表示(微程序)→顺序控制(微程序计数器+ROM 存储器)→逻辑表示(真值表)→实现技术(ROM)

硬连线控制器

  • 优点:速度快,适合简单或规整的指令系统
  • 缺点:很难处理复杂指令系统,结构复杂,实现困难;修改、维护不易;灵活性差。有些比较复杂的逻辑无法用有限状态机描述。

微程序控制器

  • 基本思想:仿照程序的设计方法,编制每个指令对应的微程序
  • 输入:指令、条件码;输出:控制信号(微命令)

带异常处理的处理器设计

  • 遇到异常时的基本处理:
    • 关中断(“中断/异常允许”状态位清零):使处理器处于“禁止中断”状态,以防止新异常(或中断)破坏断点、程序状态和现场(指的是通用寄存器的值)
    • 保护断点和程序状态:将断点和程序状态保存到堆栈或特殊的寄存器中,即:
      • PC→栈或专门存放断点的寄存器。
      • PSWR→栈或 EPSWR(专门保存程序状态的寄存器)
        • PSW(程序状态字):包括条件码、中断码、状态位等
    • 识别异常状态:分为软件识别和硬件识别(向量中断方式)
      • 软件识别:设置一个异常原因寄存器 (如 RISC-V 中的 Cause 寄存器),用于记录异常原因。操作系统使用一个统一的异常处理程序,按照优先级顺序查询异常状态寄存器,识别出异常事件。
      • 硬件识别(向量中断):每个异常和中断都有一个异常/中断号,据此号,到中断向量表(中断描述符表)中读取对应的具体的中断服务程序的入口地址。

举例:多周期处理器的异常和中断处理

  • 引入两个寄存器:
    • EPC:32 位,存放断点(异常处理后返回到的指令地址)
      • 写入 EPC 的断点可能是正在执行的指令的地址,也可能是下一条指令的地址。前者需要 PC-4,后者直接送 PC
    • Cause:32 位,记录异常原因
  • 引入两个写使能信号:
    • EPCWr:保存断点时该信号有效
    • CauseWr:在处理器发现异常时,该信号有效

第五讲 流水线数据通路和控制

使用流水线数据通路设计可以大幅提高多条指令的执行时间,但也会带来一些设计上的复杂性、冲突、竞争等。

流水线方式下,单条指令执行时间不能缩短(反而可能会提升),但能大大提高指令吞吐率。