8.3 控制单元与微操作
第 8.2 节说明了数据通路中存在许多可能的路径。控制单元把一条指令转换为有序的控制决策序列:选择哪个源、ALU 应执行什么操作、允许哪个存储元件改变,以及何时可以进行存储器传送。
微操作是一次小型的状态改变动作
微操作是基本的内部动作,例如把一个寄存器复制到另一个寄存器、递增 IP、读取存储器,或让 ALU 执行加法。它比机器指令更小,一条指令通常需要多个微操作。
以下是一个用于教学的指令字节取指序列:
- T0 — 地址: 把由 CS:IP 形成的地址复制到存储器地址锁存器。
- T1 — 读取: 置位存储器读控制信号,并等待字节到达。
- T2 — 捕获并前进: 把返回的字节复制到指令寄存器,同时递增 IP。
- T3 — 译码: 解释已捕获的操作码并选择下一个控制序列。
T0 至 T3 表示控制时间槽,并不代表固定的现实持续时间。较慢的存储器读取可能需要在请求与捕获之间插入等待状态。地址锁存器和指令寄存器是教学模型中的内部寄存器,并非额外的、程序员可见的 8086 寄存器。
操作顺序由数据依赖决定。消费者不能在生产者提供数值之前使用它,因此译码不能早于捕获。IP 可以与捕获在同一时间槽中递增,因为当前取指地址已经保存在地址锁存器中。
只有当多个微操作不争用同一个资源,并且其中一个不会破坏另一个仍需要的输入时,它们才能安全并行。调度是资源与依赖问题,并非只是把动作放入相邻方框。
控制字激活相互兼容的数据通路信号
在一个时间槽中,控制单元可以发出一个控制字:由多个字段和使能位组成的一组信号,它们共同描述当前的数据通路操作。一个简单的教学控制字可以包含:
- 源 A 和源 B 选择字段;
- ALU 功能字段;
- 目的选择字段;
- RegisterWrite 与 FlagWrite 使能位;以及
- MemoryRead 与 MemoryWrite 使能位。
对于 CX ← AX + BX,控制字选择 AX 和 BX,请求 ADD,选择 CX,并使能 RegisterWrite;它不需要存储器命令。对于 FLAGS ← test(AX),控制字可以让 AX 通过直通操作,并使能 FlagWrite,而不改变通用寄存器。
某些组合没有意义或存在危险。对于一次普通总线传送,MemoryRead 与 MemoryWrite 不得同时置位。没有有效目的数据时,RegisterWrite 必须关闭。只有当指令定义了新标志时,FlagWrite 才应开启。
常见的控制器组织方式大致有两类:
- 硬布线控制利用围绕操作码、当前时间槽、标志和其他条件构建的逻辑来产生信号。它可以很快,但复杂行为较难修改。
- 微程序控制在控制存储器中保存控制字或编码后的微指令。它让长序列更有条理,但取出和译码微指令也会增加设计成本。
这些都是指令集之下的实现策略。无论使用哪种方式,程序员看到的体系结构指令行为都相同。真实处理器也可能组合多种技术,因此这种教学区分是一种设计视角,并不意味着每个 CPU 只能属于其中一类。
较宽的水平型控制字直接提供许多独立信号,可以请求更多并行工作。较窄的垂直型编码节省控制存储器位数,但需要额外译码,而且每条微指令可能表达较少的并行操作。
控制单元回答“每个时间槽发生什么”。第 8.4 节将加入物理延迟和工作负载计数,以回答“时间槽以及完整程序需要多长时间”。