Intel 8087浮点芯片的核心加法器
摘要
对1980年Intel 8087浮点协处理器中69位加法器的详细逆向工程分析,解释其快速进位技术在计算超越函数中的作用。
<p><a href="https://lobste.rs/s/f1qxka/adder_at_heart_intel_s_8087_floating_point">评论</a></p>
查看缓存全文
缓存时间: 2026/06/14 00:21
# Intel 8087 浮点芯片核心的加法器
来源:http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html
1980 年,英特尔发布了 Intel 8087 浮点协处理器,这是一款能让数学运算提速高达 100 倍的芯片。除了算术运算和平方根,8087 还能计算包含正切、指数和对数在内的超越函数。但这一切都依赖于一个 69 位加法器:正如[专利](https://patents.google.com/patent/USRE33629E)中所述,“浮点执行单元的算数核心围绕着一个由加法器及其相关寄存器、移位器和控制电路组成的纳米机器。”在本文中,我将解释这个加法器的电路结构。
下面的照片展示的是显微镜下的 8087 芯片裸片。在裸片边缘,比头发还细的键合线将芯片连接到它的 40 个外部引脚上。芯片上复杂的图案由金属布线以及下方的多晶硅和硅构成。芯片顶部是总线接口单元,负责与系统其余部分连接:协调与主 8086 处理器和内存的通信。芯片的指令由中间的大型微码 ROM 定义。
Intel 8087 浮点单元芯片的裸片,标有相关功能模块。裸片尺寸为 5mm×6mm。点击查看大图。 (https://static.righto.com/images/8087-adder/8087-die-labeled.jpg)
裸片下半部分是“数据通路”,即执行计算的电路;它分为指数数据通路(处理浮点数的指数)和小数数据通路(处理小数部分,即有效数)。加法器(红色)位于小数数据通路的中央;为了对指数执行加法,必须将指数复制到小数数据通路中。
## 加法器的结构
构建一个二进制加法器很容易;难的是让它变快。关键问题是如何处理从一个位到下一个位的进位。每个进位都可能依赖于所有更低的进位,但你肯定不希望进位在全部 69 位中逐级传输等待。(就像用竖式计算 999999+1:你需要不断地进位、进位……)
8087 的加法器通过将加法分解成 4 位块来提升性能,并采用两种技术让每个块内部的运算快速完成。进位需要在块之间传递,但这将进位步骤的数量减少了四倍。
8087 加法器中一个四位块的简化示意图。 (https://static.righto.com/images/8087-adder/overall-diagram.jpg)
上图显示了一个 4 位块的结构,进位生成电路暂时抽象化了。加法器有两个输入:一个(`F`)来自芯片的小数总线,这条总线连接小数数据通路的各个组件;第二个输入(`B`)来自一个称为 B 寄存器的寄存器。和的每一位都是由对输入`F`、输入`B`以及进入该位的进位进行异或运算得到的。¹ (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:xor) 出于下文将要解释的原因,中间值(`F XOR B`)被称为“传播”。每个块输出的进位连接到下一个块的进位输入。但进位电路内部发生了什么呢?
1959 年,曼彻斯特大学的研究人员为一台名为 Atlas 的计算机开发了一种快速进位技术。这种技术被称为曼彻斯特进位链,它通过并行设置开关,然后让进位在开关的控制下快速通过导线传播来计算进位值。尽管进位仍然需要从一个位传递到下一个位,但它的传播速度是导线中的信号速度,不受逻辑门延迟的影响。² (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:386)
曼彻斯特进位链基于生成、传播和删除(也称为清除)这些概念构建,这些概念在相加两个位和一个进位时出现。如果相加`1+1`,则*生成*进位输出,无论是否有进位输入。相反,如果相加`0+0`,则无论进位输入如何,都没有进位输出;任何进位输入都会被*删除*。有趣的情况是相加`0+1`:只有当存在进位输入时才会产生进位输出;也就是说,进位输入被*传播*到进位输出。在逻辑上,生成信号是两个输入位的与运算,删除信号是或非运算,传播信号是异或运算。重要的是,这些信号可以并行计算所有位位置,所需时间为常数。
曼彻斯特进位链的原理。注意低位在左侧,因此进位从左向右流动。 (https://static.righto.com/images/8087-adder/manchester.jpg)
曼彻斯特进位链如上图所示构建,每个位的开关根据生成/传播/删除值设置。开关设置好后,进位状态会迅速通过电路,无需任何逻辑延迟即可产生每个位置的进位值。如果传播开关闭合,则前一个进位通过。但如果生成或删除开关闭合,则分别设置或清除进位。一旦进位值可用,就可以用异或门并行计算最终的和。
8087 使用了针对曼彻斯特进位链的优化电路,将生成和删除情况合并。加法器进位链的一级如下所示。对于传播情况,进位输入`Cin`通过顶部开关,传播到进位输出`Cout`。对于生成和删除情况,底部开关闭合,传递输入位`F`。技巧在于,生成情况对应`1+1`,因此`F`为 1,导致`Cout`被置位。删除情况对应`0+0`,因此`F`为 0,`Cout`被清除。(注意,在这些情况下两个输入`F`和`B`相同,因此使用`F`而不是`B`是任意的。)
曼彻斯特进位链的一级。 (https://static.righto.com/images/8087-adder/mux-stage.jpg)
图中部显示开关如何对应于一个多路复用器(mux),如果`prop`置位则选择顶部信号`Cin`,如果`prop`清零则选择底部信号`F`。图的右侧显示了使用两个 NMOS 晶体管的物理实现。这些晶体管充当开关(传输门),由栅极上的`prop`信号控制。
问题是传输门不是完美的开关,每一步都会损失一点电压。为了解决这个问题,进位链被分成四位一块(如前所示),每个块产生“新鲜的”进位。这种刷新由“进位跳过”电路完成,它可以跳过块内部的进位处理。具体来说,进位跳过机制检查块内的所有位置是否都是传播状态。在这种情况下,进位输出将与进位输入具有相同的值(因为进位输入传播通过块的所有位)。进位跳过电路检测到这种情况,并产生一个与进位输入匹配的进位输出信号。
综合起来,下面的示意图显示了加法器中一个典型四位块的电路。四个多路复用器构成曼彻斯特进位链,而或非门检测进位跳过情况。
反逆向工程得到的加法器四位块原理图。 (https://static.righto.com/images/8087-adder/block-schematic.jpg)
出于电气原因,为了优化性能,存在一个复杂性。³ (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:precharge) 8087 使用 NMOS 晶体管,将信号拉低的速度远快于拉高。为了提升性能,在加法开始时进位线被预充电至 5V,然后电路在必要时将线拉低。为了从无进位状态开始,所有进位线都被否定,因此初始的 5V 状态对应无进位,而接地状态对应有进位。
块中的最后一个多路复用器有四个输入而不是两个⁴ (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:mux)。第三个输入在进位跳过情况下将(反相的)进位线拉低。⁵ (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:nor) 第四个输入是`precharge`信号;它将 5V 加到进位线上以预充电。(一个控制电路在加法周期开始时激活预充电信号。)注意这仅预充电其中一条进位线;为了预充电其余部分,在预充电期间传播信号被强制拉高。
传播电路的反向工程原理图。这显示任意位`n`。 (https://static.righto.com/images/8087-adder/prop-schematic.jpg)
生成`propagate`信号的电路(上图)概念上是两个输入的异或,但(当然)存在复杂性。当`precharge`信号为高时,`propagate`被强制为高,将所有进位线连接在一起,以便预充电可以传播到所有进位线。第二个特性是`B`输入可以被`forceZero`信号阻塞,因此加入的是 0 而不是`B`值。
总结一下,加法器被分成四位一块。每个块使用曼彻斯特进位链和进位跳过电路来优化性能。尽管如此,大量的块使得 8087 需要两个时钟周期来完成一次加法。
## 硅片上的加法器
下图显示了一个四位块的电路在裸片上的样子。这些块垂直堆叠,形成在早期裸片照片中看到的完整加法器。在这张图中,金属层显示为白色线条,大部分遮挡了下方的电路。8087 只有单层金属,这限制了布局。注意金属布线非常密集,几乎占据了整个区域。左侧的粗垂直金属迹线是地线,右侧的粗金属迹线是电源线,为加法器电路供电。水平迹线提供加法器块内部的布线,也允许小数总线穿过加法器。两侧的垂直线是加法器的控制信号(`precharge`和`forceZero`),以及连接到裸片底部电路的连接线。
加法器中的一个四位块。 (https://static.righto.com/images/8087-adder/adder-block-metal.jpg)
下图显示了金属层下方的硅和多晶硅电路。(为了拍摄这张照片,我用酸溶解了金属层。)细线是多晶硅布线,而凸起的粉红色区域是掺杂硅。当多晶硅穿过掺杂硅时,就形成了一个晶体管。电路复杂且不规则,通过上面的水平金属线连接。白色电路是硅与金属布线之间的接触点,而白色方块是多晶硅与金属之间的接触点。大致来说,如果将上面的电路分成四等份,每份对应一位加法。进位跳过电路位于中间。
去除金属层后的加法器中的四位块。 (https://static.righto.com/images/8087-adder/adder-block-die.jpg)
图像的左右两侧没有晶体管,只有多晶硅线穿过垂直金属布线下方。许多这些多晶硅线被加宽以降低电阻,从而调整性能。这些区域中的硅被“浪费”了,只是为垂直布线提供通道。
尽管 8087 名义上对小数值(有效数)使用 64 位,但加法器稍大:它接收 69 位输入并产生 70 位输出。一个原因是 8087 使用三个额外的低位用于舍入,称为 Guard、Round 和 Sticky。这些位确保数值始终向正确方向舍入。对舍入位的处理相当复杂,有多种模式,但从加法器的角度来看,它们只是三个输入位。⁶ (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:carry-in)
如下文所述,来自 B 寄存器的值可以加倍,这需要一个额外的位。最后,小数总线和 B 值可以被取反。(这用于减法等情况。)负值用二进制补码表示,需要一个额外的位。总共,加法器的输入是 69 位宽。
当相加两个大数时,结果可能需要一个额外的位。因此,加法器的输出是 70 位宽。求和移位器(下文解释)可以将输出右移两位,将结果缩减至 68 位。这仍然比 64 位加 3 个舍入位多一位;“额外”的位由一些专用寄存器支持,例如`tmpC`寄存器⁷ (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:tmpc)和跳过移位器。
## 周围电路
加法器的输入和输出连接到一些专用寄存器和电路。我将把对这些电路的详细解释留到另一篇文章中,但这里提供简要描述。⁸ (http://www.righto.com/2026/06/intel-8087-adder-reverse-engineered.html#fn:patent) 加法器有两个输入:一个来自小数总线,另一个来自 B 寄存器。加法器的输出存储在求和寄存器中。为了加快乘法,8087 使用基 4 布斯乘法(https://www.geoffknagge.com/fyp/booth.shtml),它一次乘两个位。乘数存储在跳过移位器中,这是一个允许一次移出两位的寄存器。根据这些位,添加值`2B`、`B`、`0`或`-B`之一。(`-B`路径也用于减法。)加法器的输出由求和移位器(不要与跳过移位器混淆)右移两位,并存储在求和寄存器中。
加法器及相关寄存器。基于专利。 (https://static.righto.com/images/8087-adder/adder-regs.jpg)
除法通过重复减法、加法和移位实现。结果的位累积在商寄存器中。平方根的实现类似于纸笔长平方根,只不过是在二进制中。跳过移位器从左侧提供两位,这些位附加到加法器输入的右侧。进行减法或加法,类似于除法,平方根在 B 寄存器中形成。
乘法、除法和平方根需要多个步骤来处理所有位。为了性能,这种循环在硬件中实现,而不是在微码中。这些指令需要大量微码来准备参数、处理指数、处理特殊情况并存储结果,但内循环是硬件的。
## 结论
[8087 专利](https://patents.google.com/patent/US4484259A)阐述了加法器的重要性:“最终,所有的算术运算在某一时刻都归结为……"
相似文章
Intel 8087浮点芯片的指令解码
对Intel 8087浮点协处理器指令解码的详细逆向工程分析,解释主CPU与协处理器之间的交互、微码ROM的使用以及总线接口单元。
Intel 8087浮点芯片的堆栈电路逆向工程
本文详细介绍了对Intel 8087浮点协处理器堆栈电路的逆向工程,解释了该芯片基于堆栈的寄存器架构和微码ROM如何实现快速浮点运算。
8087数学协处理器快速位移器的芯片分析(2020)
对Intel 8087数学协处理器快速位移器的芯片分析,探讨其架构及在浮点运算中的作用。
Intel 8087浮点芯片内部的微码:寄存器交换
对Intel 8087浮点协处理器内部微码的详细逆向工程分析,聚焦于FXCH寄存器交换指令及芯片内部架构。
Intel 8087 浮点芯片微码中的条件
对 Intel 8087 浮点协处理器微码中使用的条件测试的详细研究,是逆向工程工作的一部分,旨在理解其算法。