5计算机组成(第6版)

微程序控制单元

存储逻辑控制

微程序控制存储器微指令水平/垂直

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第5章 微程序控制单元(存储逻辑控制)

一、导读

1.1 本章学习目标

理解微程序控制的基本原理:掌握微程序控制(Microprogrammed Control)的核心思想——将控制逻辑以微程序的形式存储在控制存储器中,通过顺序执行微指令序列来产生控制信号,理解它与硬布线控制在设计哲学上的根本区别。

掌握微指令的格式设计:深入了解微指令中控制字段和地址字段的各种编码方式,理解直接控制、字段编码和混合编码的优缺点,以及微指令字长对控制存储器容量和速度的影响。

区分水平微代码与垂直微代码:掌握两种微代码格式的核心特征——水平微代码的宽格式与高并行度、垂直微代码的窄格式与紧凑性,了解它们各自适用的场景和现代处理器中的实际应用。

理解微程序的执行流程:掌握微地址的形成方式、微指令的顺序执行与分支转移机制,了解机器指令与微程序之间的映射关系,以及如何通过微程序实现复杂的机器指令。

了解微程序控制的优势与局限性:掌握微程序控制在灵活性、可维护性和设计规整性方面的优势,以及在速度方面的局限性,理解现代处理器中微程序控制的实际应用方式。

能够对比硬布线与微程序控制的设计选择:从速度、灵活性、面积、功耗和设计复杂度等多个维度,系统比较两种控制方式的优劣,理解现代处理器混合控制策略的设计考量。

1.2 为什么本章如此重要

微程序控制是计算机体系结构发展史上的一项革命性创新。1951 年,Maurice Wilkes 提出了存储逻辑控制的概念,将控制单元的设计从复杂的硬件连线问题转化为程序设计问题。这一思想极大地简化了复杂指令集处理器的设计过程,使得实现和维护庞大的指令集变得可行。

从软件工程的角度看,微程序控制将硬件控制逻辑"软件化"。控制逻辑不再是一团难以理解和修改的逻辑门电路,而是存储在控制存储器中的有序微指令序列。设计者可以像编写程序一样编写控制逻辑,通过修改微程序来改变处理器的行为,而不需要重新设计硬件电路。这种设计理念对后来的计算机发展产生了深远影响。

从商业角度看,微程序控制使得指令集的修改和扩展变得经济可行。在芯片制造完成后,如果发现指令集中的错误或需要添加新的指令,只需更新控制存储器中的微程序即可(如果控制存储器是可写的)。这种灵活性对于产品的快速迭代和市场响应至关重要。IBM System/360 系列计算机是微程序控制的成功案例——通过微程序,不同型号的 360 计算机可以运行相同的指令集,尽管它们的硬件实现截然不同。

从教育角度看,微程序控制提供了一个理解处理器内部工作机制的清晰视角。通过将每条机器指令分解为一系列微操作,学生可以逐步跟踪指令的执行过程,理解每个时钟周期中处理器内部发生的具体操作。这种自底向上的理解方式对于掌握计算机组成原理至关重要。

1.3 核心问题引导

微程序控制的核心思想是什么?它与硬布线控制在设计哲学上有什么根本区别?

什么是微指令?一条微指令包含哪些信息?它与机器指令有什么区别和联系?

水平微代码和垂直微代码的核心区别是什么?各自的优缺点是什么?

微地址是如何形成的?微程序的顺序执行和分支转移是如何实现的?

一条复杂的机器指令(如字符串移动指令)是如何用微程序实现的?

为什么现代高性能处理器大多不再使用纯微程序控制?微程序控制在哪些场景中仍然有价值?

微程序控制如何使得指令集的修改和扩展变得更加容易?请举例说明。


二、核心概念详解

2.1 微程序控制的基本原理

微程序控制(Microprogrammed Control)的核心思想是将控制逻辑编码为微指令(Microinstruction),存储在专用的控制存储器(Control Store)中。当处理器执行一条机器指令时,控制单元从控制存储器中读取对应的微指令序列,每条微指令产生一组控制信号,驱动数据通路完成一个基本操作。通过顺序执行这些微指令,就完成了机器指令的全部功能。

微程序控制的基本工作流程如下。首先,机器指令从内存中取出并放入指令寄存器。然后,指令寄存器的操作码字段被送到微地址形成逻辑(Micro-address Formation Logic),该逻辑将操作码映射为控制存储器中对应微程序的起始地址。接着,控制单元从该起始地址开始,依次读取并执行微指令。每条微指令包含两部分信息:控制字段(Control Field)产生直接作用于数据通路的控制信号,地址字段(Address Field)指定下一条微指令的地址。这个过程持续进行,直到遇到表示机器指令执行完毕的终止条件。

微程序控制的关键组件包括控制存储器、微指令寄存器(Micro-instruction Register, MIR)、微地址形成逻辑和微程序计数器。控制存储器是存储所有微程序的只读存储器(ROM)或可写存储器(如 SRAM),其容量由微指令的数量和字长决定。微指令寄存器暂存当前正在执行的微指令,其输出分为两路:控制字段直接连接到数据通路的各个控制输入端,地址字段送到微地址形成逻辑。微地址形成逻辑根据地址字段和可能的条件标志(如分支条件)计算下一条微指令的地址。

微程序控制的最大优势在于设计规整性和灵活性。所有控制逻辑都以统一的微指令格式存储,设计者可以通过修改微程序来改变处理器的行为,而不需要修改硬件电路。这使得微程序控制特别适合实现复杂的指令集——每条复杂指令只需要编写相应的微程序,而不需要设计复杂的硬布线逻辑。

2.2 微指令格式设计

微指令格式(Microinstruction Format)定义了微指令中各个字段的组织方式。微指令的设计需要在控制字段的表达能力和总字长之间取得平衡。微指令字长越短,控制存储器的容量需求越小,访问速度越快;但字长越短,每个控制字段能表达的信息就越有限。

微指令格式主要分为三种类型。直接控制格式(Direct Control)中,微指令的每一位直接对应一个控制信号。如果处理器有 20 个控制信号,微指令就需要至少 20 位的控制字段。这种格式的优点是简单直观——每一位的含义明确,可以同时激活任意多个控制信号,并行度最高。缺点是微指令字长较长,控制存储器的容量需求大。

字段编码格式(Encoded Control)中,控制字段被分成若干组,每组经过译码后产生多个控制信号。例如,一个 3 位的字段经过 3-8 译码器可以产生 8 个控制信号,但这 8 个信号中每次只能有一个有效。这种格式的优点是微指令字长短——用 3 位就能控制 8 个信号。缺点是同一字段中的信号互斥,不能同时激活,降低了并行度。

混合编码格式结合了直接控制和字段编码的优点。对于那些经常需要同时激活的信号使用直接控制,对于那些互斥的信号组使用字段编码。例如,ALU 操作选择通常使用字段编码(因为每次只需要一种 ALU 操作),而读写使能信号可能使用直接控制(因为可能需要同时读寄存器和写内存)。

地址字段的设计也影响微指令的格式。最简单的方式是使用顺序地址加显式跳转地址:正常情况下微地址自动递增,需要跳转时由微指令中的地址字段指定目标地址。另一种方式是完全由微指令指定下一条微指令的地址,包括顺序地址和跳转地址。

2.3 水平微代码与垂直微代码

水平微代码(Horizontal Microcode)和垂直微代码(Vertical Microcode)是两种截然不同的微指令设计取向,它们在并行度、字长和灵活性方面形成鲜明对比。

水平微代码采用宽格式的微指令,通常有 50-200 位甚至更宽。每个控制信号在微指令中占据一个固定的位,位的值直接控制对应信号的激活或关闭。水平微代码的核心特征是高度并行——在一个微指令周期内,可以同时激活多个不相关的控制信号。例如,可以同时读取寄存器、执行 ALU 运算和写入内存。这种高并行度意味着每条水平微指令可以完成更多的工作,从而减少实现一条机器指令所需的微指令数量。

水平微代码的优点包括:并行度高,每条微指令能完成更多工作;控制灵活,可以同时激活任意控制信号组合;设计直观,每位含义明确。缺点包括:微指令字长长,控制存储器容量需求大;微指令中很多位可能为 0(利用率低);修改微指令格式困难。

垂直微代码采用窄格式的微指令,通常只有 10-30 位宽。控制字段经过编码和译码后产生控制信号。垂直微代码的核心特征是紧凑——用较少的位数表达控制信息。但同一字段中的信号互斥,每个微指令周期内能完成的工作较少,实现一条机器指令通常需要更多的微指令。

垂直微代码的优点包括:微指令字长短,控制存储器容量需求小;微指令利用率高,每个位都承载有效信息。缺点包括:并行度低,每条微指令完成的工作少;译码增加延迟;设计复杂,需要仔细规划字段分组。

在实际应用中,大多数微程序控制器采用介于水平和垂直之间的混合方案。常用的控制信号使用直接控制以获得高并行度,不常用的信号使用编码格式以节省空间。这种折中方案在控制存储器容量和执行效率之间取得了平衡。

2.4 微地址形成与微程序流程

微地址(Micro-address)的形成是微程序控制中的关键环节,它决定了下一条要执行的微指令在控制存储器中的位置。微地址形成逻辑需要根据当前微指令的地址字段、机器指令的操作码和各种条件标志来计算下一条微指令的地址。

微程序的起始地址由机器指令的操作码决定。通常使用操作码映射表(Opcode Map)将操作码转换为微程序的起始地址。这个映射表可以是一个 ROM、一个 PLA(可编程逻辑阵列)或简单的组合逻辑。映射的结果是微程序在控制存储器中的入口地址。

微指令的顺序执行通过微地址的自动递增实现。微地址寄存器(Micro-address Register, muAR)在每个微指令周期结束时自动加 1,指向控制存储器中的下一个位置。这种方式适用于微程序的线性执行部分——大多数微指令都是顺序执行的。

微程序的分支转移通过条件判断实现。当需要根据某些条件(如 ALU 的零标志、进位标志等)改变执行流程时,微指令中的地址字段提供跳转目标地址,条件判断逻辑决定是否执行跳转。例如,在实现条件分支指令(如 BEQ)的微程序中,需要检查零标志:如果为零则跳转到分支目标地址的微程序,否则跳转到顺序执行的微程序。

微程序的终止通过特殊的终止条件标识。当微程序执行到最后一条微指令时,需要返回到取指周期,开始执行下一条机器指令。终止条件通常通过一个特殊的微地址(如全零地址或全一地址)来标识,微地址形成逻辑检测到这个地址后,将控制权交还给取指逻辑。

2.5 微程序控制的设计权衡

微程序控制的设计涉及多个维度的权衡,理解这些权衡对于选择合适的控制方案至关重要。

灵活性方面,微程序控制具有明显优势。控制逻辑以软件形式存储在控制存储器中,修改控制逻辑只需要更改微程序,而不需要改变硬件电路。如果控制存储器是可写的(如使用 SRAM),甚至在芯片制造后仍然可以更新微程序。这种灵活性使得微程序控制非常适合需要频繁更新或扩展指令集的场景。

设计复杂度方面,微程序控制将复杂的硬件设计问题转化为相对简单的程序设计问题。设计者只需要编写微指令序列来实现每条机器指令的功能,而不需要设计复杂的组合逻辑电路。微指令的编写可以借助高级工具和仿真环境,大大提高了设计效率。这种规整的设计流程使得实现大型指令集成为可能。

速度方面,微程序控制通常不如硬布线控制。每条微指令的执行需要先访问控制存储器读取微指令,然后将控制字段传送到数据通路。控制存储器的访问延迟(通常需要 1-2 个时钟周期)加上控制信号的传播延迟,使得微程序控制的每个步骤比硬布线控制慢。此外,一条机器指令通常需要多条微指令来完成,累积的延迟更为显著。

面积和功耗方面,微程序控制需要额外的控制存储器,增加了芯片面积和静态功耗。但控制逻辑本身的电路比硬布线控制器简单,减少了动态功耗。总体效果取决于控制存储器的规模和制造工艺。


三、深入分析与讨论

3.1 纳米代码与可写控制存储

纳米代码(Nanocode)是对微代码的进一步优化。在两级控制存储架构中,第一级是微代码(Microcode),第二级是纳米代码(Nanocode)。微指令不直接产生控制信号,而是指向纳米代码中的一个条目。纳米代码才是真正产生控制信号的地方。

这种两级结构的优势在于节省控制存储空间。许多微指令产生的控制信号组合是重复的——不同的微程序可能使用相同的控制信号模式。通过将这些重复的模式提取到纳米代码中,多个微指令可以共享同一个纳米代码条目,从而减少控制存储的总容量。

可写控制存储(Writable Control Store, WCS)允许用户在运行时加载自定义的微程序。在 20 世纪 70-80 年代,一些高端计算机(如 Xerox Alto 和某些 IBM 大型机)提供了 WCS,允许用户通过修改微程序来优化特定应用的性能或添加自定义指令。虽然这种灵活性在现代通用处理器中已经很少见,但在 FPGA 实现的软核处理器和某些领域特定处理器中,可写控制存储仍然是一种有用的特性。

3.2 微程序控制中的流水线技术

为了提高微程序控制的执行速度,可以在微指令的执行过程中引入流水线技术。将微指令的执行分为两个阶段:第一阶段从控制存储器读取微指令到微指令寄存器,第二阶段将微指令寄存器的控制字段传送到数据通路并执行操作。

通过流水线化,在第二个微指令从控制存储器读取的同时,第一个微指令的控制信号正在驱动数据通路执行操作。这样,控制存储器的访问延迟被隐藏在数据通路的执行时间之后,有效地提高了微指令的吞吐量。

更高级的微程序流水线可以将微指令的执行分为更多阶段,类似于机器指令的流水线。但微程序流水线的深度受到限制,因为微指令之间存在数据依赖——后一条微指令可能需要前一条微指令产生的结果。此外,微程序的分支转移也会造成流水线冲刷(Pipeline Flush),降低效率。

3.3 微程序控制在现代处理器中的地位

在现代高性能处理器中,纯微程序控制已经不再是主流。大多数高性能处理器采用以硬布线为主的控制方案,只在处理少数复杂指令时使用微程序。但这种转变并不意味着微程序控制的思想已经过时。

首先,现代 x86 处理器的指令翻译层在概念上与微程序控制非常相似。x86 的复杂指令被动态翻译为简单的微操作(micro-ops),这些微操作然后由硬布线控制的流水线执行。指令翻译的过程本质上就是一种微程序——将复杂的机器指令分解为一系列简单的内部操作。

其次,在处理器启动和初始化阶段,微程序仍然扮演重要角色。现代处理器的 BIOS/UEFI 固件中包含了大量的微代码更新(Microcode Update),用于修复芯片中发现的 errata(设计缺陷)。这些微代码更新在每次启动时被加载到处理器的可写控制存储中,是微程序控制灵活性的直接体现。

此外,在嵌入式处理器和 FPGA 软核处理器中,微程序控制仍然是常见的选择。这些场景对性能的要求相对较低,而对设计灵活性和可维护性的要求较高,微程序控制的优势得以充分发挥。


四、实践案例

4.1 案例分析:用微程序实现一条机器指令

以一条简化的 ADD 指令为例,展示如何用微程序实现其完整的执行过程。假设 ADD 指令的格式为 ADD R1, R2, R3,功能是将 R2 和 R3 相加,结果存入 R1。

微程序的设计如下(每条微指令包含控制字段和地址字段):

微指令 0(取指周期开始):控制字段 = {PC_out, MemRead, IR_write},地址字段 = 顺序(自动跳转到微指令 1)。这条微指令将 PC 指向的内存内容读出并存入指令寄存器 IR。

微指令 1(取指周期继续):控制字段 = {ALU_add, PC_write},地址字段 = 映射到操作码。ALU 将 PC 加 1,更新 PC 指向下一条指令。同时,IR 中的操作码被送到微地址形成逻辑,映射到 ADD 指令微程序的起始地址。

微指令 20(ADD 微程序起始,执行阶段):控制字段 = {R2_out, R3_out, ALU_add},地址字段 = 顺序。将 R2 和 R3 的内容送到 ALU 的两个输入端,ALU 执行加法。

微指令 21(ADD 写回阶段):控制字段 = {ALU_out, R1_write},地址字段 = 终止(返回取指周期)。将 ALU 的输出写入 R1。

微指令 0(返回取指周期):开始执行下一条机器指令。

通过这个例子可以看到,一条简单的 ADD 指令需要 4 条微指令来完成。每条微指令产生一组控制信号,驱动数据通路完成一个基本操作。微指令之间的顺序由地址字段控制。

4.2 案例分析:水平微代码与垂直微代码的对比

考虑一个需要同时控制 16 个信号的场景。使用水平微代码,微指令需要 16 位的控制字段,每位直接控制一个信号。一条微指令可以同时激活任意数量的信号,例如同时激活信号 1、3、7、12。

使用垂直微代码,16 个信号被分为 4 组,每组 4 个信号。每组使用 2 位编码(加上一个"无操作"状态,需要 3 位),加上一个 1-4 译码器。4 组共需要 12 位的控制字段。但同一组内的信号互斥——例如组 1 中的信号 1 和信号 2 不能同时激活。

如果实现一条机器指令需要 10 条微指令,水平微代码方案的控制存储需求为 10 x 16 = 160 位(不含地址字段),垂直微代码方案为 10 x 12 = 120 位。垂直方案节省了 25% 的存储空间。但如果某些操作需要同时激活同一组内的信号,垂直方案就需要额外的微指令来分步完成,反而可能增加总的微指令数量。

这个对比说明了两种方案的核心权衡:水平微代码用更多的存储空间换取更高的并行度和灵活性,垂直微代码用更少的存储空间换取更高的存储利用率但牺牲了并行度。


五、常见误区与注意事项

5.1 误区一:微程序控制一定比硬布线控制慢

虽然微程序控制通常需要访问控制存储器,增加了延迟,但通过流水线技术和快速控制存储器(如 SRAM),微程序控制的延迟可以被显著降低。此外,水平微代码的高并行度可以减少实现一条机器指令所需的微指令数量,从而弥补单次访问的延迟。在某些情况下,经过优化的微程序控制可以接近硬布线控制的速度。

5.2 误区二:微程序控制只适用于 CISC 处理器

虽然微程序控制在 CISC 处理器中发挥了重要作用,但它同样可以应用于 RISC 处理器。事实上,一些 RISC 处理器使用微程序来实现异常处理、系统调用和浮点运算等功能。微程序控制的核心优势——灵活性和可维护性——对任何类型的处理器都有价值。

5.3 误区三:水平微代码总是优于垂直微代码

水平微代码的高并行度确实可以减少微指令数量,但其宽格式导致控制存储器容量需求大,增加了芯片面积和功耗。在存储空间受限的嵌入式系统中,垂直微代码的紧凑性可能更为重要。此外,水平微代码的宽位宽意味着每次访问控制存储器需要传输更多数据,可能增加访问延迟。

5.4 误区四:微程序可以完全替代硬布线控制

虽然微程序控制在灵活性方面有优势,但在高性能场景中,硬布线控制的速度优势是不可替代的。现代处理器的主流水线通常使用硬布线控制,只在处理复杂指令或异常情况时才切换到微程序。将关键路径上的所有控制逻辑都微程序化会导致不可接受的性能损失。

5.5 误区五:微程序一旦写入就不能修改

这取决于控制存储器的类型。如果使用 ROM 或 PROM,微程序确实不可修改。但如果使用 EPROM、EEPROM 或 SRAM 作为控制存储器,微程序可以在芯片制造后更新。现代处理器通常使用可写的控制存储来支持微代码更新,用于修复芯片中发现的设计缺陷。


六、本章小结

本章讲解了微程序控制单元的设计原理和实现方式。微程序控制将控制逻辑以微指令的形式存储在控制存储器中,通过顺序执行微指令序列来产生控制信号。与硬布线控制相比,微程序控制在灵活性和设计规整性方面有显著优势,但在速度方面存在局限。微指令格式分为水平微代码和垂直微代码两种基本类型,前者并行度高但字长较长,后者紧凑但并行度低。微地址形成逻辑负责将机器指令映射到微程序入口,并管理微指令的顺序执行和条件分支。现代处理器通常采用混合方案,在关键路径使用硬布线控制,在复杂指令和异常处理中使用微程序控制。微程序控制的思想——将控制逻辑软件化——对计算机设计产生了深远影响,至今仍在处理器微代码更新和可编程处理器等领域发挥作用。


七、思考题与练习

请用自己的话解释微程序控制的基本原理。微程序控制与硬布线控制在设计思想上有什么根本区别?

比较水平微代码和垂直微代码的特点。如果要为一个存储空间受限的嵌入式处理器设计微程序控制器,你会选择哪种格式?请说明理由。

微指令格式中的字段编码如何工作?一个 4 位的字段经过译码后可以控制多少个信号?这种编码方式的限制是什么?

请描述一条机器指令从取指到执行完毕的完整微程序流程。微地址是如何在流程中形成和更新的?

微程序控制如何使得指令集的修改变得容易?请举一个具体的例子,说明如何通过修改微程序来添加一条新指令。

为什么现代高性能处理器不再使用纯微程序控制?微程序控制在现代处理器中以什么形式存在?

什么是纳米代码?两级控制存储架构如何节省控制存储空间?请用一个具体的例子说明。

从速度、灵活性、面积、功耗和设计复杂度五个维度,系统比较硬布线控制和微程序控制的优劣。在什么场景下应该选择微程序控制?

5/7微程序控
0%