Conception d`un microprocesseur RISC 16 bits

publicité
ASR1 2016
Florent de Dinechin, Nicolas Louvet, Antoine Plet
TP 3 et quelques suivants
Conception d’un microprocesseur RISC 16 bits
Présentation générale
Ce sujet va se dérouler sur plusieurs séances de TD/TP et deux devoirs à la maison :
— Une séance de TP consacrée à la conception d’un jeu d’instruction 16 bits ;
— Un travail de synthèse des TDMen, pour vous imposer à tous le même jeu d’instruction.
— Un premier rendu de DM qui pour implémenter un assembleur et un simulateur d’un processeur
implémentant ce jeu d’instruction 1 ;
— Un second rendu de DM consistant à écrire du logiciel de base pour ce processeur 2 ;
— Une séance de TD pour construire le plan de masse de ce processeur ;
— Une séance de TD pour définir l’automate de commande ;
— Au moins deux séances de TP pour décrire le processeur lui-même (le hardware) en VHDL.
Pour les DM comme pour les TP finaux, vous ne partirez pas de rien : vous trouverez sur des squelettes
de code à compléter.
Dans ce premier TD, il s’agit de définir un jeu d’instruction par ses mnémoniques et son encodage.
Pour les mnémoniques, on utilisera essentiellement une syntaxe dans laquelle l’affectation s’écrit <- et
l’accès mémoire * (comme en C).
1 Le jeu d’instructions
Voici les règles du jeu :
— Votre processeur devra être une machine universelle.
— Ses adresses et ses types de données natifs devront tenir sur 16 bits 3 . Toutes les instructions machines devront également être codées sur 16 bits, opérandes compris.
— Il devra être aussi RISC (simple, orthogonal) que possible. Autrement dit : n’oubliez pas que vous
aurez à le construire ensuite...
1) Dessiner la boîte noire de ce processeur, comportant tous les signaux d’interface avec la mémoire
(on ignore les questions d’interruptions des processeurs réels).
2 Contraintes d’encodage
On va découper les 16 bots du mot d’instruction (représenté ci-dessous) en différents champs codant
(entre autre) l’instruction à effectuer, ses différents opérandes, etc.
On s’attachera à respecter le principe d’orthogonalité de la philosophie RISC, qui dit que ce découpage
doit être le plus constant possible pour des instructions qui se ressemblent.
1) Justifier le principe d’orthogonalité par le boulot que vous aurez à faire en DM.
1. Ce qui devrait faire ressortir quelques bugs de conception
2. Voir note précédente
3. Alors que même les téléphones portables passent à 64 bits, ce n’est pas très moderne, certes. Mais cette contrainte a deux
avantages : 1/ la complexité de l’implémentation sera limitée ; 2/ étant à l’étroit dans 16 bits, vous serez obligés de faire des tas
compromis ce qui est l’essence même de l’architecture.
3 Choix du nombre de registres
1) Rappelez ce qu’est une machine à 3 opérandes, à deux opérandes, à un opérande/accumulateur,
à 0 opérande/à pile.
2) culture peu générale : donner des exemples de processeurs (réels) qui sont des machines à trois,
deux ou un opérande.
3) Discutez le nombre de bits que va nécessiter le codage des opérandes et de la destination dans
notre mot d’instruction, en fonction du nombre d’opérandes et du nombre de registres du processeur.
4) Organisez un vote sur le meilleur choix. Remarque : c’est un vote à la Russe, le TDMan dispose de
42 voix.
4 Opérations mémoire de base
La philosophie RISC distingue bien les opérations de calcul, dont opérandes et destination ne sont
que des registres, et les opérations d’accès à la mémoire, qui n’effectuent aucun calcul.
1) Discuter les avantages et inconvénients de cette approche.
2) Discuter comment utiliser les champs de bits inutilisés du mot d’instruction.
5 Choix des instructions arithmétiques et logiques
Nous allons maintenant définir le champ instruction, c’est-à-dire les quelques bits de notre mot d’instruction codant l’instruction.
En plus opérations sur la mémoire, on aura des opŕations de calcul entier, de calcul binaire, une instruction de copie de registres, des décalages, etc.
1) Définissez un jeu d’instructions minimal (ou en tout cas très reduced), mais permettant par exemple
de programmer en assembleur multiplication et division (même si cet exercice n’est pas complètement possible à ce stade).
2) Si le nombre d’instructions obtenu est différent de 8, 16 ou 32, ajoutez ou retirez des instructions
jusqu’à bien remplir le champ instruction. Il est toutefois sage 4 de réserver des codes “pour des
extensions futures”.
3) Discuter les différentes possibilités pour coder des opérations dont un des opérande est une constante
(en particulier 0 et 1 sont fort utiles).
4) Récapituler précisément le jeu d’instructions et discuter son codage le plus simple possible dans
le champ instruction.
6 Branchements
1) Pourquoi les sauts relatifs (au PC) c’est bien ? Pourquoi les sauts absolus c’est bien aussi ?
2) Le saut absolu a besoin d’encoder son adresse sur 16 bits. Proposez un ou deux trucs qui permettent de faire tenir une instruction de saut absolu sur 16 bits.
—
— on peut dire qu’on ne fait des sauts absolus qu’à des adresses multiples de 4, ou 8.
— On peut faire des sauts à une adresse contenue dans un registre.
— On peut faire des sauts absolus indirects
4. C’est comme cela qu’on arrive aux 4000 pages de la doc de référence de l’ISA IA32.
7 Contrôle d’exécution
1) Espérons qu’il reste quelques bits libres dans l’encodage d’un saut relatif. Ils vont servir à contrôler
l’exécution par des drapeaux, produits par l’UAL et testables par l’instruction de saut relatif 5
Les trois drapeaux de base de toute UAL sont :
— Z , qui vaut 1 si le résultat d’une opération est nul, et 0 sinon,
— P , qui vaut 1 si le résultat est strictement positif, et 0 sinon,
— C , qui vaut 1 s’il y a dépassement de capacité, et 0 sinon.
2) Exprimez les conditions suivantes en fonction des drapeaux : résultat positif ou nul, négatif ou
nul, strictement positif, strictement négatif, dépassement de capacité, pas de dépassement de capacité, etc.
3) Combien de bits faut-il pour coder un ensemble minimal de conditions (ne pas oublier le “sans
condition”) ? Définissez précisément le champ condition, et les mnémoniques correspondants.
8 Récapitulation et bouche-trous
Récapituler le mot d’instruction jusqu’ici. Reste-t-il des bits inutilisés ? Si oui, voici des suggestions
d’utilisation :
— On peut définir un bit qui dit si une instruction met à jour les drapeaux, ou pas. Ceci sera utile
pour des séquences de code machine du type si alors sinon.
— On peut définir un bit qui dit si le résultat d’une opération est écrit dans le registre résultat, ou pas.
Ceci permet de transformer toute instruction arithmétique ou logique en une instruction de test
(par exemple il transforme SUB en CMP (compare)).
— On peut proposer des modes d’adressages qui facilitent l’accès à une structure ou un tableau.
— On peut faire jouer son imagination.
Compléter le jeu d’instruction, vérifier qu’il n’y a pas (trop) de redondance dans les instructions, récapituler.
9 Test : programmation en assembleur
Pour se convaincre de la qualité de notre jeu d’instruction, écrire un programme réalisant la multiplication, un réalisant la division, puis un clone de Pokemon Go. Corriger les questions précédentes en
fonction des oublis.
5. Sur ARM, par souci d’orthogonalité, toutes les instructions sont (optionnellement) conditionnelles : un champ condition,
dans le mot d’instruction, contient un codage de la condition sous laquelle l’instruction sera effectuée. Un autre bit encode si
l’instruction met à jour les drapeaux. Si vous voulez tenter cela on peut aussi, c’est plus orthogonal.
Téléchargement