Changes between Version 28 and Version 29 of SoclibCourseTp2


Ignore:
Timestamp:
Nov 28, 2010, 2:30:44 PM (15 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp2

    v28 v29  
    1616= 2 Architecture matérielle cible =
    1717
    18 L'architecture matérielle qu'on souhaite prototyper dans ce second TP instancie 7 composants matériels de
    19 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. 
     18L'architecture matérielle qu'on souhaite prototyper dans ce second TP instancie trois composants matériels :
     19Les 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
     20vers 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. 
    2121
    2222[[Image(soclib_tp2_archi.png)]]
     
    3131
    3232Le 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).
     33partagée. Dans ce type de d'architecture, les différents composants matériels utilisent des transactions pour communiquer entre eux.
     34
     35Terminologie :
     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
    3440Une transaction est initiée par un composant ''initiateur'', qui envoie un paquet ''commande'', et est terminée par
    3541un composant cible, qui répond à la commande en renvoyant un paquet ''réponse''.
     
    3844
    3945Dans 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 VCI pour 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 VCI suivant 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.
    4248
    4349'''Question''' : à quoi sert le paquet réponse dans le cas d'une transaction d'écriture ?
     
    95101== 4.1 Indexation des composants VCI ==
    96102
    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).
     103On 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).
    98104
    99105La plate-forme SoCLib définit la classe C++ ''!IntTab'' pour représenter ces index composites. (voir fichier ''int_tab.h'').
     
    104110Dans une architecture à mémoire partagée, on assigne à tout composant ''cible'' un (ou plusieurs) segment(s) dans l'espace adressable.
    105111Un 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.
     112segment peut être très variable : de quelques dizaines d'octets pour un périphériques adressable, à quelques Moctets pour un contrôleur mémoire.
    107113C'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,
    108114et donc vers quelle cible un paquet commande doit être aiguillé. Le découpage de l'espace adressable en segments et l'assignation de ces
    109115segments 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.
    110116
    111 La plate-forme SoCLib définit la classe C++ ''!MappingTable'' permettant de centraliser dans un même objet toutes
    112 les informations concernant la segmentation de l'espace addressable, et la correspondance entre les cible VCI (identifiées par leur index),
    113 et les segments. (voir fichiers ''mapping_table.h'' et ''segment.h'').
    114 
    115 Un segment est caractérisé par 5 informations :
     117La plate-forme SoCLib définit la classe C++ ''!MappingTable'' permettant de centraliser dans un même objet logiciel toutes
     118les informations concernant la segmentation de l'espace addressable, et la correspondance entre une cible VCI (identifiées par son index),
     119et un segment. (voir fichiers ''mapping_table.h'' et ''segment.h'').
     120
     121Un segment est un objet caractérisé par 5 informations :
    116122 * un nom
    117123 * une adresse de base
     
    122128Pour plus de détails, vous pouvez consulter le site WEB du projet SoCLib :  [https://www.soclib.fr/trac/dev/wiki/Component/MappingTable].
    123129
    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
     132Le 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.
     135Pour faciliter ce décodage, la plate-forme SoCLib définit les classe C++ ''!AddressDecodingTable'' (voir fichier ''address_decoding_table.h'') et
    128136''!AddressMaskingTable'' (voir fichier ''address_masking_table.h'')
    129137
    130138== 4.4 Allocation de tableaux ==
    131139
    132 On a parfois besoin d'utiliser des tableaux d'objets complexes. Par exemple, le composant ''!VciVgsb'' possède un nombre variable
     140On a parfois besoin d'utiliser des tableaux d'objets complexes. Par exemple, le composant générique ''!VciVgsb'' possède un nombre variable
    133141de ports VCI initiateur, et un nombre variable de ports VCI cibles. Ces ports sont donc définis comme des tableaux de ports. Pour
    134142pouvoir 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
     
    159167
    160168L'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)
    162170 * `vci_gcd_master.h` : définition du composant `VciGcdMaster` (fichier complet)
    163171 * `vci_gcd_master.cpp` : méthodes associées (fichier incomplet)
     
    170178== 5.1 Composant ''!VciGcdCoprocessor'' ==
    171179
    172 Le composant ''!VciGcdCoprocessor'' se comporte comme un périphérique adressable, et doit donc être
     180Le composant ''!VciGcdCoprocessor'' est un périphérique adressable, et doit donc être
    173181modélisé comme une cible VCI. Il possède un seul port de type ''!VciTarget'', et 4 registres
    174182(ou pseudo-registres) implantés dans l'espace addressable, qui peuvent donc - en principe - être
    175183lus 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.
     184Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une longueur de `4*4` = 16 octets.
    177185
    178186Pour simplifier le décodage des adresses, on impose la contrainte que l'adresse de base de ce segment est
    179187un multiple de sa longueur (on dit que le segment est ''aligné''). 
    180 La carte d'implantation des registres est définit comme suit :
     188La carte des registres est définie comme suit :
    181189
    182190|| '''Nom du registre''' || '''Offset''' || '''Mode'''      ||
     
    212220 
    213221
    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.
     222Une 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.
    217226
    218227'''Question''' : comment sont traitées les erreurs dans ce modèle de simulation? à quoi servent ces vérifications ?
    219228
    220229Le 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 de le lire attentivement pour modifier
     230Il n'a pas besoin d'être modifié, mais vous devez le lire attentivement pour modifier
    222231le 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()`.
    223232
    224233== 5.2 Composant ''!VciGcdMaster'' ==
    225234
    226 Le composant `VciGcdMaster` est un initiateur VCI, qui exécute une boucle infinie dans laquelle il exécute
    227 successivement les actions suivantes:
     235Le composant `VciGcdMaster` est un initiateur VCI, qui joue le rôle d'un processeur, mais qui n'est pas programmable:
     236Il exécute un unique ''programme'' qui est une une boucle infinie dans laquelle on effectue successivement les actions suivantes:
    228237 1. calcul de deux valeurs aléatoires (entiers positifs codés sur 32 bits)
    229238 1. écriture de l'opérande OPA dans le registre GCD_OPA du coprocesseur GCD.
    230239 1. écriture de l'opérande OPB dans le registre GCD_OPB du coprocesseur GCD.
    231240 1. écriture dans le pseudo-registre GCD_START du coprocesseur GCD.
    232  1. lecture du 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é)..
    233242 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.
    235244
    236245Pour accéder au coprocesseur GCD, le composant a besoin de l'adresse de base du