本文适合对逻辑电路和 x86 汇编有一定了解的读者阅读。本文会尽量通俗地解释所有概念,因此本文不需要您对计算机组成的知识有任何了解。
如果您有相关方面的设计或工作经验,欢迎您对本文提出批评和建议。
什么是微程序?
最简单的两种 CPU 设计方案分别是单周期(single cycle)和多周期(multicycle)设计。一个单周期或多周期的 CPU 核心通常由 数据通路(datapath)和 控制器(control)两部分组成。数据通路中定义了寄存器、内存输入输出接口,以及在不同元件间传输数据的通道。而控制器中含有 CPU 的控制逻辑,它通过向数据通路发出控制信号,控制数据的流动,以此来完成指令的执行。
而 微程序(microcode,又称 微代码)是一种代替单周期或多周期的 CPU 设计方案,通常用于解决 CISC 处理器的设计问题。不同于 RISC 指令,一条 CISC 指令通常需要被分解成很多个动作,比如 x86 中的 add [eax+4], ebx
指令的执行流程可以表示成下图:
这条指令总共需要两次 ALU 操作和两次内存操作。在实际的 CPU 中,这条指令可能需要分解成如下这些动作:
- 取
eax
寄存器的值,发送到 ALU 的 A 输入端口; - 取立即数 4,发送到 ALU 的 B 输入端口;
- 控制 ALU 计算出
eax+4
的值,并发送到内存地址端口; - 控制内存进行读操作;
- 等待内存返回
[eax+4]
的数据,并把数据发送到 ALU 的 A 输入端口; - 取
ebx
寄存器的值,并发送到 ALU 的 B 输入端口; - 控制 ALU 计算出
[eax+4] + ebx
的值,并发送到内存数据端口; - 控制内存进行写操作,并等待写入完成。
如果只靠控制器中的逻辑门来表达所有这些动作,就需要消耗大量的逻辑门,并且电路的深度(逻辑门层数)会显著增加,这样会使得 CPU 设计变得过于复杂且低效。
由于以上这些动作具有程序化、串行化的特点,CPU 设计者们想到如下这个方案:不再直接用逻辑电路来实现控制器,而是在 CPU 中嵌入一个 ROM,用来存放一个特殊的程序,这个程序能