Changes between Version 28 and Version 29 of SoclibCourseTp2
- Timestamp:
- Nov 28, 2010, 2:30:44 PM (15 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SoclibCourseTp2
v28 v29 16 16 = 2 Architecture matérielle cible = 17 17 18 L'architecture matérielle qu'on souhaite prototyper dans ce second TP instancie 7 composants matériels de19 trois types différents : 20 Les deux composants ''!VciGcdCoprocessor'' et ''!VciGcdMaster'' 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 ''!VciGcdMaster'' se comporte comme un initiateur, et le composant ''!VciGcdCoprocesseur'' 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.18 L'architecture matérielle qu'on souhaite prototyper dans ce second TP instancie trois composants matériels : 19 Les deux composants ''!VciGcdCoprocessor'' et ''!VciGcdMaster'' 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. A la différence du protocole FIFO, le protocole VCI introduit une dissymétrie entre les initiateurs et les cibles : Le composant ''!VciGcdMaster'' se comporte comme un initiateur, et contrôle non seulement le chargement des données 20 vers le le composant ''!VciGcdCoprocesseur'' cible, mais contrôle également la récupération du résultat. 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)]] … … 31 31 32 32 Le protocol de communication VCI permet de construire des architectures matérielles multi-processeurs à memoire 33 partagée. Dans ce type de d'architecture, les différents composants matériels utilisent des transactions pour communiquer entre eux. Une transaction est un couple (paquet commande / paquet réponse). 33 partagée. Dans ce type de d'architecture, les différents composants matériels utilisent des transactions pour communiquer entre eux. 34 35 Terminologie : 36 * un ''flit'' est l'information qui peut être transférée en un seul cycle sur un interface VCI. 37 * un ''paquet'' est une séquence de flits qui sont transmis de façon atomique à travers le réseau d'interconnexion. 38 * une ''transaction'' est un couple (paquet commande / paquet réponse) 39 34 40 Une transaction est initiée par un composant ''initiateur'', qui envoie un paquet ''commande'', et est terminée par 35 41 un composant cible, qui répond à la commande en renvoyant un paquet ''réponse''. … … 38 44 39 45 Dans la spécification VCI "advanced", il y a principalement deux types de commandes : 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 VCIpour acquitter la transaction.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 VCIsuivant la longueur de la rafale.46 * transaction CMD_WRITE : le paquet commande contient un ou plusieurs flit (à des adresses constantes ou consécutives). Le paquet réponse contient un seul flit pour acquitter la transaction. 47 * transaction CMD_READ : le paquet commande contient un seul flit (à l'adresse du premier octet) et le nombre d'octets à lire est défini par le champs PLEN. Le paquet réponse contient un ou plusieurs flits suivant la longueur de la rafale. 42 48 43 49 '''Question''' : à quoi sert le paquet réponse dans le cas d'une transaction d'écriture ? … … 95 101 == 4.1 Indexation des composants VCI == 96 102 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).103 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 en ''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). 98 104 99 105 La plate-forme SoCLib définit la classe C++ ''!IntTab'' pour représenter ces index composites. (voir fichier ''int_tab.h''). … … 104 110 Dans une architecture à mémoire partagée, on assigne à tout composant ''cible'' un (ou plusieurs) segment(s) dans l'espace adressable. 105 111 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 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.112 segment peut être très variable : de quelques dizaines d'octets pour un périphériques adressable, à quelques Moctets pour un contrôleur mémoire. 107 113 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, 108 114 et donc vers quelle cible un paquet commande doit être aiguillé. Le découpage de l'espace adressable en segments et l'assignation de ces 109 115 segments aux différentes cibles est donc un caractéristique globale de l'architecture, et doit donc être définie dans la ''top-cell'' décrivant l'architecture générale du système. 110 116 111 La plate-forme SoCLib définit la classe C++ ''!MappingTable'' permettant de centraliser dans un même objet toutes112 les informations concernant la segmentation de l'espace addressable, et la correspondance entre les cible VCI (identifiées par leurindex),113 et les segments. (voir fichiers ''mapping_table.h'' et ''segment.h'').114 115 Un segment est caractérisé par 5 informations :117 La plate-forme SoCLib définit la classe C++ ''!MappingTable'' permettant de centraliser dans un même objet logiciel toutes 118 les informations concernant la segmentation de l'espace addressable, et la correspondance entre une cible VCI (identifiées par son index), 119 et un segment. (voir fichiers ''mapping_table.h'' et ''segment.h''). 120 121 Un segment est un objet caractérisé par 5 informations : 116 122 * un nom 117 123 * une adresse de base … … 122 128 Pour plus de détails, vous pouvez consulter le site WEB du projet SoCLib : [https://www.soclib.fr/trac/dev/wiki/Component/MappingTable]. 123 129 124 == 4.3 Décodage des champs ADDRESS et SRCID == 125 126 Dans une architecture à mémoire partagée, l'adresse VCI est décodée à différents endroits : 127 les bits de poids faibles sont décodés par les périphériques adressables pour déterminer l'action à réaliser, et les bits de poids fort sont décodés par le sous-système d'interconnexion pour déterminer l'index de la cible concernée. Pour faciliter ce décodage, la plate-forme SoCLib définit les classe C++ ''!AddressDecodingTable'' (voir fichier ''address_decoding_table.h'') et 130 == 4.3 Décodage de l'adresse == 131 132 Le champs ADDRESS de la commande VCI est décodé à deux endroits : 133 * les bits de poids faibles sont décodés par les périphériques adressables pour déterminer l'action à réaliser. 134 * les bits de poids fort sont décodés par le sous-système d'interconnexion pour déterminer l'index de la cible et router le paquet commande vers la cible concernée. 135 Pour faciliter ce décodage, la plate-forme SoCLib définit les classe C++ ''!AddressDecodingTable'' (voir fichier ''address_decoding_table.h'') et 128 136 ''!AddressMaskingTable'' (voir fichier ''address_masking_table.h'') 129 137 130 138 == 4.4 Allocation de tableaux == 131 139 132 On a parfois besoin d'utiliser des tableaux d'objets complexes. Par exemple, le composant ''!VciVgsb'' possède un nombre variable140 On a parfois besoin d'utiliser des tableaux d'objets complexes. Par exemple, le composant générique ''!VciVgsb'' possède un nombre variable 133 141 de ports VCI initiateur, et un nombre variable de ports VCI cibles. Ces ports sont donc définis comme des tableaux de ports. Pour 134 142 pouvoir nommer chacun des éléments d'un tableau, la plate-forme SoCLib définit un mécanisme générique d'allocation et de désallocation … … 159 167 160 168 L'archive contient également les fichiers suivants : 161 * `gcd.h` : ce fichier décrit les fichiers adressables du coprocesseur GCD (fichier complet)169 * `gcd.h` : ce fichier décrit les registres adressables du coprocesseur GCD (fichier complet) 162 170 * `vci_gcd_master.h` : définition du composant `VciGcdMaster` (fichier complet) 163 171 * `vci_gcd_master.cpp` : méthodes associées (fichier incomplet) … … 170 178 == 5.1 Composant ''!VciGcdCoprocessor'' == 171 179 172 Le composant ''!VciGcdCoprocessor'' se comporte commeun périphérique adressable, et doit donc être180 Le composant ''!VciGcdCoprocessor'' est un périphérique adressable, et doit donc être 173 181 modélisé comme une cible VCI. Il possède un seul port de type ''!VciTarget'', et 4 registres 174 182 (ou pseudo-registres) implantés dans l'espace addressable, qui peuvent donc - en principe - être 175 183 lus ou écrits par n'importe quel initiateur du sytème. Chacun de ces registres a une largeur de 4 octets. 176 Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une taille de `4*` = 16 octets.184 Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une longueur de `4*4` = 16 octets. 177 185 178 186 Pour simplifier le décodage des adresses, on impose la contrainte que l'adresse de base de ce segment est 179 187 un multiple de sa longueur (on dit que le segment est ''aligné''). 180 La carte d 'implantation des registres est définitcomme suit :188 La carte des registres est définie comme suit : 181 189 182 190 || '''Nom du registre''' || '''Offset''' || '''Mode''' || … … 212 220 213 221 214 Une erreur est signalée si le coprocesseur GCD reçoit une commande de longueur supérieure à un mot, 215 ou si l'adresse reçue n'appartient pas au segment qui a été défini pour le coprocesseur, 216 ou si le mode d'accès (Read ou Write) ne respecte pas les contraintes définies dans la carte des registres. 222 Une erreur est signalée dans les trois cas suivants : 223 * le coprocesseur GCD reçoit une commande VCI de longueur supérieure à un flit, 224 * l'adresse reçue n'appartient pas au segment qui a été défini pour le coprocesseur, 225 * le mode d'accès (Read ou Write) ne respecte pas les contraintes définies dans la carte des registres. 217 226 218 227 '''Question''' : comment sont traitées les erreurs dans ce modèle de simulation? à quoi servent ces vérifications ? 219 228 220 229 Le fichier `vci_gcd_coprocessor.h` contient une définition complête du composant `VciGcdCoprocessor`. 221 Il n'a pas besoin d'être modifié, mais vous aurez besoin dele lire attentivement pour modifier230 Il n'a pas besoin d'être modifié, mais vous devez le lire attentivement pour modifier 222 231 le fichier `vci_gcd_coprocessor.cpp`, qui contient une description incomplête des méthodes associées à ce composant. Complétez le code des méthodes `transition()` et `genMoore()`. 223 232 224 233 == 5.2 Composant ''!VciGcdMaster'' == 225 234 226 Le composant `VciGcdMaster` est un initiateur VCI, qui exécute une boucle infinie dans laquelle il exécute227 successivement les actions suivantes:235 Le composant `VciGcdMaster` est un initiateur VCI, qui joue le rôle d'un processeur, mais qui n'est pas programmable: 236 Il exécute un unique ''programme'' qui est une une boucle infinie dans laquelle on effectue successivement les actions suivantes: 228 237 1. calcul de deux valeurs aléatoires (entiers positifs codés sur 32 bits) 229 238 1. écriture de l'opérande OPA dans le registre GCD_OPA du coprocesseur GCD. 230 239 1. écriture de l'opérande OPB dans le registre GCD_OPB du coprocesseur GCD. 231 240 1. écriture dans le pseudo-registre GCD_START du coprocesseur GCD. 232 1. lecturedu registre GCD_STATUS du coprocesseur GCD, jusqu'à obtenir une valeur nulle (calcul terminé)..241 1. scrutation du registre GCD_STATUS du coprocesseur GCD, jusqu'à obtenir une valeur nulle (calcul terminé).. 233 242 1. lecture du résultat dans le registre GCD_OPA du coprocesseur GCD. 234 1. affichage des résultats. 243 1. affichage des résultats... et on recommence. 235 244 236 245 Pour accéder au coprocesseur GCD, le composant a besoin de l'adresse de base du