跳转至

数据通路与指令周期

数据通路解决什么问题

指令编码只是一串静态位。数据通路把它变成一条物理路径:从 PC 取指,读取寄存器,经 ALU 运算,必要时访问数据存储器,最后写回并更新 PC。

一个教学型 RISC 数据通路包含:

  • PC 与指令存储器;
  • 寄存器堆,通常有两个读端口和一个写端口;
  • 立即数生成器;
  • ALU;
  • 数据存储器;
  • 若干多路选择器;
  • PC 加法器与分支比较逻辑。

五个逻辑阶段

即使不是流水线实现,也可把指令周期理解为:

  1. IF 取指:用 PC 读指令,并计算顺序地址;
  2. ID 译码:解析字段、读寄存器、生成立即数;
  3. EX 执行:ALU 运算、比较或计算有效地址;
  4. MEM 访存:load 读数据,store 写数据;
  5. WB 写回:把 ALU 或内存结果写进目的寄存器。

并非每条指令都使用每个阶段,但统一分段有助于控制与流水化。

逐类追踪

add x7, x5, x6

寄存器堆读出 x5x6,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 来自顺序地址、分支还是间接跳转?多路选择器就是数据路径上的岔路口,控制信号决定方向。

单周期的性能限制

单周期时钟必须覆盖最慢指令的组合路径:

PC -> 指令存储器 -> 寄存器堆 -> ALU -> 数据存储器 -> 写回

即使简单 add 不访问数据存储器,也只能等待同样长的周期。若指令数为 \(I\),单周期 CPI 近似为 1:

\[ T_{CPU}=I\times 1\times T_{clk}. \]

多周期设计让简单指令少走几拍、复杂指令多走几拍,并复用 ALU;代价是控制状态增多。流水线进一步重叠不同指令,但必须解决冒险。

指令周期与异常

访存可能发现地址未对齐或页不存在,译码可能发现非法操作码。此时正常数据流必须改道:保存出错 PC 和原因,跳到异常入口,并阻止错误指令写回。异常并非数据通路之外的附加功能,而是“下一状态选择”的一部分。

自测

  1. 为何 sw 通常需要两个寄存器读端口,却不需要写回端口?
  2. 如果误把 load 的写回选择设为 ALU 输出,会观察到什么错误?
  3. 多周期数据通路复用一个 ALU 的收益和代价分别是什么?