Changes between Version 2 and Version 3 of SoclibCourseTp3


Ignore:
Timestamp:
Sep 12, 2009, 10:45:43 PM (15 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp3

    v2 v3  
    1616= 2 Architecture matérielle cible =
    1717
    18 La première architecture modélisée comporte un seul initiateur VCI et 4 cibles VCI :
     18La première architecture modélisée dans ce TP comporte un seul initiateur VCI et 4 cibles VCI :
    1919
    2020[[Image(soclib_tp3_archi_mono)]]
    2121
    22  * '''mips''' est un processeur MIPS32 avec ses caches L1. On utilise le composant ''!VciXcache''
    23  * '''rom''' est une mémoire non inscriptible contenant le code binaire. On utilise le composant ''!VciSimpleRam''
    24  * '''ram''' est une mémoire inscriptible contenant les données. On utilise également un composant ''!VciSimpleRam''
     22 * '''mips32''' est un processeur MIPS32 avec ses caches L1. On utilise le composant ''!VciXcacheWrapper''
     23 * '''rom''' est une mémoire non inscriptible contenant le code de boot. On utilise le composant ''!VciSimpleRam''
     24 * '''ram''' est une mémoire inscriptible contenant le code et les données. On utilise également un composant ''!VciSimpleRam''
    2525 * '''tty''' est un périphérique adressable de type écran/clavier. On utilise le composant ''VciMultiTty''
    2626 * '''lcd''' est le coprocesseur cible réalisant le calcul du PGCD. On utilise évidemment le composant ''VciLcdCoprocessor''.
    2727 * '''bus''' est le bus système déjà utilsé dans le TP2. On utilise le composant ''!VciVgsb''.
    2828
     29Les modèles de simulation des composants matériels instanciés dans cette architecture sont disponibles dans la bibliothèque SoCLib.
     30Ils vous sont fournis, et vous n'aurez pas à les re-écrire vous-même.
     31
     32Le composant ''!VciXcacheWrapper'' est un contrôleur de cache générique à interface VCI, qui peut être utilisé pour interfacer
     33différents coeurs de processeur avec le reste du système. Le coeur du processeur est modélisé par un ISS (Instruction Set Simulateur).
     34Le type du proceseur instancié (MIP32, ARM, SPARCV8, PPC405, NIOS, MicroBlaze, etc.) est défini par un paramètre template
     35du composant ''!VciXcacheWrapper''.
     36
     37Le composant ''!VciSimpleRam'' est utilisé pour modéliser des mémoires inscriptibles embarquées (SRAM), ou
     38pour modéliser des mémoires non inscriptibles (ROM) dont le contenu est ''cablé''.
     39Ce composants peut contenir un ou plusieurs segments (correspondant à des tranches disjointes
     40de l'espace addressable). Cela signifie que ce composant décode les bits de poids fort de l'adresse VCI
     41pour adresser le segment désigné. Les dimensions des tableaux qui implémentent les bancs mémoire
     42physique sont définis par les longueurs des segments définis dans la MappingTable.
     43
    2944= 3 Génération et chargement du logiciel embarqué =
    3045
    3146Il existe plusieurs façons de définir et de générer le code binaire qui sera exécuté par le (ou les) processeur(s) du
    32 MPSoC. Si on part d'unr application logicielle écrite en langage C, il faut utiliser un cross-compilateur spécifique
     47MPSoC. Si on part d'une application logicielle écrite en langage C, il faut utiliser un cross-compilateur spécifique
    3348pour le processeur choisi. Le résultat est un fichier binaire au format ELF. Le code binaire correspondant doit
    3449être chargé dans les mémoires embarquées du MPSoC. 
     
    6378 * `address_decoding_table.cpp` : implémentation des méthodes de la table indexée.
    6479 * `alloc_elems.h` : allocation de tableaux d'objets complexes
     80
    6581L'archive contient également les fichiers suivants :
    66  * `vci_lcd_master.h` : définition du composant `VciLcdMaster` (fichier complet)
    67  * `vci_lcd_master.cpp` : méthodes associées (fichier incomplet)
    68  * `vci_lcd_coprocessor.h` : définition du composant `VciLcdCoprocessor`. (fichier complet)
    69  * `vci_lcd_coprocessor.cpp` : méthodes associées (fichier incomplet)
    70  * `vci_vgsb.h` : définition du composant `VciVgsb`. (fichier complet)
    71  * `vci_vgsb.cpp` : méthodes associées (fichier complet)
    72  * `tp2_simple_top.cpp` : top-cell d'une architecture simple à deux composants (fichier incomplet)
     82 * `vci_xcache_wrapper.h` : définition du composant `VciXcacheWrapper`
     83 * `vci_xcache_wrapper.cpp` : méthodes associées
     84 * `vci_lcd_coprocessor.h` : définition du composant `VciLcdCoprocessor`
     85 * `vci_lcd_coprocessor.cpp` : méthodes associées
     86 * `vci_simple_ram.h` : définition du composant `VciSimpleRam`
     87 * `vci_simple_ram.cpp` : méthodes associées
     88 * `vci_multi_tty.h` : définition du composant `VciMultiTty`
     89 * `vci_multi_tty.cpp` : méthodes associées 
     90 * `vci_vgsb.h` : définition du composant `VciVgsb`
     91 * `vci_vgsb.cpp` : méthodes associées
     92 * `tp3_mono_top.cpp` : top-cell d'une architecture simple à deux composants (fichier incomplet)
    7393
    74 == 5.1 Composant ''!VciLcdCoprocessor'' ==
     94== 5.1 Génération du logiciel embarqué ==
    7595
    76 Le composant ''!VciLcdCoprocessor'' se comporte comme un périphérique adressable, et doit donc être
    77 modélisé comme une cible VCI. Il possède un seul port de type ''!VciTarget'', et 4 registres
    78 (ou pseudo-registres) implantés dans l'espace addressable, qui peuvent donc - en principe - être
    79 lus ou écrits par n'importe quel initiateur du sytème. Chacun de ces registres a une largeur de 4 octets.
    80 Par conséquent, le segment occupé par ce périphérique dans l'espace adressable a une taille de `4*4` = 16 octets.
     96== 5.2 Instanciation des codèles des composants ==
    8197
    82 Pour simplifier le décodage des adresses, on impose la contrainte que l'adresse de base de ce segment est
    83 un multiple de sa longueur (on dit que le segment est ''aligné''). 
    84 La carte d'implantation des registres est définit comme suit :
     98== 5.3 Définition de la Top-cell  ==
    8599
    86 || '''Nom du registre''' || '''Offset''' || '''Mode'''    ||
    87 || r_opa                         || 0x0          || Write Only ||
    88 || r_opb                         || 0x4          || Write Only ||
    89 || r_start                        || 0x8          || Write Only ||
    90 || r_res                           || 0xc          || Read Only  ||
     100Il faut compléter le fichier ''tp3_mono_top.cpp'', pour définir la segmentation
     101de l'espace adressable, définir les arguments des constructeurs et les valeurs des
     102paramètres template des différents composants matériels instanciés.
    91103
    92 Attention : Il n'existe pas réellement de registre ''r_start'' dans le composant matériel.
    93 Lorsque le composant ''!VciLcdCoprocessor'' reçoit une commande d'écriture à l'adresse
    94 correspondant à l'adresse de ''r_start'', la donnée WDATA correspondante n'est écrite nulle part,
    95 mais la commande est interprêtée par le coprocesseur comme un ordre de démarrage du calcul.
     104Cette architecture nécessite la définition de 6 segments:
     105 * '''seg_lcd''' est le segment associé au coprocesseur LCD. On prendra pour adresse de base la valeur 0xD0000000. La longueur de 16 octets correspond aux quatre registres adressables de ce composant.
     106 * '''seg_tty''' est le segment associé au contrôleur de terinaux TTY. On prendra pour adresse de base la valeur 0xC0000000, et pour longueur 64 octets, ce qui permet d'adresser jusqu'à 4 terminaux indépendants (consulter la spécification fonctionnelle du composant VciMultiTty).
     107 * '''seg_reset''' est le segment contenant contient le code de ''boot'' exécuté à la mise sous tension. Il est évidemment assigné à la ROM. L'adresse de base 0xBFC00000 est imposée par la spécification du processeur MIPS32. On choisira une capacité de stockage de 4Koctets.
     108 * '''seg_giet''' est le segment contenant le code du Gestionnaire d'Interruptions, Exceptions, et Trappes (GIET). Il est assigné à la RAM. L'adresse de base 0x80000000 est imposée par la spécification du processeur MIPS32. On choisira une capacité de stockage de 4 Koctets. 
     109 * '''seg_code''' est le segment contenant le code de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x00400000,
     110et une capacité de stockage de 16 Koctets. 
     111 * '''seg_data''' est le segment contenant les données globales et la pile d'exécution de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x10000000, et une capacité de stockage de 64 Koctets.
    96112
    97 Une erreur est signalée si le coprocesseur reçoit une commande de longueur supérieure à un mot,
    98 ou si l'adresse reçue n'appartient pas au segment qui a été défini pour le coprocesseur,
    99 ou si le mode d'accès (Read ou Write) ne respecte pas les contraintes ci-dessus.
    100 
    101 Question : comment sont traitées les erreurs dans ce modèle de simulation? à quoi servent ces vérifications ?
    102 
    103 La figure ci-dessous décrit la structure de l'automate de contrôle du composant `VciLcdCoprocessor`.
    104 
    105 [[Image(soclib_tp2_coprocessor.png)]]
    106 
    107 Le fichier `vci_lcd_coprocessor.h` contient une définition complête du composant `VciLcdCoprocessor`.
    108 Il n'a pas besoin d'être modifié, mais vous aurez besoin de le lire attentivement pour modifier
    109 le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplête des méthodes associées à ce composant.
    110 Complétez le code des méthodes `transition()` et `genMoore()`.
    111 
    112 == 5.2 Composant ''!VciLcdMaster'' ==
    113 
    114 Le composant `VciLcdMaster` est un initiateur VCI, qui exécute une boucle infinie dans laquelle il exécute
    115 successivement les 6 actions suivantes:
    116  1. calcul de deux valeurs aléatoires (entiers positifs codés sur 32 bits)
    117  1. écriture de l'opérande OPA dans le registre `r_opa` du coprocesseur LCD.
    118  1. écriture de l'opérande OPB dans le registre `r_opb` du coprocesseur LCD.
    119  1. écriture dans le pseudo-registre `r_start` du coprocesseur LCD.
    120  1. lecture du résultat dans le registre `r_res` du coprocesseur LCD.
    121  1. affichage des résultats.
    122 
    123 Pour accéder au coprocesseur LCD, le composant a besoin de l'adresse de base du
    124 segment de l'espace adressable aui a été assigné au coprocesseur LCD.
    125 Le composant ''!VciLcdMaster'' étant un automate cablé (non programmable), on considère
    126 que cette adresse est également "câblée". Elle est donc définie comme un paramètre du constructeur.
    127  
    128 La figure ci-dessous décrit la structure de l'automate de contrôle du composant ''!VciLcdMaster''.
    129 
    130 [[Image(soclib_tp2_master.png)]]
    131 
    132 Chaque transaction VCI nécessite deux états dans l'automate: un premier état pour envoyer la commande
    133 (on reste dans cet état tant qu'on a pas reçu confirmation que la commande a été acceptée), et un second état
    134 dans lequel on attend la réponse (on reste dans cet état tant qu'on a pas reçu une réponse valide).
    135 
    136 Le fichier `vci_lcd_coprocessor.h` contient une description complète du composant `!VciLcdMaster`.
    137 Il n'a pas besoin d'être modifié, mais vous devez le lire attentivement pour modifier
    138 le fichier `vci_lcd_coprocessor.cpp`, qui contient une description incomplète des méthodes associées à ce composant.
    139 Complétez le code des méthodes `transition()` et `genMoore()`.
    140 
    141 == 5.3 Architecture minimale ==
    142 
    143 Pour valider les modèles de simulation des composants `VciLcdMaster` et `VciLcdCoprocessor`,
    144 on construit une architecture minimale ne contenant que deux composants matériels, conformément au schéma ci-dessous :
    145 
    146 [[Image(soclib_tp2_simple_archi.png)]]
    147 
    148 En vous inspirant de ce que vous avez fait dans le TP1, complétez le fichier ''tp2_simple_top.cpp'' qui vous est fourni,
    149 en précisant :
    150  * les caractéristiques du segment mémoire associé au coprocesseur LCD.
    151  * les valeurs des paramètres VCI (largeurs des champs) dans l'objet `vci_param`.
    152  * les valeurs des arguments des constructeurs des deux composants.
    153 On prendra pour valeurs des paramètres VCI les valeurs définies en commentaire dans le fichier ''tp2_simple_top.cpp''.
     113== 5.3 Génération du logiciel embarqué ==
    154114
    155115== 5.4 Compilation et génération du simulateur ==