Changes between Initial Version and Version 1 of SoclibCourseTp3


Ignore:
Timestamp:
Sep 12, 2009, 11:34:37 AM (15 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp3

    v1 v1  
     1{{{
     2#!html
     3<h1>TP2: Processeurs programmables</h1>
     4}}}
     5[[PageOutline]]
     6
     7= 1 Objectif =
     8
     9L'objectif de ce troisième TP est d'introduire des processeurs programmables dans les architectures modélisées.
     10Les 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
     12de processeur possède un excellent rendement énergétique.
     13On introduira également dans l'architecture les mémoires embarquées contenant le code binaire
     14de l'application logicielle.
     15
     16= 2 Architecture matérielle cible =
     17
     18
     19
     20
     21
     22 
     23= 5 Travail à réaliser =
     24 
     25L'archive [attachment:soclib_tp3.tgz soclib_tp2.tgz] contient différents fichiers dont vous aurez besoin pour ce TP.
     26Cré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
     31Cette 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
     44L'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
     55Le composant ''!VciLcdCoprocessor'' se comporte comme un périphérique adressable, et doit donc être
     56modé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
     58lus ou écrits par n'importe quel initiateur du sytème. Chacun de ces registres a une largeur de 4 octets.
     59Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une taille de `4*4` = 16 octets.
     60
     61Pour simplifier le décodage des adresses, on impose la contrainte que l'adresse de base de ce segment est
     62un multiple de sa longueur (on dit que le segment est ''aligné''). 
     63La 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
     71Attention : Il n'existe pas réellement de registre ''r_start'' dans le composant matériel.
     72Lorsque le composant ''!VciLcdCoprocessor'' reçoit une commande d'écriture à l'adresse
     73correspondant à l'adresse de ''r_start'', la donnée WDATA correspondante n'est écrite nulle part,
     74mais la commande est interprêtée par le coprocesseur comme un ordre de démarrage du calcul.
     75
     76Une erreur est signalée si le coprocesseur reçoit une commande de longueur supérieure à un mot,
     77ou si l'adresse reçue n'appartient pas au segment qui a été défini pour le coprocesseur,
     78ou si le mode d'accès (Read ou Write) ne respecte pas les contraintes ci-dessus.
     79
     80Question : comment sont traitées les erreurs dans ce modèle de simulation? à quoi servent ces vérifications ?
     81
     82La figure ci-dessous décrit la structure de l'automate de contrôle du composant `VciLcdCoprocessor`.
     83
     84[[Image(soclib_tp2_coprocessor.png)]]
     85
     86Le fichier `vci_lcd_coprocessor.h` contient une définition complête du composant `VciLcdCoprocessor`.
     87Il n'a pas besoin d'être modifié, mais vous aurez besoin de le lire attentivement pour modifier
     88le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplête des méthodes associées à ce composant.
     89Complétez le code des méthodes `transition()` et `genMoore()`.
     90
     91== 5.2 Composant ''!VciLcdMaster'' ==
     92
     93Le composant `VciLcdMaster` est un initiateur VCI, qui exécute une boucle infinie dans laquelle il exécute
     94successivement 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
     102Pour accéder au coprocesseur LCD, le composant a besoin de l'adresse de base du
     103segment de l'espace adressable aui a été assigné au coprocesseur LCD.
     104Le composant ''!VciLcdMaster'' étant un automate cablé (non programmable), on considère
     105que cette adresse est également "câblée". Elle est donc définie comme un paramètre du constructeur.
     106 
     107La figure ci-dessous décrit la structure de l'automate de contrôle du composant ''!VciLcdMaster''.
     108
     109[[Image(soclib_tp2_master.png)]]
     110
     111Chaque 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
     113dans lequel on attend la réponse (on reste dans cet état tant qu'on a pas reçu une réponse valide).
     114
     115Le fichier `vci_lcd_coprocessor.h` contient une description complète du composant `!VciLcdMaster`.
     116Il n'a pas besoin d'être modifié, mais vous devez le lire attentivement pour modifier
     117le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplète des méthodes associées à ce composant.
     118Complétez le code des méthodes `transition()` et `genMoore()`.
     119
     120== 5.3 Architecture minimale ==
     121
     122Pour valider les modèles de simulation des composants `VciLcdMaster` et `VciLcdCoprocessor`,
     123on 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
     127En vous inspirant de ce que vous avez fait dans le TP1, complétez le fichier ''tp2_simple_top.cpp'' qui vous est fourni,
     128en 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.
     132On 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
     136Il faut ensuite compiler les différents fichiers pour générer le simulateur.
     137On va utiliser la même méthode que dans le TP1, mais il y a une difficulté supplémentaire, à cause
     138du paramètre template `vci_param` des composants `VciLcdMaster`, `VciLcdCoprocessor`.
     139Dans un contexte de compilation séparée, il est nécessaire de définir explicitement la valeur de ce paramètre
     140dans chacun des fichiers source avant de lancer la génération du fichier objet associé.
     141Pour cela, il faut rajouter la ligne suivante à la fin des fichiers `vci_lcd_master.cpp` et `vci_lcd_coprocessor.cpp` :
     142{{{
     143template 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
     147Ceci étant fait, écrivez le Makefile permettant la génération du fichier exécutable `simple_simulator.x`.
     148N'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
     151Le lancement du simulateur doit vous fournir la même trace d'exécution que celle que obtenue dans le TP1, puisque
     152les calculs effectués sont les mêmes (seul le protocole de communication a changé.
     153
     154== 5.5 Architecture multi-maitres ==
     155
     156L' architecture interne du composant `VciVgsb` est décrite dans la figure ci-dessous.
     157Le `bus` des commandes VCI, et le `bus` des réponses VCI sont modélisés par des multiplexeurs. Ces multiplexeurs sont
     158commandés par un automate à trois états qui réalise une priorité tournante entre les initiateurs.
     159Comme vous pouvez le constater sur le schéma, ce composant se comporte comme un automate de Mealy,
     160puisque - une fois le bus alloué à un initiateur - les signaux de sortie dépendent combinatorement des signaux d'entrée.
     161La 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.
     162Du point de vue latence et bande passante, ce composant se comporte comme le PIbus.   
     163
     164[[Image(soclib_tp2_bus.png)]]
     165
     166En vous inspirant du fichier `tp2_simple_top.cpp` de la question précédente, écrivez le fichier `tp2_multi_top.cpp`,
     167qui décrit l'architecture à 7 composants décrite au début de ce TP. Vous ferez en sorte que le maitre (i) communique
     168avec le coprocesseur (i). N'oubliez pas de définir 3 segments différents pour les trois coprocesseurs.
     169
     170Il 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{{{
     173template class VciVgsb<soclib::caba::VciParams<4, 8, 32, 1, 1, 1, 12, 1, 1, 1> >;
     174}}}
     175
     176Modifiez le Makefile pour générer le fichier exécutable `multi_simulator.x`, en n'oubliant pas d'inclure le fichier `vci_vgsb.o`
     177dans l'ensemble des fichiers objet.
     178Le lancement du simulateur doit vous fournir une trace d'exécution qui entrelace les compte-rendus des trois initiateurs
     179qui s'exécutent en parallèle. Chaque initiateur commande un seul coprocesseur, et la seule ressource partagée est le
     180bus de communication.
     181
     182= 6 Compte-rendu =
     183
     184Il 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...