Vous êtes sur la page 1sur 53

DGEI 4me anne Informatique.

Anne 2010 - 2011

Projet Systmes Informatiques

Du compilateur vers le microprocesseur

Daniela Dragomirescu Eric Alata

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 1

Organisation du projet :

1. Dveloppement dun compilateur en utilisant LEX et YACC


Application des Automates & Langages Prsentation des logiciels LEX et YACC

2. Conception dun microprocesseur de type RISC avec pipe-line


Application des Architectures matrielle pour systmes informatiques

___________________________________________________________________________ 2 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

Objectif
Lobjectif de ce Projet Systmes Informatiques est de raliser un systme informatique complet. Nous allons raliser un compilateur qui traduit un langage source (proche du C) en un langage cible (jeu dinstructions assembleur orientes mmoire). Crer un microprocesseur correspondant un jeu dinstructions orientes mmoire est difficile. Par contre, crer un microprocesseur correspondant a un jeu dinstructions orient registre est plus facile. Un cross-compilateur permettant de traduire ce jeu dinstructions orientes mmoire en un jeu dinstructions orientes registre sera donc ncessaire. Voici le schma complet de notre systme informatique :

Langage C Compilateur Jeu dinstructions assembleur orientes mmoire Interprteur Cross-assembleur Jeu dinstructions assembleur orientes registre Architecture Excution matrielle Microprocesseur

Excution

Microprocesseur

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 3

Ralisation dun compilateur en utilisant LEX et YACC

1. OBJECTIF
Lobjectif de ces travaux pratiques est de raliser un compilateur dune version simplifie du langage C en utilisant le gnrateur d'analyseur lexical LEX et le gnrateur d'analyseur syntaxique YACC (Yet Another Compiler Compiler ).

Le T.P. va tre structur en 4 parties : 1. Premire partie vous allez dvelopper un compilateur dun langage permettant la

manipulation dexpressions arithmtiques de type C. Le compilateur va gnrer le code correspondant en langage assembleur. Ensuite vous allez crire, un interprteur du langage assembleur, afin dobtenir lexcution du code. Enfin vous allez raliser un programme de test du compilateur et de linterprteur dvelopps. 2. Deuxime partie vous allez rajouter votre langage de type C limplmentation des expressions conditionnelles if et while . 3. Troisime partie vous allez rajouter au compilateur un traitement des erreurs (avec diffrentes degrs de difficult). 4. Cross-assembleur

Dveloppement dun compilateur pour un langage simplifi de type C et de linterprteur dun langage assembleur
Le langage dentre est un langage de type C qui reconnat : la fonction main (), les accolades { et } les constantes de type entier( mot cl : const ) et leur noms les variables de type entier (mot cl : int ) et leur noms. Le nom dune variable ou dune constante doit commencer par une lettre et peut contenir de lettres, des chiffres et le tire bas _ les oprations arithmtiques dfinies par les signes mathmatiques suivants : +, -, *, /, = et les parenthses ( ) les sparateurs : espace, TAB et virgule

___________________________________________________________________________ 4 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

la fin de ligne \n la fin dune instruction signale par " ; " comme en langage C classique la fonction printf() ayant 1 seul paramtre : la variable dont la valeur doit tre affiche les entiers doivent tre reconnus sous la forme dcimale et la forme exponentielle notre langage C permet la dclaration de plusieurs variables dans la mme ligne

(ex : int toto, mimi=5 ; ) ou la dclaration de plusieurs constantes dans la mme ligne. Dans ce cas noubliez pas dallouer de la mmoire pour chacune de variables, respectivement constantes dclares notre langage C fait la diffrence entre lettres minuscule et majuscule. Les mots cles du langage seront reconnus seulement sils sont crits en minuscule. On autorise la dclaration des constantes et variables seulement lintrieur de la fonction main(). Cette partie dclarative doit se trouver avant les instructions, obligatoirement. aucune autre appel de fonction nest pas reconnu par notre langage C simplifi.

Dans un premiers temps on va raliser lanalyseur lexical qui dtecte les mots typs (tokens) spcifiques notre langage (tel que dcrit au-dessus) et affiche lcran un message qui indique le mot typ (token) lu. Une fois lanalyseur lexicographique correctement dvelopp, on va modifier la spcification lexicale afin de passer ces mots typs YACC. Dans un deuxime temps on va raliser lanalyseur syntaxique qui analyse notre langage de type C et produit comme sortie le code assembleur correspondant.

Description du langage assembleur utiliser :


Les donnes sont ranges dans une mmoire de donnes de type tableau, avec une premire zone rserve aux variables et constantes dclares et une deuxime zone pour les rsultats temporaires (voir cours section 5.3.4 du chapitre 3). Il faut grer la libration de lespace mmoire.

Les instructions connues sont : - addition des 2 oprandes : ADD @rsultat @oprande1 @oprande2

code opration ADD 1 exemple : __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 5

si loprande 1 est ladresse 50, loprande 2 est ladresse 55 et le rsultat ladresse 250 on gnre : 1 250 50 55 Ce codage permettra une interprtation plus aise. - multiplication des 2 oprandes : MUL @rsultat @oprande1 @oprande2

code opration MUL 2 - soustraction SOU @rsultat @oprande1 @oprande2

code opration SOU 3

- division DIV @rsultat @oprande1 @oprande2

code opration DIV 4 - copie COP @rsultat @oprande

code opration COP 5 - affectation AFC @rsultat valeur constante

code opration AFC 6 - saut inconditionnel JMP numro dinstruction code opration JMP 7 - saut si la condition est fausse JMF @X numro dinstruction

code opration JMF 8 On attribue un code entier 1 pour un rsultat true et 0 pour une rsultat false. - comparaison inferieur : INF @rsultat @oprand1 @oprand2

code opration INF 9 suprieur : SUP @rsultat @oprand1 @oprand2

code opration SUP A ___________________________________________________________________________ 6 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

gal : EQU @rsultat @oprand1 @oprand2

code opration EQU B - imprimer PRI @rsultat

code opration PRI C

A la sortie de votre analyseur syntaxique vous aller crire les instructions du code assembleur correspondant en clair dans un premier fichier, ainsi que la version code dans un second fichier. Dans un troisime temps vous aller dvelopper linterprteur du langage assembleur en utilisant LEX et YACC (de la version code gnre auparavant). Cet interprteur va afficher lcran le rsultat de notre programme crit en langage C et qui utilise la fonction printf(). Exemple : main() { int i, j,k ,r; i =3 ; j=4 ; k=8 ; printf (i) ; r=(i+j)*(i+k/j) ; printf ( r ) ; } Le rsultat affich par linterprteur lcran va tre : 3 35 Donc, en dernire tape vous aller tester le compilateur et le interprteur dvelopps.

Implmentation des expressions conditionnelles du if et du while .

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 7

Vous aller rajouter les expressions conditionnelles ainsi que les instructions if et while la syntaxe identique celle du langage C. Vous aller faire les modifications ncessaires au niveau de lanalyseur lexical et syntaxique de votre compilateur.

Traitement des erreurs


Un traitement des erreurs simple sera prvu au niveau du compilateur, qui permettra de dtecter quune erreur est intervenue, dafficher un message derreur et la ligne sur laquelle lerreur se trouve dans un premier temps. Dans un deuxime temps il faut raliser le traitement des erreurs puis de continuer lanalyse de la chane dentre.

Par la suite nous allons prsenter les deux logiciels utiliss : LEX et YACC.

___________________________________________________________________________ 8 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

2. LEX : gnrateur d'analyseurs lexicaux


2.1 Introduction
LEX est un outil qui, partir de la description de la lexicographie d'un langage (donnes d'entre) gnre un analyseur lexicographique associ. Cet analyseur gnr est un programme C. Les spcifications de l'utilisateur fournie comme donnes de LEX sont converties dans un programme qui reconnat une srie de terminaux (tokens) et excute, en plus, des fragments de code (actions) fournis aussi par l'utilisateur. Spcifications lexicales du langage Analyseur lexicographique du langage (programme C)

LEX

Actions en C Fig.1 Gnrateur de l'analyseur lexical. L'analyseur lexicographique doit ensuite tre compil pour tre utilis.

Chane d'entre

Analyseur lexicographique du langage (excutable)

Chane de sortie

Fig.2 Utilisation de l'analyseur lexical.

Les donnes de ce programme excutable doit tre une chane conforme aux spcifications lexicales. Au fur et mesure que le flux dentre est trait les actions sont excutes chaque fois qu'un token est reconnu. Si le flux dentre contient des expressions qui ne sont pas reconnues, elles sont copies la sortie sans aucun traitement.

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 9

Remarque: Le programme gnr par LEX est stoqu dans un fichier nomm lex.yy.c qui contient la fonction yylex(). Cette fonction reconnat les expressions dfinies et ralise le traitement demand sur celles-ci. Les spcifications lexicales du langage trait sont dcrites dans un langage qui sera prsent la section 2.2. Avant cela, on va donner deux exemples. Le but est uniquement de donner une ide de ce langage.

Exemples: 1. Programme qui limine les blancs et les TABs la fin de chaque ligne Les spcifications sont les suivantes :

%% [ \t]+$ ; (attention :devant \t se trouve un blanc)

La spcification contient le dlimiteur %% pour indiquer le dbut de spcification des rgles. Dans cet exemple il y a une seule rgle qui dit que chaque fois que lon rencontre une ou plusieurs blancs ou tabs , aucune action nest effectue . Les crochets carres dfinissent la classe forme par les caractres blancs et tab ; le signe + signifie un ou plusieurs caractres de ce type (rptition) ; enfin, $ indique fin de la ligne . Aucune action nest spcifie, alors la fonction yylex() va ignorer cette configuration. Toute autre combinaison va tre copie la sortie.

2. Programme qui remplace plusieurs blancs ou TABs avec un seul blanc.

%% [ \t]+ printf(" ");

Ici on voit apparatre l'utilisation d'une action (printf).

___________________________________________________________________________ 10 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

2.2 Sources LEX


Le format gnral dune spcification lexicale d'un langage pour LEX est le suivant :

dfinitions %% rgles %% sous-programmes utilisateurs

Les dfinitions, les sous-programme et le deuxime %% (si il ny a pas de sousprogrammes) sont optionnels. Les dfinitions seront abordes la section 2.6. Le premier %% doit tre toujours prsent pour marquer le dbut des rgles. Le plus simple programme LEX est le suivant :

%% Aucune dfinition, aucune rgle. Leffet de ce programme est de copier la chane dentre la sortie sans aucune modification. En mode normal, les rgles ont 2 parties : dans la premire partie lexpression que lon doit trouver ; dans la deuxime partie laction effectuer quand on trouve cette expression.

Exemples : 1. %% int printf("trouv mot cl INT"); Ce programme cherche dans les donnes dentre le mot int et affiche la sortie le message trouv mot cl INT .

2.

%% hello printf ("salut") ; world printf ("monde") ; sea printf ("mer") ;

Ce programme peut reprsenter le dbut dun traducteur danglais vers franais. __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 11

2.3 Mots typs (tokens)


Dans les exemples prcdents, les expressions sont rduites un mot typ (token). On appelle un token une chane de caractres (lettres ou chiffres) quon veut dtecter. Dans les cas gnral, une expression contient des caractres tokens et des oprateurs qui prcisent des rptitions, des choix ou d'autres rgles de composition de ces tokens. Exemple: [^abc]+ dfini la rptition (+) de lettres de l'alphabet sauf a, b et c(^). On va dtailler maintenant chaque oprateur.

2.3.1 Les oprateurs

Les caractres utiliss comme oprateurs sont les suivants :

"\[]^-?.*+|()$/{}%<>
Si on dsire les utiliser comme caractres dun token, ils doivent tre prcds du symbole \ . Laction de ces oprateurs est la suivante : loprateur " indique que tout ce que se trouve entre les signes " " doit tre considr comme texte dun token;

loprateur \ indique que le signe qui le suit doit tre trait comme un caractre dun token. Ce mme oprateur peut tre utilis pour la spcification portable de caractres spciaux comme : \n \t \b Exemple : Les expressions xyz"++" "xyz++" xyz\+\+ ont toutes la mme signification. Ces expressions cherchent la chane xyz++ dans le flux dentre. Lutilisation de lune ou lautre de ces variantes tient du got de chacun. newline TAB backspace

___________________________________________________________________________ 12 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

Remarque Si on avait crit xyz"+ "+, on aurait exprim la rptition du token xyz+.

loprateur [ ] dlimite des classes des caractres. La signification des oprateurs nest pas prise en compte quand ceux-ci se trouvent entre [ ], exception faite des oprateurs \, - et ^; Exemple :[abc] est un token constitu dun seul caractre qui peut tre soit a, soit b, soit c.

loprateur - indique la plage de variation ; Exemple [a-z0-9<>] signifie la classe des caractres minuscules compris entre a et z,

laquelle on ajoute les chiffres entre 0 et 9, les symboles plus petit et plus grand .

loprateur ^ indique le fait que la classe est compose du complment des caractres spcifis . Cet oprateur apparat toujours entre des crochets. Exemple : [^abc] reprsente la classe de tous les caractre sauf a, b et c ; [^a-zA-Z] reprsente la classe de caractres qui ne sont pas des lettres. Remarque : Le caractre ^ doit se trouver en premire position entre les crochets.

loprateur . signifie nimporte quel caractre ;

loprateur ? signifie que l'lment se trouvant devant lui est optionnel ; Exemple : ab ?c signifie soit la chane abc soit ac, c'est--dire l'apparition de b dans cette expression est optionnelle

les oprateurs de rptitions loprateur * indique nimporte quel nombre des apparitions (incluant 0) du caractre ou de la classe de caractres qui le prcde ; loprateur + signifie une ou plusieurs apparitions du caractre ou de la classe de caractres antrieure ; Exemple : [a-z]+ signifie toutes les chanes de caractres en minuscules ; [A-Za-z][A-Za-z0-9]* toutes les chanes qui commencent avec une lettre. Cette

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 13

expression est utilise habituellement pour reconnatre les identificateurs dans les langages de programmation.

loprateur | est utilis la construction des expressions alternatives ; Exemple : ab|cd signifie soit ab soit cd .

loprateur ( ) est utilis pour grouper des expressions alternatives dans des expressions plus compliques ; Exemple : (ab|cd+) ?(ef)* peut reprsenter abefef , efefef , cdef , cddd , mais

non abcd , abc ou abcdef .

loprateur ^ est utilis pour reconnatre les expressions qui apparaissent au dbut dune ligne . Cette utilisation ne peut pas tre confondue avec loprateur de complmentarit, car celui-ci apparat toujours entre des crochets, comme spcifi au dessus ;

loprateur $ est utilis pour reconnatre les expressions qui apparaissent la fin dune ligne ; Exemple : ab$ reconnat lexpression ab si elle apparat la fin de la ligne ab/\n est quivalente avec ab$

les oprateurs { et } spcifient soit des rptitions, si entre eux se trouvent des numros, soit une dfinition si entre eux se trouve un nom ;

Exemple : {digit}cherche la chane digit et la remplace avec la dfinition correspondante ; a{1,5} cherche les apparitions de groupes de 1 5 a ; a{2, } cherche des apparitions de a 2 fois ou plus; a{3} cherche exactement 3 apparitions de a

2.3.2 Priorit des oprateurs

Les oprateurs placs sur les premires lignes ont une priorit plus grande que ceux placs sur les dernires lignes (priorit dcroissante). Sur une mme ligne, les oprateurs ont la priorit dcroissante suivante :

___________________________________________________________________________ 14 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

Caractres escape Expressions entre crochets Expressions entre guillemets Oprateur utilis pour grouper Dfinitions Un caractre, rptition Concatnation Contexte Alternative

\caractres spciaux [ ] "" () {nom} * ? +

$ ^ |

Remarque: LEX accepte des expressions ayant la longueur maximale de 100 caractres.

2.3.3 Les actions

Quand une expression (dfinie de la faon dcrite prcdemment) est reconnue, le programme gnr par LEX va effectuer les actions spcifies la suite de la dfinition. Les actions sont, en gnral, des fragments de code crit en langage C, fournis par lutilisateur. La plus simple des actions est laction nulle ; , cest--dire, on reconnat lexpression et on nexcute rien. Pour des actions plus complexes, il existe une srie de fonctions et de variables globales comme: la variable globale yytext, qui est un pointer vers une chane de caractres qui contient l'expression trouve; Exemple: Pour imprimer l'expression trouve, l'action faire est : [a-z]+ printf("%s", yytext) ; Cette action est trs utilise, elle peut tre crite plus simplement: [a-z]+ ECHO; la variable globale yyleng qui reprsente le nombre de caractres de l'expression trouve; Exemple: Pour compter les expressions trouves et le nombre de caractres traits on crit: [a-zA-Z]+ {words++; chars +=yyleng;}

Le dernier caractre d'une expression peut tre accd ainsi: yytext[yyleng-1] __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 15

Concatnation Pour raliser la concatnation de deux expressions on utilise la fonction yymore(). Elle indique que le token suivant reconnu va tre ajouter la valeur prsente de yytext la place de remplacer cette valeur. La valeur de yyleng est modifi en consquence. Exemple: "xyz+" {printf("%d %s\n", yyleng, yytext) ; yymore();} . printf("%s", yytext); Ds qu'on dtecte xyz+ dans le flux d'entre on va afficher 4 xyz+ et l'expression qui suit va tre afficher xyz+"expression". Entre: Sortie: xyz+32 4 xyz+ xyz+32

Si on dsire liminer les derniers caractres d'une expression on utilise la fonction yyless(n) o n reprsente le nombre des caractres qu'on veux garder en yytext. Exemples : 1. "integer" { printf("%s\t ", yytext) ; yyless(2) ; } . printf("%d %s\t ", yyleng, yytext) ;

Ds qu'on dtecte "integer" dans le flux d'entre on va afficher "integer", on garde en yytext les 2 premires caractres et partir du 3me caractre on relance l'analyse suivant les rgles lexicales dfinis. La sortie de ce exemple est, donc, la suivante: Entre : integer 32 Sortie : integer 1t 1e 1g 1e 1r 1" " 13 12

2. char buffer[400]; %% \n.* { strcpy(buffer, yytext+1); yyless(1); } Cette spcification sauve la ligne courante dans un buffer local. L'expression \n.* dtecte un caractre newline et toute la ligne qui le suit. Aprs le contenu de la ligne est sauv dans le buffer , il est retourn l'analyseur lexical pour analyse.

___________________________________________________________________________ 16 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

2.4 Accs aux sous-programmes d'entre/sortie


Pour ceci on utilise les fonctions suivantes : input() donne le caractre suivant ; output(c) crit le caractre c la sortie; unput(c) met le caractre c dans le flux de donnes d'entres pour tre lu ensuite par input().

Une autre fonction , qui peut tre redfinie par l'utilisateur, est yywrap(), fonction qui est appele chaque fois que EOF est dtect. Elle peut tre utilise pour ouvrir un nouveau fichier la fin du fichier courant pour continuer l'analyse lexicale. Si elle n'est pas modifie, yywrap() retourne 1 quand le EOF est dtect.

2.5 L'ambigut des rgles


LEX peut travailler avec des spcifications qui contiennent des ambiguts. Quand l'expression de l'entre correspond plusieurs rgles, LEX choisit selon les critres suivantes : 1. L'expression plus longue est prfre. 2. Pour la mme longueur, LEX prfre la rgle qui apparat en premier.

Exemple: integer [a-z]+

printf("Mot cl\n"); printf("Identificateur\n");

Si dans le flux de donnes d'entre se trouve "integer", il va tre considr comme mot cl, car mme si les 2 rgles dtectent des expressions de la mme longueur, la rgle integer est dfinie en premier.

En LEX un caractre est pris en compte une seule fois. Exemple: she he \n . s++; h++; | ;

On va tout ignorer, part "she" et "he". Comme "she" inclut "he" LEX va gnrer un programme qui ne reconnatra pas les apparitions de "he" l'intrieur de "she". Si on dsire __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 17

reconnatre les apparitions de "he" l'intrieur de "she" on doit utiliser l'action REJECT qui veut dire "passe l'alternative suivante". En gnral REJECT est utile quand on ne cherche pas la division de flux d'entre en terminaux, mais on dsire dtecter l'apparition de certaines configurations qui sont partiellement superposes.

2.6 Dfinitions
L'utilisateur a besoin de facilits nouvelles pour dfinir les variables qui vont tre utilises par LEX. Celles-ci peuvent apparatre autant dans la partie dfinitions que dans la partie rgles. LEX transforme les rgles dans un programme. Toute action qui n'est pas effectue par LEX est copie dans le programme gnral. Il y a 2 rgles pour raliser ceci :

1. Toute ligne qui ne fait pas partie d'une rgle ou d'une action et qui commence par un blanc ou un TAB est copie dans le programme. Les variables dfinies avant la premire apparition de l'expression%% sont des variables globales. Les lignes de commentaire sont aussi copies dans le programme source.

2. Toute chane de caractres incluse entre %{et %} est copie telle que ( les dlimiteurs sont limins). Toute ligne qui n'est pas incluse entre ces dlimiteurs et qui commence la premire position va tre considre par LEX comme une substitution avec le format:

nom

expression

et dtermine l'association de l'expression avec le nom. Les deux champs doivent tre spars au moins par un blanc ou un TAB et le nom doit commencer par une lettre. Exemple: reconnaissance des nombres en virgule flottante D E %% {D}+ {D}+{E} {D}*"."{D}*({E})? | printf("integer\n"); printf("real\n"); [0-9] [Ee][-+]?{D}+

___________________________________________________________________________ 18 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

2.7 Utilisation
La compilation d'un programme LEX s'excute en 2 tapes : 1. Gnration du programme en langage C en utilisant LEX lex source opration qui va gnrer le programme en C lex.yy.c 2. La compilation de programme avec un compilateur C. gcc lex.yy.c -ll

2.8 Lex et YACC


LEX fournit une fonction yylex() - analyseur lexical. yylex() est exactement le nom demand par YACC pour l'analyseur lexical. Cette fonction est appele par YACC pour reconnatre les tokens dans le flux d'entre. Dans ce cas, la rgle LEX doit finir par return nom_token; de manire que YACC soit inform du token trouv par l'analyseur lexical.

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 19

3. YACC : gnrateur d'analyseurs syntaxiques


YACC - Yet Another Compiler Compiler
Le flux de donnes d'entre utilis par diffrents programmes prsente une structure bien dfinie. En fait, tout programme peut tre vu comme un analyseur syntaxique qui accepte un certain "langage d'entre". Un "langage d'entre" peut tre aussi compliqu quun langage de programmation ou aussi simple quune chane de numros. YACC est un instrument qui, partir de la description de la syntaxe du "langage d'entre" gnre lanalyseur syntaxique associ. Les utilisateurs spcifient la structure du langage dentre et des fragments de code en C qui doivent tre excuts chaque fois quune structure est reconnue. Si le langage dentre est un langage informatique, le code C effectue gnralement une traduction de la structure du langage source (dentre) en des instructions assembleur de la machine dexcution. YACC transforme les spcifications du langage dentre dans un programme crit en langage C qui ralise l'analyse syntaxique de donnes d'entres. Source crit en C de Description de la syntaxe du langage dentre

YACC

lanalyseur syntaxique et analyseur smantique

(traduction) du langage

Fragments de code C de traduction Fig.1 YACC

En utilisant YACC on peut raliser des compilateurs de C, Pascal, Fortran ou des compilateurs pour les langages de programmations des imprimantes graphiques, etc.

___________________________________________________________________________ 20 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

3.1 Introduction
Les utilisateurs de YACC donnent les spcifications du flux d'entre, qui inclut des rgles dcrivant la structure syntaxique, des fragments de programme qui reprsentent les actions effectuer et des spcifications du traitement primaire des donnes d'entre. YACC gnre une fonction qui ralise le contrle de donnes d'entre. Cette fonction appelle la fonction de l'analyseur lexical pour reconnatre les terminaux. La conformit de la squence des terminaux avec la syntaxe du langage dentre est ensuite vrifie. Chaque fois qu'une rgle est reconnue, les instructions spcifies par lutilisateur sont effectues (fragments de code C de traduction). Les rgles syntaxique sont dcrites en dfinissant pour chaque non-terminal (plac gauche de : ), la composition de terminaux et non-terminaux (placs droite de : ). Exemple: Data Data : jour '.' mois '.' an ; : jour '/' mois '/' an;

o "jour", "mois", "an" sont des structures dfinies antrieurement, des terminaux (tokens) dj reconnus par l'analyseur lexical qui les passe lanalyseur syntaxique. Les symboles ":" et ";" sont des dlimiteurs pour une rgle syntaxique. Nous allons par la suite dtailler la faon dexprimer les rgles et les actions.

3.2 Spcifications de base


Le format d'une spcification YACC est le suivant : Dclarations %% Rgles %% Programmes

La partie de dclarations peut manquer, ainsi que la partie de programmes. Les blancs et les TABs sont ignors. Les commentaires sont limits par /* . */ comme en C. Les rgles ont le format suivant : A : CORPS; __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 21

"A" reprsente un symbole non-terminal, et "CORPS" reprsente une chane de noms et lettres. Les symboles ":" et ";" sont des dlimiteurs. Les noms peuvent tre des symboles terminaux ou non-terminaux. YACC ncessite que les noms des symboles terminaux soient dclars ainsi dans la partie de dclarations. Exemple: %token nom1 nom2

Tout nom non-defini dans la partie dclarative est considr comme un symbole nonterminal. Tout symbole non-terminal doit apparatre dans la partie gauche d'une rgle au moins une fois. Les noms peuvent avoir une longueur arbitraire et sont forms par des lettres, ".", "_", et des chiffres (pas au dbut du nom). Les majuscules et les minuscules sont distinctes. Une lettre est spcifie par un caractre entre ' et '. Comme en C le caractre "\" est utilis pour la spcification portable des caractres spciaux (newline, return, tab, etc). Pour des raisons techniques, le caractre NULL (\0 ou 0 ) ne doit pas tre utilis dans les rgles syntaxiques. Si plusieurs rgles ont la mme partie gauche, on peut utiliser le caractre " | ". Il n'est pas ncessaire que toutes les rgles avec la mme partie gauche apparaissent ensemble. Toute fois, ceci facilite la comprhension des spcifications. Exemple: A A A : B C D; : E F; : G; A :BCD |EF |G ; Si un symbole non-terminal doit reconnatre une chane vide, on va crire : Vide : ;

Parmi tous les symboles non-terminaux il en existe un trs important. Celui-ci est le symbole de dbut. L'analyseur syntaxique reconnat ce symbole. Par dfaut, le symbole de dbut (axiome) est considr comme tant le premier nom de ct gauche de la premire rgle. Si on dsire, on peut dclarer ce symbole explicite en utilisant le mot cl: %start Exemple: %start symbole La fin du flux d'entre est signale avec un symbole spcial, nomm "end marker". Si les symboles trouvs jusqu' end marker correspondent une rgle syntaxique, l'analyseur a fini son activit. Sinon, il signale une erreur.

___________________________________________________________________________ 22 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

3.3 Actions
A chaque rgle syntaxique on associe des actions. Ces actions peuvent retourner diffrentes valeurs et peuvent utiliser les valeurs retournes par des autres actions. Une action est un fragment de code en C, plac entre accolades. Exemple: rgle syntaxique avec actions A : '(' B ')' {printf("message %d\n", i); i++}

Pour faciliter la communication entre actions et l'analyseur syntaxique on utilise le symbole $ de la manire suivante : Pour retourner une valeur, l'action doit attribuer la pseudo-variable $$ une valeur. Exemple : action qui ne fait que retourner la valeur 1 { $$=1; } Pour obtenir la valeur retourne d'une action prcdente, l'action courante doit utiliser les pseudo-variables $1, $2, qui font rfrence aux valeurs retournes des composantes du ct droite d'une rgle, parcouru du gauche droite. Exemple: 1. Soit la rgle A : B C D;

alors $2 reprsente la valeur retourne par C et $3 la valeur retourne par D. 2. expr : '(' expr ')' { $$ = $2; }

La valeur retourne par cette action est la valeur de "expr" qui se trouve entre les parenthses. Par dfaut, la valeur d'une rgle est la valeur du premier lment de cette rgle (c'est-dire $1). Pour ceci, les rgles de type A : B; A : B { $$ = $1;} ne ncessitent aucune action. Dans les exemples prcdents, les actions taient places la fin de la rgle. Parfois, il est ncessaire d'effectuer des actions avant qu'une rgle ne soit compltement analyse. YACC permet dcrire des actions l'intrieur de la rgle.

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 23

Exemple : A : B { $$ = 1;} C { x = $2; y = $3;} L'effet est l'attribution de la valeur 1 x et l'attribution de la valeur retourne par C y. Les actions qui ne se trouvent pas la fin d'une rgle sont considres par YACC comme de nouveaux symboles non-terminaux ; la rgle qui analyse ces symboles est la chane vide. Dans certaines applications (ex: compilateurs de C) la sortie n'est pas le rsultat direct des actions. Les actions construisent une structure d'arbre danalyse grammaticale qui gnre la sortie. Ces arbres syntaxiques sont construits en utilisant la technique suivante: 1. On crit une fonction ( en C) appele "nud" de faon que l'appel nud( L, n1, n2) gnre un nud avec l'tiquette L, ayant les descendants n1 et n2 et qui retourne l'index de nud cr. 2. L'arbre d'analyse peut tre gnr en utilisant des actions de type: expr : expr '+' expr {$$ = nud ('+', $1, $3); }

L'utilisateur peut dfinir des autres variables qui peuvent tre utilises par des actions. Ces variables doivent tre dfinies dans la partie dclarative d'une spcification YACC entre les signes "%{ " et "%}".

Exemple: %{ int toto = 0; %} Les variables utilises par YACC ont des noms qui commencent par "yy" et l'utilisateur doit viter de dfinir des variables avec un tel nom.

3.4 Analyse lexicale

___________________________________________________________________________ 24 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

L'analyseur lexicale est une fonction qui doit porter le nom yylex(). La fonction doit retourner un entier qui reprsente le" numro du token lu" dans le flux d'entre. Sil existe une valeur associe ce token elle va tre attribue la variable externe yylval. L'analyseur lexicale et l'analyseur syntaxique doivent "s'entendre" sur les numros de chaque token. Ces numros peuvent tre choisis par l'utilisateur ou par YACC. Dans les 2 cas le mcanisme "#define" du C est utilis. Par dfaut YACC choisit ces numros. Pour un caractre YACC choisit la valeur numrique de ce caractre et pour les autres des numros suprieur 257. Si cest lutilisateur qui choisit la numrotation, il faut toujours choisir pour ces tokens des numros > 257. Pour donner un numro un token, sa premire apparition dans la rgion de dclarations doit tre suivie dun nombre entier positif. Les tokens et les caractres qui ne sont pas suivis d'un entier reoivent des numros par dfaut, comme dcrit au-dessus. Exemple : DIGIT - est dclar dans la partie de dclarations yylex(){ extern int yylval; int c; c = getchar(); switch(c){ case '0' : case '1' : ... case '9' : yylval = c - '0'; return (DIGIT); } } Cet exemple va retourner le nombre correspondant DIGIT et sa valeur chaque fois que lon trouve un chiffre dans le flux d'entre.

3.5 Ambigut et conflits

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 25

On considre quun ensemble de rgles syntaxiques prsente une ambigut si la mme chane dentre peut tre structure de plusieurs manires diffrentes. Exemple : expr : expr - expr ;

est une manire naturelle pour dcrire le mode de formation dune expression mathmatique. Mais cette rgle ne nous dit pas comment on va interprter une expression de type : expr expr expr

Celle-ci peut tre structure ainsi : (expr expr) expr ou comme : expr (expr expr)

YACC dtecte ce type d'ambigut. Un rapport plus dtaill peut tre obtenu en utilisant loption v la compilation du fichier source YACC. Il faut regarder le fichier y.output. Pour avoir une ide de la manire par laquelle sont rsolus les conflits de ce type, il faut jeter un coup dil lintrieur de lanalyseur syntaxique. Lanalyseur syntaxique est un automate pile qui peut raliser quatre fonctions : dplacement, rduction, acceptation et erreur.

1.

La fonction de dplacement ajoute un nouveau symbole la chane analyse. Cette

fonction remplit la pile de lautomate. 2. La fonction de rduction est laction excute par lautomate quand il a reconnu une

rgle. Cette fonction vide la pile de lautomate. 3. La fonction dacceptation est une fonction qui indique que le flux dentre a t

analys et qu'il correspond aux spcifications. 4. La fonction derreur indique que, dans le flux dentre, existe une sous-chane qui ne

correspond aucune spcification.

Revenons lexemple prcdent. On voit que aprs avoir lu la chane expr expr on a un conflit de type dplacement / rduction. Dans certain cas, un conflit de type

___________________________________________________________________________ 26 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

rduction / rduction peut apparatre, mais jamais un conflit de type dplacement / dplacement. Les rgles dlimination de ces conflits sont les suivantes : 1. Dans le cas dun conflit dplacement / rduction cest le dplacement qui gagne. 2. Dans le cas dun conflit rduction / rduction on choisit la rgle qui apparat la premire dans les spcifications. Donc notre chane dentre va tre groupe : expr (expr expr)

Exemple : Voici un autre exemple de la puissance du YACC de rsoudre les ambiguts. Considrons un exemple dun langage de programmation qui permet des structures de type if then else . statement : | IF ( cond ) statement IF ( cond ) statement ELSE statement

Dans ces rgles IF, ELSE sont des terminaux, et cond , statement sont des nonterminaux. cond dcrit une condition et statement dcrit une chane dactions. Si lentre est de type : IF (C1) IF(C2) S1 ELSE S2 elle peut tre structure en 2 modes : IF (C1) { IF (C2) S1 } ELSE S2 ou IF (C1) { IF (C2) S1 ELSE S2 } La deuxime interprtation est celle habituelle pour beaucoup de langages de programmation. Analysons pour cet exemple la situation o lanalyseur syntaxique est arriv analyser seulement : IF (C1) IF (C2) S1 Cette chane peut tre considre comme une instance de la rgle IF (C1) statement Aprs avoir lu le reste de lexpression ELSE S2 on pourrait croire que cette chane va tre considre comme une instance de la rgle __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 27

IF (C1) statement ELSE S2 Ceci t vrai si lexpression tait rduite avant de faire le dplacement. Mais comme les conflits de type dplacement / rduction donnent toujours gain de cause au dplacement, ELSE va tre dplac et, aprs avoir lu le symbole S2, la rduction de la rgle IF ELSE de la partie droite va tre faite, suivie de la rduction de la rgle IF (C1) statement. Donc , on obtient la deuxime interprtation, celle qui est correcte. Pour viter les risques de problmes concernant les ambiguts, il est prfrable de les viter lorsque vous donnez vos rgles syntaxiques (cf. le cours).

3.6 Priorits
Il y a des situations o les rgles dfinies prcdemment ne sont pas suffisantes pour spcifier la notion de priorit. Cest, par exemple, le cas de lanalyse syntaxique des expressions arithmtiques. La majorit des constructions arithmtiques peuvent tre dcrites en utilisant le concept de niveaux de priorit des oprateurs et des informations sur leurs associativits. Lassociativit et la priorit des oprateurs peuvent tre prcises dans la zone dclarative. Ceci est ralis en utilisant les mots cl : %left %right %noassoc suivi dune liste des symboles terminaux (tokens). Tous les symboles qui se trouvent sur une mme ligne ont la mme priorit. Les symboles terminaux qui se trouvent sur les premires lignes ont une priorit plus petite que celles qui se trouvent sur les lignes suivantes (priorit croissante). Exemple : %left + - %left * / Ces lignes dcrivent la priorit et lassociativit de quatre oprateurs arithmtiques. + et - ont la mme priorit et lassociativit gauche du fait du terme "left" ; * et / ont une priorit plus grande que les oprateurs prcdents et lassociativit gauche .

___________________________________________________________________________ 28 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

Le mot cl %right est utilis (comme vous lavez dj devin) pour lassociativit droite et le mot cl %noassoc est utilis pour dcrire des oprateurs sans associativit (comme certains oprateurs du FORTRAN). Exemple : Spcifications pour expressions arithmtiques %right = %left + - %left * /

%% expr : | | | | | ; Conforme cette spcification la chane dentre : a = b = c*d e f*g va tre structure en: a =(b= (((c*d) e) (f*g) )) Quand on utilise un tel mcanisme, il faut spcifier aussi une priorit pour les oprateurs unaires (comme - devant un numro). Le mot cl %prec modifie la priorit dun oprateur dans le cadre dune rgle syntaxique. Il doit apparatre tout de suite aprs que la rgle ait t dfinie. Dans lexemple suivant, on donne loprateur unaire la mme priorit que celle de loprateur * . Exemple : %right = %left + - %left * / expr = expr expr + expr expr - expr expr * expr expr / expr NAME

%% expr : | | expr = expr expr + expr expr - expr

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 29

| | | | ;

expr * expr expr / expr expr NAME %prec *

Un symbole terminal dclar en utilisant %left, %right, %noassoc nest plus ncessaire (mais il peut) tre dclar en utilisant %token.

3.7 Traitement des erreurs


Le traitement des erreurs est un domaine difficile. Souvent il est inacceptable darrter le traitement de donnes si on trouve une erreur. Donc il faut rsoudre le problme de la reprise danalyse aprs la rencontre dune erreur. Lalgorithme gnral de reprise de lanalyse implique llimination de certains terminaux dans la chane dentre, de manire reprendre lanalyse devant une expression correcte. Pour permettre le control des erreurs YACC offre une modalit simple, mais assez gnrale. Le symbole terminal error est rserv pour le traitement des erreurs syntaxiques. Ce token peut tre utilis dans les rgles syntaxiques et pour actions de corrections de celles-ci. Lanalyseur syntaxique vide sa pile jusqu l'tat dans lequel le token erreur est autoris; ensuite il effectue laction correspondante. Afin dviter de gnrer trop de messages derreur, lanalyseur syntaxique, aprs la dtection dune erreur, reste dans ltat derreur jusqu ce que 3 tokens successifs aient t dplacs et rduits correctement. Si, dans ce temps, une nouvelle erreur est dtecte, il nest pas gnr un nouveau message derreur. Exemple : 1. statement : error ;

signifie que dans le cas dune erreur de syntaxe, lanalyseur syntaxique va ignorer lexpression o lerreur est apparue. Plus prcisment, lanalyseur syntaxique va continuer lire les symboles dentre en cherchant 3 tokens conscutives qui sont autoriss pour lexpression courante et va commencer lanalyse avec ceux-ci.

2.

statement

: ;

error ;

___________________________________________________________________________ 30 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

indique que dans le cas dune erreur de syntaxe, lanalyseur syntaxique va ignorer tous les terminaux ou non-terminaux jusqu ;. Tous les symboles jusquau ; ne vont pas tre dplacs et vont tre ignors. Quand on rencontre le symbole ; la rgle sera rduite. Une autre forme de traitement des erreurs peut tre utilise dans les programmes interactifs. On dsire la rintroduction de la ligne qui a eu des erreurs, une fois quon a affich le message derreur.

Exemple : input : error \n input {$$ = $4 ; } ; {printf ("Rentrez la dernire ligne") ;}

3.8 Utilisation
La compilation dun programme YACC sexcute en 2 tapes : 1. Gnration du programme en langage C en utilisant YACC : YACC nom_fichier_source opration qui va gnrer le fichier y.tab.c qui contient la fonction yyparse() Quand cette fonction est appele, elle va appeler son tour la fonction yylex() pour obtenir les symboles dentre. Si une erreur est signale, yyparse() retourne 1. Si on dsire gnrer le fichier y.tab.h qui contient les dclarations de type #define qui associe le nom des tokens dfinis par lutilisateur avec le code YACC pour chaque token il faut utiliser lors de la compilation loption d. YACC d nom_fichier_source Lutilisateur doit prciser dans le fichier source de YACC, dans la zone de sousprogrammes, d'autres fonctions. Par exemple la fonction main() qui appelle la fonction yyparse(). Il faut aussi dfinir une fonction yyerror() (fonction dfinie dans la bibliothque de YACC) qui indique quune erreur de syntaxe a t rencontre. Exemple : main()

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 31

{ return yyparse() ; } et yyerror(char *s) { fprintf(stderr, "%s\n", s) ; } La compilation de ce programme: gcc y.tab.c Pour la compilation des fichiers de lanalyseur lexical (lex.yy.c) et de lanalyseur syntaxique (y.tab.c) il faut utiliser la commande : gcc y.tab.c lex.yy.c ll o nom_executable.exe Attention de conserver cet ordre pour les paramtres de gcc.

Recommandations pour lcriture des spcifications

Il existe quelques conventions qui facilitent la comprhension, bien que n'tant pas des obligations: 1. Utilisez des noms commencent par t ou des majuscules pour les tokens. 2. Mettez les rgles syntaxiques et les actions sur des lignes diffrentes. 3. Regroupez toutes les rgles avec la mme partie gauche ensemble. 4. Mettez le signe ; de la fin dune rgle sur une ligne spare. 5. Positionnez les actions dune rgle avec un dcalage de 3 TABs et les rgles syntaxiques avec un dcalage de 2 TABs. Toutes ces recommandations facilitent la lecture du fichier des spcifications syntaxiques.

___________________________________________________________________________ 32 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

Conception dun microprocesseur de type RISC avec pipe-line

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 33

Note : Le cours de SFO de Michel Cubero Castan et les Travaux Pratiques de SFO de 3me
anne MIC sont un pr-requis obligatoire pour ces Travaux Pratiques.

1. Objectif
2. Premire partie - vous allez concevoir et implmenter en VHDL un microprocesseur avec pipe-line correspondant aux instructions assembleur : addition, soustraction,

multiplication, division, copie et affectation (sans les instructions de saut et de comparaison). Vous allez ensuite synthtiser et optimiser ce microprocesseur du point de vue de la frquence de fonctionnement et vous allez ensuite limplmenter sur le FPGA Xilinx. Cette partie est obligatoire. 3. Deuxime partie vous allez rajouter votre microprocesseur les units

architecturales ncessaires limplmentation des instructions des saut et des comparaison (par exemple : lunit de branchement). Vous allez ensuite synthtiser et optimiser ce microprocesseur du point de vue de la frquence de fonctionnement et vous allez ensuite limplmenter sur le FPGA Xilinx. Cette deuxime partie est facultative.

Afin de vous guider dans la conception de ce microprocesseur, nous allons, dans la deuxime section de ce document, vous prsenter le jeu dinstructions orientes registre que vous allez utiliser. Dans la troisime section, nous abordons larchitecture du microprocesseur que nous vous proposons dimplmenter.

2. Langage assembleur
Le jeu dinstructions orientes registre que vous allez utiliser est prsent dans le tableau 2. Ri, Rj et Rk reprsentent les numros de registres sollicits par linstruction. @i et @j reprsentent des adresses mmoire. Le format dinstruction est de taille fixe. La valeur _ est ___________________________________________________________________________ 34 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

utilise comme bourrage (padding), dans les instructions ncessitant moins de 3 oprandes. Autrement dit, toutes les instructions occupent 4 octets, comme illustr dans le tableau 3. Bien entendu, les jeux dinstructions utiliss par les microprocesseurs dans le commerce ne possdent pas cette caractristique. Nous vous proposons de concevoir un jeu dinstructions orientes registre avec un format de taille fixe, afin de faciliter votre conception. Opration Addition Multiplication Soustraction Division Copie Affectation Chargement Sauvegarde Code 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 Format dinstruction OP A B C ADD Ri Rj Rk MUL Ri Rj Rk SOU Ri Rj Rk DIV Ri Rj Rk COP Ri Rj _ AFC Ri j _ LOAD Ri @j _ STORE @i Rj _ Tableau 2. Jeu dinstructions Instruction : ADD R1 R9 R4 Hexadcimal : 0x01 0x01 0x09 0x04 Binaire : 00000001 00000001 00001001 00000100 Tableau 3. Exemple dinstruction Compar au jeu dinstructions orientes mmoire des TP dAutomates et Langages, deux nouvelles instructions ont fait leur apparition : Chargement et Sauvegarde. Linstruction de chargement permet de copier dans le registre Ri le contenu de la mmoire ladresse @j. Linstruction de sauvegarde permet de copier dans la mmoire ladresse @i le contenu du registre Rj. Ce sont les seules instructions permettant un change avec la mmoire. Un tel processeur RISC est qualifi de processeur RISC Load/Store. Notons que le jeu dinstruction utilis en TP dAutomates et Langages nest pas adapt pour ce type de microprocesseur. Description [Ri] [Rj] + [Rk] [Ri] [Rj] * [Rk] [Ri] [Rj] - [Rk] [Ri] [Rj] / [Rk] [Ri] [Rj] [Ri] j [Ri] [@j] [@i] [Rj]

3. Architecture du microprocesseur RISC


Nous vous proposons dimplmenter ici une architecture de type RISC avec un pipe-line 5 tages (figure 4). Cette architecture doit fonctionner sur 8 bits. Nous reprenons en annexe le cours de Structure et Fonctionnement des Ordinateurs de 3me anne MIC de Michel Cubero Castan concernant le cycle des instructions, le pipe-line et les alas.

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 35

Notre microprocesseur va avoir : Une unit arithmtique et logique, section 3.1 ; Un banc de registres double port de lecture, section 3.2 ; Une mmoire dinstructions, section 3.3 ; Une mmoire des donnes, section 3.3 ; Un chemin des donnes, section 3.4; Une unit de contrle, section 3.5 ; Une unit de dtection des alas, section 3.6 ; Architecture pipe-line sur 5 tages.

LI

DI
Logique de contrle, denvoi et dala

EX

MEM

ER

Mmoire dinstructions

Banc de registres

ALU

Mmoire de donnes

Figure 4. Architecture du microprocesseur RISC avec 5 niveaux de pipe-line

3.1 Lunit arithmtique et logique


On se propose de raliser une UAL ayant linterface prsente sur la figure 5. Le signal Ctrl_Alu informera sur lopration raliser : Addition, Soustraction, Multiplication et Division. Les B(7:0) Ctrl_Alu(2:0) Figure 5. UAL A(7:0) S(7:0)

N, O, Z, C

drapeaux (flags) : N, O, Z et C reprsentent, respectivement, une valeur ngative en sortie (S < 0), un dbordement (overflow : taille de A OP B > 8

bits), une sortie nulle (S = 0) et la retenue (carry) de laddition. Les oprations arithmtiques peuvent tre ralises partir des fonctions correspondantes (+, -, *, /), fournies dans

___________________________________________________________________________ 36 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

la librairie de Xilinx (car limplmentation de ces fonctions a t vu lanne dernire en SFO). Leur implmentation est raliser par vos soins. Pour mmoire, nous vous montrons un exemple de droulement dune multiplication sur des nombres binaires (sur 4 bits), dans la figure 6.

1.

A = 1010 B = 0101 R = 00000000

B(1)=1 R(5:1)R(5:1)+0&A

A = 1010 B = 0101 R = 00001010

2.

A = 1010 B = 0101 R = 00001010

B(2)=0

A = 1010 B = 0101 R = 00001010

3.

A = 1010 B = 0101 R = 00001010

B(3)=1 R(7:3)R(7:3)+0&A

A = 1010 B = 0101 R = 00110010

4.

A = 1010 B = 0101 R = 00110010

B(4)=0

A = 1010 B = 0101 R = 00110010

Figure 6. Droulement dune multiplication sur 4 bits : 10 * 5 = 50

3.2 Banc de registres double port de lecture


On se propose de raliser un banc de 16 registres de 8 bits avec un double accs en lecture et un accs en criture. Le schma de ce registre est prsent la figure 7. Le signal reset RST est actif 0 : le contenu du banc de registres est alors initialis 0x00. @A et @B permettent de lire deux registres simultanment. Les valeurs @A(3:0) @B(3:0) @W(3:0) W DATA(7:0) RST CLK Figure 7. Banc de registres QB(7:0) QA(7:0)

correspondantes sont propages vers les sorties QA et QB. Lcriture de donnes dans un registre se fait par le biais des entres @W, W et DATA. W spcifie si une criture doit tre ralise. Cette entre est active 1, pour une criture. Lorsque lcriture est active, les __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 37

donnes prsentent sur lentre DATA sont copies dans le registre dadresse @W. On considre que le reset et lcriture se feront synchrone avec lhorloge.

Bypass D Q Il arrive quen cours dexcution, le processeur fasse simultanment une requte de lecture et dcriture sur le mme registre. Ceci constitue un ala de donnes. Cet alas peut tre trait par lunit denvoie. Toutefois, afin de simplifier la conception de lunit denvoi, on se propose dimplmenter cette fonctionnalit directement dans le banc de registres : Si criture et lecture sur le mme registre alors la sortie QX DATA.

3.3 Banc de mmoire


Notre architecture contient deux mmoires : une mmoire pour les donnes et une mmoire pour les instructions. Leur structure est prsente la figure 8. La mmoire des donnes doit permettre un accs en lecture ou en criture. Ladresse de la zone mmoire est fournie par lentre @. Pour raliser une lecture, RW doit tre positionn 1 et pour raliser une criture, RW doit tre positionn 0. Dans le cas dune criture, le contenu de lentre IN est copi dans la mmoire ladresse @. Le reset, RST, permettra dinitialiser le contenu de la mmoire 0x00. La lecture, lcriture et le reset se feront synchrones avec lhorloge CLK. Pour simplifier la conception, nous vous proposons une structure de la mmoire des instructions plus simple. Nous supposerons que le programme excuter par le microprocesseur est dj stock dans cette mmoire. De plus, lexcution, nous empchons toute modification du contenu de cette mmoire. Elle sapparente une ROM. Elle est alors dpourvue des entres RST, IN et RW. Comme pour la mmoire des donnes, la lecture se fera synchrone avec lhorloge CLK.

@(7:0) IN(7:0) RW RST CLK

@(7:0) Mmoire des donnes Mmoire des instructions CLK Figure 8. Mmoire des donnes et mmoire des instructions

OUT(7:0)

OUT(31:0)

___________________________________________________________________________ 38 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

3.4 Chemin des donnes


Nous allons prsent commencer lintgration des diffrents lments prcdemment dvelopps afin de concevoir une premire version du processeur. Nous allons crer un chemin des donnes (prsent lillustration 6). Afin de vous guider dans la cration de ce chemin des donnes, nous vous conseillons de procder par tapes. Autrement dit, nous vous conseillons de commencer par crer un chemin de donnes prenant en compte uniquement une des instructions. Vous pourrez alors tester votre implmentation afin de corriger les erreurs ventuelles. Ensuite, vous pourrez intgrer une nouvelle instruction. Vous bouclerez ainsi tant quil reste des instructions implmenter. La suite de cette section vous prsente un exemple de dmarche.

1 - Nous commenons par implmenter linstruction AFC. Cette instruction permet de copier une constante dans un registre destination. Sachant que la modification d'un registre ne doit tre effectue quau niveau de l'tage 5, l'identifiant du registre destination et la valeur lui affecter doivent tre propages jusqu' cet tage. Le chemin suivi par cette instruction est donc le suivant : 1.1. Au niveau du premier tage, les diffrents champs constituant l'instruction sont placs dans le premier pipe-line (LI/DI) ; 1.2. Au niveau du second tage, aucune slection de valeur dans le banc de registres n'est ncessaire : le code de l'opration en cours, la valeur copier et le registre destination sont simplement propags dans le pipe-line (DI/EX) ; 1.3. Au niveau du troisime tage, aucune excution arithmtique n'est ncessaire pour la copie : le code de l'opration en cours, la valeur copier et le registre destination sont simplement propags dans le pipe-line (EX/Mem) ; 1.4. Au niveau du quatrime tage, aucune modification de la mmoire n'est ncessaire pour la copie : le code de l'opration en cours, la valeur copier et le registre destination sont simplement propags dans le pipe-line (Mem/RE) ; 1.5. Au niveau du cinquime tage, nous disposons de toutes les informations ncessaires pour mener bien la copie : valeur copier et registre destination. Cette modification se fait en utilisant l'entre criture du banc de registres. __________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 39

Le schma correspondant est donn en illustration 1. Dans cette illustration, OP reprsente le code dopration et A, B et C les oprandes. Notons, au passage, que le chemin emprunt par cette opration ncessite, au niveau de l'tage 5, d'utiliser un composant situ schmatiquement au niveau de l'tage 2. Mais, en aucune faon, le chemin en question ne passe deux fois par un mme pipe-line.

2 - Sur la base de ce schma, l'instruction COP peut tre ajoute. La diffrence par rapport au schma prcdent est l'obligation, lors du passage l'tage 2, de propager la valeur associe au registre source et non l'identifiant de ce registre. Pour effectuer ces modifications sans pour autant altrer le bon fonctionnement de l'instruction AFC, nous utilisons un multiplexeur. En fonction du code de l'opration, il propage le paramtre B ou la valeur contenue dans le registre point par le paramtre B. Le schma obtenu est donn en illustration 2.

3 - Remarquons que les illustrations prcdentes incluent une unit arithmtique et logique sans les exploiter. Nous allons donc inclure les instructions arithmtiques pour rattacher cette UAL au chemin de donnes. En utilisant nouveau des multiplexeurs pour dterminer les lments propager, nous obtenons l'illustration 3.

4 - En procdant de la mme manire pour l'implmentation des instructions LOAD et STORE, nous obtenons les illustrations 4 et 5.

___________________________________________________________________________ 40 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

IP IP @ @ OUT OUT MUX MUX B @A @A @B @B QB C B @W DATA @W W DATA QA QA A Ctrl_Alu S A Ctrl_Alu S C C C B OP OP OP OP OP OP OP

A A A

A A A

OP

LC B @ RW OUT @ RW OUT IN IN

Mmoire LI/DI LI/DI des instructions des instructions Banc de registres Banc de registres IP @ @ OUT OUT B B B C C C @A @A @B @B QA QA QB @W DATA @W W DATA OP A

DI/EX DI/EX UAL UAL A OP OP OP

EX/Mem EX/Mem A OP OP OP

Mmoire des donnes des donnes

Mem/RE Mem/RE

OP

LC B C A Ctrl_Alu S A Ctrl_Alu S B B @ RW OUT @ RW OUT IN IN

B B B

Illustration 1 : Instruction AFC

Illustration 2 : Instructions AFC, COP

Banc de registres Banc de registres

UAL UAL

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 41

Mmoire Mmoire LI/DI des instructions des instructions DI/EX EX/Mem EX/Mem

Mmoire Mmoire des donnes des donnes

Mem/RE

Banc de registres Banc de registres A A A OP OP OP LC MUX MUX MUX OP OP OP A A A

UAL UAL

IP IP @ @ OUT OUT B @A @A @B @B QB C B @W DATA @W W DATA QA QA A Ctrl_Alu S A Ctrl_Alu S C C C B OP

OP LC

LC B @ RW OUT @ RW OUT IN IN

Banc de registres Banc de registres A OP OP OP

UAL UAL A OP OP OP LC MUX MUX MUX

IP @ @ OUT OUT B B B C C C @A @A @B @B OP

OP

LC QA QA QB B C A Ctrl_Alu S A Ctrl_Alu S B B @ RW OUT @ RW OUT IN IN

B B B

@W DATA @W W DATA

Illustration 3 : Instructions AFC, COP, ADD, MUL, DIV, SOU

Mmoire LI/DI LI/DI des instructions des instructions

DI/EX DI/EX

EX/Mem EX/Mem

Mmoire des donnes des donnes

Mem/RE Mem/RE

___________________________________________________________________________ 42 Daniela Dragomirescu & Eric Alata/ INSA Toulouse

Illustration 4 : Instructions AFC, COP, ADD, MUL, DIV, SOU, LOAD

Mmoire Mmoire LI/DI des instructions des instructions DI/EX EX/Mem EX/Mem

Mmoire Mmoire des donnes des donnes

Mem/RE

MUX

Banc de registres Banc de registres Banc de registres A A A A OP LC MUX MUX MUX MUX MUX MUX OP A A A A

IP IP IP @ @ @ OUT OUT OUT B @A @A @A @B @B @B QB C B @W W DATA @W W DATA @W W DATA QA QA QA A Ctrl_Alu S A Ctrl_Alu S A Ctrl_Alu S C C C C B OP

OP LC LC LC MUX MUX MUX

LC B @ RW OUT @ RW OUT @ RW OUT IN IN IN

IP @ @ @ OUT B B B B C C C C @A @A @A @B OP

A OP LC MUX MUX MUX MUX

A OP LC LC LC MUX MUX MUX QA QA QA QB B C C C C A Ctrl_Alu S A Ctrl_Alu S A Ctrl_Alu S B B @ RW @ RW @ RW OUT IN

OP

LC

B B B B

@W W DATA @W W DATA @W W DATA

Illustration 5 : Instructions AFC, COP, ADD, MUL, DIV, SOU, LOAD, STORE

Mmoire LI/DI LI/DI LI/DI des instructions des instructions des instructions Banc de registres Banc de registres Banc de registres

DI/EX DI/EX DI/EX UAL UAL UAL

EX/Mem EX/Mem EX/Mem

Mmoire des donnes des donnes des donnes

Mem/RE Mem/RE Mem/RE

__________________________________________________________________________ Daniela Dragomirescu & Eric Alata/ INSA Toulouse 43

Mmoire LI/DI LI/DI LI/DI des instructions des instructions des instructions DI/EX DI/EX DI/EX UAL UAL UAL EX/Mem EX/Mem EX/Mem

Mmoire des donnes des donnes des donnes

Mem/RE Mem/RE Mem/RE

Illustration 6 : Chemin des donnes

MUX

MUX

Unit de contrle
Paralllement au chemin de donnes, vous aurez complter la procdure de contrle dont le rle est de dfinir ltat des signaux de commandes des multiplexeurs, des bancs de mmoire et autres lments propres chaque tage du pipeline. Ce contrle est fonction des instructions en cours dexcution.

Gestion des alas


Par la suite, vous serez confronts des situations d'alas. Il existe deux types dalas : les alas de donnes et les alas de branchement. Nous nous intresserons aux alas de donnes. Afin dillustrer ces situations, considrons le programme suivant :

NOP NOP [R1] 12 [R2] [R1] NOP NOP

Supposons que le registre R1 contient 14 et le registre R2 contient 8. A lissu de ce programme, la valeur affecte au registre R2 doit tre 12. Or, lorsque l'criture associe la premire instruction sera ralise (tage 5), la valeur associe au registre R1 dans l'tage 4 ne sera pas encore 12 mais 14. La figure 9 prsente ce cas de figure. Pour rsoudre ce problme, nous vous conseillons d'utiliser une entit de gestion des alas, qui aura pour rle d'injecter des bulles en cas de dtection d'alas. Ces bulles permettent de temporiser lexcution des tages infrieurs lors de la dtection dun conflit avec les tages suprieurs. Pour l'exemple prcdent, lorsque la premire instruction se situe au niveau du second pipe-line et la seconde instruction au niveau du premier pipe-line la comparaison entre les donnes du premier pipe-line et du second pipe-line permet de dtecter cet ala :

OPDI_EX = AFC and OPLI_DI = COP and ADI_EX = BLI_DI Pour ce cas, l'horloge du premier pipe-line est inhibe, le temps que la premire instruction finisse. Attention toutefois que le vide engendre par cette temporisation n'altre pas l'tat des registres. Pour viter ceci, il faut injecter un NOP (NO-OPERATION), qui constitue la bulle. La rsolution des autres cas d'alas suit le mme raisonnement.

D. Dragomirescu & E.Alata / INSA Toulouse

Entre LI/DI

Entre DI/EX

Entre EX/Mem

Entre Mem/RE

Entre criture banc de registre NOP

Contenu banc de registres

1 0 1 0 1 0 1 0 1 0 1 0

OP = AFC A = R1 B = 12 OP = COP A = R2 B = R1 NOP

NOP OP = AFC A = R1 B = 12 OP = COP A = R2 B = 14 NOP

NOP

NOP

R1 = 14 ; R2 = 8

NOP OP = AFC A = R1 B = 12 OP = COP A = R2 B = 14 NOP

NOP

NOP

R1 = 14 ; R2 = 8

NOP OP = AFC A = R1 B = 12 OP = COP A = R2 B = 14 NOP

NOP

R1 = 14 ; R2 = 8

NOP

NOP OP = AFC A = R1 B = 12 OP = COP A = R2 B = 14

R1 = 14 ; R2 = 8

NOP

NOP

R1 = 12 ; R2 = 8

NOP

NOP

NOP

R1 = 12 ; R2 = 14

LI

DI

EX

MEM

ER

Figure 9 : Exemple dala de donnes

D. Dragomirescu & E. Alata / INSA Toulouse

ANNEXE Cours SFO 3me anne MIC Cycle des instructions Pipe-line Aleas

Michel Cubero Castan

D. Dragomirescu & E.Alata / INSA Toulouse

Cycle de l'instruction
Dans le chapitre 1, nous avons vu une machine simplifie excutant une instruction en quatre cycles d'horloge. Toutes les machines ont un fonctionnement analogue. Elles ne s'excutent pas toutes en quatre phases d'horloge, mais elles suivent une mme schma d'excution. Dans les machines anciennes, ce schma comprenait 3 phases: 1. Recherche de l'instruction (Fetch) 2. Dcodage de l'instruction (Decode) 3. Excution de l'instruction (execute) Dans notre machine simplifie, la phase de fetch correspond aux deux premiers cycles d'horloge. En gnral, cette phase de fetch met jour le compteur ordinal. La phase de dcodage est plus difficile cerner dans cette machine, on pourrait dire qu'elle correspond au passage du deuxime cycle au troisime cycle ainsi qu'au troisime cycle. La phase de dcodage comprend souvent la recherche des diffrents paramtres de l'instruction. La phase d'excution correspond elle aux deux derniers cycles. Un ordinateur excute donc, en permanence, la boucle suivante:
rpter dbut Recherche; Dcodage; Excution; fin;

Dans une machine de type RISC, on peut dcomposer l'excution d'une instruction en 5 phases distinctes : recherche de l'instruction, dcodage de l'instruction, excution ou calcul d'adresse mmoire effective, accs mmoire ou branchement, criture rsultat. Prenons, par exemple, le cas d'une machine ayant, pour le jeu d'instructions, les trois formats de la figure 6.7.

Fig 6.7 : Exemple de format instruction RISC Les instructions de cette machine sont rparties dans 4 groupes (on ne s'intresse pas aux instructions de saut call, return, goto utilisant le troisime format) : 4 D. Dragomirescu & E. Alata / INSA Toulouse

Accs mmoire : ce sont les instructions de chargement (load) ou rangement (store); Opration Registre-Registre : toutes les oprations entre les registres (calcul ou change de donne); Opration Registre-Immdiat : toutes les oprations de calcul entre un registre et une donne immdiate; Branchement : toutes les oprations de branchements conditionnels;

Le travail effectu par chaque phase est donn ci-dessous: 1. Cycle Lecture de l'instruction (LI) RI <-- Mmoire(PC); NCP <-- CP + 4; L'instruction est charge dans le registre instruction RI, puis le registre NPC est charg avec l'adresse de l'instruction suivante (l'adressage tant l'octet, nous devons ajouter 4, car l'instruction fait 4 octets). 2. Cycle du Dcodage de l'Instruction / Lecture Registre (DI) A <-- Registre(RI25..21); B <-- Registre(RI20..16); IMM <-- (RI15)16 concat RI15..0; L'unit de commande possde trois registres A, B, et IMM. A est charg avec le contenu du registre dont le numro est Rs1; B est charg avec le contenu du registre dont le numro est Rd; IMM est charg avec la donne immdiate fournie par l'instruction avec extension du bit de signe. 3. Cycle Excution / Adresse Effective (EX) L'unit arithmtique et logique travaille sur les oprandes A, B et IMM prpares lors du cycle prcdent, et suivant le type d'instruction, ralise l'une des 4 oprations suivantes (elle utilise le registre SortieUAL) :

Accs mmoire SortieUAL <-- A + IMM; Opration Registre-Registre SortieUAL <-- A op B; Le type de l'opration op est dtermine par le code opration de l'instruction. Opration Registre-Immdiat SortieUAL <-- A op IMM; Le type de l'opration op est dtermine par le code opration de l'instruction. Branchement SortieUAL <-- NCP + IMM; Cond <-- A op 0; Le registre Cond est charg par le rsultat d'une opration op entre A et 0. Le type de cette opration op est dtermine par le code opration de l'instruction.

4 Cycle d'accs mmoire et Fin de Branchement (MEM) Les seules instructions actives durant ce cycle sont les instructions de chargement (Load), de rangement (Store) ou de branchement.

Chargement DMC <-- Mmoire(SortieUAL); Rangement Mmoire(SortieUAL) <-- B; Branchement si Cond alors CP <-- SortieUAL sinon CP <-- NCP;

5 Cycle d'Ecriture du Rsultat (ER)


Opration Registre-Registre Registre(RI15..11) <-- SortieUAL; Opration Registre-Immdiat Registre(RI20..16) <-- SortieUAL; Chargement Registre(RI20..16) <-- DMC;

D. Dragomirescu & E.Alata / INSA Toulouse

On peut imaginer le chemin de donnes de la figure 6.8 . Pour excuter une instruction, il faudra de 4 5 cycles, les plus rapides tant les instructions de branchement. On peut estimer que ces instructions de branchement constituent 12% des instructions excutes dans une machine de ce type. La dure moyenne d'une instruction est donc: 12%4+88%5=4,88 cycles.

Fig 6.8 : Chemin de donnes d'une machine RISC

6.6 Pipeline de base


Comment amliorer les performances de cette machine, c'est dire diminuer le temps d'excution d'une instruction? Plusieurs solutions d'offrent nous:

on peut terminer les instructions concernant l'unit arithmtique et logique plus tt, c'est dire pendant le cycle Mem. Ces instructions reprsentant 44% des instructions excutes, cela ramne la dure moyenne d'une instruction 12%4+44%4+44%5=4,44 cycles. on peut augmenter le temps de cycle de manire faire plus d'oprations en un cycle, et la limite, n'avoir qu'un cycle pour excuter une instruction. L'inconvnient de cette approche est qu'elle supprime toute possibilit de rduire la redondance matrielle. En effet, avec une instruction s'excutant sur plusieurs cycle, on pourrait utiliser l'alu pour calculer l'adresse suivante puisque ce calcul ne se fait pas lors du mme cycle. De mme, on peut envisager d'utiliser la mme mmoire la fois pour les instructions et les donnes, puisque l aussi, elles ne sont pas utilises lors du mme cycle.

La technique la plus utilise est celle du Pipeline. Cela correspond au travail la chane entre diverses units fonctionnelles.

D. Dragomirescu & E. Alata / INSA Toulouse

6.6.1 Pipeline trois tage


Si on prend l'exemple du dcoupage de l'excution d'une instruction en trois phases indpendante (Fetch, Decode, Execute), et si chacune de ces trois phases est ralise en 1 cycle d'horloge, la mise en pipeline de ces trois units donnera le cycle d'excution suivant: lors du premier cycle, on recherche l'instruction 1; lors du deuxime cycle, on dcode l'instruction 1 et on recherche l'instruction 2; lors du troisime cycle, on excute l'instruction 1, on dcode l'instruction 2 et on recherche l'instruction 3; lors du quatrime cycle, on excute l'instruction 2, on dcode l'instruction 3 et on recherche l'instruction 4. Et ainsi de suite (Tab. ). Le temps moyen d'une instruction est ainsi divis par 3. On dit que l'on a affaire un pipeline trois tages. Le temps d'excution de n instructions est de 2+n cycles d'horloge. Le dlai de 2 cycles est appel le temps de latence du pipeline. Cycle d'horloge 1 Etage Fetch Etage Decode Etage Execute 2 3 4 5 6

inst 1 inst 2 inst 3 inst 4 inst 5 inst 6 inst 1 inst 2 inst 3 inst 4 inst 5 inst 1 inst 2 inst 3 inst 4

Tab 6.1 : Excution pipeline sur 3 tages

6.6.2 Pipeline cinq tages


Cette organisation peut tre utilise pour l'organisation de la machine RISC prcdente. Le chemin de donne de la figure 6.8 doit tre modifi pour rendre les 5 phases indpendantes. Toute information issue d'un tage et devant tre utilise dans un autre tage, doit tre mmorise dans un registre servant d'interface entre les tages (Fig 6.9).

Fig 6.9 : Chemin de donnes d'une machine RISC pipeline

D. Dragomirescu & E.Alata / INSA Toulouse

Le fonctionnement de notre structure pipeline 5 tages est indique dans la table . Cycle d'horloge 1 Etage LI Etage DI Etage EX Etage MEM Etage ER 2 3 4 5 6

inst 1 inst 2 inst 3 inst 4 inst 5 inst 6 inst 1 inst 2 inst 3 inst 4 inst 5 inst 1 inst 2 inst 3 inst 4 inst 1 inst 2 inst 3 inst 1 inst 2

Tab 6.2 : Excution pipeline sur 5 tages Ce fonctionnement idal ncessite un certain nombre d'observations. Tout d'abord, il n'est plus possible d'utiliser la mme mmoire pour les instructions et les donnes puisque ces mmoires sont maintenant utilises chaque cycle d'horloge. Par exemple, lorsque l'instruction 1 se trouve sur l'tage MEM, et donc utilise la mmoire pour les donnes, l'instruction 4 se trouve dans l'tage LI et utilise la mmoire pour les instructions. Un tel conflit est facilement lev en utilisant deux mmoires distinctes, ce qui est en gnral le cas dans de telles architectures qui possdent un cache instruction et un cache donne. Une deuxime observation du mme genre concerne l'utilisation de la mmoire registre. Dans notre excution pipeline, lorsque l'instruction 1 utilise la mmoire de registre dans l'tage ER pour l'criture du rsultat, l'instruction 4 utilise cette mme mmoire de registre, pour la lecture des registres sources dans l'tage DI. Ceci n'est pas en soi un problme si on utilise une mmoire permettant deux lectures et une criture dans le mme cycle. Cela posera un problme si l'criture concerne le mme registre accd galement en lecture. Une troisime observation peut tre faite au niveau des instructions de branchement. Entre la figure 6.8 et 6.9, on constate que le multiplexeur de slection du registre CP a t dplac de l'tage MEM l'tage LI. Cela signifie que l'excution l'tage LI peut dpendre de la prsence, dans l'tage MEM, d'une instruction de branchement, ce qui complique le fonctionnement du pipeline. D'une manire gnrale, toute information circulant, dans le chemin de donne, de droite gauche complique le fonctionnement du pipeline.

6.7 Obstacles du pipeline : les alas


On vient de voir en fait quelques alas dans le pipeline. Un ala est une situation qui empche l'instruction suivante de s'excuter au cycle d'horloge prvu. On distingue plusieurs sortes d'alas: alas structurels

D. Dragomirescu & E. Alata / INSA Toulouse

un ala structurel apparait lorsque un conflit de ressource ne peut pas tre gr par le matriel. C'est par exemple le cas de la mmoire unique pour les instructions et les donnes. Dans ce cas, le pipeline doit tre suspendu durant un cycle pour lever l'ala (on parle de bulle de pipeline). alas de donnes il apparait lorsqu'il y a des dpendances de donne entre les instructions. Par exemple, on a un ala de donne lorsque l'instruction de chargement (1) R2 := Mmoire(120) est suivie de l'instruction (2) R3 := R2+R1. En effet, l'instruction 2 a besoin de l'information produit par l'instruction 1, lorsqu'elle est sur l'tage DI. Or ce moment l, l'instruction 1 n'est que dans l'tage EX, c'est dire n'a pas encore produit de valeur. Quelque fois, pour lever un tel ala, on utilise la notion d'envoi, c'est dire le passage direct d'un rsultat l'unit fonctionnelle qui en a besoin. Dans certains cas, l'envoi n'est pas possible, par exemple s'il une interruption apparait entre deux instructions! alas de contrle il concerne les instructions de modification du registre CP. C'est le principal facteur de dgradation de performance dans une architecture pipeline. Un ala de contrle intervient par exemple aprs une instruction de branchement conditionnel. L'adresse de l'instruction suivante n'tant connu qu'au niveau de l'tage EX, on est oblig, aprs l'excution d'une instruction de branchement, de gnrer des instructions NOP le temps que l'instruction de branchement puisse se conclure. On peut rduire le cot des alas de branchement en laissant les instructions s'excuter comme si le branchement n'tait pas trait, puis on transforme ces instructions en NOP au moment o l'on est sr que le branchement doit tre fait. Un autre cas d'alas apparait lors des interruptions.

D. Dragomirescu & E.Alata / INSA Toulouse