CPU + 指令系统

从 ISA 抽象到一条指令的执行,再到流水线和异常控制。

一句话模型

指令系统定义软件可观察的机器接口,CPU 的控制器把指令译码为控制信号,数据通路依次驱动寄存器、ALU、存储器和 PC 完成状态更新;流水线再把不同指令的阶段重叠起来提高吞吐量。

三层递进

本板块同样遵循“简单 → 中等 → 复杂”的叠加方式:

  1. 简单:先区分 ISA、CPU 组成和控制器/数据通路的职责。
  2. 中等:追踪一条 LOADADD 指令从取指到写回的主干数据流。
  3. 复杂:加入流水线重叠、数据/控制冒险、异常中断和访存等待,观察控制状态如何改变。

简单图谱:CPU 与指令系统的边界

先回答“软件交给 CPU 什么、CPU 内部由谁完成”:ISA 规定指令语义和可见状态,微架构用控制器和数据通路实现这些语义。

CpuInstructionSimpleMapsoftware软件高级语言 / 汇编isaISA指令语义 + 可见状态software->isa机器代码control控制器译码 + 时序 + 控制信号isa->controlopcode / 语义datapath数据通路寄存器 + ALU + 总线control->datapath控制信号memory存储器接口取指 / 访存datapath->memory地址 / 数据result状态更新寄存器 / PC / 标志位datapath->resultmemory->datapath指令 / 数据result->isa软件可观察行为
# CPU + 指令系统

## 软件可见接口:ISA

- 指令操作码与语义
- 指令格式和操作数
- 寻址方式与数据类型
- 通用寄存器、PC、状态寄存器
- 异常、中断与特权规则

## CPU 内部实现

- 控制器:取指、译码、时序和控制信号
- 数据通路:寄存器、ALU、内部总线和存储器接口
- 执行单元:算术逻辑、分支、访存

## 性能扩展

- 多周期与流水线
- 冒险处理与转发
- 多核、SIMD 与硬件多线程

基础知识页面:CPU指令系统指令体系结构

中等图谱:一条指令的执行流程

主干问题是:一条机器指令如何从二进制编码变成寄存器或内存状态的变化?

CpuInstructionFlowMappcPC下一条指令地址ifIF 取指Mem[PC] → IRPC ← PC + 4pc->ifidID 译码opcode / 寄存器 / 立即数if->idexEX 执行ALU 运算或有效地址id->exmemMEM 访存Load / Storeex->memwbWB 写回寄存器状态提交mem->wbflags状态寄存器 / PC影响后续控制流wb->flagsflags->pc顺序或分支目标

LOAD R1, [R2 + imm] 为例:

  1. 取指 IF:PC 提供指令地址,指令进入 IR,同时 PC 更新为下一条指令地址。
  2. 译码 ID:控制器解析 opcode、寄存器字段和立即数,读取 R2 并生成后续控制信号。
  3. 执行 EX:ALU 计算有效地址 R2 + imm
  4. 访存 MEM:用有效地址读取数据存储器,结果进入数据寄存器或流水线寄存器。
  5. 写回 WB:把数据写入 R1,提交这条指令对寄存器状态的改变。

ADD R1, R2, R3,EX 阶段改为计算 R2 + R3,MEM 阶段为空操作,WB 仍把 ALU 结果写入 R1

复杂图谱:流水线与异常控制

复杂图在中等流程上叠加“多条指令同时处于不同阶段”,并标出三种冒险和异常/中断如何打断正常提交。

CpuInstructionComplexMapcluster_pipeline五阶段流水线:不同指令错开重叠i1I1: IF → ID → EX → MEM → WBi2I2: IF → ID → EX → MEM → WBi1->i2下一个时钟周期hazard冒险检测结构 / 数据 / 控制i1->hazard阶段重叠暴露依赖i3I3: IF → ID → EX → MEM → WBi2->i3下一个时钟周期i2->hazardi3->hazardforward数据冒险处理转发 / 暂停 / 气泡hazard->forward数据依赖branch分支与控制冒险预测 / 冲刷 / 更新 PChazard->branch分支依赖memory访存系统Cache / 主存 / MMUhazard->memory访存冲突commit按架构顺序提交更新寄存器、PC、标志位forward->commitexception异常 / 中断保存现场,转处理程序branch->exception异常或中断边界branch->commit确定下一条 PCexception->commit返回或重新执行memory->commit

阅读时沿三条路径追踪:

  • 正常路径:IF → ID → EX → MEM → WB,每个时钟周期推进一个阶段。
  • 数据冒险路径:后一条指令依赖前一条尚未写回的结果,通过转发、暂停或插入气泡保持数据正确。
  • 控制/异常路径:分支改变下一条 PC,预测错误需要冲刷流水线;中断或异常保存现场、转入处理程序,返回后再恢复执行。

子模块图谱:指令格式与寻址方式

指令系统内部可以先单独展开“编码如何指定操作数”。这张图把 opcode、地址字段和有效地址计算连接起来,适合继续添加零地址/一地址/二地址/三地址指令的例题。

InstructionFormatAddressMapword指令字opcode | mode | addressopcodeopcode确定执行什么操作word->opcodemode寻址方式 mode确定如何解释地址字段word->modefield地址 / 寄存器 / 立即数字段word->fieldalu送入 ALU 或数据通路opcode->aluea有效地址或操作数EA = base + index + offset 等mode->eafield->easource读取源操作数寄存器 / 内存 / 立即数ea->sourcesource->aludest结果写回寄存器或内存alu->dest

子图阅读顺序是:指令字 → opcode 译码 → 地址字段解释 → 按寻址方式得到操作数或有效地址 → 送入寄存器/ALU/存储器。

子模块图谱:CPU 结构

再把 CPU 本身拆开,观察“控制信号由谁产生、数据经过哪些部件、结果如何回到状态寄存器”。这张图适合和上一张指令格式图连起来阅读:上一张解释输入如何编码,这一张解释编码进入 CPU 后如何驱动硬件。

CpuStructureInternalMapcluster_control控制单元cluster_datapath数据通路pcPC程序计数器irIR指令寄存器pc->ir取指result架构状态寄存器 + PC + 标志位pc->resultdecoder指令译码器opcode / modeir->decodersignal控制信号发生器Rout / Rin / ALUop / MemRdecoder->signaltiming时序控制器时钟与节拍timing->signal时序signal->pcPC 控制regs寄存器组通用寄存器 / MAR / MDRsignal->regs寄存器选择aluALU算术逻辑与地址计算signal->aluALUopmemory存储器接口指令存储器 / 数据存储器signal->memoryMemR / MemWbusCPU 内部总线连接寄存器与执行单元regs->busregs->memory地址 / 写数据ioI/O 接口总线与外部设备regs->ioI/O 数据regs->resultstatus状态寄存器Zero / Carry / Sign 等alu->statusalu->bus结果status->resultbus->regs写回bus->alumemory->ir指令字memory->regs读数据io->regs设备数据

CPU 结构子图的阅读顺序是:PC/IR 取指 → 指令译码器识别操作 → 控制器按时序发出控制信号 → 寄存器组提供操作数 → ALU 或访存单元执行 → 数据写回寄存器、PC 和状态寄存器。

关键问题

ISA 和微架构为什么要分开?

ISA 规定软件能观察到的行为,微架构决定内部如何实现。同一 ISA 可以由不同的流水线、Cache、执行单元和分支预测器实现。

控制器和数据通路如何配合?

控制器根据 opcode 和时序产生控制信号,数据通路按照这些信号完成寄存器传送、ALU 运算和存储器读写;控制器决定“做什么微操作”,数据通路真正搬运和计算数据。

为什么流水线能提高吞吐量却不能让单条指令变快?

流水线让不同指令的 IF/ID/EX/MEM/WB 阶段重叠,稳态下每周期可完成一条指令;单条指令仍需经过全部阶段,冒险和流水线寄存器还会引入额外停顿。

异常和中断为什么必须进入执行流程?

它们会改变 PC、特权状态和现场保存位置。CPU 必须在规定的边界暂停或完成当前指令,转到处理程序,处理完后依据保存的返回地址恢复或重新执行。

旁路清单

  • 控制器:硬布线控制器与微程序控制器、微指令编码
  • 数据通路:寄存器传送语言、ALU 标志位、单总线/多总线结构
  • 指令格式:定长/变长、操作码扩展、端序与对齐
  • 寻址方式:立即、直接、间接、寄存器、基址变址、相对寻址
  • 流水线:结构冒险、数据冒险、控制冒险、分支预测和超标量
  • 异常机制:精确异常、现场保护、中断响应与 DMA 协同

对应页面:控制器指令流水线格式和寻址方式指令操作码