Dans un processeur, un banc de registres est une mémoire interne au processeur, dans laquelle sont rassemblés certains (voire la totalité) des registres du processeur. En anglais, on parle de register file.
Dans les microprocesseurs, les bancs de registres sont généralement réalisés à l'aide de RAM statique (bascules).
Banc de registres simple port
Un bancs de registres contient une entrée d'adresse sur laquelle on place une suite de bits qui permet d'identifier le registre à sélectionner. Cette suite de bits n'est autre que le nom du registre en question. Sur les processeurs avec un banc de registres, on peut voir le nom d'un registre comme une sorte d'adresse permettant d'identifier un registre dans le banc de registres.
Il ne faut pas oublier que certains registres n'ont pas de noms : le Program Counter, le registre d'état, etc. Ceux-ci ne sont pas forcément rassemblés avec les autres registres et sont souvent intégrés dans des circuits spécialisés ou mis à part des autres registres. Ce n'est toutefois pas systématique : on peut placer ces registres dans un banc de registres, bien que ce soit rarement utilisé. Dans ce cas, les adresses dans le banc de registres seront plus longues que leurs noms pour permettre l'ajout de ces registres supplémentaires.
Bancs de registres multiports
Les bancs de registres multiports disposent de plusieurs ports d'accès, afin de pouvoir lire ou écrire dans plusieurs registres à la fois. Ce n'est pas une obligation : certains bancs de registres n'ont qu'un seul port.
L'utilisation de plusieurs ports trouve sa justification dans le fait que les instructions d'un processeur ont souvent besoin de lire plusieurs opérandes pour faire leurs calculs. Par exemple, une addition va devoir additionner deux nombres, chacun dans un registre. Utiliser plusieurs ports permet ainsi à l'opération d'avoir tous ses opérandes disponibles le plus vite possible : on n'a pas besoin de charger ces opérandes un par un. Certains processeurs, les processeurs superscalaires, exécutent plusieurs instructions en même temps, et un banc de registres multiport est alors encore plus utile.
Contrairement à la RAM statique ordinaire pour laquelle la lecture et l'écriture passent par les mêmes ports, les bancs de registres sont équipés de ports distincts pour la lecture et l'écriture.
Influence du jeu d'instructions sur les bancs de registres
L'architecture externe d'un processeur définit presque toujours un ensemble de registres (dits architecturaux) qui sont utilisés pour stocker des données entre la mémoire et les éléments du chemin de données. Dans les processeurs les plus simples, ces registres architecturaux correspondent exactement aux entrées d'un banc de registres.
Les processeurs plus élaborés ont recours au renommage de registres, de façon que l'association entre un registre architectural et l'entrée physique dans le banc de registres puisse changer au cours de l'exécution. Le fonctionnement exact du banc de registres est alors caché au programmeur.
Mise en œuvre
La convention de disposition habituelle est qu’un tableau simple est lu verticalement. C’est-à-dire que pour une ligne de mot donnée, qui s’étend horizontalement, une rangée de cellules de bits place ses données sur des lignes de bits, qui s’étendent verticalement. Les amplificateurs de détection, qui convertissent les signaux bas niveau des lignes de bits de lecture en niveaux logiques normalisés, sont généralement situés en bas (par convention). Des bancs de registres plus volumineux sont ensuite parfois construits en juxtaposant des tableaux simples en miroir et tournés.
Les bancs de registres ont une ligne de mot par entrée et par port, une ligne de bit par bit de largeur et par port de lecture et deux lignes de bits par bit de largeur et par port d’écriture. Chaque cellule de bit a également un Vdd et un Vss. Par conséquent, la surface des fils de connexion augmente comme le carré du nombre de ports, et la surface de la zone de transistors augmente linéairement[1]. À un moment donné, il peut être plus efficace en termes de surface occupée et/ou plus rapide d’avoir plusieurs bancs de registres redondants, avec un plus petit nombre de ports de lecture, plutôt qu’un seul banc de registres avec tous les ports de lecture. L’unité entière du MIPS R8000, par exemple, disposait d’un banc de registres 64 bits à 32 entrées, avec 9 ports de lecture et 4 ports d’écriture, implémenté dans un procédé 0,7 μm.
Décodeur
Le décodeur est souvent divisé en pré-décodeur et décodeur proprement dit.
Le décodeur est une série de portes ET qui pilotent les lignes de mots.
Il y a un décodeur par port de lecture ou d’écriture. Si par exemple le tableau dispose de quatre ports de lecture et de deux ports d’écriture, il comportera 6 lignes de mot par cellule de bit dans le tableau et six portes ET par ligne dans le décodeur. Le décodeur doit être adapté à la hauteur du tableau, ce qui oblige ces portes ET à être larges et courtes.
Tableau ou matrice de cellules de bits
Schéma de base d'une cellule de bit :
L'état (0 ou 1) est stocké dans une paire d'inverseurs croisés
Les données sont lues par un transistor NMOS vers une ligne de bit.
Les données sont écrites en connectant un côté ou l'autre de la paire d'inverseurs à la masse au moyen d'une pile de deux NMOS.
Par conséquent les ports de lecture utilisent un transistor par cellule de bit, les ports d'écriture en utilisent quatre !
Beaucoup d'optimisations sont possibles :
Partage de lignes entre les cellules, par exemple, Vdd et Vss.
Les lignes de bits de lecture sont souvent préchargées à une tension comprise entre Vdd et Vss, voisine de la valeur moyenne.
Les signaux sur les lignes de bits de lecture ne varient souvent que d'une fraction de la tension vers Vdd ou Vss. Un amplificateur de détection convertit ce signal de faible amplitude en un niveau logique normalisé. Les signaux de faible amplitude sont plus rapides car la ligne de bits a une forte impédance mais une grande capacité parasite.
Les lignes de bits en écriture peuvent être tressées, de sorte qu’elles se couplent de manière égale aux lignes de bits de lecture proches. Étant donné que les lignes de bits en écriture transmettent des signaux normalisés, elles peuvent causer des perturbations importantes sur les lignes de bits de lecture voisines.
Si Vdd est une ligne horizontale, elle peut être désactivée par un décodeur supplémentaire, si l’un des ports d’écriture écrit sur cette ligne pendant le cycle. Cette optimisation augmente la vitesse d’écriture.
Les techniques qui réduisent l’énergie utilisée par les bancs de registres sont utiles dans l’électronique à faible consommation[2].