3-Présentation d’un µP simple Microprocesseur avec un bus de données sur 16 bits et un bus d’adresses sur 12 bits (soit 4096 mots adressables). Le chemin de données doit comprendre au minimum : un registre compteur programme (PC) : un registre stockant l’adresse de la prochaine instruction à exécuter. un registre accumulateur (ACC) : un registre stockant la donnée sur laquelle on travaille. une UAL qui permet d’exécuter des opérations arithmétiques et logiques de base (addition, soustraction, ET/OU/OUX logique)…
Codage des Instructions Chaque instruction est codée sur 16 bits et comprend : le champ code opération : indique le type d’instruction dont il s’agit (add, …). le champ code opérande : adresse de la donnée. Une instruction d’addition, par exemple, utilise la donnée stockée à l’adresse spécifiée, ainsi que le registre accumulateur comme opérande implicite, puis stocke le résultat dans l’accumulateur. L’action réalisée est : ACC ¬ ACC + mem16 [addr]. On parle de machine une adresse car une seule opérande est définie explicitement dans le codage de l’instruction. Les instructions sont lues depuis la mémoire à partir de l’adresse 0, à des adresses consécutives.
Jeu d’Instructions La programmation d’un programme complet directement en code machine binaire devient très rapidement fastidieuse :on définit un langage symbolique nommé langage d’assemblage permettant de représenter les instructions par des mnémoniques. On délègue la traduction du programme source en code binaire exécutable à un programme : l’assembleur.
Chemin de données
Chemin de données Les éléments du chemin de donnés sont : l’UAL, le registre accumulateur (ACC) : il contient la donnée sur laquelle on travaille. Il renvoie des informations vers la machine d’état (valeur nulle et valeur positive ou nulle). le compteur programme (PC : Program Counter) : il contient à tout instant l’adresse de la prochaine instruction à exécuter. le registre d’instruction (IR : Instruction Register) : il contient l’instruction qui est en train d’être exécutée. des multiplexeurs (MUXA et MUXB) qui permettent d’aiguiller les données. une porte 3 états qui permet d’amener le contenu du registre accumulateur sur le bus de données, et de déconnecter l’accumulateur du bus de données quand la mémoire est en lecture. Les registres disposent d’une commande de chargement et de remise à zéro synchrone (non représentée). l’UAL reçoit, en plus de ses entrées et sortie, un code permettant d’identifier la fonction UAL sélectionnée.
Séquencement des Instructions La machine d’état récupère des informations en provenance de la partie traitement (opcode, accZ, acc15) et génère des commandes internes pour contrôler l’activation du chemin de données adéquat pour réaliser l’instruction en train d’être exécutée et des commandes externes pour assurer le dialogue du microprocesseur avec la mémoire. Le séquencement des différentes actions est cadencé par l’horloge clk. L’exécution d’un programme entier consiste à répéter l’exécution de l’instruction pointée par le PC jusqu’à la dernière instruction. L’exécution d’une instruction peut être réalisée en deux phases : phase d’acquisition (fetch) : on lit en mémoire l’instruction pointée par le PC et on la transfère dans le registre d’instruction RI. On incrémente le compteur programme pour qu’il pointe sur l’instruction suivante. Dès que l’instruction est dans le registre d’instruction, elle est décodée. phase d’exécution (execute) : l’opérande est lue en mémoire (si nécessaire). L’opération UAL est exécutée, et le résultat est rangé dans l’accumulateur ACC.
Séquencement des Instructions
Exemple de Programme
Phase d’acquisition (Fetch) 1 LDA var1 ADD var2 STO res B+1 STOP LDA var1 Var1=1 Var2=2 res
Phase d’exécution 0x004 0x004 LDA var1 ADD var2 LDA var1 STO res B STOP Var1=1 Var2=2 res 0x001
Phase d’acquisition (Fetch) 2 1 LDA var1 ADD var2 STO res STOP ADD var2 Var1=1 Var2=2 res
Phase d’exécution 0x005 LDA var1 ADD var2 STO res STOP Var1=1 Var2=2
Instructions de Saut JMP Addr : Fetch 1 JMP 0x004 JMP 0X004
JMP Addr : Exécution 0X004 0X004 JMP 0X004
JSR Addr : Fetch 1 JSR 0x004 JSR 0x004
JSR Addr : Exécution 0x004 0x004 1 1 0x004
RET : Fetch 6 6 7 JSR 0x004 RET RET
RET : Exécution Actions réalisées : PC SPC 1 1
4-Structure de la machine d’état Machine d’Etat Microprogrammée Concept introduit par Wilkes en 1951, mais appliqué par IBM qu’à partir de 1964. Les valeurs des signaux pour les différentes instructions sont stockées dans une mémoire dite de microprogrammation interne au microprocesseur. Chaque mot de la mémoire peut être adressé en fonction des entrées de la machine d’état (opcode et drapeaux).
Machine d’Etat Microprogrammée Pour exécuter une instruction, il suffit de lire deux lignes de la mémoire (fetch + exec) pour affecter les signaux de contrôle appropriés. Chaque ligne de la mémoire forme une micro-instruction. La lecture de la mémoire est séquencée par une machine d’état de microprogrammation relativement simple à mettre en oeuvre. Intérêt : l’ajout de nouvelles instructions consiste simplement à ajouter des lignes dans la mémoire. En ajoutant au micro-instructions un champ permettant d’identifier la prochaine instruction à exécuter, il est possible d’obtenir un langage de microprogrammation. Ce langage permet de réaliser des microprogrammes (firmware) pour synthétiser des instructions complexes (ex multiplication) sur une architecture sans les ressources matérielle pour le faire.
Machine d’Etat Microprogrammée Cette technique a un coût : 70 cycles pour une multiplication, 140 cycles pour une division contre 4 cycles pour une addition sur un Motorola (Freescale) 68000.
Machine d’Etat Câblée • Machine d’état cablée : elle est synthétisée pour fournir les signaux de commande aux éléments du chemin de données interne ou externe au microprocesseur. Elle enchaîne les phases de chargement et d’exécution des instructions en tenant compte des informations provenant de la partie traitement. Plus le nombre d’instructions devient important et plus la réalisation de cette machine d’état devient complexe.
3- Caractéristiques des jeux d’instructions Introduction Le microprocesseur est caractérisé par son architecture de jeu d’instructions (ISA – Instruction Set Achitecture), qui est souvent commune à toute une famille de processeurs. l’ISA définit l’interface entre le microprocesseur et le programmeur (codage des instructions, registres disponibles …). l’ISA est en général détaillée dans le “User’s Manual” de la famille de microprocesseurs.
Codage des Instructions Le codage d’une instruction doit permettre de rendre compte de la fonction réalisée (opcode) et de la localisation des opérandes. Quelques exemples avec une instruction typique d’addition: Machine 3 adresses Machine 2 adresses Machine 1adresse (ou à accumulateur) La manière dont sont codées les instructions a une influence sur leur pouvoir d’expression : pour réaliser l’opération d = op1 + op2 avec une machine à accumulateur, il faut réaliser : LDA op1 ; acc=op1 ADD op2 ; acc=acc+op2 STO d ; d=acc
Les Registres Les registres sont des emplacements de mémorisation à accès très rapides. On trouve : des registres d’usage général, avec parfois des spécificités : registres de données, d’adresses, pour les opérations en flottants. des registres à usage spécifique : compteur programme (PC), pointeur de pile, registre de segment, mot d’état, registre de configuration,…
Modes d’Adressage Les modes d’adressage font référence aux manières de spécifier une opérande (et d’utiliser les bits de codage des champs opérande) : mode d’adressage immédiat : on spécifie la valeur de la donnée dans le codage de l’instruction, int a = 2 + 3; mode d’adressage direct ou absolu : on spécifie l’adresse mémoire de la donnée dans le codage de l’instruction, int op1=2, op2=3, d; d = op1 + op2; mode d’adressage direct registre : on spécifie le numéro du registre qui contient la donnée dans le codage de l’instruction, register int r1, r2, r3; r3 = r1 + r2; mode d’adressage indirect : on spécifie, dans le codage de l’instruction, un registre qui sert de pointeur vers la donnée, int a, *p=0x00FF1143; a=*p; Des variantes permettent de spécifier en plus un offset par rapport à l’adresse de base, ou un index défini dans un autre registre. mode d’adressage implicite : l’instruction s’exécute sur une donnée spécifiée de manière implicite. add op1 ; le registre acc est modifié, mais pas référencé dans le codage de l’instruction goto addr ; le registre pc est modifié Les modes d’adressage disponible doivent permettre de supporter les structures de données des langages de haut niveau.
Types d’Instruction Les instructions classiquement proposées par les jeux d’instructions des microprocesseurs sont : instructions de transfert de données, instructions arithmétiques et logiques opérations sur des entiers et des réels, instructions logiques bit à bit, instructions de manipulation de bits, instructions de décalage et rotation, instructions de manipulation de chaînes de caractères, instructions de contrôle : branchement conditionnel ou inconditionnel, instructions d’appel et de retour de sous-programme, manipulation du contexte (passage de paramètre, gestion des variables locales), instructions privilégiées orientées vers le support de systèmes d’exploitation. La programmation au niveau assembleur est laborieuse (mais instructive).On fait appel à des langages de plus haut niveau (C,C++, Java, …) possédant un niveau d’abstraction plus important. L’écart entre un langage de haut niveau et les instructions machine est complété par un programme chargé de la traduction : le compilateur. Le jeu d’instruction doit fournir le matériel nécessaire pour exprimer les concepts utilisés par les langages de haut niveau.
Jeux d’Instructions CISC Caractéristiques des processeurs CISC CISC = Complex Instruction Set Computer Dans les années 1970, la mémoire vive était chère et les compilateurs peu performants. Les jeux d’instructions CISC supportent au maximum les langages de haut niveau En offrant des instructions évoluées permettant une traduction quasi-directe des programmes source vers l’assembleur. En offrant des modes d’adressage orientés vers la manipulation de structure de données complexes (tableau, enregistrement, liste, …). Avantages : L’écriture des compilateurs est plus facile puisque le microprocesseur apporte un support évolué, Les instructions permettent d’avoir un code compact, qui économise l’utilisation de la mémoire. Conséquences : Le codage des instructions est de longueur variable (2 à 10 octets pour un Motorola 68000). La complexité des instructions et des modes d’adressage impose l’utilisation d’un séquenceur micro-programmé. La durée d’exécution d’un programme est donnée par TP = Σ(Ni × NC/ i × TC) avec TC la durée d’un cycle d’horloge,NC/ i le nombre de cycles pour exécuter une instruction particulière et Ni le nombre d’occurrence de cette instruction. Les processeurs CISC essaient d’agir sur le nombre d’instructions pour obtenir la performance voulue.
Jeux d’Instructions CISC Limite de l’architecture CISC classique Constats sur les processeurs CISC des années 1970-1980 : La vitesse de traitement des processeurs augmente plus rapidement que le temps de réponse des mémoires ne décroît. Les accès mémoire deviennent pénalisants. Le grand nombre de modes d’adressage implique la réalisation de séquenceurs micro-programmés. La mémoire de micro-programmation peut utiliser jusqu’à 60% de la surface de silicium de la puce. Fréquence d’utilisation des modes d’adressage (68000) moyenne sur 500 millions d’instructions (Electronic Design 07/02/1985)
Jeux d’Instructions CISC
Jeux d’Instructions CISC
Jeux d’Instructions CISC Dans 80% des cas, le code généré par les compilateurs ne fait appel qu’à 20% des instructions disponibles dans le jeu d’instruction des microprocesseurs. Les types d’instructions les plus fréquemment exécutées sont : Les affectations de variables (40%) : dans 75% des cas, il s’agit d’affectations de variables scalaires, et dans 25% de mouvement de données sur des tableaux ou des structures. Les structures de contrôle : test et boucles (50%) Les appels de sous-programmes (10%) : ils représentent cependant 45% du temps d’exécution des instructions machine. Le nombre de paramètres passés à la fonction est inférieur à 6 dans 98% des cas. 92% des fonctions appelées ont moins de 6 variables locales scalaires. La profondeur d’appels successifs est en moyenne de 5. Conclusions: Une partie seulement des modes d’adressage et du jeu d’instruction est vraiment très utilisée. Les appels de fonction et le passage des paramètres nécessitent des accès mémoire qui sont pénalisants.
Jeux d’Instructions RISC Introduction Les premières recherches entreprises par IBM au milieu des années 1970, puis poursuivies aux universités de Berkeley (en 1980) et de Stanford (en 1981) débouchent sur les principaux modèles architecturaux des RISC. 1. Les accès mémoire ne doivent se faire que via des instructions du type LOAD/STORE.Les autres instructions fonctionnent de registre à registre. Il faut donc beaucoup de registres. Le jeu d’instruction ne doit contenir que ce qui est utile, le reste peut être émulé. Les modes d’adressage doivent être peu nombreux. RISC = Reduced Instruction Set Computer. 2. Toutes les instructions doivent s’exécuter en un cycle. Le format des instructions doit être fixe (32 bits), de largeur égale ou plus petite à la largeur du bus de données. 3. Le séquenceur doit être cablé. Quelques repères : L’équipe de David Patterson, à l’université de Berkeley, produit le RISC I (44420 transistors, 32 instructions) en 1982 avec des performances qui surpassent les CISC de l’époque, puis le RISC II (40760 transistors, 39 instructions) en 1983. L’équipe de John Henessy, à l’université de Stanford, produit le MIPS au début des années 1980.
Du fait de la simplicité des instructions et de leur format, la conception des processeurs RISC est plus simple que celle des CISC. Pour atteindre les niveaux de performance voulu, les processeurs RISC font appel à des améliorations d’ordre architectural. La durée d’exécution d’un programme est donnée par TP = Σ(Ni × NC/ i × TC) avec TC la durée d’un cycle d’horloge, NC/ i le nombre de cycles pour exécuter une instruction particulière et Ni le nombre d’occurence de cette instruction. Les processeurs RISC essaient d’agir sur le nombre de cycle par instruction pour obtenir la performance voulue. Après une période de méfiance de la part de l’industrie, le marché du RISC se développe à la fin des années 1980. Deux modèles de processeurs RISC développés à Berkeley et à Stanford sont à l’origine de la plupart des processeurs RISC actuels. Ils diffèrent principalement par le nombre de registres qu’ils comportent.