| 1 | {{{ |
| 2 | #!html |
| 3 | <h1>TP2: Processeurs programmables</h1> |
| 4 | }}} |
| 5 | [[PageOutline]] |
| 6 | |
| 7 | = 1 Objectif = |
| 8 | |
| 9 | L'objectif de ce troisième TP est d'introduire des processeurs programmables dans les architectures modélisées. |
| 10 | Les initiateurs ''cablés'' utilisés dans les deux premiers TPs seront remplacés par des processeurs programmables. |
| 11 | (avec leurs caches L1 pour les données et les instructions). On utilisera des processeurs RISC 32 bits, car ce type |
| 12 | de processeur possède un excellent rendement énergétique. |
| 13 | On introduira également dans l'architecture les mémoires embarquées contenant le code binaire |
| 14 | de l'application logicielle. |
| 15 | |
| 16 | = 2 Architecture matérielle cible = |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | = 5 Travail à réaliser = |
| 24 | |
| 25 | L'archive [attachment:soclib_tp3.tgz soclib_tp2.tgz] contient différents fichiers dont vous aurez besoin pour ce TP. |
| 26 | Créez un répertoire de travail spécifique TP3, recopiez l'archive dans ce répertoire TP3, et décompressez-la: |
| 27 | {{{ |
| 28 | $ tar xzvf soclib_tp2.tgz |
| 29 | }}} |
| 30 | |
| 31 | Cette archive contient les fichiers généraux suivants, extraits de la plate-forme SoCLib : |
| 32 | * `vci_param.h` : definition des paramètres VCI. |
| 33 | * `vci_signals.h` : definition d'un canal VCI. |
| 34 | * `vci_initiator.h` : définition d'un port VCI initiateur. |
| 35 | * `vci_target.h` : définition d'un port VCI cible. |
| 36 | * `int_tab.h` : définition des index composites. |
| 37 | * `segment.h` : définition d'un segment de l'espace adressable. |
| 38 | * `segment.cpp` : implémentation des méthodes du segment. |
| 39 | * `mapping_table.h` : définition de la mapping table. |
| 40 | * `mapping_table.cpp` : implémentation des méthodes de la mapping table. |
| 41 | * `address_decoding_table.h` : table indexée par une partie de l'adresse. |
| 42 | * `address_decoding_table.cpp` : implémentation des méthodes de la table indexée. |
| 43 | * `alloc_elems.h` : allocation de tableaux d'objets complexes |
| 44 | L'archive contient également les fichiers suivants : |
| 45 | * `vci_lcd_master.h` : définition du composant `VciLcdMaster` (fichier complet) |
| 46 | * `vci_lcd_master.cpp` : méthodes associées (fichier incomplet) |
| 47 | * `vci_lcd_coprocessor.h` : définition du composant `VciLcdCoprocessor`. (fichier complet) |
| 48 | * `vci_lcd_coprocessor.cpp` : méthodes associées (fichier incomplet) |
| 49 | * `vci_vgsb.h` : définition du composant `VciVgsb`. (fichier complet) |
| 50 | * `vci_vgsb.cpp` : méthodes associées (fichier complet) |
| 51 | * `tp2_simple_top.cpp` : top-cell d'une architecture simple à deux composants (fichier incomplet) |
| 52 | |
| 53 | == 5.1 Composant ''!VciLcdCoprocessor'' == |
| 54 | |
| 55 | Le composant ''!VciLcdCoprocessor'' se comporte comme un périphérique adressable, et doit donc être |
| 56 | modélisé comme une cible VCI. Il possède un seul port de type ''!VciTarget'', et 4 registres |
| 57 | (ou pseudo-registres) implantés dans l'espace addressable, qui peuvent donc - en principe - être |
| 58 | lus ou écrits par n'importe quel initiateur du sytème. Chacun de ces registres a une largeur de 4 octets. |
| 59 | Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une taille de `4*4` = 16 octets. |
| 60 | |
| 61 | Pour simplifier le décodage des adresses, on impose la contrainte que l'adresse de base de ce segment est |
| 62 | un multiple de sa longueur (on dit que le segment est ''aligné''). |
| 63 | La carte d'implantation des registres est définit comme suit : |
| 64 | |
| 65 | || '''Nom du registre''' || '''Offset''' || '''Mode''' || |
| 66 | || r_opa || 0x0 || Write Only || |
| 67 | || r_opb || 0x4 || Write Only || |
| 68 | || r_start || 0x8 || Write Only || |
| 69 | || r_res || 0xc || Read Only || |
| 70 | |
| 71 | Attention : Il n'existe pas réellement de registre ''r_start'' dans le composant matériel. |
| 72 | Lorsque le composant ''!VciLcdCoprocessor'' reçoit une commande d'écriture à l'adresse |
| 73 | correspondant à l'adresse de ''r_start'', la donnée WDATA correspondante n'est écrite nulle part, |
| 74 | mais la commande est interprêtée par le coprocesseur comme un ordre de démarrage du calcul. |
| 75 | |
| 76 | Une erreur est signalée si le coprocesseur reçoit une commande de longueur supérieure à un mot, |
| 77 | ou si l'adresse reçue n'appartient pas au segment qui a été défini pour le coprocesseur, |
| 78 | ou si le mode d'accès (Read ou Write) ne respecte pas les contraintes ci-dessus. |
| 79 | |
| 80 | Question : comment sont traitées les erreurs dans ce modèle de simulation? à quoi servent ces vérifications ? |
| 81 | |
| 82 | La figure ci-dessous décrit la structure de l'automate de contrôle du composant `VciLcdCoprocessor`. |
| 83 | |
| 84 | [[Image(soclib_tp2_coprocessor.png)]] |
| 85 | |
| 86 | Le fichier `vci_lcd_coprocessor.h` contient une définition complête du composant `VciLcdCoprocessor`. |
| 87 | Il n'a pas besoin d'être modifié, mais vous aurez besoin de le lire attentivement pour modifier |
| 88 | le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplête des méthodes associées à ce composant. |
| 89 | Complétez le code des méthodes `transition()` et `genMoore()`. |
| 90 | |
| 91 | == 5.2 Composant ''!VciLcdMaster'' == |
| 92 | |
| 93 | Le composant `VciLcdMaster` est un initiateur VCI, qui exécute une boucle infinie dans laquelle il exécute |
| 94 | successivement les 6 actions suivantes: |
| 95 | 1. calcul de deux valeurs aléatoires (entiers positifs codés sur 32 bits) |
| 96 | 1. écriture de l'opérande OPA dans le registre `r_opa` du coprocesseur LCD. |
| 97 | 1. écriture de l'opérande OPB dans le registre `r_opb` du coprocesseur LCD. |
| 98 | 1. écriture dans le pseudo-registre `r_start` du coprocesseur LCD. |
| 99 | 1. lecture du résultat dans le registre `r_res` du coprocesseur LCD. |
| 100 | 1. affichage des résultats. |
| 101 | |
| 102 | Pour accéder au coprocesseur LCD, le composant a besoin de l'adresse de base du |
| 103 | segment de l'espace adressable aui a été assigné au coprocesseur LCD. |
| 104 | Le composant ''!VciLcdMaster'' étant un automate cablé (non programmable), on considère |
| 105 | que cette adresse est également "câblée". Elle est donc définie comme un paramètre du constructeur. |
| 106 | |
| 107 | La figure ci-dessous décrit la structure de l'automate de contrôle du composant ''!VciLcdMaster''. |
| 108 | |
| 109 | [[Image(soclib_tp2_master.png)]] |
| 110 | |
| 111 | Chaque transaction VCI nécessite deux états dans l'automate: un premier état pour envoyer la commande |
| 112 | (on reste dans cet état tant qu'on a pas reçu confirmation que la commande a été acceptée), et un second état |
| 113 | dans lequel on attend la réponse (on reste dans cet état tant qu'on a pas reçu une réponse valide). |
| 114 | |
| 115 | Le fichier `vci_lcd_coprocessor.h` contient une description complète du composant `!VciLcdMaster`. |
| 116 | Il n'a pas besoin d'être modifié, mais vous devez le lire attentivement pour modifier |
| 117 | le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplète des méthodes associées à ce composant. |
| 118 | Complétez le code des méthodes `transition()` et `genMoore()`. |
| 119 | |
| 120 | == 5.3 Architecture minimale == |
| 121 | |
| 122 | Pour valider les modèles de simulation des composants `VciLcdMaster` et `VciLcdCoprocessor`, |
| 123 | on construit une architecture minimale ne contenant que deux composants matériels, conformément au schéma ci-dessous : |
| 124 | |
| 125 | [[Image(soclib_tp2_simple_archi.png)]] |
| 126 | |
| 127 | En vous inspirant de ce que vous avez fait dans le TP1, complétez le fichier ''tp2_simple_top.cpp'' qui vous est fourni, |
| 128 | en précisant : |
| 129 | * les caractéristiques du segment mémoire associé au coprocesseur LCD. |
| 130 | * les valeurs des paramètres VCI (largeurs des champs) dans l'objet `vci_param`. |
| 131 | * les valeurs des arguments des constructeurs des deux composants. |
| 132 | On prendra pour valeurs des paramètres VCI les valeurs définies en commentaire dans le fichier ''tp2_simple_top.cpp''. |
| 133 | |
| 134 | == 5.4 Compilation et génération du simulateur == |
| 135 | |
| 136 | Il faut ensuite compiler les différents fichiers pour générer le simulateur. |
| 137 | On va utiliser la même méthode que dans le TP1, mais il y a une difficulté supplémentaire, à cause |
| 138 | du paramètre template `vci_param` des composants `VciLcdMaster`, `VciLcdCoprocessor`. |
| 139 | Dans un contexte de compilation séparée, il est nécessaire de définir explicitement la valeur de ce paramètre |
| 140 | dans chacun des fichiers source avant de lancer la génération du fichier objet associé. |
| 141 | Pour cela, il faut rajouter la ligne suivante à la fin des fichiers `vci_lcd_master.cpp` et `vci_lcd_coprocessor.cpp` : |
| 142 | {{{ |
| 143 | template class VciLcdMaster<soclib::caba::VciParams<4, 8, 32, 1, 1, 1, 12, 1, 1, 1> >; |
| 144 | }}} |
| 145 | (pensez à changer le nom de la classe pour `vci_lcd_coprocessor.cpp`. |
| 146 | |
| 147 | Ceci étant fait, écrivez le Makefile permettant la génération du fichier exécutable `simple_simulator.x`. |
| 148 | N'oubliez pas d'inclure dans la liste des fichiers objets les fichiers `mapping_table.o`, `segment.o`, `address_decoding_table.o`, |
| 149 | `address_masking_table.o` (en plus des fichiers objet correspondant aux deux composants matériels |
| 150 | |
| 151 | Le lancement du simulateur doit vous fournir la même trace d'exécution que celle que obtenue dans le TP1, puisque |
| 152 | les calculs effectués sont les mêmes (seul le protocole de communication a changé. |
| 153 | |
| 154 | == 5.5 Architecture multi-maitres == |
| 155 | |
| 156 | L' architecture interne du composant `VciVgsb` est décrite dans la figure ci-dessous. |
| 157 | Le `bus` des commandes VCI, et le `bus` des réponses VCI sont modélisés par des multiplexeurs. Ces multiplexeurs sont |
| 158 | commandés par un automate à trois états qui réalise une priorité tournante entre les initiateurs. |
| 159 | Comme vous pouvez le constater sur le schéma, ce composant se comporte comme un automate de Mealy, |
| 160 | puisque - une fois le bus alloué à un initiateur - les signaux de sortie dépendent combinatorement des signaux d'entrée. |
| 161 | La latence minimale d'une transaction rafale de N mots VCI est de (N+1) cycles, dans le cas où la cible répond immédiatement. |
| 162 | Du point de vue latence et bande passante, ce composant se comporte comme le PIbus. |
| 163 | |
| 164 | [[Image(soclib_tp2_bus.png)]] |
| 165 | |
| 166 | En vous inspirant du fichier `tp2_simple_top.cpp` de la question précédente, écrivez le fichier `tp2_multi_top.cpp`, |
| 167 | qui décrit l'architecture à 7 composants décrite au début de ce TP. Vous ferez en sorte que le maitre (i) communique |
| 168 | avec le coprocesseur (i). N'oubliez pas de définir 3 segments différents pour les trois coprocesseurs. |
| 169 | |
| 170 | Il faut également ajouter à la fin du fichier `vci_vgsb.cpp` la ligne permettant de définir la valeur du paramètre template |
| 171 | `vci_param` : |
| 172 | {{{ |
| 173 | template class VciVgsb<soclib::caba::VciParams<4, 8, 32, 1, 1, 1, 12, 1, 1, 1> >; |
| 174 | }}} |
| 175 | |
| 176 | Modifiez le Makefile pour générer le fichier exécutable `multi_simulator.x`, en n'oubliant pas d'inclure le fichier `vci_vgsb.o` |
| 177 | dans l'ensemble des fichiers objet. |
| 178 | Le lancement du simulateur doit vous fournir une trace d'exécution qui entrelace les compte-rendus des trois initiateurs |
| 179 | qui s'exécutent en parallèle. Chaque initiateur commande un seul coprocesseur, et la seule ressource partagée est le |
| 180 | bus de communication. |
| 181 | |
| 182 | = 6 Compte-rendu = |
| 183 | |
| 184 | Il ne vous est pas demandé de compte-rendu pour ce TP, mais on vous demandera une démonstration de votre simulateur au début du TP de la semaine suivante... |