【总结笔记】CPU组成:数据通路、微操作与流水线
本部分涵盖:单总线数据通路结构、暂存器Y/Z的作用、标志位逻辑表达式、取指微操作序列、执行阶段周期计算、指令格式编码、流水线五段结构、三大冲突与解决方法、RAW冲突的停顿拍数、指令调度优化。
一、单总线数据通路结构
基本结构:所有寄存器、ALU、存储器接口均挂在一条内部总线上。
核心铁律:
- 同一时钟周期内,只能有1个部件向总线输出(一个out)
- 多个部件可以同时从总线读入(多个in)
为什么需要暂存器Y和Z?
| 暂存器 | 解决的问题 | 工作方式 |
|---|---|---|
| 暂存器Y(A/Temp) | ALU是组合逻辑,需两端同时稳定输入,但单总线一次只能送一个数 | 第1拍:第一个操作数→Y锁存;第2拍:总线送第二个操作数,Y端稳定 |
| 暂存器Z(AC) | ALU结果若直接送总线,会反馈回ALU输入端B,引发逻辑振荡 | ALU输出→Z锁存,下一拍再由Z送总线 |
标志位逻辑表达式(设最高位:输入, ,输出)
加法 的溢出标志: (正+正=负,或 负+负=正,则溢出)
减法 的溢出标志: (正-负=负,或 负-正=正,则溢出)
译码器 vs 多路选择器
| 操作 | 部件 | 功能 |
|---|---|---|
| 写寄存器(rd写入) | 地址译码器() | 选通目标寄存器的写使能端 |
| 读寄存器(rs读出) | 多路选择器() | 从多个寄存器输出中选一路 |
控制单元CU的输入来源
CU产生所有微命令,其必须连接的寄存器:
- IR(指令寄存器):提供操作码,决定执行什么指令
- FR/PSW(标志寄存器):提供ZF/SF/OF/CF,决定条件转移是否跳转
- 时钟/节拍发生器:告知当前执行第几步
- 外部中断请求线
二、取指阶段微操作(固定模板)
取指数据通路:
微操作序列:
第1拍:PCout, MARin, Read ← 发地址、启动主存读(同一拍发出)
第2~N拍:等待主存读完 ← 若主存读需N个周期,则等N-1拍
第N+1拍:MDRout, IRin ← 数据已稳定,送入IR译码
取指周期总拍数 = 1(发命令) + N(主存读延时,含第1拍重叠) = N+1拍
注意:
PCout, MARin和Read可以在第1拍同时发出,不要算成N+2!
三、执行阶段周期数计算(四步法)
三大硬件铁律:
- 总线互斥:同一拍只能1个out,但可多个in
- 组合逻辑单拍:ALU运算→SR移位→总线→写寄存器,是一气呵成的组合通路,仅1拍
- 内外总线并行:主存读取(外部总线)期间,内部总线空闲可并行其他寄存器操作
标准微操作耗时速查
| 操作 | 拍数 | 能否并行 |
|---|---|---|
| 寄存器→暂存器T() | 1拍 | 可与外部主存读并行 |
| 送地址() | 1拍 | 占内部总线 |
| 读主存() | 1拍 | 占外部总线,内部总线空闲可并行 |
| ALU运算并写回寄存器 | 1拍 | 组合逻辑一气呵成 |
| 结果写主存 | 2拍(MDR←结果 + M(MAR)←MDR) | — |
例:不同寻址方式的执行阶段拍数
| 指令类型 | 源操作数寻址 | 执行拍数 | 说明 |
|---|---|---|---|
inc R1() | 寄存器直接 | 2拍 | 1拍送T,1拍ALU+写回 |
add Rd, Rs1, Rs2(纯寄存器) | 寄存器直接 | 2拍 | 1拍送T,1拍ALU+写回 |
add Rd, Rs, (R2)(一个间址) | 寄存器间接 | 3拍 | 1拍送MAR+启读,1拍读MDR(并行送T),1拍ALU+写回 |
st (R2), Rs(写主存) | 寄存器直接+写存 | 3拍 | 1拍送T,1拍ALU/移位,1拍结果→MDR,1拍写主存… |
四、括号层级与寻址方式对应
| 符号 | 含义 | 对应寻址方式 |
|---|---|---|
R1 | 寄存器R1本身(编号) | — |
(R1) | R1中存储的值 | 寄存器直接寻址 |
((R1)) / 汇编(R1) | 以R1的值为地址去主存取数据 | 寄存器间接寻址 |
指令格式书写顺序:操作码 目的寄存器, 源1, 源2(目的在前,源在后)
寄存器编号位数:(个寄存器需要位)
五、指令流水线
5.1 五段经典结构(IF/ID/EX/MEM/WB)
| 流水段 | 全称 | 主要工作 |
|---|---|---|
| IF | 取指 | 从指令Cache取指令,PC+4 |
| ID | 译码/读寄存器 | 解析操作码,读通用寄存器 |
| EX | 执行 | ALU运算,或计算访存有效地址EA |
| MEM/M | 访存 | Load/Store访数据Cache/主存 |
| WB | 写回 | 写回通用寄存器 |
5.2 性能计算公式
流水线时钟周期(取决于最慢的段):
理想时钟周期数(段,条指令):
有阻塞时钟周期数:
加速比与吞吐率:
5.3 三大冲突(Hazards)
| 冲突类型 | 本质 | 典型场景 | 解决方法 |
|---|---|---|---|
| 结构冲突 | 多条指令争用同一硬件 | IF与MEM段同时访问主存 | 分离指令Cache和数据Cache(哈佛结构);插NOP |
| 数据冲突(RAW) | 后读前写,数据未就绪 | ADD R1,R2 后紧跟 ADD R3,R1 | 转发(Forwarding);硬件阻塞;指令重排 |
| 控制冲突 | 分支/跳转导致PC不确定 | BEQ/BNE/JMP指令 | 分支预测;延迟槽;清空流水线 |
判断控制冲突:只要看到条件转移(
jle/bne等)或无条件跳转(jmp/jal),直接认定引发控制冒险。
5.4 数据相关(RAW/WAR/WAW)
| 类型 | 全称 | 发生时机 | 408考频 |
|---|---|---|---|
| RAW | 写后读(真相关) | 后指令ID段读,前指令WB才写完 | ⭐⭐⭐ 最常考 |
| WAR | 读后写(反相关) | 仅乱序执行出现 | 极少 |
| WAW | 写后写(输出相关) | 仅多发射/乱序出现 | 极少 |
5.5 RAW冲突停顿拍数(必背!)
关键原则:RAW相关时,后一条指令必须等前一条WB结束后的下一拍才能执行ID(读寄存器)。
| 场景 | 无转发停顿 | 有转发停顿 |
|---|---|---|
| ALU指令紧跟ALU指令(相邻RAW) | 3拍 | 0拍(EX结果直接转发回EX输入) |
| LOAD指令紧跟ALU指令(Load-Use) | 3拍 | 1拍(MEM结束才有数据,仍需等1拍) |
5.6 流水线时空图画法
无阻塞(理想):
周期: 1 2 3 4 5 6 7
I1: IF ID EX M WB
I2: IF ID EX M WB
I3: IF ID EX M WB
有RAW阻塞(无转发,I2依赖I1,停3拍):
周期: 1 2 3 4 5 6 7 8 9
I1: IF ID EX M WB
I2: IF [停] [停] [停] ID EX M WB
5.7 指令调度优化
核心思想:把与数据无关的独立指令填入阻塞的空气泡中,消除停顿。
优化前:LOAD R1, [a] / ADD R2, R1 / STORE R2, [b] → 停3拍
优化后:LOAD R1, [a] / LOAD R3, [c](无关)/ ADD R2, R1 → 停0拍
六、页(Page)vs 块(Block)区分
| 概念 | 层次 | 大小 | 缺失处理 |
|---|---|---|---|
| 页(Page) | 主存↔磁盘(虚存) | 大(4KB/8KB) | 缺页中断(OS介入,读磁盘,慢) |
| 块(Block/Line) | Cache↔主存 | 小(32B/64B) | Cache Miss(纯硬件调块,快) |
重要推论:数据全在同一页 ≠ 全在同一Cache块!一个页通常包含数百个Cache块。
七、高频易错汇总
| 错误 | 正确做法 |
|---|---|
| 取指周期算成N+2拍 | PCout,MARin,Read可同一拍发出,总计N+1拍 |
| ALU运算和写回寄存器拆成两拍 | 组合逻辑通路(ALU→SR→总线→寄存器)只需1拍 |
| 忽略外部访存期间的内部总线并行 | 读主存那1拍,内部总线空闲,可并行送另一操作数到T |
| CU输入只连IR,忘了FR | CU还需接标志寄存器FR,用于条件转移判断 |
| rd(写)连多路选择器 | rd写操作需要选通使能,连译码器;rs读才连多路选择器 |
| 转发技术能消除所有RAW | Load-Use冲突即使有转发,仍需停1拍 |
| 按序流水时后续指令继续流进 | I2在ID阻塞时,I3的IF也必须一起停顿(按序发射) |
| 看到条件转移不判断控制冒险 | 只要有jxx/bxx/jmp,直接判定控制冒险 |
| 前半拍写后半拍读的题还数停顿3拍 | 若支持”前半拍写后半拍读”,同一拍内WB可同时供ID读,少停1拍 |
| 数据在同一页就认为只占1个Cache块 | 页和块是两个层次,同页数据可能跨多个Cache块 |