Déclencheurs de verrouillage: rétro-ingénierie du registre d'instructions dans Intel 8086

Le microprocesseur Intel 8086 est l'une des puces les plus influentes du marché. L'architecture x86 qu'il a engendrée continue de dominer les ordinateurs de bureau et serveurs à ce jour. Et pourtant, cette puce est encore suffisamment simple pour que ses circuits puissent être examinés et démontés au microscope. Dans cet article, j'expliquerai l'implémentation d'une bascule dynamique [bascule à un étage ], un circuit qui détient un bit. Le 8086 a plus de 80 verrous dispersés dans toute la puce contenant divers bits importants d'état du processeur, mais je me concentrerai sur huit d'entre eux qui implémentent le registre d'instructions et contiennent l'instruction d'exécution.



Le 8086 a plus de 80 loquets. Certains d'entre eux stockent les valeurs des broches AD (adresse / données) ou des broches de contrôle. D'autres stockent l'adresse actuelle du microcode et du microcode, ainsi que l'adresse de retour du sous-programme de microcode. Le troisième stocke les bits du registre de commande source et de sortie, et l'opération ALU de la commande. Beaucoup stockent les statuts de l'état interne, que je comprends encore.





Crystal 86 montrant un registre d'instructions à 8 bits



La photo ci-dessus montre une matrice en silicium 8086 sous un microscope. J'ai enlevé les couches de métal et de silicium polycristallin pour que vous puissiez voir les transistors - il y en a environ 29 000 au total. La zone allouée contient un tampon de commande de 8 bits, composé de huit verrous. Ce processeur de 1978 était encore assez simple pour qu'un seul registre 8 bits occupe une surface relativement grande. Le grossissement montre le silicium et les transistors qui constituent un seul verrou.



Comment fonctionne un verrou dynamique



Le loquet est l'un des éléments les plus importants du 8086, car les loquets gardent une trace de ce que fait le processeur. Les verrous peuvent être réalisés de différentes manières; le 8086 utilise un circuit compact connu sous le nom de verrou dynamique. Le verrou dynamique repose sur le fonctionnement d'un générateur d'horloge biphasé, qui était souvent utilisé pour contrôler les microprocesseurs de cette époque. L'horloge biphasée génère deux signaux d'horloge qui sont actifs à leur tour. Dans la première phase, l'horloge principale est haute et l' horloge associée est basse. Puis ils changent de place. Le cycle est répété à une fréquence d'horloge, par exemple 5 MHz.



De nombreux microprocesseurs utilisent des portes NAND pour former des bascules RS. Une bascule RS prend généralement plus de place qu'une bascule dynamique, surtout si des circuits supplémentaires y sont ajoutés pour maintenir la fréquence d'horloge. Les déclencheurs D (déclencheurs de retard) sont également populaires, mais ils deviennent encore plus complexes et utilisent six portes. Dans de nombreux cas, un transistor passe suffit; il peut stocker une valeur pour un cycle d'horloge, mais ne fournit pas de stockage à long terme.



La vitesse d'horloge la plus élevée possible est toujours choisie pour les processeurs. Le premier 8086 fonctionnait jusqu'à 5 MHz, et plus tard le 8086-1 supportait jusqu'à 10 MHz. Cependant, en raison de l'utilisation de la logique dynamique, le 8086 a également une fréquence d'horloge minimale: 2 MHz. Si le générateur d'horloge tourne plus lentement, il y a un risque de fuite de charge des fils avant que les circuits y accèdent, ce qui entraîne des erreurs.





Le verrou du processeur 8086 se compose de quatre transistors passants et de deux inverseurs. Le verrou fonctionne sur des signaux d'horloge intermittents.



Le schéma ci-dessus montre un loquet type 8086. Il se compose de deux onduleurs et de plusieurs transistors passants. Pour nos besoins, le transistor passe peut être considéré comme un interrupteur: si 1 vient à la grille, le transistor transmet le signal plus loin. Si 0 vient, le transistor bloque le signal. Le transistor de passage est commandé par plusieurs signaux: charge, qui charge un peu dans le verrou; hold (maintenir), en maintenant la valeur de bit existante; l'horloge de la première phase et l' horloge de la seconde, inversées.



Le diagramme ci-dessous montre comment une valeur (dans ce cas, 1) est chargée dans le verrou. Le signal de charge monte, permettant au signal d'entrée (1) de traverser le transistor. Depuis le signal d'horlogehaut, le signal passe par le deuxième transistor à l'inverseur, qui délivre 0. A ce moment, le troisième transistor (d'horloge) bloque le signal.





Le signal d'entrée est chargé dans la bascule lorsque le signal de charge est haut



Dans la phase d'horloge suivante, le signal d'horloge devient haut, amenant le signal 0 à atteindre le deuxième inverseur, qui sort 1. Puisque le signal de maintien est haut, le signal revient mais est bloqué par le transistor d' horloge.... Ce qui rend ce circuit dynamique, c'est qu'aucun signal d'entrée n'est actuellement envoyé au premier onduleur. Son entrée reste 1 (représentée en gris) en raison de la capacité du circuit. Un jour, cette charge fuira, la valeur sera perdue, mais avant ce moment, une nouvelle commutation du générateur d'impulsions d'horloge aura lieu.





Lorsque le signal d'horloge devient haut, la valeur passe par le deuxième inverseur. L'entrée du premier onduleur (gris) est supportée par la capacité du circuit.



Après avoir commuté l'état du générateur d'horloge, l'entrée du second onduleur fournira la capacité du circuit (voir ci-dessous). Le signal revient, recharge et met à jour l'entrée du premier onduleur. Lors des commutations d'horloge suivantes, le verrou bascule entre ce modèle et le modèle précédent, en maintenant la valeur stockée et en gardant la sortie stable.



La clé du fonctionnement du verrou est la présence de deux onduleurs, qui maintiennent le signal de sortie stable. Un nombre impair d'onduleurs provoquerait une oscillation - cette fonction est utilisée par la pompe de charge 8086. En outre, une paire d'onduleurs utilise un ensemble de registres 8086 pour stocker les bits. Cependant, dans un ensemble de registres, les deux onduleurs sont directement connectés, sans les transistors de passage commandés par horloge, ce qui se traduit par un système de stockage plus compact mais difficile à gérer.





Lorsque le signal d'horloge est haut, la valeur passe par le premier inverseur.



Implémentation en silicium



Le 8086 et les autres processeurs de cette époque étaient basés sur des transistors N-MOS . Ils étaient constitués d'un substrat de silicium auquel, lors du dopage , des impuretés d'arsenic ou de bore ont été ajoutées pour former des transistors. Au-dessus du silicium, il y avait du polysilicium, qui créait les grilles des transistors et les conducteurs reliant tous les composants ensemble. Une autre couche, métallique, a fourni des connexions conductrices supplémentaires. Les processeurs modernes, par comparaison, utilisent la technologie CMOS , une combinaison de technologies N-MOS et P-MOS, et ils ont plus d'une couche conductrice métallique.





Comment un transistor N-MOS ( structure MOS ) est implémenté dans un IC



Le schéma ci-dessus montre la structure du transistor. Un transistor peut être considéré comme un interrupteur qui permet au courant de circuler d'une section (source) à une autre (drain). Le transistor est entraîné par une grille constituée d'un type spécial de silicium - polysilicium. L'application d'une tension à la grille permet au courant de circuler entre la source et le drain, tandis que la traction de la grille à 0 V bloque le courant. La grille est séparée du silicium par une couche d'oxyde isolant - de ce fait, la grille fonctionne comme un condensateur, comme on peut le voir dans l'exemple d'un verrou dynamique.



L'onduleur (ci-dessous) est composé d'un transistor N-MOS et d'une résistance. Lorsque le signal est faible, le transistor est désactivé, de sorte que la résistance de tirage vers le haut tire le signal de sortie vers le haut. Lorsque le signal est haut, le transistor s'allume, connectant la sortie à la masse et abaissant la sortie. Ainsi, le circuit inverse le signal d'entrée.



La résistance pull-up dans la porte N-MOS est mise en œuvre en utilisant un type spécial de transistor. Un transistor en mode d'appauvrissement fonctionne comme une résistance mais prend moins de place et est plus efficace.





Le diagramme montre comment un onduleur est constitué d'un transistor et d'une résistance. La photo montre comment le circuit est implémenté sur la puce. La couche métallique a été retirée pour révéler du polysilicium et du silicium.



La photo de droite montre comment le 8086 implémente physiquement un onduleur. Les zones jaunâtres sont en silicium conducteur avec des impuretés, et les zones tachetées sont en polysilicium sur le dessus. Le transistor est réalisé à l'endroit où le polysilicium traverse le silicium dopé. Le polysilicium forme la grille du transistor et des sections de silicium des deux côtés fournissent la source et le drain du transistor. Un grand rectangle en silicium polycristallin forme une résistance de rappel entre + 5V et la sortie. Vous pouvez comparer la structure de ces structures physiques avec un diagramme.



Le schéma ci-dessous montre l'implémentation du verrou sur la puce. Un transistor traversant et deux inverseurs sont marqués; le premier onduleur est décrit ci-dessus. Les conducteurs en polysilicium connectent les composants les uns aux autres. Des connexions supplémentaires ont été fournies par une couche métallique (supprimée pour la photo). La forme complexe des transistors permet l'utilisation la plus efficace de l'espace.





Photo microscopique du verrou dans le processeur 8086. La couche métallique avec les conducteurs a été enlevée, mais ses traces sont visibles sous forme de lignes verticales rougeâtres. Photo pivotée de 180 ° pour s'adapter à la mise en page.



Le verrou utilise des tampons de sortie non marqués dans le diagramme pour fournir des signaux de courant élevé pour la sortie et la sortie inversée. Ces tampons ont un drôle de nom, «superbuffers» - car ils fournissent un courant beaucoup plus élevé qu'un onduleur N-MOS typique. Le problème avec un onduleur N-MOS est qu'il fonctionne lentement lors de la conduite d'un circuit haute capacité. Étant donné que le super-tampon fournit plus de courant, il commute le signal beaucoup plus rapidement. Il y parvient en remplaçant la résistance pull-up par un transistor qui délivre plus de courant. L'inconvénient est que le transistor pull-up nécessite un inverseur pour fonctionner, de sorte que le circuit de super-tampon est plus compliqué. Par conséquent, le superbuffer n'est utilisé qu'en cas de besoin - généralement lors de l'envoi d'un signal à de nombreuses portes ou lors de la conduite d'un long bus.





L'implémentation du loquet 8086 du superbuffer.Notez que les connexions +5 V et terre sont déplacées vers les transistors les plus à droite.



Le diagramme ci-dessus montre un schéma du super-tampon à verrouillage 8086. Contrairement à un super-tampon conventionnel, il a à la fois un super-tampon inverseur et non inverseur. Pour comprendre le circuit, notez que la résistance centrale et le transistor forment un inverseur. La sortie de l'onduleur est connectée aux transistors supérieurs et l'entrée non inversée est connectée aux transistors inférieurs. Ensuite, si l'entrée est 1, les transistors inférieurs s'allument, et si l'entrée est 0, alors grâce à l'onduleur, les transistors supérieurs s'allument. Ensuite, si l'entrée est 1, les transistors inférieurs tireront la sortie vers le haut et la sortie correspondante vers le bas. Si l'entrée est 0, les transistors supérieurs tireront la sortie vers le bas et la sortie correspondante- vers le haut.



Le problème avec l'onduleur N-MOS est que la résistance pull-up a un courant limité. Lorsque la sortie est à 0, le transistor dans l'onduleur rapidement et avec un courant relativement élevé tire la sortie vers le bas. Cependant, si la sortie est 1, la sortie est tirée vers le haut par une résistance pull-up beaucoup plus faible.



Un superbuffer est similaire à un inverseur CMOS en ce qu'il a un transistor pull-up et un transistor pull-down. La différence est que CMOS utilise des transistors P-MOS et N-MOS, tandis que P-MOS utilise une entrée de grille inversée. Inversement, un superbuffer N-MOS nécessite un onduleur séparé. En d'autres termes, un inverseur CMOS utilise deux transistors, et le super-tampon est beaucoup moins efficace car il nécessite quatre transistors.



Le superbuffer utilise un transistor à mode d'amélioration pour tirer vers le haut et un transistor à mode d'amélioration pour tirer vers le bas. La tension de seuil d'un transistor avec son propre canal est inférieure à zéro, ce qui permet à sa sortie d'être tirée jusqu'à 5 V, et de ne pas être désactivée à une tension inférieure. Lorsque la sortie est faible, le transistor auto-canalisé sera toujours activé et agira comme un pull-up normal dans un onduleur conventionnel, de sorte qu'un certain courant le traversera. Vous pouvez en savoir plus sur le superbuffer ici .



Registre de commande



Comme la plupart des processeurs, le 8086 possède un registre d'instructions dans lequel l'instruction en cours d'exécution est stockée. Dans le 8086, le registre de commande contient le premier octet de la commande (qui peut être plusieurs octets), il est donc composé de huit verrous. On pourrait penser qu'ils seraient identiques, cependant, chacun d'eux a sa propre forme. La disposition du 8086 est hautement optimisée, de sorte que la forme de chaque verrou est conçue pour tirer le meilleur parti de l'espace disponible en raison des limitations des conducteurs environnants. En particulier, notez que certains loquets se connectent entre eux et partagent l'alimentation et la terre. Apparemment, pour la même raison, les loquets ne sont pas alignés.





Les 8 verrous ont des formes légèrement différentes, optimisées pour les conducteurs environnants. Plus tôt dans l'article, le verrou n ° 1 a été tourné de 180 °. Les lignes verticales rouges sont des traces de la couche métallique retirée.



L'équipe parcourt le 8086 dans un chemin sinueux. Le processeur utilise une prélecture améliorant les performances, chargeant les instructions de la mémoire avant qu'elles ne soient nécessaires. Ils sont stockés dans la file d'attente des commandes, une file d'attente de 6 octets située au milieu d'un ensemble de registres. En comparaison, les processeurs modernes ont un cache de commandes pouvant atteindre plusieurs mégaoctets.



Lorsqu'une commande est exécutée, elle est stockée dans le registre de commande, approximativement au centre de la puce. Les distances relativement importantes expliquent la nécessité d'un superbuffer. Le registre de commande transmet la commande à la "ROM de décryptage de groupe". Cette ROM définit les caractéristiques de haut niveau de la commande - elle est à un octet ou à plusieurs octets, ou c'est le préfixe de la commande. Et ce n'est qu'une petite partie du système complexe de traitement des instructions 8086. D'autres verrous stockent des parties des instructions, marquent l'utilisation du registre et les opérations ALU, et un circuit séparé contrôle le moteur du microcode - mais je vais le décrire séparément.





Crystal 8086, les composants clés pour le traitement des commandes sont marqués. Le long du périmètre, des fils à souder relient le cristal à des contacts externes.



Conclusion



Le 8086 utilise largement les verrous dynamiques pour stocker les états internes. Ils sont visibles au microscope et leurs circuits peuvent être tracés et compris. Le cristal 8086 est intéressant à analyser car, contrairement aux processeurs modernes, ses transistors sont suffisamment grands pour être vus au microscope. C'était un processeur sophistiqué avec 29 000 transistors pour l'époque, mais assez simple pour que ses circuits soient tracés et compris.



All Articles