数据通路与指令周期¶
数据通路解决什么问题¶
指令编码只是一串静态位。数据通路把它变成一条物理路径:从 PC 取指,读取寄存器,经 ALU 运算,必要时访问数据存储器,最后写回并更新 PC。
一个教学型 RISC 数据通路包含:
- PC 与指令存储器;
- 寄存器堆,通常有两个读端口和一个写端口;
- 立即数生成器;
- ALU;
- 数据存储器;
- 若干多路选择器;
- PC 加法器与分支比较逻辑。
五个逻辑阶段¶
即使不是流水线实现,也可把指令周期理解为:
- IF 取指:用 PC 读指令,并计算顺序地址;
- ID 译码:解析字段、读寄存器、生成立即数;
- EX 执行:ALU 运算、比较或计算有效地址;
- MEM 访存:load 读数据,store 写数据;
- WB 写回:把 ALU 或内存结果写进目的寄存器。
并非每条指令都使用每个阶段,但统一分段有助于控制与流水化。
逐类追踪¶
add x7, x5, x6¶
寄存器堆读出 x5 和 x6,ALU 做加法,结果经写回多路选择器进入 x7。数据存储器不工作,PC 通常加 4。
lw x5, 12(x10)¶
寄存器堆读 x10,立即数生成器把 12 符号扩展,ALU 计算:
\[
EA=R[x10]+12.
\]
数据存储器读取 \(EA\),结果写回 x5。它比 add 多一次存储访问,因此常成为单周期关键路径。
sw x7, 8(x10)¶
x10 用于计算地址,x7 提供要写的数据。数据存储器写使能有效,寄存器写使能必须关闭,否则会误改寄存器。
条件分支¶
读取两个源寄存器进行比较,同时形成目标地址。若条件成立,PC 选择分支目标;否则选择顺序地址。这里“运算结果”不是普通寄存器值,而是下一 PC。
多路选择器为何无处不在¶
硬件资源常被多类指令复用,必须选择输入:ALU 第二输入来自寄存器还是立即数?写回值来自 ALU 还是内存?下一 PC 来自顺序地址、分支还是间接跳转?多路选择器就是数据路径上的岔路口,控制信号决定方向。
单周期的性能限制¶
单周期时钟必须覆盖最慢指令的组合路径:
即使简单 add 不访问数据存储器,也只能等待同样长的周期。若指令数为 \(I\),单周期 CPI 近似为 1:
\[
T_{CPU}=I\times 1\times T_{clk}.
\]
多周期设计让简单指令少走几拍、复杂指令多走几拍,并复用 ALU;代价是控制状态增多。流水线进一步重叠不同指令,但必须解决冒险。
指令周期与异常¶
访存可能发现地址未对齐或页不存在,译码可能发现非法操作码。此时正常数据流必须改道:保存出错 PC 和原因,跳到异常入口,并阻止错误指令写回。异常并非数据通路之外的附加功能,而是“下一状态选择”的一部分。
自测¶
- 为何
sw通常需要两个寄存器读端口,却不需要写回端口? - 如果误把 load 的写回选择设为 ALU 输出,会观察到什么错误?
- 多周期数据通路复用一个 ALU 的收益和代价分别是什么?