Intel8086内部加法器的逆向工程

2020-08-02 02:59:36

Intel8086处理器包含许多有趣的组件,这些组件可以通过逆向工程来理解。在这篇文章中,我将讨论用于地址计算的加法器。下面的照片显示了显微镜下8086处理器的微型硅晶片。芯片的左侧有16位数据路径,包括寄存器和算术逻辑单元(ALU);您可以看到重复16次的电路模式。右下角的矩形是微码ROM,定义每条指令的执行。

8086微处理器的模具照片,突出显示16位地址加法器。微码ROM在右下角。这张照片的金属层被去掉了,露出了下面的硅和多晶硅。这些颜色是由于部分去除的氧化层产生的薄膜效应造成的。

16位加法器,这篇文章的主题,在左上角。放大视图显示了加法器是如何由16级构成的,每个级对应一个比特。上行处理高位(15-8),下行处理低位(7-0)。1对芯片的研究揭示了这种16位加法器是如何通过巧妙的电路设计、专门的逻辑门和仔细的布局技术进行优化的。

您可能想知道为什么8086同时包含加法器和ALU(算术逻辑单元)。原因是加法器用于地址计算,而ALU用于数据计算。8086使用总线接口单元预取指令,该接口单元半独立于执行指令的执行单元运行。总线接口单元和执行单元很难无冲突地共享ALU,通过同时提供加法器2和ALU,这两个计算可以并行进行。

20世纪70年代早期的微处理器通常有16位地址,能够访问64千字节的内存。起初,64千字节的内存似乎比任何人都需要(或负担得起)的内存更多,但随着内存芯片价格的暴跌,对内存的需求也在增长。4为了支持更大的地址空间,英特尔在8086上增加了段寄存器,这是一次黑客攻击,允许处理器访问一兆字节的内存,这些内存已经咬了好几年的牙了,其概念是将内存分成64千字节段。段寄存器指定内存段的开始,16位地址表示该段内的地址。这些地址在加法器中组合,如下所示,以获得内存地址。一个缺点是访问大于64千字节的内存区很困难;必须修改段寄存器才能离开当前段。3个。

添加段寄存器和偏移量以创建20位物理地址。摘自iAPX 86,88用户手册,第2-13页。

16位加法器如何计算20位地址?诀窍在于,由于段寄存器被移位4位,加法器将段寄存器的16位和偏移量的前12位相加。偏移量的四个低位绕过加法器,因为它们是不变的。出于其他目的(如递增指令计数器),加法器对未移位的16位地址进行操作。因此,寄存器电路具有将移位或非移位的值馈送到加法器的逻辑。

下图来自8086专利,展示了加法器如何位于段寄存器和地址引脚之间,计算地址。在专利中,段寄存器被命名为RC、RD、RS和RA,而不是它们的当前名称:CS、DS、SS和ES。

加法器以黄色突出显示,是总线接口单元的关键部件。上部寄存器堆(独立于通用寄存器)连接到加法器。IND和OPR是内部寄存器,程序员不可见。来自8086专利。

如果你学过数字逻辑,你可能会熟悉全加器,这是一种用于加二进制数的积木,具体地说,一个全加器需要两位和一位进位。它将这三位相加,并输出1位和以及进位输出位。(例如,二进制形式的1+0+1=10,因此进位输出为1,和位为0。)16位加法器可以通过连接16个全加器来创建,其中一个全加器的进位送入下一个进位。当您添加两个十进制数时,将进位移动到左边的下一列,每个全加器在二进制数中添加一列,然后。

全加器可以用不同的方式实现;8086的电路如下所示。(此电路在16位加法器中重复16次。)每个加法器级接受两个输入(底部)和进位输入(反相,右侧)。这些输入相加形成1位和输出(底部)和进位输出(左侧)。和位由两个组合两个输入和进位的异或门构成。5输出通过三态缓冲器(在顶部),允许其连接到内部数据总线。6个。

8086加法器一级原理图。原理图布局对应于芯片上的物理布局。

进位计算使用一种名为曼彻斯特进位链7的优化,可以追溯到1959年。加法的问题是进位速度很慢;在简单的方法中,只有在计算完右边的进位之后,才能计算每一位和。(类似于用长加法计算99999999+1;每个数字都需要进位1。)如果每一位都必须等待前一位进位,加法就会变成一个缓慢的串行过程。

曼彻斯特进位链背后的思想是并行地决定每个阶段是生成进位、传播现有进位还是阻塞任何进位。然后,进位可以在没有顺序评估的情况下快速流过进位链。要理解这一点,请考虑添加两位和进位时的情况。对于0+0,无论任何进位,都不会有进位。另一方面,添加1+1将始终产生进位,而不管任何进位;在这种情况下。如果有外卖的话就会有外卖。这种情况被称为进位传播,因为进位不变地通过级传播。

进位生成";和进位传播";信号用于打开或关闭进位线中的开关(即晶体管)。对于";进位传播";,进位连接到进位输出,因此进位可以流过。否则,输入进位被断开。对于";进位生成";。对于";进位生成";。对于";进位生成";,进位输入被连接到进位输出。否则,输入进位被断开。对于";进位生成";进位生成";。由于这些开关都可以并行设置,进位计算速度较快。进位输入流经开关时仍有一些传播延迟,可能从位0一直到位15,但这比通过一系列逻辑门计算进位快得多。

加法器的四级,其中指示了进位链。在这张照片中,芯片顶部的金属层是可见的,大部分遮挡了多晶硅和下面的硅。每级的输入和输出接线在底部。

芯片上可以看到进位链;上面的照片显示了加法器的四个阶段。水平线是金属布线:控制信号、接地和电源(靠近底部的粗线)。金属下面几乎看不见硅电路。进位链线在每一级被中断,以连接到下面的晶体管,新的进位继续到下一级。

对加法器的仔细检查表明,虽然16个单位级非常相似,但它们并不都是相同的。下面显示的额外电路是一种称为[carry-skip](https://en.wikipedia.org/wiki/Carry-skip_adder].的性能优化。

这两级的8086加法器几乎是相同的,除了箭头所示的电路。在这张照片中,去除了金属层和多晶硅层,显示了下面的硅。

跳跃进位的思想是如果可能的话跳过进位链中的一些级,以减少通过链的最坏情况的延迟。例如,如果比特8有进位输入,并且为比特8、9、10和11设置进位传播,则可以立即确定存在进位输入TOBIT 12。因此,通过将进位输入和四个进位传播值进行AND运算,可以针对这种情况立即计算比特12的进位输入。换言之,如果比特8有进位输入,则可以立即确定存在进位输入TOBIT 12。因此,通过将进位输入和四个进位传播值进行AND运算,可以针对这种情况立即计算比特12的进位输入。换言之,类似的跳跃进位电路允许进位从位2跳到位4,以及从位4跳到位8。这些跳过进位电路减少了加法器';最坏情况下的计算时间。8个。

加法器的性能对8086的整体速度至关重要,所以它使用了一些有趣的技术来实现快速逻辑门。一些加法器的门是用动态逻辑构建的。标准的逻辑门很简单:你输入信号就可以得到结果。相比之下,动态逻辑门使用周期时钟信号来计算逻辑函数。9由于动态逻辑可以更快、更紧凑,所以它以多米诺逻辑的形式在现代处理器中使用。

动态逻辑依赖于两相时钟,在那个时代的微处理器中通常用于计时。两相时钟由两个交替激活的时钟信号组成。首先,第一阶段(ɸ1)为高,第二阶段(ɸ2)为低。那么阶段1是低的,阶段2是高的。此周期以时钟频率(例如5 MHz)重复。

下图显示了加法器的动态与非门。在阶段1中,时钟ɸ1打开较低的晶体管,将输入拉低到反相器。阶段2是评估阶段,在此计算逻辑函数。如果两个输入都为高,则两个输入晶体管将打开,允许时钟ɸ2通过反相器输入,将其拉高并导致输出降低。另一方面,如果任一输入为低,则时钟ɸ2不能通过晶体管。相反,在任何一种情况下,电路实现NAND功能,只有当输入都为高时才具有低输出。请注意,与标准逻辑门不同,动态逻辑门';S输出仅在时钟相位2期间有效。

使用动态逻辑实现与非门。门由两相时钟信号控制。

下图显示了动态与非门是如何在芯片上物理实现的;原理图的布局与物理布局相对应。在照片中,金属层被移除,显示了下面的硅。淡黄色的区域是掺杂的导电硅,棕色的金属线是多晶硅,多晶硅是一种用于布线的特殊类型的硅。当多晶硅穿过掺杂硅形成晶体管;多晶硅是栅极,控制两侧硅之间的传导。晶体管有复杂的扭曲形状,以便在尽可能小的空间内适应电路。每个晶体管都有特定的尺寸,以便在速度和功耗之间实现最佳平衡。例如,输入晶体管很小,而逆变器晶体管要大得多。

8086中的一个动态与非门,并给出了相应的原理图。这张照片的金属层被去掉了,露出了硅和多晶硅。下级(如图所示)和上级的布局略有不同。

下图显示了与非门在8086芯片中的位置。第一个框放大16个单位加法器电路中的一个。第二个框显示与非门在加法器中的位置,与非门在整个芯片照片中几乎可见,显示了与现代芯片相比的特征有多大。

加法器的每一级具有动态与非门。突出显示其中一个阶段中的与非门。

加法器中另一个有趣的动态逻辑门是异或(XNOR,异或的补码),如果两个输入相同,则输出1,否则输出0。下图显示了XNOR的实现。10如前所述,在阶段1期间,逆变器输入被拉到地。在评估阶段,时钟ɸ2可以通过上对晶体管或下对晶体管将逆变器输入拉高。如果输入不同(输入2为高而输入1为低,或者如果输入1为高而输入2为低),则会发生这种情况,从而导致逆变器输出为低。否则,逆变器输入将从相1保持为低,并且逆变器输出将为高。因此,如果两个输入为高,则输出为高。

8086中的加法器起着至关重要的作用,为每次存储器访问计算地址。16位加法器看起来像是一个简单的电路,但8086中的加法器经过了高度优化,因此不会成为性能瓶颈。为了加快进位处理,加法器使用曼彻斯特进位链,其上有跳跃进位电路。加法器使用三种不同的逻辑门设计:标准NMOS门、传递晶体管逻辑和动态逻辑。即使在晶体管级别,电路也使用了三种不同的设计:标准NMOS门、传递晶体管逻辑和动态逻辑。即使在晶体管级别,加法器也使用了三种不同的设计用于逻辑门:标准NMOS门、传递晶体管逻辑和动态逻辑。

Intel8086是一款有趣的处理器,电路复杂,但仍然很简单,可以在显微镜下研究它的电路。8086有2.9万个晶体管,其功能只有几微米大。相比之下,现代处理器有数十亿个晶体管和以纳米为单位的晶体管。虽然摩尔定律的进步带来了现代处理器的巨大进步,但20世纪70年代的处理器在逆向工程方面要好得多。

如果你对8086感兴趣,我早些时候写过关于8086芯片、它的芯片缩小过程和8086寄存器的文章。我计划写更多关于8086的文章,所以请在Twitter@kenshiriff或RSS上关注我的更新。

加法器';的布局具有顶部的位15-8和下方的位7-0。此布局是数据路径中的位排序的结果:位是交错的15-7-14-6-...-8-0,而不是线性的15-14-...-0。这种交织背后的原因是,通过交换位对,可以容易地交换16位字中的两个字节。加法器被分成两行,以便它适合可用的水平空间。加法器的一位比寄存器文件的一位宽。将加法器拆分成两行可以保持位间距大致相同,从而避免了寄存器文件和加法器之间的长导线。-↩。

许多早期的微处理器(如68000和Z-80)都有一个程序计数器增量,与算术运算单元分开。(一个动机是算术运算单元是8位,而程序计数器是16位。)6502和Z-80有地址加法器,与算术运算单元分开。-↩。

8086';的分段体系结构导致了使用近指针和远指针进行编程。近指针是一个16位指针,可以保存在寄存器中并易于操作,但不能访问超过64千字节。远指针是偏移量和段值的组合,导致一个指针可以访问全部内存,但每个指针需要两次存储。比较远指针是有问题的,因为它们不是唯一的;多个偏移量/段组合可以寻址相同的物理。

与8086型相比,摩托罗拉68000微处理器(1979年)有32位寄存器,它的地址总线是24位宽,允许它直接访问16兆字节的内存,而不需要段寄存器。1984年的68020将地址总线扩展到32位,允许访问4千兆字节的内存。

68000采用64针封装,为24条地址线和16条数据线提供了大量的管脚。相比之下,英特尔不喜欢大型IC封装,对8086使用40针封装。因此,8086使用20个管脚作为地址线,并将其中16个管脚重复使用(即多路复用)用于数据线。8086还多路复用了许多控制管脚,使系统设计复杂化。-↩。

所需总和输出为INPUT1⊕INPUT2⊕进位输入。在8086加法器中,进位是反相的,路径中有两个异或门和一个反相器。因此,电路总共有四个反相器;因为这个数字是偶数,所以它们相互抵消,电路产生所需的三个值的异或。“↩。

三态缓冲器有三种不同的输出:高(1)、低(0)或高阻抗(hi-Z)。在hi-Z状态下,缓冲器不输出任何东西,并且是电断开的。其动机是可以通过三态缓冲器将多个信号连接到总线。通过启用一个缓冲器并禁用其余缓冲器,可以将所需的信号输出到总线。(常规缓冲器无法工作,因为如果一个缓冲器输出1,而另一个缓冲器输出1,则会出现电气问题。集电极开路输出是将多个信号连接到总线的另一种选择。“↩。

曼彻斯特进位链是由曼彻斯特大学开发的,并在1959年的“数字计算机中的并行加法:一种新的快速进位电路”一文中描述,它被用于阿特拉斯超级计算机(1962年)。

上图来自原文,显示了曼彻斯特进位链的结构。虽然开关看起来像继电器触点,但进位链是由晶体管(2N501微合金扩散基区晶体管)实现的。8086中进位链的结构与上图相似,但顶部开关被异或门取代。-↩。

关于跳跃进位实现的几点注意事项。从概念上讲,信号一起进行AND运算,但是由于进位和传播信号输入是反转的,所以实现使用NOR门。为了使进位跳跃有用,使用门的进位计算必须比进位链快,这是通过一次跳过四个阶段来实现的。(我不知道为什么第一级用较小的跳跃来实现。)请注意,进位跳跃在特定情况下(包括最坏的情况)是有帮助的,因此仍然需要常规的进位电路。-↩。

处理器总是有最高时钟速度,也就是它们能运行的最快速度。(最初的8086运行频率高达5兆赫,而后来的8086-1支持10兆赫。)然而,由于使用了动态逻辑,8086的最低时钟速度也是2兆赫。如果时钟运行得比这个速度慢,电线上的电荷在使用之前就有泄漏的风险,导致错误。-↩。

令人惊讶的是,加法器对上一个XNOR门使用了完全不同的实现;它是用传递晶体管逻辑而不是动态逻辑实现的。我认为其动机是,由于通过进位链的传播延迟,这些XNOR门的进位输入信号不是完全同步的。动态逻辑的缺点是,如果输入信号在时钟之后切换为低电平,则门无法恢复;电路已经充电,直到下一个时钟阶段才会放电。特别是,如果进位在时钟相位2开始之后进入,则它不能切换输出高电平。通过使用非动态逻辑,即使进位未与时钟对齐,当进位到达时,输出也会正确切换。

通过晶体管逻辑不同于常规的NMOS逻辑门,但提供了一种更有效的实现XNOR的方式。该电路类似于Z-80微处理器中的XNOR,我在前面已经描述过了,所以我在这里不再详述。

传递晶体管逻辑还用于实现加法器上的输入和输出锁存器。在前面显示的专利图表中,这些锁存器在加法器的输入侧显示为Tmp B和Tmp C,在输出侧显示为Tmpɸ1。这些锁存器为n。

.