第四章 处理器

在本章中, 我们将讨论现代计算机中央处理器的组成以及工作方式, 我们会从单周期CPU开始, 逐步扩展到现代的流水线CPU.

序言: 计算机抽象

image-20251028235219569

在计算机系统中, 我们编写的高级语言程序(High Level Language Program)被编译器编译为汇编代码(Assembly Language), 再由汇编器翻译为机器语言(Machine Language). 机器语言被CPU中的硬件架构处理, 而这些架构又是由一个个逻辑门电路组成的.

在第三章中, 我们已经讨论了门电路是如何组成ALU(Arithmetic Logical Unit)等原件的. 在本章中, 我们会聚焦于CPU是如何通过这些抽象的元件进行组合, 完成译码, 存取数据等一系列操作的.

CPU Overview

单核处理器的基本组成

image-20251029000157742

一个单核处理器包含数据通路控制通路两部分.

数据通路是负责处理和传输数据的硬件集合, 其主要包括:

  • 寄存器文件 (Register File, RF)
  • 主内存 (Main Memory)
  • 算数逻辑单元 (ALU)
  • 立即数生成器 (Immediate generator)

而控制通路是负责产生时序和控制信号的硬件集合, 主要包括:

  • 主控制单元 (Main Control Unit)
  • ALU 控制单元(ALU Control Unit)

稍后我们会详细讨论这些硬件是如何组成CPU的.

CPU处理指令的基本流程

image-20251029003238645

  • 指令内存(Instruction Memory)从PC中取出指令地址, 将指令送往不同的其他硬件:

    • 寄存器文件
    • ALU
  • 寄存器文件读取寄存器的值

  • ALU进行计算, 这里的计算主要分为以下几种类型

    • R-typeI-type 指令进行的算数运算

    • J-typeB-type 指令进行的跳转地址计算

    • 对访存指令进行的访存地址计算

  • 读取内存/写入内存

  • 写入寄存器文件

  • 更新PC

控制信号

image-20251029005231413

除了数据通路外, 还有大量控制信号控制CPU的行为. 其主要包括:

  • RegWrite (控制是否写寄存器)
  • Memread(是否读内存)
  • Memwrite(是否写内存)
  • Zero (ALU 计算的值是否为0)
  • ALUop (用于控制ALU进行的运算类型)

我们后续会详细关注这些指令的用途和实现.

时序逻辑

逻辑设计基础

在逻辑电路中:

  • 数据用电压的高低表示, 低电平表示0, 高电平表示1.

  • 每一条线路表示一个比特.

  • 多比特的数据由多条线路组成的 总线 (Bus)传输.

组合逻辑与时序逻辑:

  • 每个组合逻辑电路相当于一个函数, 输出是输入的函数.
  • 时序逻辑电路储存输入的值.

组合电路主要包含 ALU, Adder, Mux, 与门, 或门等. 我们这里主要讨论时序逻辑.

时序元件

寄存器是一个时序逻辑元件.

image-20251029082049557

在时钟上升沿, 寄存器检查输入端D的值, 并且判断Write 信号是否为True, 当输入信号发生改变, 且Write 信号为时, 寄存器的值发生改变.

而在每一个时钟周期内部, 组合逻辑操纵数据. 数据从一个状态元件前往另一个状态元件. 这个过程不涉及改变任何时序逻辑元件的输出.

而时钟周期的长度由组合逻辑中最长的线路决定.

单周期处理器设计

数据通路(Datapath)

这个部分中, 我们会通过以下几个步骤, 一步步搭建出一个简单处理器的数据通路.

  • 取指 (Instruction Fetch)
  • R-type
  • B-type

取指

image-20251029083932879

时钟上升沿, PC接收Add 送来的数据, 并且更新输出端的数据, 将新的PC值同时送往:

  • Add
  • 指令内存(Instruction Memory)

指令内存是一个组合电路, 在接收PC的值后经过一个较短的延迟, 输出稳定为本次要执行的指令.

R-type

R-format 指令具有以下特征:

  • 读两个寄存器值作为输入
  • ALU 进行算数/逻辑运算
  • 将计算的结果存入寄存器文件 (Register File, RF)

因此, 我们将以下组合元件加入CPU:

Registers

image-20251029100111168

寄存器从指令内存接受输入, 包括:

  • Read register 1 / 2
  • Write register
  • Opcode, RegWrite等控制信号

并且给出输出:

  • Read data 1/2
ALU

image-20251029100540198

接受 ImmediateRead data, 通过 ALU op 控制行为进行输出.

输出包括:

  • Zero, 表示计算结果是否为0
  • ALU result, 计算结果.

Load/Store Instructions

在此类指令中, 我们有了计算立即数地址的需求, 因此引入新的组合元件 ImmGen

image-20251029101301853

其以完整的32位指令作为输入, 以扩展(符号扩展或逻辑扩展, 取决于指令类型)后的立即数作为输出.

在输入指令无立即数需求时, 其输出通常为全0

以及组合元件 数据内存

image-20251029103058139

AddressALU 计算而来.

image-20251029103747586

处理完几类主要的datapath 后, 得到的Full Datapath 如图所示.

控制通路(control path)

ALU Control

ALUop是从opcode 中取出的两位ALU控制码, 其用于生成ALU control, 用于决定ALU的 运算类型.

image-20251029104719878

  • ALU op00时, 表示操作类型为 ldsd执行加法, ALU control0010

  • ALU op01 时, 表示操作类型为branch on equal (B-type), 执行减法, ALU control0110.

  • ALU op10 时, 表示操作类型为 R-type, 继续由 Funt3Funt7 确定具体的ALU control.

    其具体的真值表为:

    image-20251029111653431

多重控制信号

一般而言, 单周期CPU中的控制信号有:

  • ALUSrc(ALU Source), 用于决定ALU的第二个输入是来自:

    • 若其为0: 寄存器文件, 用于执行R-format 指令
    • 若其为1: 立即数, 用于执行 S-format, I-format, B-format指令等.
  • MemtoReg 决定RegWrite的入口, 是从内存中读取的数据还是ALU的计算结果

  • BranchZero 这两个信号通常连接到一个与门的两个输入端, 用于决定PCSrc.

路径延迟

计算CPU执行某种类型的指令的延迟, 必须确定数据通路中最长的一条的长度.

image-20251029230117184

R-type 为例:

  • 最长数据通路为PC -> IM -> RF -> rs2 -> MUX1 -> ALU -> MUX2->writeData

  • 如果要计算延迟, 即PC输出稳定至writeData 输入稳定, 即250 + 150 + 200 + 25 + 25 = 700ps

  • 如果要计算周期长度, 那么还要加上50ps的寄存器搭建和读取时间.