Intel8086处理器的寄存器:从芯片到晶体管

2020-07-19 00:50:57

英特尔8086微处理器是有史以来最有影响力的芯片之一;它导致了今天主导台式机和服务器计算的x86架构。我一直在根据芯片照片对8086进行逆向工程,在这篇文章中,我讨论了它的寄存器文件是如何实现的。

8086芯片,显示寄存器存储。上部寄存器由总线接口单元用于存储器访问,而通用下部寄存器由执行单元使用。指令缓冲器是预取指令的6字节队列。

上图为显微镜下8086处理器的硅晶片。芯片顶部的金属层是可见的,下面隐藏着硅。在外缘周围,将芯片上的导线连接垫连接到芯片的40个外部引脚上。

突出显示的区域表示8086个16位寄存器和6个字节的指令预取队列。1寄存器占芯片的很大一部分,即使它们总共只有36字节。由于空间的限制,早期的微处理器的寄存器数量相对较少;相比之下,现代处理器芯片有千字节的寄存器和兆字节的高速缓冲存储器。2个。

我将首先解释8086是如何由NMOS晶体管构成的。然后我将解释反相器是如何构造的,单个比特是如何使用反相器存储的,以及寄存器是如何构造的。

8086和那个时代的其他芯片是由一种叫做NMOS的晶体管制成的。这些芯片由硅衬底组成,硅衬底通过砷或硼的扩散掺杂形成晶体管。在硅之外,多晶硅布线将晶体管的栅极和布线元件连接在一起。最后,顶部的金属层提供了更多的布线。(相比之下,现代处理器使用的是CMOS技术,它结合了NMOS和PMOS晶体管,它们有很多金属层。)(与之相比,现代处理器使用的是CMOS技术,它结合了NMOS和PMOS晶体管,它们有很多金属层。)(与之相比,现代处理器使用的是CMOS技术,它结合了NMOS和PMOS晶体管,它们有很多金属层。)。

下面的示意图显示了一个由NMOS晶体管和电阻器构成的逆变器。3输入低时,晶体管关断,因此上拉电阻将输出拉高。输入高时,晶体管接通,连接地和输出,拉低输出。因此,输入信号反转。

该示意图显示了逆变器是如何由晶体管和电阻器构成的。这张照片显示了芯片上的实现,去除了金属层,以显示多晶硅和下面的硅。

上面的照片显示了8086中的逆变器是如何物理构造的。粉红色的区域是导电的掺杂硅,闪闪发光的铜色线是顶部的多晶硅。在多晶硅与硅交叉的地方会产生一个晶体管:多晶硅形成晶体管的栅极,而两边的硅区是晶体管的源极和漏极。大的多晶硅矩形在+5伏和输出之间形成上拉电阻。因此,芯片的电路与逆变器原理图相匹配。在显微镜下,电路,如以下电路。

寄存器的构建块是反馈环路中的两个反相器,存储单个比特,如下所示。如果顶线为0,则右侧的反相器将向底线输出1。然后,左侧的反相器将向顶线输出0,从而完成周期。因此,电路是稳定的,并且将记住";记住";0。同样,如果顶线是1,这将在底线反转为0,并在顶部反转为1。因此,电路是稳定的,并且将记住";0。同样,如果顶线是1,则在底线将反转为0,在顶线将反转为1。因此,电路是稳定的,并且将记住";记住";0。

在8086中,两个耦合的反相器保持寄存器中的单个位。该电路在0或1状态下稳定。

添加三个晶体管以从反相器对中形成可用的寄存器单元。4一个晶体管选择要读取的单元,另一个晶体管选择要写入的单元,第三个晶体管在读取时放大信号。在下面原理图的中心,两个反相器存储位。为了读取位,读取线被通电。这通过放大晶体管将反相器的输出连接到位线,为了写入位,写入线被通电,从而将位线连接到反相器。通过在位线上施加高电流0或1信号,将反相器(以及存储的位)强制为所需的值。请注意,位线同时用于读取和写入。

存储单个位的寄存器单元的示意图。寄存器堆由这些单元的阵列构建。

寄存器堆由如上所述的寄存器单元矩阵组成,由于寄存器是16位宽,所以矩阵是16个单元宽,每个寄存器水平排列,所以读取线或写入线选择特定寄存器的所有单元,16条垂直位线形成总线,因此所选寄存器中的所有16位都是并行读或写的。

下面的照片放大了8086的通用寄存器文件,显示了寄存器单元矩阵:8个16位寄存器的16列8行。然后放大寄存器文件中的单个寄存器单元。现在我将解释该单元是如何实现的。

8086的照片,放大低位寄存器堆(八个16位寄存器),然后是单个寄存器单元。这张照片去掉了金属和多晶硅,以显示硅的结构。

8086由掺杂硅和多晶硅布线构成,顶部有金属布线。下面的左图显示了寄存器单元的垂直金属布线。显示了地线、电源线和位线。(剩余的导线穿过寄存器堆,但没有连接到寄存器堆上。)在右边的照片中,金属层已经溶解,以显示下面的多晶硅和硅。读写线是水平的多晶硅导线。(因为芯片只有一层金属,所以寄存器使用金属作为垂直线,使用多晶硅作为水平线,这样它们就不会相遇。)金属和硅之间的连接(称为通孔)在金属照片中看起来像更亮的圆圈和圆形。

一种寄存器存储单元。左边的照片显示的是金属层,右边的照片显示的是对应的多晶硅和下面的硅。金属层上的亮圆圈是连接到硅上的圆圈的通孔。

下图显示了寄存器单元的物理布局如何与原理图相匹配。逆变器由晶体管A和B以及电阻组成。晶体管C、D和E由多晶硅的标记条形成。下面看不到位线,因为它在金属层中。请注意,存储单元的布局经过高度优化,以使其尺寸最小化。还请注意,晶体管A比其他晶体管小得多;反相器A的输出很弱,因此当写入一个值时,它可以被位线超越。

仔细检查芯片显示,一些寄存器单元的结构略有不同。左边是上面讨论的一对寄存器单元,5而右边的照片显示一对寄存器单元有两条写控制线,而不是一条。在左边的照片中,写入线穿过两个寄存器单元中的硅。但是在右边的照片中,右边的写线穿过右边的硅,但在左边的硅区之间。相反,左边的写线穿过两个寄存器单元中的硅。在右边的照片中,右边的写线穿过右边的硅,但在左边的硅区之间。相反,左边的写线穿过两个寄存器单元中的硅。在右边的照片中,右边的写线穿过右边的硅,但在左边的硅区之间。相反,左边的写线穿过两个寄存器单元的硅。线路与左侧的硅交叉,并在右侧的硅之间穿行。因此,一条写入线控制对右侧位的写入,而另一条写入线控制对左侧位的写入。在完整的16位寄存器中,这允许交替的8位部分单独写入。6个。

两对存储单元,显示不同的电路。左单元具有单个写入线,而右单元具有用于左和右位的分开的写线。

为什么有些寄存器有两条写入线,而另一些寄存器有一条?原因是8086有16位寄存器,但其中4个也可以作为8位寄存器访问,如下所示。例如,16位累加器A可以作为8位AH(累加器高)寄存器和8位AL(累加器低)寄存器进行访问。通过用两条写控制线实现寄存器,可以单独写入寄存器的任何一半。7个。

8086处理器中的通用寄存器。A、B、C和D寄存器可以拆分为两个8位寄存器。摘自8086系列用户手册。

到目前为止,我已经讨论了8个通用低位寄存器。8086还有7个用于内存访问的高位寄存器,包括声名狼藉的段寄存器。8这些寄存器具有更复杂的多端口设计,允许同时进行多个读取和写入。例如,多端口寄存器文件将允许同时读取程序计数器、读取段寄存器和写入不同的段寄存器。

下面的多端口寄存器单元是围绕与前面相同的两个反相器电路构建的,但是它有三条位线(与之前的一条相比)和五条控制线(与两条相比),三条读控制线允许将寄存器单元内容读取到三条位线中的任何一条,而两条写入控制线允许将位线A或位线C写入寄存器单元。

乍一看,8086的寄存器堆看起来像是一组统一的寄存器,但仔细检查就会发现,每个寄存器都根据其功能进行了优化。10有些寄存器是简单的16位寄存器,布局最紧凑。其他16位寄存器也可以作为两个8位寄存器访问,需要另一条控制线。最复杂的寄存器有两个或三个读取端口和一个或两个写入端口。在每种情况下,寄存器单元的物理布局都经过精心设计,尽可能紧凑,具有精细的电阻器形状,如下所示。英特尔的工程师尽可能缩小寄存器布局,以适应所有。

上部寄存器堆,由10个16位寄存器组成。这张照片展示了硅和多晶硅。垂直的红线是被移除的金属层的痕迹。单击查看大图。

虽然8086处理器已经有42年的历史了,但它仍然通过今天大量使用的x86体系结构对现代计算产生了重大影响。8086的寄存器仍然存在于现代x86计算机中,尽管这些寄存器现在是64位长,并且已经加入了许多新的寄存器。

8086是芯片分析的一个有趣的主题,因为它的晶体管足够大,可以在显微镜下看到。当时它是一个复杂的处理器,有29,000个晶体管,但它仍然足够简单,可以追踪和理解电路。我计划在未来的博客文章中更详细地分析8086,以便在Twitter@kensheriff或RSS上关注我的更新。

8086微处理机是最早实现指令预取的微处理器之一,但摩托罗拉68000(1979年)稍早于4字节的指令预取缓冲器。大型机的预取可以追溯到IBM Stretch(1961年)、CDC6600(1964年)和IBM System/360Model91(1966年)。↩。

很难确定现代处理器中有多少寄存器;我能找到的唯一准确描述是在“高性能微处理器剖析”中,它详细描述了AMDK6处理器(1997)。由于寄存器重命名,现代处理器的物理寄存器比体系结构寄存器(程序员可见的寄存器)多得多,并且没有记录物理寄存器的数量。(除了8个通用x86寄存器之外,K6还有16个微体系结构暂存寄存器,用于。

支持AVX-512的处理器包括32512位寄存器,因此仅用于该功能的寄存器就有2千字节。这使得确定寄存器大小变得更加困难。至于高速缓存大小,高端处理器具有高达77MB的高速缓存存储空间。)-↩

NMOS门中的上拉电阻器实际上是一种特殊的晶体管。耗尽型晶体管充当电阻器,但比实际的电阻器更紧凑,性能更好。-↩。

其他处理器使用的寄存器存储单元略有不同。6502在逆变器反馈环路中使用额外的晶体管,在写入新值时中断反馈环路。Z-80同时向两个逆变器写入,使转换变得更容易,但需要两条写线。虽然8086在每个寄存器单元中都有一个用于读取的放大晶体管,但其他处理器读取两个逆变器的输出,并使用外部差分放大器来增强信号。8086';的基本寄存器单元使用7个晶体管(7T),比典型的6晶体管(6T)或4晶体管(4T)静态随机存储器单元多,但它只使用一条位线,而不是两条差分位线。动态存储器(DRAM)效率高得多,只使用一个晶体管和一个电容器,但如果不刷新,数据将会丢失。-↩。

在芯片上,寄存器单元不是均匀重复的,而是交替的单元是镜像。这提高了寄存器单元的密度,因为两个镜像单元之间的电源线可以同时为它们供电(地也是如此)。因此,镜像布局将电源线和地线的数量减少了一半。-↩。

虽然框图总是显示16位寄存器分为左半部分和右半部分,但实际实现交替使用每一半的位,而不是在左存储一个8位部分,在右存储另一个8位部分。这种实现使交换16位字的两个半部分变得更容易,这在几种情况下都是必需的。(一种是未对齐的存储器读或写。另一种是使用寄存器的上半部分(如AH)的算术运算。)在左半部分和右半部分之间交换位需要在每一位的两半之间铺设长线。但在交错实现中,交换两半是交换每对相邻位的问题,这不需要长线。换句话说,寄存器中的交错布局简化了交换字的两个半部分的布线。-↩。

如果寄存器堆只支持16位寄存器而不是8位半寄存器,处理器仍然可以工作,但效率会较低。写入8位半寄存器可以通过读取完整的16位,修改8位的一半,然后写回完整的16位来完成。这将需要三次寄存器访问,而不是一次。请注意,寄存器文件不需要对8位读取的特殊支持,因为不需要的那一半可以忽略。。↩。

下面的框图与大多数8086框图不同,因为它显示的是实际的物理实现,而不是程序员对处理器的看法。尤其是,此图显示总线接口单元寄存器(右侧)和段寄存器中的两个内部通信寄存器,与芯片上可见的7个寄存器相匹配。(下面的临时寄存器是ALU的物理部分,因此我不在此博客文章中讨论它们。)。

“现代处理器设计”一书讨论了21世纪初处理器的复杂寄存器系统。书中说,电路复杂性迅速增加,超过3个端口,但一些高端处理器的寄存器堆有20个或更多端口。-↩。

上部寄存器具有不同数量的读取和写入端口,如下所示:具有3条读取控制线和2条写入线的两个寄存器,具有2条读取线和2条写入线的一个寄存器,以及具有2条读取线和1条写入线的4个寄存器。前三个寄存器可能是程序计数器、间接临时寄存器和操作数临时寄存器。最后四个可能是SS、DS、SS和ES段寄存器。还有三个指令预取

在最初的IBM PC中使用的8088处理器与8086基本相同,只是它有一个外部8位总线,而不是16位总线,以降低系统成本。8088的预取缓冲器是4字节而不是6字节,想必是因为4字节对于8088较慢的内存总线来说已经足够了。

与8086不同的是,8088中的预取寄存器支持独立地写入8位的一半(类似于8088的A、B、C和D寄存器,但具有不同的寄存器单元设计)。原因是8088的预取指令由于总线较窄,一次取一个字节,而不是一次一个字。因此,8088的预取寄存器需要支持字节大小的写入,而8086则不支持字大小的预取。因此,8088的预取寄存器需要支持字节大小的写入,而8086则不支持字大小的预取。因此,8088的预取寄存器需要支持字节大小的写入,而8086不支持字大小的预取