微操作的相爱相杀:是携手并肩的相容性,还是你死我活的串行!⚔️

微操作的安排遵循两大原则:相容性并行(在单一时钟周期内,将不占用冲突硬件资源的多个微操作合并执行以提高效率)和数据流串行(必须严格按照数据流动和处理的先后逻辑顺序,安排微操作的执行次序,以确保后续操作能获得正确的输入)。


1. 定义


2. 微操作安排的两大核心原则

原则一:相容性原则 —— 如何将微操作合并到同一周期

目标:尽可能地压缩执行指令所需的时钟周期数(即降低CPI),提高CPU执行效率。

核心思想:“能并行,就并行”。在一个时钟周期内,只要多个微操作不相互冲突,就应该把它们安排在一起,形成一条微指令。

判断“相容”(不冲突)的依据是:不争抢同一个“功能部件”或“资源”。

在典型的单总线CPU结构中,常见的冲突资源有:

  1. 总线(Bus)的占用冲突(最重要)

    • 规则:在一个时钟周期内,最多只能有一个部件向总线输出数据(即最多只有一个_out信号有效)。

    • 正确并行示例PC+1 → PCM(MAR) → MDR

      • PC+1 → PC 使用的是CPU内部的ALU和寄存器间的通路,不占用主数据总线。

      • M(MAR) → MDR 使用的是存储总线,将数据从存储器读到MDR。

      • 这两个操作一个在CPU内部,一个在CPU与存储器之间,资源不冲突,可以并行。

    • 错误并行示例(PC) → MAR(R0) → Y

      • 这两个操作都需要将各自的数据放到CPU内部总线上,发生了总线争用,是绝对不允许的。
  2. ALU(算术逻辑单元)的占用冲突

    • 规则:ALU在一个时钟周期内只能进行一次运算。

    • 正确并行示例(MDR) → IRPC+1 → PC

      • 前者是寄存器到寄存器的直接传送,不经过ALU。

      • 后者需要使用ALU进行加一运算。

      • 资源不冲突,可以并行(前提是不发生总线冲突)。

    • 错误并行示例PC+1 → PC(R0)+(Y) → Z

      • 两者都需要使用ALU,无法并行。
  3. 寄存器的读写冲突

    • 规则:同一个寄存器不能既作为总线操作的源,又作为同一总线操作的目的。例如 (R0) → Bus → R0 是无意义的。

    • 注意:但 (R0) 可以通过ALU运算后再写回 R0,这需要多个周期来完成(如 (R0)→Y; (Y)+1→Z; (Z)→R0),不能在一个周期内完成。

原则二:时序性原则 —— 如何确定微操作的先后次序

目标:保证指令执行的逻辑正确性。

核心思想:“先有因,后有果”。数据的流动和处理是有先后依赖关系的,后续操作的输入往往是前序操作的输出。

必须遵守的典型时序依赖关系:

  1. 先送地址,再访存储器

    • 必须先执行 (PC) → MAR(IR(Addr)) → MAR,将地址送到地址寄存器。

    • 然后才能执行 M(MAR) → MDR (读) 或 (MDR) → M(MAR) (写)。

  2. 先读数据,再用数据

    • 必须先执行 M(MAR) → MDR,将数据从存储器读到数据缓冲寄存器。

    • 然后才能执行 (MDR) → IR(送去译码)或 (MDR) → Y(送去运算)。

  3. 先取操作数,再做运算

    • 必须先执行 (R0) → Y 等操作,将一个或两个操作数准备好。

    • 然后才能执行 (R1)+(Y) → Z 等运算操作。

  4. 先做运算,再送结果

    • 必须先执行 (R1)+(Y) → Z,将运算结果存入暂存寄存器。

    • 然后才能执行 (Z) → R2,将结果写回通用寄存器。

  5. 先用PC,再改PC

    • 在取指周期,通常先完成 (PC) → MAR,用当前的PC值去取指令。

    • 之后再完成 PC+1 → PC,为取下一条指令做准备。如果顺序反了,就会取错指令。


3. 实例分析:编排“取指周期”的微操作

我们来为一个单总线CPU设计取指周期的微操作序列,并应用上述两大原则。

所需微操作:

a. (PC) → MAR (送指令地址)

b. M(MAR) → MDR (从内存读指令)

c. PC+1 → PC (PC自增,指向下一条指令)

d. (MDR) → IR (将指令送入指令寄存器)

e. Decode(IR) (控制器译码)

编排过程

最终的、高效的取指周期微程序: