英特尔8087浮点芯片核心:加法器的故事
速览
英特尔8087是早期重要的浮点运算协处理器。其核心组件加法器的设计对提升计算性能至关重要。该文章深入解析了这一关键硬件技术的发展历程。
AI 深度解读
Intel 8087 浮点芯片核心的加法器解析
背景
1980年,英特尔(Intel)发布了 8087 浮点协处理器。这款芯片能够将数学运算速度提升多达 100 倍。除了基本的算术运算和开方,8087 还能计算正切、指数和对数等超越函数。然而,所有这些复杂功能的实现,都依赖于一个核心的 69 位加法器。正如相关专利描述的那样:“浮点执行单元算术核心的中心是一个纳米机器,由加法器及其相关的寄存器、移位器和控制电路组成。”
这篇文章深入剖析了构成这一核心运算单元的加法器电路结构。
从显微镜下的 8087 芯片晶粒(die)照片可以看出,芯片边缘通过发丝般的键合线(bond wires)连接到 40 个外部引脚。晶粒上复杂的图案由金属布线以及下方的多晶硅和硅层形成。芯片顶部是总线接口单元(Bus Interface Unit),负责与系统其余部分连接,协调主 8086 处理器和内存。芯片的指令由中间的大型微代码 ROM(microcode ROM)定义。
晶粒的下半部分是“数据通路”(datapath),即执行计算的电路。它分为处理浮点数指数部分的指数数据通路,和处理尾数(或有效数字)部分的尾数数据通路。加法器(红色区域)位于尾数数据通路的中间;为了对指数执行加法,必须将指数复制到尾数数据通路中。
核心内容
构建二进制加法器本身并不困难,真正的挑战在于如何使其快速运行。关键问题在于如何处理从某一位到下一位的进位(carry)。每个进位可能依赖于所有低位的进位,但如果让进位像涟漪一样穿过所有 69 位逻辑电路,等待时间将是不可接受的。这类似于手工进行长除法时的进位过程:你需要不断地进位、再进位。
8087 的加法器通过将加法分解为 4 位块(4-bit blocks)来加速性能,并使用两种技术使每个块内部的计算快速完成。虽然进位仍然需要在块与块之间传递,但这将进位步骤的数量减少了四倍。
加法器的基本结构
一个 4 位块的结构如下:加法器有两个输入,一个是来自芯片尾数总线(fraction bus)的输入 F,该总线连接尾数数据通路的各个组件;另一个输入 B 来自一个名为 B 寄存器的寄存器。
每一位的和由输入 F、输入 B 以及进入该位的进位进行异或(XOR)运算产生。出于后续解释的原因,中间值(F XOR B)被称为“传播”(propagate)。每个块的进位输出连接到下一个块的进位输入。
曼彻斯特进位链(Manchester Carry Chain)
进位电路内部发生了什么?1959年,曼彻斯特大学的研究人员为 Atlas 计算机开发了一种快速进位技术,即曼彻斯特进位链。该技术通过设置并行开关,让进位通过导线快速传播,而开关由逻辑控制。虽然进位仍需逐位传输,但它以导线中信号的速度传播,而不受逻辑门延迟的减慢。
曼彻斯特进位链基于三个概念:生成(Generate)、传播(Propagate)和删除/消去(Delete/Kill),这些概念源于两个位和一个进位相加时的情况:
- 生成(Generate):如果相加
1+1,无论是否有进位输入,都会产生进位输出。 - 删除(Delete/Kill):如果相加
0+0,无论是否有进位输入,都不会产生进位输出;任何进位输入都会被删除。 - 传播(Propagate):如果相加
0+1,只有存在进位输入时才会产生进位输出;即进位输入被传播到进位输出。
在逻辑层面,生成信号是两个输入位的与(AND)运算,删除信号是或非(NOR)运算,传播信号是异或(XOR)运算。重要的是,这些信号可以在常数时间内并行计算所有位位置。
曼彻斯特进位链由上述结构构建,每个位的开关根据生成/传播/删除值设置。一旦开关设置好,进位状态就会迅速流过电路,在没有逻辑延迟的情况下产生每个位置的进位值。如果传播开关闭合,前一个进位通过;但如果生成或删除开关闭合,进位分别被置位或清零。一旦进位值可用,最终的和可以通过异或运算并行计算。
8087 的优化电路
8087 使用了一种优化的曼彻斯特进位链电路,将生成和删除情况结合在一起。
在一个加法器进位链阶段中:
- 对于传播情况,进位输入
Cin通过顶部开关,传播到进位输出Cout。 - 对于生成和删除情况,底部开关闭合,传递输入位 F。
- 生成情况对应
1+1,此时 F 为 1,导致Cout被置位。 - 删除情况对应
0+0,此时 F 为 0,Cout被清零。 - (注:在这些情况下,两个输入 F 和 B 是相同的,因此使用 F 而不是 B 是任意的。)
- 生成情况对应
图示中间部分显示了开关如何对应于多路选择器(mux):如果 prop 信号置位,则选择顶部信号 Cin;如果 prop 信号清零,则选择底部信号 F。图示右侧展示了使用两个 NMOS 晶体管的物理实现。这些晶体管作为开关(传输晶体管)工作,由栅极上的 prop 信号控制。
电压损耗与进位跳过(Carry-Skip)
问题是传输晶体管并非完美的开关,每一步都会损失一定的电压。为了解决这个问题,进位链被分成四个位一组的块(如前所示),每个块产生一个“新鲜”的进位。这种刷新是通过“进位跳过”电路完成的,该电路可以跳过块内部的进位处理。
具体来说,进位跳过机制检查块内的所有位置是否都是“传播”状态。在这种情况下,进位输出将与进位输入具有相同的值(因为进位输入通过块的所有位位置传播)。进位跳过电路检测这种情况并产生与进位输入匹配的进位输出信号。
将所有内容结合起来,典型的四位数块的加法器电路图显示:四个多路选择器形成曼彻斯特进位链,而或非门(NOR gate)检测进位跳过情况。
电气优化与预充电
为了优化性能,由于电气原因存在一个复杂性。8087 使用 NMOS 晶体管,其拉低信号的速度远快于拉高信号的速度。为了提高性能,进位线在加法开始时被预充电至 5V,然后电路在需要时将线拉低。为了从无进位状态开始,进位线全部取反,因此初始的 5V 状态对应无进位,而接地状态对应有进位。
块中的最后一个多路选择器有四个输入而不是两个:
- 第三个输入在进位跳过情况下将(取反的)进位线拉低。
- 第四个输入是预充电信号(precharge);它在进位线上放置 5V 以进行预充电。(控制电路在加法周期开始时激活预充电信号。)
注意,这只预充电一条进位线;为了预充电其余进位线,预充电期间强制传播信号为高电平。
生成传播信号(propagate)的电路在概念上是两个输入的异或,但当然存在复杂性。当预充电信号为高电平时,传播信号被强制为高电平,将所有进位线连接在一起,以便预充电可以传播到所有进位线。
第二个功能是 B 输入可以被 forceZero 信号阻断,从而添加值 0 而不是 B 值。
总结
加法器被分为四位数块。每个块使用曼彻斯特进位链和进位跳过电路来优化性能。即使有这些优化,由于块的数量众多,8087 仍需两个时钟周期才能完成一次加法。
关键要点
- **核心
