Manuel
Fonctionnement général
L'interface est composée de trois onglets :
- Avec le premier onglet il est possible de dessiner un Réseau de Processus de Kahn pour définir la partie "application" du MPSoC.
- Pour définir l'architecture du MPSoC, il faut utiliser le deuxième onglet. Il est possible d'ajouter des processeurs (NIOS 2 seulement), des mémoires, et des co-processeurs (conçus en VHDL).
- Le dernier onglet permet de placer les tâches du premier onglet sur les ressources du deuxième onglet.
Une fois que le modèle de MPSoC est terminé, il est possible de l'exporter dans un fichier au format XML.
La deuxième fonction de TaskMapper est d'évaluer le placement. Pour ce faire, le meilleur moyen est de tester ce placement. TaskMapper utilise la suite de développement d'Altera pour reprogrammer un FPGA, et ainsi mettre en oeuvre le MPSoC.
Contraintes d'utilisation
- Il n'est pas possible de faire apparaitre d'espace dans les chemins d'accès aux fichiers.
- À chaque modification d'un champ de donné, il faut appuyer sur ENTRER pour rendre effectif la modification.
- Les fonctions d'édition (couper, copier, coller, annuler, refaire), ainsi que l'aide ne sont pas implémentées.
Contraintes de conception
extrait des rapports et présentations
L'architecture destinée à être implanter sur le MPSoC est à base de NIOS 2. Sur chacun de ces processeurs, un µC-OS 2 (wikipedia) s'exécute, permettant l'exécution de 20 tâches par processeur. Ces tâches "logicielles" doivent être programmées en C et avoir un priorité unique (sur le processeur). En plus des NIOS 2, il est possible d'ajouter des co-processeurs matériels. Chacun de ces co-processeurs peut exécuter une seule tâche, programmée en VHDL. Les co-processeurs sont connecté d'office au bus, c'est pourquoi il n'y a pas besoin de créer de lien dans l'onglet architecture. Chaque processeur peut établir une communication avec chaque co-processeur. Cependant, les co-processeurs étant de type "SLAVE", ils ne peuvent pas établir de communication avec d'autres composants (mémoire, co-processeur, processeur).
Chaque processeur NIOS 2 doit être relié à une mémoire via un bus d'instruction. C'est dans cette mémoire qu'il lira les instructions des programmes qu'il doit exécuter. Plusieurs processeurs peuvent lire leurs instructions dans une même mémoire.
Pour communiquer entre elles, les ressources utilisent différents moyens (selon les cas, cf. présentation 2nd semestre, diapos 31 et suivantes). Dans le cas d'une communication entre tâches placées sur des processeurs NIOS 2 différents, la FIFO est mise en oeuvre par une mémoire commune, reliée à chacun des processeurs. TaskMapper ne gère pas de façon transparente la création de cette mémoire. En ce qui concerne la communication avec les co-processeurs, la FIFO se situe dans un composant englobant le co-processeur, et qui fait office d'interface avec le bus.
Tant que le modèle n'est pas cohérent, il n'est pas possible de générer le code ou de lancer l'exécution du modèle sur la carte. Ainsi, un co-processeur n'ayant aucune tâche à exécuter, ou l'absence de mémoire pour la communication inter-processeur sera signalé.
Chaque processeur relié à la mémoire sdram_0 peut utiliser au maximum 1 Mo sur cette mémoire (code, pile, données). Pour les autres mémoires, il est possible d'utiliser uniquement des mémoires de type RAM (bien que d'autres types apparaissent, la SDRAM est reservée à la mémoire sdram_0, et la ROM n'est pas implémentée).
Premier onglet : RPK
- Le menu permet d'accéder aux fonction générales de l'outil : ouvrir/enregistrer/créer un nouveau/générer le code pour un projet.
- La partie principale de l'onglet représente le réseau de processus de Kahn.
- Le panneau de propriétés permet de modifier certaines propriétés de l'élément sélectionné (ici, un port de sortie).
- Fonction de pointage : permet de selectionner les différents éléments.
- Création de processus : en double cliquant dans un espace vide de la partie (2).
- Création d'un port d'entrée : en double cliquant sur un processus.
- Création d'un port de sortie : en double cliquant sur un processus.
- Création d'un canal de communication : en effectuant un glisser-déposer d'un port de sortie vers un port d'entrée.
- Project Name : permet de nommer le projet.
- Workspace : permet de spécifier où sera généré le code, et où seront compilés les différents éléments du projet.
- Card Number : permet d'indiquer quelle carte doit être utilisée (liste accessible via jtagconfig).
Il est possible de supprimer des éléments en utilisant la touche SUPPR (ou DEL) du clavier lorsqu'un élément est sélectionné. Le déplacement des éléments se fait via un glisser-déposer (avec la fonction de pointage).
Deuxième onglet : Architecture
- La partie principale de l'onglet représente le modèle d'architecture.
- Le panneau de propriétés permet de modifier certaines propriétés de l'élément sélectionné (ici, la mémoire sdram_0).
- Fonction de pointage : permet de selectionner les différents éléments.
- Création de processeurs : en double cliquant dans un espace vide de la partie (1).
- Création de co-processeurs : en double cliquant dans un espace vide de la partie (1).
- Création de mémoires : en double cliquant dans un espace vide de la partie (1).
- Création d'un lien instruction : lie un processeur à une mémoire pour lire les instructions.
- Création d'un lien données : lie un processeur à une mémoire de données.
- Barre d'outils
Il est possible de supprimer des éléments en utilisant la touche SUPPR (ou DEL) du clavier lorsqu'un élément est sélectionné (y compris les liens mémoire-processeur). Le déplacement des éléments se fait via un glisser-déposer (avec la fonction de pointage).
Troisième onglet : Allocation
- La partie droite représente les "hardallocations", c'est a dire le placement de tâches codées en VHDL.
- La partie gauche représente les "softallocations", c'est à dire le placement de tâches codées en C.
- La partie du bas représente les tâches qui n'ont pas été placées (elles doivent toutes l'être).
- Générer le code : génére et compile le code.
- Afficher le terminal : envoie le code compilé sur la carte, et affiche le terminal d'exécution.
Les placements se font via un glisser-déposer. C'est dans cet onglet qu'il faut spécifier les paramètres des tâches :
- Tâches logicielles :
- Path C : chemin d'accès vers le fichier C contenant la déclaration du point d'entrée pour la tâche.
- Priority : donne une priorité à la tâche. La priorité doit être unique sur le processeur. Les priorités vont de 7 à 20 (en dessous de 7 et au dessus de 20 il y a des problèmes lors de l'exécution).
- Entry Point : le point d'entrée dans le fichier C.
- Stacksize : la taille de la pile allouée pour la tâche.
- Tâches matérielles :
- VHDL : Le fichier VHDL qui décrit le contrôleur matériel pour la tâche. Ce fichier doit respecter certaines contraintes (cf. suite). Il est détruit à chaque glisser-déposer, c'est pourquoi il est conseillé de coder ces fichiers dans votre éditeur favori, puis de copier/coller le code ensuite.
- control et status : définissent les paramètres usercontrol et userstatus du co-processeurs.
Edition du VHDL
- La première partie du fichier spécifie les entêtes. Elles sont générées par TaskMapper, et ne doivent pas être modifiées. Elles permettent au co-processeur de bien se connecter à l'interface de connection au bus (cf. rapports).
- La deuxième partie correspond au traitements, et est modifiable.
nios2-terminal
- Le debut correspond à l'inialisation du terminal.
- La suite correspond à l'exécution des tâches sur le processeur cpu_0. En effet, seul ce processeur est connecté à l'interface d'entrée-sortie avec l'exterieur (les printf() exécutés sur les autres processeurs ne seront pas affichés).
Pour accéder à TaskMapper après l'exécution, il faut fermer cette fenêtre (cela tue le processus nios2-terminal, et interrompt la communication avec la carte.