CPU + 指令系统
一句话模型
指令系统定义软件可观察的机器接口,CPU 的控制器把指令译码为控制信号,数据通路依次驱动寄存器、ALU、存储器和 PC 完成状态更新;流水线再把不同指令的阶段重叠起来提高吞吐量。
三层递进
本板块同样遵循“简单 → 中等 → 复杂”的叠加方式:
- 简单:先区分 ISA、CPU 组成和控制器/数据通路的职责。
- 中等:追踪一条
LOAD或ADD指令从取指到写回的主干数据流。 - 复杂:加入流水线重叠、数据/控制冒险、异常中断和访存等待,观察控制状态如何改变。
简单图谱:CPU 与指令系统的边界
先回答“软件交给 CPU 什么、CPU 内部由谁完成”:ISA 规定指令语义和可见状态,微架构用控制器和数据通路实现这些语义。
# CPU + 指令系统
## 软件可见接口:ISA
- 指令操作码与语义
- 指令格式和操作数
- 寻址方式与数据类型
- 通用寄存器、PC、状态寄存器
- 异常、中断与特权规则
## CPU 内部实现
- 控制器:取指、译码、时序和控制信号
- 数据通路:寄存器、ALU、内部总线和存储器接口
- 执行单元:算术逻辑、分支、访存
## 性能扩展
- 多周期与流水线
- 冒险处理与转发
- 多核、SIMD 与硬件多线程
中等图谱:一条指令的执行流程
主干问题是:一条机器指令如何从二进制编码变成寄存器或内存状态的变化?
以 LOAD R1, [R2 + imm] 为例:
- 取指 IF:PC 提供指令地址,指令进入 IR,同时 PC 更新为下一条指令地址。
- 译码 ID:控制器解析 opcode、寄存器字段和立即数,读取
R2并生成后续控制信号。 - 执行 EX:ALU 计算有效地址
R2 + imm。 - 访存 MEM:用有效地址读取数据存储器,结果进入数据寄存器或流水线寄存器。
- 写回 WB:把数据写入
R1,提交这条指令对寄存器状态的改变。
对 ADD R1, R2, R3,EX 阶段改为计算 R2 + R3,MEM 阶段为空操作,WB 仍把 ALU 结果写入 R1。
复杂图谱:流水线与异常控制
复杂图在中等流程上叠加“多条指令同时处于不同阶段”,并标出三种冒险和异常/中断如何打断正常提交。
阅读时沿三条路径追踪:
- 正常路径:IF → ID → EX → MEM → WB,每个时钟周期推进一个阶段。
- 数据冒险路径:后一条指令依赖前一条尚未写回的结果,通过转发、暂停或插入气泡保持数据正确。
- 控制/异常路径:分支改变下一条 PC,预测错误需要冲刷流水线;中断或异常保存现场、转入处理程序,返回后再恢复执行。
子模块图谱:指令格式与寻址方式
指令系统内部可以先单独展开“编码如何指定操作数”。这张图把 opcode、地址字段和有效地址计算连接起来,适合继续添加零地址/一地址/二地址/三地址指令的例题。
子图阅读顺序是:指令字 → opcode 译码 → 地址字段解释 → 按寻址方式得到操作数或有效地址 → 送入寄存器/ALU/存储器。
子模块图谱:CPU 结构
再把 CPU 本身拆开,观察“控制信号由谁产生、数据经过哪些部件、结果如何回到状态寄存器”。这张图适合和上一张指令格式图连起来阅读:上一张解释输入如何编码,这一张解释编码进入 CPU 后如何驱动硬件。
CPU 结构子图的阅读顺序是:PC/IR 取指 → 指令译码器识别操作 → 控制器按时序发出控制信号 → 寄存器组提供操作数 → ALU 或访存单元执行 → 数据写回寄存器、PC 和状态寄存器。
关键问题
ISA 和微架构为什么要分开?
ISA 规定软件能观察到的行为,微架构决定内部如何实现。同一 ISA 可以由不同的流水线、Cache、执行单元和分支预测器实现。
控制器和数据通路如何配合?
控制器根据 opcode 和时序产生控制信号,数据通路按照这些信号完成寄存器传送、ALU 运算和存储器读写;控制器决定“做什么微操作”,数据通路真正搬运和计算数据。
为什么流水线能提高吞吐量却不能让单条指令变快?
流水线让不同指令的 IF/ID/EX/MEM/WB 阶段重叠,稳态下每周期可完成一条指令;单条指令仍需经过全部阶段,冒险和流水线寄存器还会引入额外停顿。
异常和中断为什么必须进入执行流程?
它们会改变 PC、特权状态和现场保存位置。CPU 必须在规定的边界暂停或完成当前指令,转到处理程序,处理完后依据保存的返回地址恢复或重新执行。
旁路清单
- 控制器:硬布线控制器与微程序控制器、微指令编码
- 数据通路:寄存器传送语言、ALU 标志位、单总线/多总线结构
- 指令格式:定长/变长、操作码扩展、端序与对齐
- 寻址方式:立即、直接、间接、寄存器、基址变址、相对寻址
- 流水线:结构冒险、数据冒险、控制冒险、分支预测和超标量
- 异常机制:精确异常、现场保护、中断响应与 DMA 协同