微操作的相爱相杀:是携手并肩的相容性,还是你死我活的串行!⚔️
微操作的安排遵循两大原则:相容性并行(在单一时钟周期内,将不占用冲突硬件资源的多个微操作合并执行以提高效率)和数据流串行(必须严格按照数据流动和处理的先后逻辑顺序,安排微操作的执行次序,以确保后续操作能获得正确的输入)。
1. 定义
-
微操作(Micro-operation):一个最基本、不可分割的操作,如
(PC) → MAR
。 -
微指令(Micro-instruction):在一个时钟周期内执行的一组相容的微操作的集合。例如
(PC) → MAR
和1 → R
(若R为某状态标志) 可以合并为一条微指令。 -
微程序(Micro-program):实现一条机器指令功能的一段微指令序列。
2. 微操作安排的两大核心原则
原则一:相容性原则 —— 如何将微操作合并到同一周期
目标:尽可能地压缩执行指令所需的时钟周期数(即降低CPI),提高CPU执行效率。
核心思想:“能并行,就并行”。在一个时钟周期内,只要多个微操作不相互冲突,就应该把它们安排在一起,形成一条微指令。
判断“相容”(不冲突)的依据是:不争抢同一个“功能部件”或“资源”。
在典型的单总线CPU结构中,常见的冲突资源有:
-
总线(Bus)的占用冲突(最重要)
-
规则:在一个时钟周期内,最多只能有一个部件向总线输出数据(即最多只有一个
_out
信号有效)。 -
正确并行示例:
PC+1 → PC
和M(MAR) → MDR
。-
PC+1 → PC
使用的是CPU内部的ALU和寄存器间的通路,不占用主数据总线。 -
M(MAR) → MDR
使用的是存储总线,将数据从存储器读到MDR。 -
这两个操作一个在CPU内部,一个在CPU与存储器之间,资源不冲突,可以并行。
-
-
错误并行示例:
(PC) → MAR
和(R0) → Y
。- 这两个操作都需要将各自的数据放到CPU内部总线上,发生了总线争用,是绝对不允许的。
-
-
ALU(算术逻辑单元)的占用冲突
-
规则:ALU在一个时钟周期内只能进行一次运算。
-
正确并行示例:
(MDR) → IR
和PC+1 → PC
。-
前者是寄存器到寄存器的直接传送,不经过ALU。
-
后者需要使用ALU进行加一运算。
-
资源不冲突,可以并行(前提是不发生总线冲突)。
-
-
错误并行示例:
PC+1 → PC
和(R0)+(Y) → Z
。- 两者都需要使用ALU,无法并行。
-
-
寄存器的读写冲突
-
规则:同一个寄存器不能既作为总线操作的源,又作为同一总线操作的目的。例如
(R0) → Bus → R0
是无意义的。 -
注意:但
(R0)
可以通过ALU运算后再写回R0
,这需要多个周期来完成(如(R0)→Y; (Y)+1→Z; (Z)→R0
),不能在一个周期内完成。
-
原则二:时序性原则 —— 如何确定微操作的先后次序
目标:保证指令执行的逻辑正确性。
核心思想:“先有因,后有果”。数据的流动和处理是有先后依赖关系的,后续操作的输入往往是前序操作的输出。
必须遵守的典型时序依赖关系:
-
先送地址,再访存储器
-
必须先执行
(PC) → MAR
或(IR(Addr)) → MAR
,将地址送到地址寄存器。 -
然后才能执行
M(MAR) → MDR
(读) 或(MDR) → M(MAR)
(写)。
-
-
先读数据,再用数据
-
必须先执行
M(MAR) → MDR
,将数据从存储器读到数据缓冲寄存器。 -
然后才能执行
(MDR) → IR
(送去译码)或(MDR) → Y
(送去运算)。
-
-
先取操作数,再做运算
-
必须先执行
(R0) → Y
等操作,将一个或两个操作数准备好。 -
然后才能执行
(R1)+(Y) → Z
等运算操作。
-
-
先做运算,再送结果
-
必须先执行
(R1)+(Y) → Z
,将运算结果存入暂存寄存器。 -
然后才能执行
(Z) → R2
,将结果写回通用寄存器。
-
-
先用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) (控制器译码)
编排过程:
-
周期T0:
-
时序:必须先送地址,所以
(PC) → MAR
是第一步。 -
相容:
PC+1 → PC
是否可以并行?如前所述,在严格单总线模型中,PC_out
会冲突。假设PC自增不占用总线,但仍需ALU。而(PC) → MAR
不需ALU。那么可以并行吗?可以。但为了逻辑清晰和应对访存延迟,通常分开。我们先安排最关键的:- T0:
(PC) → MAR
- T0:
-
-
周期T1:
-
时序:MAR地址已稳定,可以启动存储器读
M(MAR) → MDR
。 -
相容:存储器读主要占用的是存储总线,CPU内部的ALU和总线是空闲的。此时正是执行
PC+1 → PC
的绝佳时机!-
T1:
M(MAR) → MDR
,PC+1 → PC
-
(这里完美体现了相容性并行原则,将耗时的内存操作与CPU内部操作重叠执行)
-
-
-
周期T2:
-
时序:假设T1结束时,数据已从内存到达MDR。现在需要将指令码送入IR。所以
(MDR) → IR
是必须的。 -
相容:一旦IR的内容稳定,控制器就可以立即开始译码
Decode(IR)
。译码是CU内部逻辑,不与总线冲突。- T2:
(MDR) → IR
,Decode(IR)
- T2:
-
最终的、高效的取指周期微程序:
-
T0:
(PC) → MAR
-
T1:
M(MAR) → MDR
,PC+1 → PC
-
T2:
(MDR) → IR
,Decode(IR)