← Retour au blogArchitecture de processeur

Le registre d'instruction et l'étage de décodage

Comment un processeur pédagogique capture une instruction, extrait opcode, registres et immédiats, puis les transforme en signaux de commande validés — avec le contexte de RISC-V et x86.

DennyDenny
9 min de lecture
Chalkboard feature illustration for “Le registre d'instruction et l'étage de décodage”

En bref : dans un processeur simple, un registre d’instruction — IR — capture l’instruction lue afin que le décodeur voie des bits stables. Le décodage identifie le format, extrait les champs de registres et d’immédiat, vérifie la légalité du codage et produit les informations de commande des étages suivants. Un processeur moderne peut répartir ce rôle entre tampons de lecture et registres de pipeline au lieu de posséder un « IR » architectural littéral.

Le compteur ordinal répond à la question où lire ? L’étage de décodage répond à que signifient les bits lus ? Entre les deux, un processeur pédagogique place généralement un registre d’instruction : une banque de bascules qui conserve l’instruction courante pendant que la logique de commande l’examine.

Ce modèle est utile, mais ses limites doivent être claires. Dans la plupart des ISA, le registre d’instruction n’est pas visible du programmeur ; une implémentation hautes performances peut conserver simultanément de nombreuses instructions dans des blocs de lecture, des files, des registres de pipeline ou des caches d’opérations décodées. « IR » désigne un rôle du chemin de données pédagogique, pas un composant physique universel.

Le chemin de données pédagogique

Un petit processeur multicycle peut se représenter ainsi :

PC → instruction memory → instruction register → field extraction → control

Lors d’un événement de lecture d’instruction :

  1. le PC fournit une adresse d’instruction ;
  2. la mémoire d’instructions renvoie un mot d’instruction ;
  3. l’IR capture ce mot au front actif de l’horloge ;
  4. la logique combinatoire de décodage interprète les bits stockés.

La validation d’écriture de l’IR n’est activée que lorsqu’une nouvelle instruction doit être acceptée. Pendant un blocage, l’IR conserve son ancienne valeur. Lors d’une réinitialisation ou d’une purge du pipeline, le contrôleur marque l’instruction stockée comme invalide ou la remplace par une opération inoffensive.

Certains chemins de données multicycles placent un registre de données mémoire entre la mémoire et l’IR ; d’autres capturent directement la sortie de la mémoire. Aucune de ces séquences n’est universelle : la temporisation et le protocole de l’interface mémoire choisie déterminent les registres nécessaires.

Un petit exemple de codage

Supposons qu’une ISA pédagogique de huit bits définisse ce format :

7             5 4             2 1             0
┌──────────────┬───────────────┬───────────────┐
│ opcode [2:0] │ register [2:0]│ mode / small  │
│              │               │ immediate     │
└──────────────┴───────────────┴───────────────┘

Les champs exacts relèvent de la conception de l’ISA. Huit bits ne peuvent pas coder à la fois un grand espace d’opcodes, deux opérandes de registre indépendantes et un immédiat utile ; une véritable ISA pédagogique emploie donc souvent plusieurs formats. Par exemple :

  • une instruction sur registres peut consacrer des bits aux adresses source et destination ;
  • une instruction de chargement immédiat peut employer la plupart des bits faibles comme constante ;
  • une instruction de branchement peut interpréter ces mêmes bits comme un décalage.

Le décodage doit d’abord établir le format, puis interpréter les bits restants en conséquence. Attribuer à chaque bit une signification permanente produit un circuit incorrect.

Champs à position fixe : l’exemple de RISC-V

L’ISA RISC-V de base emploie des formats d’instruction de 32 bits. Pour une instruction de type R :

31         25 24    20 19    15 14   12 11      7 6        0
┌────────────┬────────┬────────┬───────┬─────────┬──────────┐
│   funct7   │   rs2  │   rs1  │ funct3│    rd   │  opcode  │
└────────────┴────────┴────────┴───────┴─────────┴──────────┘

Les champs de registre occupent des positions cohérentes dans les formats de base :

opcode = IR[6:0]
rd     = IR[11:7]
funct3 = IR[14:12]
rs1    = IR[19:15]
rs2    = IR[24:20]
funct7 = IR[31:25]

Ces tranches relèvent du câblage, pas de l’arithmétique. rs1 et rs2 alimentent les adresses de lecture du fichier de registres ; rd désigne une destination possible ; l’opcode associé aux bits de fonction identifie la classe et la variante de l’opération.

Les immédiats demandent davantage de soin. Dans plusieurs formats RISC-V, leurs bits sont délibérément répartis dans l’instruction. Le matériel doit les concaténer dans l’ordre spécifié et étendre le signe depuis le bit défini par l’architecture. Cela reste un simple câblage combinatoire, mais pas toujours une tranche contiguë.

Le décodage ne se limite pas à un décodeur d’opcode

Pour une ISA pédagogique qui possède huit opérations complètes, un décodeur trois-vers-huit peut créer des signaux unitaires :

OpcodeOpération pédagogiqueRésultat unitaire
000NOPis_nop
001LOADis_load
010STOREis_store
011ADDis_add
100SUBis_sub
101JUMPis_jump
110BRANCH-Zis_branch_z
111HALTis_halt

On peut ensuite dériver les équations de commande de ces signaux :

RegWrite=is_load∨is_add∨is_sub\text{RegWrite} = \text{is\_load} \lor \text{is\_add} \lor \text{is\_sub} MemWrite=is_store\text{MemWrite} = \text{is\_store}

C’est une bonne introduction aux décodeurs et à la logique somme de produits, mais ce n’est pas la structure générale d’un décodeur réel.

Dans une ISA plus vaste :

  • l’opcode principal sélectionne souvent un format ou une famille d’instructions plutôt qu’une opération unique ;
  • des champs de fonction secondaires distinguent les membres de cette famille ;
  • un mode ou l’état des préfixes peut modifier la taille et l’interprétation des opérandes ;
  • certains motifs de bits sont réservés ou illégaux ;
  • les privilèges et les extensions disponibles peuvent influer sur la légalité ;
  • les sorties de commande sont généralement codées, plutôt que matérialisées par un fil propre à chaque instruction.

Un décodeur correct doit rejeter les codages non pris en charge au lieu de les traiter accidentellement comme une instruction légale voisine.

Ce que produit le décodage

Il vaut mieux considérer la sortie comme un faisceau de commande que comme des dizaines de fils sans rapport. Un faisceau pédagogique peut contenir :

ChampSignification
alu_opSélectionner addition, soustraction, opération logique, comparaison ou transmission directe
src_a / src_bChoisir comme opérandes un registre, le PC, un immédiat ou une constante
reg_writeAutoriser une écriture dans le fichier de registres à l’étage ultérieur approprié
mem_read / mem_writeDemander une opération sur la mémoire de données
result_sourceChoisir l’ALU, la mémoire, une valeur relative au PC ou une autre source de réécriture
branch_kindChoisir aucun branchement, un branchement conditionnel, un saut direct ou un saut indirect
immediateConstante réassemblée et étendue
legalIndiquer si le codage est pris en charge dans l’état actuel de la machine

Ces signaux doivent être qualifiés par la validité du pipeline et la temporisation des étages. Un reg_write = 1 combinatoire au décodage n’autorise pas la mise à jour immédiate du fichier de registres ; l’écriture n’a lieu que lorsque l’instruction atteint l’étage prévu sans avoir été purgée ni avoir déclenché de faute.

Longueur fixe ou variable des instructions

La longueur des instructions modifie l’amont du problème de décodage.

Exemple de longueur fixe : Arm A64

Les instructions Arm A64 occupent 32 bits. Une fois qu’un mot aligné a été fourni par la lecture, ses champs peuvent être examinés directement. Une longueur fixe simplifie la détection des frontières d’instruction, sans rendre pour autant toutes les opérations ou tous les codages d’immédiat triviaux.

RISC-V avec instructions compressées

Les instructions RISC-V de base occupent 32 bits. L’extension compressée facultative ajoute des instructions de 16 bits, et l’architecture réserve un schéma de codage des longueurs pour des instructions plus grandes. La lecture doit déterminer si l’instruction suivante occupe deux, quatre ou un autre nombre d’octets pris en charge avant d’avancer le PC et d’aligner l’instruction suivante.

Exemple de longueur variable : x86

Les instructions x86 mesurent de un à 15 octets et peuvent comporter des préfixes historiques ou modernes, des octets d’opcode, des octets d’adressage ModR/M et SIB, un déplacement et des données immédiates. La présence de chaque partie dépend des octets précédents.

Un frontal x86 moderne doit donc déterminer les frontières et longueurs d’instruction avant ou pendant le décodage sémantique. Les implémentations diffèrent : il serait imprudent d’affirmer que chaque processeur lit un bloc de taille fixe, emploie la même organisation de file ou traduit toutes les instructions par un même chemin. Les manuels d’architecture d’Intel définissent le codage visible du logiciel ; le pipeline exact est propre à la microarchitecture.

Longueur fixe et longueur variable ne sont pas synonymes de RISC et CISC. Elles décrivent une propriété du codage.

Commande câblée et commande séquencée

Un petit processeur peut produire ses commandes directement à partir de logique booléenne. Un contrôleur multicycle peut plutôt employer une machine à états ou une mémoire de commande dont les entrées décrivent plusieurs étapes internes. Les processeurs réels peuvent combiner des chemins de décodage rapides avec un traitement séquencé pour les opérations plus complexes.

La distinction utile est la suivante :

  • Le décodage combinatoire transforme les champs courants en une représentation initiale de commande.
  • La commande séquencée émet plusieurs actions internes au fil du temps.

Aucune méthode n’est automatiquement « RISC » ou « CISC », et une implémentation microcodée n’est pas intrinsèquement lente. Les performances dépendent de l’ensemble de l’implémentation et de la charge de travail.

Commande du pipeline : blocage, purge et validité

Dès que plusieurs instructions se chevauchent, leurs bits ne constituent qu’une partie de l’état. Chaque registre de pipeline doit aussi conserver des métadonnées de commande.

Blocage

Si l’étage suivant ne peut pas accepter une instruction, le registre courant de lecture-décodage doit conserver ses données ou participer à un protocole prêt-valide. Laisser les bits avancer tandis que l’état de validité reste bloqué désaligne l’instruction de sa commande.

Purge

Une mauvaise prédiction de branchement, une exception ou une réinitialisation peut invalider les instructions plus jeunes. Effacer seulement leurs bits est moins robuste que d’effacer un bit de validité, puisqu’un codage entièrement nul peut lui-même être légal dans certaines ISA.

Gestion des dépendances

Le décodage peut identifier les registres source et destination afin de vérifier les aléas. La réponse peut être un blocage, la sélection d’un transfert direct, un renommage de registres ou une autre action propre à l’implémentation. L’extraction des champs fournit les identifiants ; une commande ultérieure décide de leur emploi.

Erreurs de conception courantes

  • Supposer que la mémoire exige toujours un MDR. Ajoutez les registres selon la temporisation et l’interface réelles de la mémoire, pas d’après un schéma universel.
  • Modifier l’IR alors que son instruction est encore active. Employez une validation d’écriture ou un protocole afin que le décodeur voie des bits stables.
  • Ne décoder que l’opcode principal. Champs de fonction, modes, extensions et vérifications de légalité peuvent être nécessaires.
  • Concaténer les bits d’un immédiat dans l’ordre numérique du dessin. Suivez exactement la correspondance des bits définie par l’ISA, puis étendez à partir du bit de signe spécifié.
  • Piloter des effets de bord directement depuis un décodage non qualifié. Conditionnez les écritures à la validité du pipeline, à la temporisation de l’étage et à l’état d’exception ou de purge.
  • Réinitialiser vers un motif d’instruction arbitraire. Préférez un bit de validité ou un état de réinitialisation du contrôleur ; ne supposez pas que des bits tous nuls représentent NOP.
  • Considérer une forme d’onde pédagogique comme une preuve temporelle physique. Le modèle peut montrer le séquencement logique, pas la fermeture des temps d’établissement et de maintien dans le silicium.

Construire et vérifier un décodeur pédagogique

Ouvrez l’Exécuteur séquentiel d’instructions et repérez :

  1. l’élément de stockage des instructions ;
  2. les fils qui forment chaque champ ;
  3. les sorties de commande influencées par chaque champ ;
  4. le point où ces sorties sont autorisées à modifier l’état architectural.

Construisez ensuite une table de test compacte :

Classe de testÉlément à faire varierRésultat attendu
Chaque opcode légalBits de l’opcode principalFamille d’opérations et validations d’effets de bord correctes
Variantes de fonctionChamps secondairesBonne variante d’ALU ou d’adressage
Adresses de registreChamps rs / rdBons ports de registre, opération inchangée
Extrêmes de l’immédiatZéro, maximum positif, minimum négatifConcaténation et extension correctes
Codage réservéMotif de bits non pris en chargeChemin d’instruction illégale, aucune écriture involontaire
BlocageMaintenir le décodage pendant plusieurs cyclesInstruction et commande restent alignées
PurgeInvalider une instruction en volAucun effet de bord sur registre ou mémoire

Basculer manuellement un seul exemple est une illustration, pas une vérification suffisante. Couvrez chaque classe d’opérations légales et des codages illégaux représentatifs.

Sa place dans le processeur

Le compteur ordinal fournit l’adresse de lecture. Le décodage identifie les opérandes et l’intention de commande. Le registre des indicateurs du processeur constitue une source possible de conditions de branchement dans les ISA fondées sur des indicateurs ; d’autres ISA comparent directement des registres. L’unité de commande séquence le chemin de données pédagogique et qualifie les effets de bord.

Ensemble, ces éléments expliquent le flux de contrôle d’un petit processeur, mais aucun d’eux ne constitue à lui seul « tout le plan de commande ». Caches, prédiction, exceptions, privilèges, aléas et état du pipeline ajoutent d’autres commandes dans les machines plus grandes.

Références primaires

Poursuivez avec l’étude approfondie de lecture-décodage-exécution, puis modifiez un codage dans le processeur pédagogique et mettez à jour ensemble le décodeur, les tests et la documentation.

Transformez l’idée en un circuit fonctionnel.