关于奔腾处理器微码电路的笔记
摘要
对奔腾处理器微码ROM的详细剖析,描述其结构、容量以及微码如何在硬件层面实现机器指令。
<p>大多数人认为机器指令是计算机执行的基本步骤。然而,许多处理器在软件之下还有另一层:微码。通过微码,处理器的控制电路不再由复杂的逻辑门构建,而是由存储在微码ROM中的代码(即微码)来实现。为了执行一条机器指令,计算机内部会执行若干由微码指定的更简单的微指令。在本文中,我将深入研究原始奔腾处理器中的微码ROM,观察其底层电路。</p>
<p>下面的照片展示了一块拇指盖大小的奔腾硅芯片在显微镜下的样子。我标注了主要功能模块。微码ROM在右侧高亮显示。如果你仔细观察,可以看到微码ROM由两个矩形存储块组成,一上一下排列。</p>
<p><a href="https://static.righto.com/images/pentium-microcode1/pentium-labeled.jpg"><img alt="这张奔腾芯片照片显示了微码ROM的位置。点击此图(或其他图片)可查看大图。" class="hilite" height="524" src="https://static.righto.com/images/pentium-microcode1/pentium-labeled-w500.jpg" title="这张奔腾芯片照片显示了微码ROM的位置。点击此图(或其他图片)可查看大图。" width="500" /></a><div class="cite">这张奔腾芯片照片显示了微码ROM的位置。点击此图(或其他图片)可查看大图。</div></p>
<p>下图是两个微码ROM存储块的近景。每个存储块输出45位数据,共同构成一条90位长的微指令。每个存储块由排列成288行×720列的晶体管网格组成。微码ROM总共存储4608条微指令,合计414720位数据。在此放大倍数下,ROM看似平淡无奇,但表面覆盖着水平导线,每根导线厚度仅为1.5微米。</p>
<p><a href="https://static.righto.com/images/pentium-microcode1/rom-output-lines.jpg"><img alt="ROM的90条输出线,以及其中六条线离开ROM的局部放大图。" class="hilite" height="470" src="https://static.righto.com/images/pentium-microcode1/rom-output-lines-w500.jpg" title="ROM的90条输出线,以及其中六条线离开ROM的局部放大图。" width="500" /></a><div class="cite">ROM的90条输出线,以及其中六条线离开ROM的局部放大图。</div></p>
<p>ROM的90条输出线汇聚成位于两个存储块之间的一捆导线,如上图所示。细节图展示了其中六位数据如何从存储块中引出并加入该线束。该线束从ROM左侧引出,通向芯片的各个部分,并控制芯片的电路。输出线位于芯片顶层金属层(M3)中:奔腾处理器有三层金属布线,M1在最底层,M2在中间,M3在顶层。</p>
<p>奔腾处理器的微指令包含大量位,共计90位,相比之下<a href="https://www.righto.com/2022/11/how-8086-processors-microcode-engine.html">8086</a>的微指令只有21位。据推测,奔腾采用“水平”微码架构,即微码位直接对应底层控制信号,而非“垂直”微码架构(后者将位编码为更紧凑的微指令)。我没有任何关于奔腾微码编码的信息;与8086不同,奔腾的专利并未提供任何线索。8086的微码ROM存储512条微指令,远少于奔腾的4608条。考虑到奔腾指令集(包括片内浮点单元)的复杂程度高得多,这是合理的。</p>
<!-- 40.8 pixels (blue) for metal lines + gap. 15625 pixels/mm. 2.6 µm total so 1.3 µm for metal line alone. -->
<p>下图展示了奔腾微码ROM的近景。在这张图片中,我移除了三层金属和多晶硅层,暴露出芯片底层的硅。可以看到硅掺杂形成的图案,显示了晶体管以及ROM中存储的数据。如果有足够的时间,你可以通过检查硅片并观察晶体管是否存在,来提取ROM中的位数据。</p>
<p><a href="https://static.righto.com/images/pentium-microcode1/rom-closeup.jpg"><img alt="ROM的近景,展示位数据如何通过晶体管布局编码。" class="hilite" height="469" src="https://static.righto.com/images/pentium-microcode1/rom-closeup-w500.jpg" title="ROM的近景,展示位数据如何通过晶体管布局编码。" width="500" /></a><div class="cite">ROM的近景,展示位数据如何通过晶体管布局编码。</div></p>
<p>在解释ROM的电路之前,我先回顾一下NMOS晶体管的结构。晶体管可以看作是由栅极控制的源极和漏极之间的开关。源区和漏区(绿色)由掺杂杂质以改变其半导体特性的硅构成,形成N+硅。(这些区域在上面的照片中可见。)栅极由一层多晶硅(红色)构成,并通过极薄的绝缘氧化层与硅隔离。每当多晶硅跨越有源硅区域时,就会形成一个晶体管。</p>
<p><a href="https://static.righto.com/images/pentium-microcode1/mosfet-n.jpg"><img alt="展示NMOS晶体管结构的示意图。" class="hilite" height="231" src="https://static.righto.com/images/pentium-microcode1/mosfet-n-w400.jpg" title="展示NMOS晶体管结构的示意图。" width="400" /></a><div class="cite">展示NMOS晶体管结构的示意图。</div></p>
<p>位数据通过网格中晶体管的图案存储在ROM中。晶体管的有无分别存储0或1位。<span id="fnref:ambiguity"><a class="ref" href="#fn:ambiguity">1</a></span>下面的近景展示了微码ROM的八位数据。其中有四个晶体管存在,四个位置缺失晶体管。因此,ROM的这一部分存储了四个0位和四个1位。在下图中,我移除了三层金属和多晶硅,以显示底层的硅。我将掺杂(有源)硅区域标记为绿色,并用红色画出水平的多晶硅线。如上所述,如果多晶硅跨越掺杂硅,就会形成一个晶体管。因此,ROM的内容由硅区域的图案决定,从而创建了晶体管。</p>
<p><a href="https://static.righto.com/images/pentium-microcode1/rom-transistors.jpg"><img alt="微码ROM的八位数据,其中四个晶体管存在。" class="hilite" height="211" src="https://static.righto.com/images/pentium-microcode1/rom-transistors-w500.jpg" title="微码ROM的八位数据,其中四个晶体管存在。" width="500" /></a><div class="cite">微码ROM的八位数据,其中四个晶体管存在。</div></p>
<p>水平硅线用作连接晶体管接地的导线,而水平多晶硅线用于选择ROM中的某一行。该行中的晶体管将导通,将相关的输出线拉低。也就是说,某一行中晶体管的存在会导致输出被拉低,而晶体管的缺失则会使输出线保持高电平。</p>
<p><a href="https://static.righto.com/images/pentium-microcode1/rom-schematic.jpg"><img alt="对应上述八位数据的电路原理图。" class="hilite" height="225" src="https://static.righto.com/images/pentium-microcode1/rom-schematic-w300.jpg" title="对应上述八位数据的电路原理图。" width="300" /></a><div class="cite">对应上述八位数据的电路原理图。</div></p>
<p>下图展示了硅层、多晶硅层和底层金属层(M1)。我从左侧移除了金属层以揭示下方的硅和多晶硅,但图案
查看缓存全文
缓存时间: 2026/05/16 03:35
# 奔腾处理器微码电路笔记
来源:http://www.righto.com/2025/03/pentium-microcde-rom-circuitry.html
大多数人认为机器指令是计算机执行的基本步骤。然而,许多处理器在底层还有另一层软件:微码。借助微码,处理器的控制逻辑并非由复杂的逻辑门构建,而是通过存储在微码 ROM 中的代码(即微码)来实现。为了执行一条机器指令,计算机内部会执行若干由微码指定的更简单的微指令。在本文中,我将研究原始奔腾处理器中的微码 ROM,观察其底层电路。
下图展示了显微镜下奔腾处理器拇指大小的硅 die。我标注了主要功能模块。微码 ROM 位于右侧高亮区域。仔细观察,可以看到微码 ROM 由两个矩形 bank 组成,一上一下。
该奔腾 die 照片显示了微码 ROM 的位置。点击此图(或其他图片)可查看大图。(https://static.righto.com/images/pentium-microcode1/pentium-labeled.jpg)
该奔腾 die 照片显示了微码 ROM 的位置。点击此图(或其他图片)可查看大图。
下图是两个微码 ROM bank 的放大图。每个 bank 提供 45 位输出;它们共同实现一条长度为 90 位的微指令。每个 bank 由晶体管网格组成,排列成 288 行和 720 列。微码 ROM 存储了 4608 条微指令,总共 414,720 位。在此放大倍数下,ROM 看起来毫无特征,但它覆盖着水平导线,每条导线仅 1.5 μm 粗。
ROM 的 90 条输出线,以及六条线从 ROM 引出的放大图。(https://static.righto.com/images/pentium-microcode1/rom-output-lines.jpg)
ROM 的 90 条输出线,以及六条线从 ROM 引出的放大图。
如上图所示,ROM 的 90 条输出线汇集成一束导线,位于两个 bank 之间。细节展示了其中六位如何从 bank 引出并加入该线束。该线束向左离开 ROM,传送到芯片的各个部分,控制芯片电路。输出线位于芯片的顶层金属层(M3):奔腾有三层金属布线,M1 在最底层,M2 在中间,M3 在顶层。
奔腾的微指令包含大量位,90 位,而 8086 (https://www.righto.com/2022/11/how-8086-processors-microcode-engine.html) 只有 21 位。据推测,奔腾采用了“水平”微码架构,即微码位直接对应底层控制信号,而非“垂直”微码(位被编码成更密集的微指令)。我没有关于奔腾微码编码的任何信息;与 8086 不同,奔腾的专利没有提供任何线索。8086 的微码 ROM 包含 512 条微指令,远少于奔腾的 4608 条。考虑到奔腾指令集(包括片内浮点单元)的复杂性,这一点合乎情理。
下图是奔腾微码 ROM 的放大图。为此,我移除了三层金属和多晶硅层,露出了芯片底层的硅。硅掺杂图案清晰可见,显示了晶体管,从而揭示了 ROM 中存储的数据。如果有足够时间,你可以通过检查硅并查看晶体管是否存在,从 ROM 中提取位数据。
ROM 的放大图,展示位如何通过晶体管布局编码。(https://static.righto.com/images/pentium-microcode1/rom-closeup.jpg)
ROM 的放大图,展示位如何通过晶体管布局编码。
在解释 ROM 电路之前,我先回顾一下 NMOS 晶体管的构造。晶体管可以看作一个由栅极控制的源极和漏极之间的开关。源极和漏极区域(绿色)由掺杂了杂质以改变其半导体特性的硅构成,形成 N+ 硅。(这些区域在上面的照片中可见。)栅极由一层多晶硅(红色)构成,通过非常薄的绝缘氧化物层与硅隔离。每当多晶硅穿过有源硅时,就会形成一个晶体管。
NMOS 晶体管结构示意图。(https://static.righto.com/images/pentium-microcode1/mosfet-n.jpg)
NMOS 晶体管结构示意图。
位通过网格中晶体管的图案存储在 ROM 中。晶体管的存在或缺失存储了 0 或 1 位。¹ (http://www.righto.com/2025/03/pentium-microcde-rom-circuitry.html#fn:ambiguity) 下面的放大图显示了微码 ROM 的八位。其中有四个晶体管存在,四个位置缺失晶体管。因此,ROM 的这一部分存储了四个 0 位和四个 1 位。对于下图,我移除了三层金属和多晶硅,以显示底层的硅。我将掺杂(有源)硅区域涂成绿色,并用红色画出水平多晶硅线。如上所述,如果多晶硅穿过掺杂硅,就会产生一个晶体管。因此,ROM 的内容由硅区域的图案定义,该图案创建了晶体管。
微码 ROM 的八位,其中有四个晶体管存在。(https://static.righto.com/images/pentium-microcode1/rom-transistors.jpg)
微码 ROM 的八位,其中有四个晶体管存在。
水平硅线用作导线,为晶体管提供接地,而水平多晶硅线则选中 ROM 中的一行。该行中的晶体管将导通,将相关的输出线拉低。也就是说,行中存在晶体管会使输出被拉低,而没有晶体管则使输出线保持高电平。
对应上述八位的原理图。(https://static.righto.com/images/pentium-microcode1/rom-schematic.jpg)
对应上述八位的原理图。
下图展示了硅、多晶硅和底层金属(M1)层。我从左侧移除了金属以露出下面的硅和多晶硅,但垂直金属线的图案在那里继续延伸。如前所示,硅图案形成了晶体管。每条水平金属线通过一条金属线(未显示)连接到地。水平多晶硅线选择一行。当多晶硅线穿过掺杂硅时,就形成了晶体管的栅极。两个晶体管可能共享漏极,如左侧的晶体管对所示。
展示硅、多晶硅和 M1 层的示意图。(https://static.righto.com/images/pentium-microcode1/m1-diagram.jpg)
展示硅、多晶硅和 M1 层的示意图。
垂直金属线构成输出。圆点是金属线与晶体管硅之间的接触点。² (http://www.righto.com/2025/03/pentium-microcde-rom-circuitry.html#fn:contacts) 短金属跳线将多晶硅线连接到上面的金属层,这将在下面描述。
下图显示了 ROM 的左上角。淡黄色金属线是顶层金属层(M3),而红色金属线是中间金属层(M2)。粗的淡黄色 M3 线为 ROM 分配接地。在水平 M3 线下方,一条水平 M2 线也分配接地。黑色点阵是 M3 线和 M2 线之间的众多接触点,提供低电阻连接。反过来,M2 线连接到下面的垂直 M1 接地线——这些宽的垂直线隐约可见。这些 M1 线连接到硅,如前所示,为每个晶体管提供接地。这说明了奔腾中电源分配的复杂性:厚的顶层金属(M3)是+5伏和接地的主要分配通道,但电源必须通过 M2 和 M1 向下传递才能到达晶体管。
ROM 的左上角。(https://static.righto.com/images/pentium-microcode1/rom-m3.jpg)
ROM 的左上角。
上面的另一个重要特征是水平金属线,它们帮助分配行选信号。如前所示,水平多晶硅线为晶体管提供行选信号。然而,多晶硅的导电性不如金属,因此长的多晶硅线电阻太大。解决方案是并行运行金属线,定期连接到下面的多晶硅线,从而降低总电阻。由于垂直金属输出线位于 M1 层,水平行选线则在 M2 层运行,以避免冲突。M1 层中的短“跳线”将 M2 线连接到多晶硅线。
总之,每个 ROM bank 包含一个晶体管网格以及晶体管空缺,以定义 ROM 的位。ROM 经过精心设计,使得不同的层——硅、多晶硅、M1 和 M2——协同工作,以最大化 ROM 的性能和密度。
## 微码地址寄存器
当奔腾执行一条指令时,它会为微码 ROM 提供每条微指令的地址。奔腾将这个地址——微地址——保存在微码地址寄存器(MAR)中。MAR 是一个 13 位寄存器,位于微码 ROM 上方。
下图显示了位于上方 ROM bank 上方的微码地址寄存器。它由 13 位组成;每位都有多个锁存器来保存该值以及任何推入的子程序微地址。在第 7 位和第 8 位之间,一些缓冲电路放大发送到每位电路的控制信号。在右侧,驱动器放大来自 MAR 的输出,将信号发送到行驱动器和列选择电路(我将在下面讨论)。MAR 左侧是一个 32 位寄存器,显然与微码 ROM 无关,尽管我尚未确定其功能。
微码地址寄存器位于上方 ROM bank 的上方。(https://static.righto.com/images/pentium-microcode1/MAR.jpg)
微码地址寄存器位于上方 ROM bank 的上方。
来自微码地址寄存器的输出选择微码 ROM 中的行和列,我将在下面解释。MAR 的位 12 到位 7 选择一个由 8 行组成的块,而位 6 到位 4 选择该块中的一行。位 3 到位 0 从每组 16 列中选择一列,以选择一个输出位。因此,微地址控制 ROM 提供哪个字。
可以对微码地址寄存器执行几种不同的操作。执行机器指令时,必须将 MAR 加载到相应微码例程的地址。(我尚未确定此地址是如何生成的。)执行微码时,MAR 通常会递增以移动到下一条微指令。然而,根据需求,MAR 可以分支到一个新的微地址。MAR 还支持微码子程序调用;它会推入当前微地址并跳转到新的微地址。在微子程序结束时,微地址被弹出,因此执行返回到先前的位置。MAR 支持三级子程序调用,因为它包含三个寄存器来保存被推入的微地址堆栈。
MAR 从位于其上方的标准单元逻辑 (https://www.righto.com/2024/07/pentium-standard-cells.html) 接收控制信号和地址。奇怪的是,在 Intel 公布的奔腾 (https://doi.org/10.1109/40.216745) 布局图中,该标准单元逻辑被标记为分支预测逻辑的一部分,而分支预测逻辑位于其上方。然而,仔细追踪来自标准单元逻辑的信号后发现,它连接到微码地址寄存器,而不是分支预测器。
## 行选驱动器
如上所述,每个 ROM bank 有 288 行晶体管,多晶硅线用于选择其中一行。ROM 右侧是根据微地址激活其中一条行选线的电路。每一行对应一个不同的 9 位地址。一个直接的实现是为每一行使用一个 9 输入与门,匹配 9 位地址位或其补码的特定模式。
然而,这种实现需要 576 个非常大的与门,因此不切实际。相反,奔腾使用了一种优化的实现,每个由 8 行组成的组都配有一个 6 输入与门。剩下的三位地址在 ROM 顶部解码一次。因此,每一行只需要一个门,检测其所在的八行组是否被选中以及特定的那行是否被选中。
行驱动器电路的简化原理图。(https://static.righto.com/images/pentium-microcode1/row-driver-schematic.jpg)
行驱动器电路的简化原理图。
上面的原理图显示了一个由八行组成的组的电路,略作简化。³ (http://www.righto.com/2025/03/pentium-microcde-rom-circuitry.html#fn:simplified-rows) 在顶部,三个地址位被解码,生成八条输出线,其中一次只有一条有效。剩下的六个地址位被反相,提供该位及其补码给解码电路。因此,9 位被转换成 20 个信号,流经解码器,导线数量很多,但并非不可管理。每个由八行组成的组都有一个 6 输入与门,匹配特定的 6 位地址,由哪些输入被反相而哪些未被反相决定。⁴ (http://www.righto.com/2025/03/pentium-microcde-rom-circuitry.html#fn:binary) 左侧的与非门和反相器结合 3 位解码和 6 位解码,激活相应的行。
由于每一行最多有 720 个晶体管,行选线需要高电流驱动。因此,行选驱动器使用大晶体管,大约是常规晶体管尺寸的 25 倍。为了将这些晶体管装入与其余解码电路相同的垂直间距中,采用了巧妙的布局。每个八行组的驱动器被打包成一个 3×3 网格,只是第一列有两个驱动器(因为该组有 8 个驱动器,而不是 9 个)。为了避免空隙,第一列中的驱动器在垂直方向上更大,在水平方向上被压扁。
## 输出电路
下面的原理图显示了多路复用器电路,该电路为微码输出位从 16 列中选择一列。第一级有四个 4 选 1 多路复用器。接下来,另一个 4 选 1 多路复用器选择其中一个输出。最后,一个 BiCMOS 驱动器放大输出,以便传输到处理器的其余部分。
16 选 1 多路复用器/输出驱动器。(https://static.righto.com/images/pentium-microcode1/output-mux.jpg)
16 选 1 多路复用器/输出驱动器。
更详细地说,ROM 和第一个多路复用器本质上是 NMOS 电路,而非 CMOS。具体来说,ROM 的晶体管网格由 NMOS 晶体管构成,它们可以将列线拉低,但网格中没有 PMOS 晶体管将线拉高(因为那样会使 ROM 尺寸加倍)。相反,多路复用器包含预充电晶体管,用于在 ROM 被读取之前的时钟相位将线拉高。线的电容将保持线为高电平,除非被网格中的晶体管拉低。多路复用器中的四个晶体管之一被激活(由控制信号 `a`、`b`、`c` 或 `d` 控制)来选择所需的线。输出进入一个“保持”电路,该电路保持输出为高电平,除非被拉低。保持器使用一个弱 P
相似文章
Intel 8087浮点芯片的指令解码
对Intel 8087浮点协处理器指令解码的详细逆向工程分析,解释主CPU与协处理器之间的交互、微码ROM的使用以及总线接口单元。
Intel 8087 浮点芯片微码中的条件
对 Intel 8087 浮点协处理器微码中使用的条件测试的详细研究,是逆向工程工作的一部分,旨在理解其算法。
关于Intel 8086处理器算术逻辑单元的笔记
详细的技术分析,探讨Intel 8086处理器算术逻辑单元(ALU)的控制电路,解释微码和控制信号如何协调执行28种不同操作。
386处理器寄存器的异常复杂电路
对英特尔386处理器寄存器电路的详细逆向工程分析,揭示了六种不同的定制电路和交织位存储。
Intel 8087浮点芯片的堆栈电路逆向工程
本文详细介绍了对Intel 8087浮点协处理器堆栈电路的逆向工程,解释了该芯片基于堆栈的寄存器架构和微码ROM如何实现快速浮点运算。