Changes between Version 18 and Version 19 of SoclibCourseTp2
- Timestamp:
- Sep 9, 2009, 3:39:00 PM (16 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SoclibCourseTp2
v18 v19 18 18 L'architecture matérielle qu'on souhaite prototyper dans ce second TP instancie 7 composants matériels de 19 19 trois types différents : 20 Les deux composants ''!VciLcdCoprocessor'' et ''!VciLcdMaster'' sont instanciés trois fois chacun. Ils ont des fonctionnalités identiques à celles des composants utilisés dans le premier TP, mais ces composants possèdent maintenant des ports de communication qui respectent le protocole VCI/OCP. Le composant ''!VciLcdMaster'' se comporte comme un initiateur, et le composant ''!VciLcdCoprocesseur'' se comporte come une cible. Le troisième composant ''!VciVg bs'' (Virtual Generic System Bus) est un composant matériel modélisant un bus multi-maîtres, multi-cibles respectant le protocole VCI/OCP.20 Les deux composants ''!VciLcdCoprocessor'' et ''!VciLcdMaster'' sont instanciés trois fois chacun. Ils ont des fonctionnalités identiques à celles des composants utilisés dans le premier TP, mais ces composants possèdent maintenant des ports de communication qui respectent le protocole VCI/OCP. Le composant ''!VciLcdMaster'' se comporte comme un initiateur, et le composant ''!VciLcdCoprocesseur'' se comporte come une cible. Le troisième composant ''!VciVgsb'' (Virtual Generic System Bus) est un composant matériel modélisant un bus multi-maîtres, multi-cibles respectant le protocole VCI/OCP. 21 21 22 22 [[Image(soclib_tp2_archi.png)]] … … 39 39 Dans la spécification VCI "advanced", il y a principalement deux types de commandes : 40 40 * transaction CMD_WRITE : le paquet commande contient un ou plusieurs mots VCI (à des adresses constantes ou consécutives) Le paquet réponse contient un seul mot VCI pour acquitter la transaction. 41 * transaction CMD_READ : le paquet commande contient un seul mot VCI (à l'adresse du premier mot VCIde la rafale) et le nombre de mots à lire est défini par le champs PLEN. Le paquet réponse contient un ou plusieurs mots VCI suivant la 42 longueur de la rafale. 41 * transaction CMD_READ : le paquet commande contient un seul mot VCI (à l'adresse du premier mot VCI de la rafale) et le nombre d'octets à lire est défini par le champs PLEN. Le paquet réponse contient un ou plusieurs mots VCI suivant la longueur de la rafale. 43 42 44 43 '''Question''' : à quoi sert le paquet réponse dans le cas d'une transaction d'écriture ? … … 47 46 La cible est désignée par les bits de poids fort de l'adresse. Le champs VCI ADDRESS doit donc être décodé 48 47 par le (ou les) composant(s) matériel(s) qui réalise(nt) le sous-sytème d'interconnexion, pour aiguiller 49 le paquet commande vers sa destination. De façon sym ètrique, le sous-système d'interconnexion doit48 le paquet commande vers sa destination. De façon symétrique, le sous-système d'interconnexion doit 50 49 décoder le champs VCI RSRCID pour aiguiller le paquet réponse vers l'initiateur concerné. 51 50 … … 65 64 66 65 La plupart des champs VCI on des largeurs paramètrables (en nombre de bits) : 67 * le paramètre Xdéfinit le nombre de bits du champs ADDRESS. Les adresses VCI sont des adresses octets, mais elles doivent être alignées sur des frontières de mot.66 * le paramètre '''X''' définit le nombre de bits du champs ADDRESS. Les adresses VCI sont des adresses octets, mais elles doivent être alignées sur des frontières de mot. 68 67 * le paramètre '''B''' définit le nombre d'octets d'un mot de donnée VCI. Ce paramètre définit le largeur des trois champs WDATA, RDATA et BE. 69 * le paramètre '''K''' définit le nombres de bits termettant de coder la longueur PLEN d'un paquet (en nombre d'octets). La valeur PLEN doit également être un multiple du paramètre B.68 * le paramètre '''K''' définit le nombres de bits termettant de coder la longueur PLEN d'un paquet (en nombre d'octets). Nous n'utiliserons que des valeurs de PLEN multiples du paramètre '''B'''. 70 69 * le paramètre '''S''' définit le nombre de bits du champs SRCID, qui permet de coder le numéro de l'initiateur VCI qui a démarré la transaction. Ce paramètre définit donc le nombre maximum d'initiateurs dans le système. 71 * Le paramètre '''E''' définit le nombre de bits permettant de coder le type d'erreur dans le champs RERROR du paquet commande. La valeur 0signifie "pas d'erreur".70 * Le paramètre '''E''' définit le nombre de bits permettant de coder le type d'erreur dans le champs RERROR du paquet commande. `RERROR = 0` signifie "pas d'erreur". 72 71 * Les deux paramètres '''T''' et '''P''' définissent le nombre de bits des deux champs TRDID et PKTID. Ces deux champs permettent d'étiqueter une commande VCI par une numéro de thread et/ou par un numéro de transaction. Ils peuvent être utilisés par un initiateur pour envoyer une commande (n+1) sans attendre d'avoir reçu la réponse à la commande (n). 73 72 … … 80 79 Mais elle crée une difficulté pour la modélisation des composants matériels, puisqu'il faut écrire des modèles de 81 80 simulation génériques, capable de s'adapter à différentes largeurs des champs adresse ou donnée. 82 On utilise pour cela la techique des ''templates'' du langage C++ : on regroupe toutes les valeurs de ces paramêtres dans un oblet C++ de type ''VciParams'', qui est utilisé comme paramètre ''template'' par tous les composants matériels qui possèdent des ports de communication VCI.81 On utilise pour cela la techique des ''templates'' du langage C++ : on regroupe toutes les valeurs de ces paramêtres dans un oblet C++ de type `VciParams`, qui est utilisé comme paramètre ''template'' par tous les composants matériels qui possèdent des ports de communication VCI. 83 82 (voir fichier ''vci_param.h''). 84 83 85 84 Comme on l'a fait pour le canal de communication FIFO, on définit trois objets, qui facilitent l'écriture des modèles de simulation CABA : 86 * l'objet ''VciSignals''regroupe tous les signaux (commande et réponse) d'un canal VCI. (voir fichier ''vci_signals.h'')87 * l'objet ''VciInitiator''regroupe tous les ports utilisés par un initiateur VCI pour émettre une commande, et recevoir la réponse. (voir fichier ''vci_initiator.h'')88 * l'objet ''VciTarget''regroupe tous les ports utilisés par une cible VCI pour émettre une réponse, et recevoir une commande. (voir fichier ''vci_target.h'')89 Ces trois objets possèdent évidemment un paramètre template de type ''VciParams''.85 * l'objet `VciSignals` regroupe tous les signaux (commande et réponse) d'un canal VCI. (voir fichier ''vci_signals.h'') 86 * l'objet `VciInitiator` regroupe tous les ports utilisés par un initiateur VCI pour émettre une commande, et recevoir la réponse. (voir fichier ''vci_initiator.h'') 87 * l'objet `VciTarget` regroupe tous les ports utilisés par une cible VCI pour émettre une réponse, et recevoir une commande. (voir fichier ''vci_target.h'') 88 Ces trois objets possèdent évidemment un paramètre template de type `VciParams`. 90 89 91 90 = 4 Outillage logiciel = … … 96 95 == 4.1 Indexation des composants VCI == 97 96 98 On assigne à tout composant matériel possédant un port VCI (composant ''cibleou composant ''initiateur'') un index permettant de l'identifier de façon unique. Cet index peut être éventuellement structuré (on parle d'index composite) si l'architecture est structurée ''clusters''. Un index composite est la concaténation d'un index global (le numéro de cluster) et d'un index local (à l'intérieur d'un cluster).97 On assigne à tout composant matériel possédant un port VCI (composant ''cible'' ou composant ''initiateur'') un index permettant de l'identifier de façon unique. Cet index peut être éventuellement structuré (on parle d'index composite) si l'architecture est structurée ''clusters''. Un index composite est la concaténation d'un index global (le numéro de cluster) et d'un index local (à l'intérieur d'un cluster). 99 98 100 99 La plate-forme SoCLib définit la classe C++ ''!IntTab'' pour représenter ces index composites. (voir fichier ''int_tab.h''). … … 104 103 105 104 Dans une architecture à mémoire partagée, on assigne à tout composant ''cible'' un (ou plusieurs) segment(s) dans l'espace adressable. 106 Un segment est une ''tranche "de l'espace adressable. Il possède donc une adresse de base, et une taille (en nombre d'octets). La taille d'un105 Un segment est une ''tranche'' de l'espace adressable. Il possède donc une adresse de base, et une taille (en nombre d'octets). La taille d'un 107 106 segment peut être très variable : de quelques d'octets pour un périphériques adressable, à quelques Moctets pour un contrôleur mémoire. 108 107 C'est en analysant les bits de poids fort de l'adresse que le sous-système d'interconnexion détermine à quel segment appartient l'adresse, … … 145 144 146 145 Cette archive contient les fichiers généraux suivants, extraits de la plate-forme SoCLib : 147 * ''vci_param.h'': definition des paramètres VCI.148 * ''vci_signals.h'': definition d'un canal VCI.149 * ''vci_initiator.h'': définition d'un port VCI initiateur.150 * ''vci_target.h'': définition d'un port VCI cible.151 * ''int_tab.h'': définition des index composites.152 * ''segment.h'': définition d'un segment de l'espace adressable.153 * ''segment.cpp'': implémentation des méthodes du segment.154 * ''mapping_table.h'': définition de la mapping table.155 * ''mapping_table.cpp'': implémentation des méthodes de la mapping table.156 * ''address_decoding_table.h'': table indexée par une partie de l'adresse.157 * ''address_decoding_table.cpp'': implémentation des méthodes de la table indexée.158 * ''alloc_elems.h": allocation de tableaux d'objets complexes146 * `vci_param.h` : definition des paramètres VCI. 147 * `vci_signals.h` : definition d'un canal VCI. 148 * `vci_initiator.h` : définition d'un port VCI initiateur. 149 * `vci_target.h` : définition d'un port VCI cible. 150 * `int_tab.h` : définition des index composites. 151 * `segment.h` : définition d'un segment de l'espace adressable. 152 * `segment.cpp` : implémentation des méthodes du segment. 153 * `mapping_table.h` : définition de la mapping table. 154 * `mapping_table.cpp` : implémentation des méthodes de la mapping table. 155 * `address_decoding_table.h` : table indexée par une partie de l'adresse. 156 * `address_decoding_table.cpp` : implémentation des méthodes de la table indexée. 157 * `alloc_elems.h` : allocation de tableaux d'objets complexes 159 158 L'archive contient également les fichiers suivants : 160 * ''vci_lcd_master.h'' : définition du composant ''!VciLcdMaster''(fichier complet)161 * ''vci_lcd_master.cpp'': méthodes associées (fichier incomplet)162 * ''vci_lcd_coprocessor.h'' : définition du composant ''!VciLcdCoprocessor''. (fichier complet)163 * ''vci_lcd_coprocessor.cpp'': méthodes associées (fichier incomplet)164 * ''vci_gsb.h'' : définition du composant ''!VciGsb''. (fichier complet)165 * ''vci_gsb.cpp'': méthodes associées (fichier complet)166 * ''tp2_simple_top.cpp'': top-cell d'une architecture simple à deux composants (fichier incomplet)167 168 == 5.1 Composant ''!VciLcdCoprocessor ==159 * `vci_lcd_master.h` : définition du composant `VciLcdMaster` (fichier complet) 160 * `vci_lcd_master.cpp` : méthodes associées (fichier incomplet) 161 * `vci_lcd_coprocessor.h` : définition du composant `VciLcdCoprocessor`. (fichier complet) 162 * `vci_lcd_coprocessor.cpp` : méthodes associées (fichier incomplet) 163 * `vci_vgsb.h` : définition du composant `VciVgsb`. (fichier complet) 164 * `vci_vgsb.cpp` : méthodes associées (fichier complet) 165 * `tp2_simple_top.cpp` : top-cell d'une architecture simple à deux composants (fichier incomplet) 166 167 == 5.1 Composant ''!VciLcdCoprocessor'' == 169 168 170 169 Le composant ''!VciLcdCoprocessor'' se comporte comme un périphérique adressable, et doit donc être … … 172 171 (ou pseudo-registres) implantés dans l'espace addressable, qui peuvent donc - en principe - être 173 172 lus ou écrits par n'importe quel initiateur du sytème. Chacun de ces registres a une largeur de 4 octets. 174 Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une taille de 4*4 = 16octets.173 Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une taille de `4*4` = 16 octets. 175 174 176 175 Pour simplifier le décodage des adresses, on impose la contrainte que l'adresse de base de ce segment est … … 195 194 Question : comment sont traitées les erreurs dans ce modèle de simulation? à quoi servent ces vérifications ? 196 195 197 La figure ci-dessous décrit la structure de l'automate de contrôle du composant ''!VciLcdCoprocessor''.196 La figure ci-dessous décrit la structure de l'automate de contrôle du composant `VciLcdCoprocessor`. 198 197 199 198 [[Image(soclib_tp2_coprocessor.png)]] 200 199 201 Le fichier ''vci_lcd_coprocessor.h'' contient une définition complête du composant ''!VciLcdCoprocessor''.200 Le fichier `vci_lcd_coprocessor.h` contient une définition complête du composant `VciLcdCoprocessor`. 202 201 Il n'a pas besoin d'être modifié, mais vous aurez besoin de le lire attentivement pour modifier 203 le fichier ''vci_lcd_coprocessor.cpp'', qui contient une description incomplête des méthodes associées à ce composant.204 Compl êtez le code des méthodes ''transition()'' et ''genMoore()''.202 le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplête des méthodes associées à ce composant. 203 Complétez le code des méthodes `transition()` et `genMoore()`. 205 204 206 205 == 5.2 Composant ''!VciLcdMaster'' == 207 206 208 Le composant ''!VciLcdMaster''est un initiateur VCI, qui exécute une boucle infinie dans laquelle il exécute207 Le composant `VciLcdMaster` est un initiateur VCI, qui exécute une boucle infinie dans laquelle il exécute 209 208 successivement les 6 actions suivantes: 210 209 1. calcul de deux valeurs aléatoires (entiers positifs codés sur 32 bits) 211 1. écriture de l'opérande OPA dans le registre ''r_opa''du coprocesseur LCD.212 1. écriture de l'opérande OPB dans le registre ''r_opb''du coprocesseur LCD.213 1. écriture dans le pseudo-registre ''r_start''du coprocesseur LCD.214 1. lecture du résultat dans le registre ''r_res''du coprocesseur LCD.210 1. écriture de l'opérande OPA dans le registre `r_opa` du coprocesseur LCD. 211 1. écriture de l'opérande OPB dans le registre `r_opb` du coprocesseur LCD. 212 1. écriture dans le pseudo-registre `r_start` du coprocesseur LCD. 213 1. lecture du résultat dans le registre `r_res` du coprocesseur LCD. 215 214 1. affichage des résultats. 216 215 … … 218 217 segment de l'espace adressable aui a été assigné au coprocesseur LCD. 219 218 Le composant ''!VciLcdMaster'' étant un automate cablé (non programmable), on considère 220 que cette adresse est également "c ablée". Elle est donc définie comme un paramètre du constructeur.219 que cette adresse est également "câblée". Elle est donc définie comme un paramètre du constructeur. 221 220 222 221 La figure ci-dessous décrit la structure de l'automate de contrôle du composant ''!VciLcdMaster''. … … 228 227 dans lequel on attend la réponse (on reste dans cet état tant qu'on a pas reçu une réponse valide). 229 228 230 Le fichier ''vci_lcd_coprocessor.h'' contient une description complête du composant ''!VciLcdMaster''.229 Le fichier `vci_lcd_coprocessor.h` contient une description complète du composant `!VciLcdMaster`. 231 230 Il n'a pas besoin d'être modifié, mais vous devez le lire attentivement pour modifier 232 le fichier ''vci_lcd_coprocessor.cpp'', qui contient une description incomplête des méthodes associées à ce composant.233 Compl êtez le code des méthodes ''transition()'' et ''genMoore()''.231 le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplète des méthodes associées à ce composant. 232 Complétez le code des méthodes `transition()` et `genMoore()`. 234 233 235 234 == 5.3 Architecture minimale == 236 235 237 Pour valider les modèles de simulation des composants ''!VciLcdMaster'' et ''!VciLcdCoprocessor'',236 Pour valider les modèles de simulation des composants `VciLcdMaster` et `VciLcdCoprocessor`, 238 237 on construit une architecture minimale ne contenant que deux composants matériels, conformément au schéma ci-dessous : 239 238 … … 243 242 en précisant : 244 243 * les caractéristiques du segment mémoire associé au coprocesseur LCD. 245 * les valeurs des paramètres VCI (largeurs des champs) dans l'objet vci_param.244 * les valeurs des paramètres VCI (largeurs des champs) dans l'objet `vci_param`. 246 245 * les valeurs des arguments des constructeurs des deux composants. 247 246 On prendra pour valeurs des paramètres VCI les valeurs définies en commentaire dans le fichier ''tp2_simple_top.cpp''. … … 251 250 Il faut ensuite compiler les différents fichiers pour générer le simulateur. 252 251 On va utiliser la même méthode que dans le TP1, mais il y a une difficulté supplémentaire, à cause 253 du paramètre template ''vci_param'' des composants''!VciLcdMaster'', ''!VciLcdCoprocessor''.252 du paramètre template `vci_param` des composants `VciLcdMaster`, `VciLcdCoprocessor`. 254 253 Dans un contexte de compilation séparée, il est nécessaire de définir explicitement la valeur de ce paramètre 255 254 dans chacun des fichiers source avant de lancer la génération du fichier objet associé. 256 Pour cela, il faut rajouter la ligne suivante à la fin d u fichier ''vci_lcd_master.cpp'':255 Pour cela, il faut rajouter la ligne suivante à la fin des fichiers `vci_lcd_master.cpp` et `vci_lcd_coprocessor.cpp` : 257 256 {{{ 258 257 template class VciLcdMaster<soclib::caba::VciParams<4, 8, 32, 1, 1, 1, 12, 1, 1, 1> >; 259 258 }}} 260 Il faut évidemment modifier également le fichier ''vci_lcd_coprocessor.cpp''.261 262 Ceci étant fait, écrivez le Makefile permettant la génération du fichier exécutable ''simple_simulator.x''.263 N'oubliez pas d'inclure dans la liste des fichiers objets les fichiers ''mapping_table.o'', ''segment.o'', ''address_decoding_table.o'',264 ''address_masking_table.o''(en plus des fichiers objet correspondant aux deux composants matériels259 (pensez à changer le nom de la classe pour `vci_lcd_coprocessor.cpp`. 260 261 Ceci étant fait, écrivez le Makefile permettant la génération du fichier exécutable `simple_simulator.x`. 262 N'oubliez pas d'inclure dans la liste des fichiers objets les fichiers `mapping_table.o`, `segment.o`, `address_decoding_table.o`, 263 `address_masking_table.o` (en plus des fichiers objet correspondant aux deux composants matériels 265 264 266 265 Le lancement du simulateur doit vous fournir la même trace d'exécution que celle que obtenue dans le TP1, puisque … … 269 268 == 5.5 Architecture multi-maitres == 270 269 271 L' architecture interne du composant ''!VciVgsb''est décrite dans la figure ci-dessous.272 Le ''bus'' des commandes VCI, et le ''bus''des réponses VCI sont modélisés par des multiplexeurs. Ces multiplexeurs sont270 L' architecture interne du composant `VciVgsb` est décrite dans la figure ci-dessous. 271 Le `bus` des commandes VCI, et le `bus` des réponses VCI sont modélisés par des multiplexeurs. Ces multiplexeurs sont 273 272 commandés par un automate à trois états qui réalise une priorité tournante entre les initiateurs. 274 273 Comme vous pouvez le constater sur le schéma, ce composant se comporte comme un automate de Mealy, … … 279 278 [[Image(soclib_tp2_bus.png)]] 280 279 281 En vous inspirant du fichier ''tp2_simple_top.cpp'' de la question précédente, écrivez le fichier ''tp2_multi_top.cpp'',280 En vous inspirant du fichier `tp2_simple_top.cpp` de la question précédente, écrivez le fichier `tp2_multi_top.cpp`, 282 281 qui décrit l'architecture à 7 composants décrite au début de ce TP. Vous ferez en sorte que le maitre (i) communique 283 282 avec le coprocesseur (i). N'oubliez pas de définir 3 segments différents pour les trois coprocesseurs. 284 283 285 Il faut également ajouter à la fin du fichier ''vci_vgsb.cpp''la ligne permettant de définir la valeur du paramètre template286 ''vci_param'':284 Il faut également ajouter à la fin du fichier `vci_vgsb.cpp` la ligne permettant de définir la valeur du paramètre template 285 `vci_param` : 287 286 {{{ 288 287 template class VciVgsb<soclib::caba::VciParams<4, 8, 32, 1, 1, 1, 12, 1, 1, 1> >; 289 288 }}} 290 289 291 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''290 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` 292 291 dans l'ensemble des fichiers objet. 293 292 Le lancement du simulateur doit vous fournir une trace d'exécution qui entrelace les compte-rendus des trois initiateurs