Registres de processeurs Intel 8086: de la puce aux transistors

L'Intel 8086 est l'une des puces informatiques les plus influentes jamais fabriquées. Il a créé l'architecture x86 qui domine les ordinateurs de bureau et serveurs modernes. J'ai fait de la rétro-ingénierie d'un 8086 basé sur des images de cristaux, et dans cet article je décrirai l'implémentation d'un fichier de registre (ensemble de registres).





Crystal 8086. L'emplacement de stockage des registres est marqué. Les registres supérieurs sont utilisés par le bloc d'interface de bus pour l'accès à la mémoire, et les registres généraux inférieurs sont utilisés par le bloc d'exécution. Le tampon de commandes est une file d'attente de 6 octets de commandes pré-demandées.



La photo montre une image du processeur 8086 sous un microscope. Une couche métallique est visible sur le dessus de la puce, sous laquelle du silicium est caché. Situés sur le bord extérieur des fils de connexion, relient les plots de la puce aux 40 broches extérieures de la puce.



Quinze registres 8086 16 bits et six octets de la file d'attente de pré-demande de commande ( prélecture de code ) sont encadrés . Les registres occupent une partie importante du cristal, même si au total ils ne seront saisis que sur 36 octets. En raison des contraintes d'espace, les premiers microprocesseurs avaient relativement peu de registres. En comparaison, les puces de processeur modernes ont des kilo-octets de registres et des mégaoctets de caches.



Le 8086 était l'un des premiers microprocesseurs à implémenter la prélecture de code, mais le Motorola 68000 (1979) avait un tampon de prélecture de 4 octets un peu plus tôt. Dans les mainframes, la prélecture existait avec IBM Stretch (1961), CDC 6600 (1964) et IBM System / 360 Model 91 (1966).



Le nombre de registres dans un processeur moderne est difficile à calculer. Le seul nombre exact que j'ai trouvé était dans le livre Anatomy of a High-Speed ​​Microprocessor"(1997), décrivant en détail le processeur AMD K6. En raison du changement de nom des registres, les processeurs modernes ont beaucoup plus de registres physiques que d'architectures (ceux qui sont visibles par le programmeur), et le nombre de registres physiques n'est pas indiqué dans la documentation. K6, à l'exception de huit registres x86 à usage général, il y avait 16 registres de travail microarchitecturaux à



renommer.Les processeurs prenant en charge AVX-512 ont 32 registres de 512 bits, c'est-à-dire que 2 Ko de registres sont réservés pour cette fonction. Dans ce cas, la taille des registres est encore plus difficile à calculer. Quant à la taille du cache, puis dans les processeurs avancés son volume atteint 77 Mo .



Comment les registres sont implémentés dans le silicium



Je vais commencer par décrire comment le 8086 est construit à partir de transistors N-MOS. Ensuite, j'expliquerai comment un onduleur est fabriqué, comment des bits uniques sont stockés avec des onduleurs et comment un registre est créé.



Le 8086, comme les autres puces de l'époque, était basé sur des transistors N-MOS. Ces puces étaient constituées d'un substrat en silicium, dans lequel des impuretés d'arsenic ou de bore étaient diffusées pour former des transistors. Les conducteurs en polysilicium au-dessus du silicium formaient les grilles des transistors et reliaient tous les composants les uns aux autres. La couche métallique située encore plus haut contenait des conducteurs supplémentaires. En comparaison, les processeurs modernes utilisent la technologie CMOS , qui combine des transistors N-MOS et P-MOS, et contient de nombreuses couches métalliques.



Le schéma ci-dessous montre un onduleurconstitué d'un transistor N-MOS et d'une résistance. Lorsque la tension d'entrée est faible, le transistor est bloqué, de sorte que la résistance de pull-up tire la sortie vers le haut. Lorsque la tension d'entrée est élevée, le transistor s'allume, connecte la terre et la sortie, tirant la sortie vers le bas. Ainsi, le signal entrant est inversé.



En fait, la résistance de rappel dans une vanne N-MOS est un type spécial de transistor. Un transistor appauvri se comporte comme une résistance tout en étant plus compact et efficace.





Le diagramme montre comment un onduleur est constitué d'un transistor et d'une résistance. La photo montre la mise en œuvre sur la puce. La couche métallique a été retirée pour montrer le silicium et le polysilicium.



La photo ci-dessus montre la fabrication physique de l'onduleur 8086. Les zones rosées sont en silicium avec des impuretés qui le rendent conducteur, et les lignes cuivrées sont en polysilicium sur le dessus. Le transistor apparaît là où le polysilicium croise le silicium. Le polysilicium forme la grille du transistor et des sections de silicium des deux côtés fournissent une source et un drain. Un grand rectangle de silicium polycristallin forme une résistance de rappel entre + 5V et la sortie. Le circuit de la puce est donc le même que celui de l'onduleur. Des circuits comme ceux-ci peuvent être visualisés au microscope et rétro-conçus.



Le bloc de construction du registre est constitué de deux onduleurs dans la boucle de rétroaction stockant un bit (voir ci-dessous). Si le conducteur supérieur est 0, l'onduleur droit émettra 1 vers le conducteur inférieur. L'onduleur gauche émettra alors 0 vers le conducteur supérieur, terminant le cycle. Ainsi, le circuit est stable et "se souvient" de 0. Et inversement, si le conducteur supérieur vaut 1, il passera à 0 sur le conducteur inférieur, et reviendra à 1 sur le conducteur supérieur. En conséquence, la chaîne peut stocker 0 ou 1, formant une mémoire à un bit.





Le 8086 dispose de deux onduleurs appariés qui stockent un bit dans un registre. Le circuit est de manière stable à l'état 0 ou 1.



Trois transistors sont ajoutés à la paire d'onduleurs pour créer une cellule de registre utilisable. Un transistor sélectionne une cellule pour la lecture, le second sélectionne une cellule pour l'écriture et le troisième amplifie le signal lors de la lecture. Au centre du circuit ci-dessous, deux onduleurs stockent le bit. Pour lire le bit, le courant est appliqué au bus rouge. Cela connecte la sortie de l'onduleur à la ligne de bit via un transistor amplificateur. Pour écrire un bit, le courant est appliqué à la ligne rouge, qui relie la ligne de bit aux onduleurs. En appliquant des signaux de courant élevé de 0 ou 1 à la ligne de bit (et, en conséquence, au bit stocké), nous forçons les onduleurs à passer à la valeur souhaitée. Notez que la ligne de bit est utilisée à la fois pour la lecture et l'écriture.



D'autres processeurs utilisent des emplacements de registre légèrement différents. Le 6502 utilise un transistor supplémentaire dans la boucle de rétroaction de l'onduleur pour couper le circuit lorsqu'une nouvelle valeur est écrite. Le Z80 écrit sur les deux onduleurs en même temps, ce qui «facilite» le changement, mais nécessite deux fils pour écrire. Le 8086 a un transistor de gain dans chaque emplacement de registre pour la lecture, tandis que d'autres processeurs lisent la sortie des deux onduleurs et utilisent un amplificateur différentiel externe pour amplifier le signal. La cellule de base du registre 8086 se compose de 7 transistors (7T), ce qui est plus qu'une cellule RAM statique typique utilisant 6 ou 4 transistors, mais elle n'utilise qu'une seule ligne de bit, pas deux différentes. La mémoire dynamique (DRAM) est beaucoup plus efficace et utilise un seul transistor et condensateur,cependant, sans mettre à jour les données, elles seront perdues.





Diagramme schématique d'une cellule de registre stockant un bit. Le fichier de registre est constitué d'un tableau de ces cellules.



Le fichier de registre est constitué d'une matrice de cellules de registre similaire à celle décrite ci-dessus. La matrice a une largeur de 16 cellules car les registres stockent des valeurs de 16 bits. Chaque registre est situé horizontalement, de sorte que le bus de lecture ou d'écriture sélectionne toutes les cellules d'un registre particulier. Les 16 lignes de bits verticales forment un seul bus, de sorte que les 16 bits du registre sélectionné sont tous lus et écrits en parallèle.



La photo ci-dessous montre un fichier de registre général agrandi 8086 montrant une matrice de cellules de registre: 16 colonnes et 8 lignes, 8 registres 16 bits. Ensuite, l'incrément d'un emplacement de registre dans le fichier est donné. Je vais vous expliquer comment cette cellule est implémentée.





8086 ( 16- ), . , .



Le 8086 est composé de conducteurs en silicium dopé et en polysilicium avec des conducteurs métalliques sur le dessus. La photo de gauche ci-dessous montre les conducteurs métalliques verticaux de la cellule de registre. Les fils de masse, d'alimentation et de bus de bits sont marqués (le fil restant traverse le fichier de registre, mais ne le contacte pas). Sur la photo de droite, la couche de métal est dissoute pour que le polysilicium et le silicium soient visibles. Les bus de lecture et d'écriture sont des conducteurs horizontaux en polysilicium. La puce n'ayant qu'une seule couche métallique, du métal est utilisé dans les registres pour les bus verticaux et du polysilicium pour les bus horizontaux afin qu'ils ne se croisent pas). Le métal et le silicium à travers les joints apparaissent sous forme de cercles plus brillants sur la photo métallique et de cercles sur la photo silicium.





Enregistrez l'emplacement de stockage. La photo de gauche montre la couche de métal et à droite - les couches correspondantes de polysilicium et de silicium.



Le diagramme ci-dessous montre la correspondance du schéma physique de la cellule de registre avec le principal. Les onduleurs sont constitués de transistors A et B et de registres. Les transistors C, D et E sont constitués de pièces de polysilicium marquées. La ligne de bit n'est pas visible car elle est située dans la couche métallique. Notez que la disposition des cellules de mémoire est fortement optimisée pour minimiser la taille. Notez également que le transistor A est beaucoup plus petit que les autres. L'onduleur A a un courant de sortie assez faible, de sorte que la ligne de bit peut le surmonter lors de l'écriture.





Enregistrer la cellule de 8086 avec le circuit correspondant



Prise en charge des registres 8 bits



Si vous examinez attentivement le cristal, vous pouvez voir que certaines des cellules du registre ont une structure légèrement différente. Sur la gauche se trouve l'emplacement du registre dont nous avons déjà parlé, et sur la droite se trouve une paire d'emplacements de registre avec deux bus d'écriture au lieu d'un. Sur la photo de gauche, le bus d'écriture traverse le silicium dans les deux cellules de registre. Sur la photo de droite, le bus «écriture droite» traverse le silicium à droite, mais passe entre le silicium à gauche. Inversement, la ligne "écriture gauche" traverse le silicium du côté gauche et passe entre les régions du silicium du côté droit. Ainsi, un bus contrôle l'écriture du bit droit, tandis que l'autre contrôle l'écriture du bit gauche. Dans un registre 16 bits, les parties entrelacées de 8 bits peuvent être écrites séparément de cette manière.



La cellule de registre sur le cristal n'est pas répétée uniformément - chaque seconde cellule est une image miroir de la précédente. Cela augmente la densité de la cellule de registre - le rail d'alimentation passant entre les deux cellules en miroir peut alimenter les deux (il en va de même pour la terre). Les répétitions en miroir réduisent de moitié le nombre de rails d'alimentation et de sol nécessaires.



Bien que les schémas de principe montrent généralement comment les registres 16 bits sont divisés en moitiés gauche et droite, dans le monde réel, les bits de chaque côté alternent, au lieu de toujours stocker la première partie de 8 bits à gauche et la seconde à droite. Cette mise en œuvre simplifie la tâche qui se pose parfois de permuter deux moitiés d'un mot de 16 bits. Un tel cas est la lecture ou l'écriture de mémoire sans alignement. Une autre est une opération ALU qui utilise la partie supérieure du registre - par exemple, AH. Pour permuter les bits entre les moitiés droite et gauche, il faudrait tirer de longs fils entre tous les bits des moitiés de mot. Cependant, dans un agencement alterné, pour échanger deux moitiés d'un mot, il est nécessaire d'échanger chaque paire de bits adjacents, ce qui ne nécessite pas de longs fils. En d'autres termes,le registre imbriqué du 8086 facilite la disposition des conducteurs pour permuter les deux moitiés d'un mot.





Deux paires de cellules mémoire avec des circuits différents. Les cellules de gauche ont un bus d'écriture et celles de droite ont des bus d'écriture séparés pour les bits de gauche et de droite.



Pourquoi certains registres ont-ils deux bus d'écriture et d'autres en ont un? La raison en est que le 8086 a des registres 16 bits, mais quatre d'entre eux sont accessibles en 8 bits, comme indiqué ci-dessous. Par exemple, un accumulateur A 16 bits est accessible en tant que registres AH 8 bits (partie haute de l'accumulateur) et AL 8 bits (partie basse). L'implémentation de registres avec deux bus de contrôle d'écriture permet d'écrire séparément sur chaque moitié du registre.



Si le fichier de registre ne prend en charge que les registres 16 bits au lieu de 8 bits, le processeur peut fonctionner, mais de manière moins efficace. Les écritures sur les moitiés de 8 bits seraient effectuées en lisant les 16 bits, en changeant la moitié de 8 bits et en écrivant les 16 bits. En conséquence, au lieu d'accéder à un registre, l'appel passerait à trois. Dans ce cas, le fichier de registre n'a pas besoin de prendre en charge la lecture de 8 bits, car la moitié inutile peut simplement être ignorée.





Registres à usage général dans le 8086. Les registres A, B, C et D peuvent être divisés en deux moitiés 8 bits.



Registres multiports



Jusqu'à présent, nous avons couvert huit «registres inférieurs» à usage général. Le 8086 a également sept "registres supérieurs" utilisés pour l'accès à la mémoire, y compris les registres de segment infâmes . Ces registres ont un schéma de fonctionnement multi-port plus complexe, permettant d'exécuter simultanément plusieurs processus de lecture et d'écriture. Par exemple, un fichier de registre multiport vous permet de lire un compteur de programme, un registre de segment et d'écrire un autre registre de segment, le tout en même temps.



Le schéma fonctionnel ci-dessous est différent de la plupart des schémas fonctionnels.pour 8086, car il montre l'implémentation physique réelle du processeur, et non ce que le programmeur imagine. En particulier, le schéma montre deux «registres de communication internes» parmi les registres du module d'interface bus (à droite), ainsi que des registres de segments qui correspondent aux 7 registres visibles sur la puce. Les registres temporaires indiqués ci-dessous font physiquement partie de l'ALU, je ne les couvrirai donc pas dans cet article.







Le livre « Designing Modern Processors » traite des systèmes de registres complexes dans un processeur depuis les années 2000. Il dit que la complexité des circuits va rapidement au-delà de trois ports, et dans certains processeurs avancés, il existe des fichiers de registre avec 20 ports ou plus.



La cellule de registre multiport ci-dessous est basée sur le même circuit à deux inverseurs, mais elle a trois lignes de bit (pas une comme dans le cas précédent) et cinq lignes de contrôle (au lieu de deux). Trois bus de lecture vous permettent de lire le contenu d'une cellule de registre sur l'une des trois lignes de bit, et deux bus d'écriture permettent au bit A ou C d'écrire dans une cellule de registre.





Cellule de registre multiport dans le processeur 8086



À première vue, le fichier de registre 8086 ressemble à un ensemble homogène de registres, mais un examen plus attentif montre que chaque registre est optimisé en fonction de sa fonction. Certains d'entre eux sont de simples registres 16 bits et sont les plus compacts. Les autres registres 16 bits sont accessibles sous forme de deux registres 8 bits, ce qui nécessite un autre bus de contrôle. Les registres les plus complexes ont deux à trois ports pour la lecture et un ou deux pour l'écriture. Dans chaque cas, la mise en œuvre physique de la cellule de registre est soigneusement conçue pour prendre le moins de place possible, et par conséquent la forme des transistors est souvent complexe. Les ingénieurs d'Intel ont serré la disposition du registre aussi étroitement que possible pour les adapter tous dans l'espace dont ils disposaient.



Les registres supérieurs ont un nombre différent de ports de lecture et d'écriture: deux registres avec 3 bus de lecture et 2 bus d'écriture, un registre avec 2 bus de lecture et 2 bus d'écriture, quatre registres avec 2 bus de lecture et 1 bus d'écriture. Les trois premiers registres sont probablement le compteur de programme, un registre temporaire indirect et un registre d'opérande temporaire. Les quatre derniers sont probablement les registres de segment SS, DS, SS et ES. Il existe également trois registres de tampon de prélecture d'instructions, chacun avec un bus de lecture et un bus d'écriture.



Le processeur 8088 utilisé dans les PC IBM d'origine était pratiquement identique au 8086, sauf qu'il avait un bus externe 8 bits au lieu d'un 16 bits, donc le système était moins cher. Le tampon de prélecture du 8088 était de 4 octets au lieu de 6 - probablement parce que 4 octets suffisaient pour le bus mémoire plus lent du 8088.



Contrairement au 8086, les registres de prélecture du 8088 prennent en charge l'écriture indépendante sur des moitiés de 8 bits (similaires aux registres A, B, C et D du 8088, seules ces cellules semblent différentes). Ceci est dû au fait que le 8088 demandé commande un octet à la fois, et non un mot à la fois, en raison du bus étroit. Par conséquent, les registres de prélecture doivent prendre en charge l'écriture d'octets, tandis que le 8086 prend en charge la prélecture de mot.





Fichier de registre supérieur composé de dix registres 16 bits. La photo montre du silicium et du polysilicium. Lignes rouges verticales - restes de la couche métallique retirée. Cliquable.



Conclusion



Bien que le processeur 8086 ait 42 ans, il a toujours un impact significatif sur les ordinateurs modernes, car l'architecture x86 est encore très couramment utilisée aujourd'hui. Les registres 8086 existent toujours dans les ordinateurs x86 modernes, bien qu'aujourd'hui ils aient déjà une longueur de 64 bits, et en plus de ces registres il y en a beaucoup d'autres.



Le cristal 8086 est très intéressant à étudier car ses transistors peuvent être visualisés au microscope. À une époque, c'était un processeur complexe, avec 29 000 transistors, mais assez simple pour tracer tous les circuits et comprendre comment ils fonctionnent.



Voir également:






All Articles