第 5 章 · CPU 结构与数据通路

ISA 翻译成硬件:**数据通路(datapath)**是数据流的路,控制器决定每周期数据往哪流——两种控制方式、单周期 vs 多周期、指令周期划分。

5.1 寄存器组:可见 vs 不可见

  • 程序员可见(ISA 规定,第 4 章):通用寄存器(rax/rbx…、x0~x31)、PC(指向下一条指令)、SP(栈指针)。
  • 程序员不可见(微架构内部)
    • IR(指令寄存器):锁存当前指令。
    • MAR(存储器地址寄存器):锁存要访问的内存地址。
    • MDR(存储器数据寄存器):锁存与内存交换的数据(也叫 MBR)。

注意:内存异步且慢(第 7、8 章),CPU 不能边算边等。MAR/MDR 作边界锁存器把「发地址/数据」与「等内存响应」拆成两阶段,让状态在时钟沿稳定——跨异步边界的信号必须寄存。

5.2 控制器:硬布线 vs 微程序

控制器把 IR 里的 opcode 译成控制信号(寄存器写使能、ALU 功能选择、存储器读写…):

硬布线控制微程序控制
原理组合逻辑门直接由 opcode 算出控制信号把每条指令对应一段「微指令」序列,存在控制存储器里
速度快(一层门)慢(多查几次 ROM)
可改改指令要重设计电路改微程序即可,灵活
复杂度指令多则逻辑爆炸规则、可扩展
典型RISC(RISC-V/ARM)早期 CISC(x86 复杂指令)

对比:硬布线 = 为每条指令焊死专用逻辑;微程序 = 用一个只读程序解释指令,本质是「CPU 里又套一层解释器」(同构第 1 章层次结构)。现代折中:简单指令硬布线快跑,复杂指令(rep movsb、复杂寻址)走微码。

5.3 数据通路:数据怎么流

一条 add r1, r2, r3(r1 = r2 + r3)单周期的数据流:

PC ──▶ 取指令 ──▶ IR(指令寄存器)
                     │
        r2 ──▶ ┐     │  opcode 译码
        r3 ──▶ ┼──▶ ALU ──▶ r1(写回)
                │
              控制信号(选通各数据源/目的地)

节点间用总线或专用连线,控制信号像扳道岔。两个关键:多路选择器(MUX) 在多个数据源里选一个进 ALU;寄存器文件同时读两个、写一个(一周期 rd = rs1 op rs2)。

5.4 单周期 vs 多周期

一条指令一个时钟周期完成 = 单周期;拆多个周期 = 多周期。这是第 6 章流水线的前身。

单周期多周期
周期数/指令1若干(取指/译码/执行/访存…)
时钟周期长度最慢指令决定(load 要访存+ALU)最慢的阶段决定,周期可更短
功能部件每条指令独占整个通路不同阶段复用同一部件(ALU 被取指、执行共用)
性能简单,但浪费——快指令也要等慢指令CPI 大但周期短,净收益通常更好
硬件部件不能复用,冗余部件复用,省面积

注意:单周期的死穴是木桶效应——周期必须容纳最长的 load(取指+读寄存器+访存+写回),快指令大量空等。多周期拆长指令、周期变短,但 CPI 变大。流水线(第 6 章)两全其美:周期短 + 吞吐 1 IPC。

5.5 指令执行周期

从取指到完成,一条指令的标准生命周期(也是流水线五级雏形):

① 取指周期   MAR←PC,读内存,IR←MDR,PC←PC+1(顺序)
② 间址周期   若寻址方式需要,再访存取操作数地址
③ 执行周期   操作数进 ALU 运算
④ 中断周期   若检测到中断请求,保存现场、转中断服务(第 9 章)

只有访存指令(load/store)才需完整的「访存」步骤——故单周期按 load 定周期是浪费。

对比:PC←PC+1 是顺序执行,call/jmp 改 PC 打破顺序(第 10 章);「间址周期」即二级指针/间接寻址的硬件动作;「中断周期」是第 9 章中断处理前半段。

5.6 与后续各章对照

  • 第 6 章:把 5.5 的周期拆成五级、各配独立硬件段,五条指令同时处于不同阶段——数据通路「部件专用化+锁存器分段」。
  • 第 3 章:ALU 是数据通路核心,其关键路径(第 3.2 节加法器)直接决定单周期机时钟周期。
  • 第 10 章:PC、IR、寄存器文件、MAR/MDR 在汇编层面就是「下一条指令」「当前指令」「寄存器」。