Exercices Circuits combinatoires - séquentiels - Branchement à adresse calculée-Super ALU

Exercice 1: Circuits combinatoires

On souhaite construire un multiplexeur à 4 entrées (utilisant donc 2 bits de commande) comme illustré sur la figure ci-contre .

Question 1 donnez une implémentation de circuit à l'aide de portes logiques simples.

Question 2 on dispose désormais de multiplexeurs à 2 entrées (à un 1 bit de commande). Montrez que l'on peut construire MUX4 avec un exemplaires de MUX2 (idée : filtrer en deux étapes) .Prenez soin de bien numéroter les fils sur votre schéma.

Exercice 2: Branchement à adresse calculée

Le jeu d'instruction Y86 ne possède pas d'instruction permettant  de faire un saut inconditionnel à une adresse contenue dans un registre .c'est pourtant fort utiles .On se propose donc d'écrire une fonction jmp-eax qui effectue un saut à l'adresse contenue dans le registre %eax au moment de l'appelle .Dans le code ci-contre, les deux première lignes sont ainsi équivalentes à l'instruction  jmp label.

Question 1 pour réaliser la fonction jmp_eax, l'idée est d'utiliser l’instruction ret après avoir modifié l'adresse de retour... Donnez le code de la fonction jmp_eax.

Question 2 Expliquez calmement et soigneusement le fonctionnement du  programme ci-contre. A quoi servent les deux lignes addl %ebx, %ebx ? Quel bloc d’instructions (0,1 ou 2) sera exécuté dans cet exemple ?

Question 3 Imaginez le code C dont la compilation produirait un tel code assembleur. Quel est l'intérêt d'utiliser  une tel structure de code assembleur plutôt qu'un code correspondant à un enchainement de if...elseif...elseif...?

{sidebar id=1}

Question4 On souhaite ajouter dans le jeu d'instruction Y86 une instruction (jr %reg), effectuant un saut inconditionnel  l'adresse contenue dans le registre Opérande. Cela permettra typiquement d'utiliser jr %eax au lieu de call jmp_eax .En considérant la version pipeline du processeur. Expliquer le problème posé par cette instruction concernant la prédiction de branchement .A quel étage du pipeline connaitra-t-on avec certitude l'adresse de l'instruction suivante? Détruisez-en le nombre de cycles dans le pipeline.

Question 5 répondre aux même questions que dans Q4 dans le cas d'une instruction (jm dep1(%reg))permettant de faire un saut à une adresse chargée depuis la mémoire (e.g. jm 8(%edp)) .

Question 6 les deux séquences de code ci-après sont donc fonctionnellement équivalente .Qu'en est-il de leur performance?

Appuyez-vous sur des chronogrammes montrant la progression des instructions dans le pipeline Y86 pour chacune de deux séquences. On notera simplement OP l'instruction se trouvant à  l'adresse destinataire du branchement .Attention aux dépendances!

Question7 (indépendante de Q5 et Q6, sauf pur la définition de jump memory) La feuille jointe au sujet reproduit l'essentiel du fichier seq-std.hcl, qui décrit la version séquentielle simple de processeur Y86 .On suppose qu'on dispose du symbole supplémentaire IJM pur désigner l'instruction "Jump Memory": écrivez directement sur cette feuille les ajouts que vous proposez pour traiter cette instruction.

NB: n’oubliez pas d'inscrire votre numéro d'anonymat sur la feuille avant de l'insérer dans votre copie.

Exercice 3: Circuits séquentiels et horloge

Le circuit ci-contre est bistable D sur lequel on relié la sortie a l'entrée D. On suppose qu'initialement la sortie Q vaut 0.

Question 1:En utilisant un chronogramme s'étalant sur au moins 4 cycles d'horloge. Comparez les 2 signaux .Queconstatez-vous?

Question 2 : Déduisez-en façon de réaliser un circuit acceptant en entrée un  signal d'horloge ainsi qu'un bit de commande (0=normal, 1=slow) et fournissant en sortie soit le signal d'horloge inchangé (mode normal) soit un signal d'horloge de période deux fois plus longue (mode slow).

Question 3 :Proposez un circuit composé de deux bistables D qui permette de diviser la fréquence d'horloge par quatre (idée: pensez au compteur de Johoson). Tracez le chronogramme s'étalant sur au moins 8 cycles d'horloge.

Exercice 4: Super ALU

l'ALU du processeur Y86 , représentée ci-contre, est capable d'effectuer une opération sélectionnée parmi quatredisponibles en fonction de la valeur alufum codée sur 2 bits :00=ADD, 01=SUB,10=A11=XOR. On suppose qu'on dispose également d'un circuit similaires, nommé MULDIV, capable d'effectuer une multiplication ou une division, suivant la valeur de son signal de commande binaire:0=MUL, 1=DIV. Pour simplifier ,on considère que le résultat de ce circuit sort également sur 32bits.

Question 1:assemblez ces deux circuits en une seule (en utilisant des portes et /ou des circuits supplémentaires) ou la sélection de l'opération désirée  s'effectuera au moyen d'un signal de commande a 3 bits. Choisissez un codage des opérations (ADD, SUB, AND, XOR, MUL, DIV) simplifiant la réalisation.

Question 2: On décide donc de remplacer l'ancienne ALU par notre nouvelle Super ALU au sein de la version pipeline de Y86. Si on suppose qu'une opération MUL ou DIV a besoin de 2 cycles pour se stabiliser, expliquer ce qu'il faut faire pour que l'exécution se déroule normalement lorsque une telle opération se trouve à l'étage Execute.

Question 3:Finalement, ce n'était peut-être pas une si bonne idée d'assembler ALU et MULDIV .Si l'on avait simplementp;nbsp; juxtaposé ces deux circuits dans le processeur, on aurait pu espérer effectuer certaines opérations en parallèle. Par exemple, une instruction addl chargée juste après une instruction div1 pourrait entrer à l'étage Execute pendant le seco nd cycle d'activité du circuit MULDIV...  C'est précisément ce qui se passe dans un processeur superscalaire.les deux instructions add1 et par la suite, lors de leur passage simultané aux étages suivants(on suppose que div1se comporte de manière similaire à add1) ? Comment pourrai-on résoudre ces problèmes ?

{sidebar id=3}