13 | | Dessinez sur une feuille (ou sur un logiciel adapté) les machines d'état du cache L1 write-through à invalidations et du contrôleur mémoire associé, en étant le plus précis possible. On s'intéresse pour ce TP uniquement à la partie données du cache : on suppose en effet que le processeur émet directement des requêtes de lecture et d'écritures, et non les adresses des instructions. De plus, on ne s'intéresse pas aux requêtes à des adresses non cachées : on suppose donc que toutes les requêtes sont à des adresses cachées. |
| 13 | Dans cette première partie, il vous est demandé de dessiner sur une feuille (ou sur un logiciel adapté) les machines d'état du cache L1 write-through à invalidations et du contrôleur mémoire associé. La liste des états vous est donnée ci-dessous, il faut donc remplir chaque état avec les actions qui y sont associées et représenter les transitions entre états. Pour représenter les actions, vous pouvez utiliser du français ou du pseudo-code. |
| 14 | Liste des états du contrôleur de cache : |
| 15 | |
| 16 | {{{ |
| 17 | IDLE, // Traiter les requêtes en attente, répondre aux lectures qui font hit |
| 18 | INVAL, // Traiter une invalidation reçue |
| 19 | MISS, // Envoi d'un miss |
| 20 | SEND_WRITE, // Envoyer l'écriture d'un mot en mémoire et éventuellement mettre le cache à jour |
| 21 | MISS_WAIT // Attendre la réponse à un miss et mettre à jour le cache lors de sa réception |
| 22 | }}} |
| 23 | |
| 24 | Liste des états du contrôleur mémoire : |
| 25 | |
| 26 | {{{ |
| 27 | IDLE, // Traiter les requêtes en attente |
| 28 | WRITE_WORD, // Écriture d'un mot |
| 29 | READ_LINE, // Lecture d'une ligne |
| 30 | DIR_UPDATE, // Mise à jour du répertoire |
| 31 | INVAL, // Préparation de l'envoi d'une ou plusieurs invalidations |
| 32 | INVAL_SEND, // Envoi des invalidations |
| 33 | INVAL_WAIT, // Attente des réponses aux invalidations |
| 34 | RSP_READ, // Répondre à une lecture |
| 35 | RSP_WRITE // Répondre à une écriture |
| 36 | }}} |
| 37 | |
36 | | Une fois les sources du package Model à peu près maitrisées, il faut compléter les classes L1WtiController et !MemWtiController à partir des machines d'état dessinées dans la partie 1. |
| 62 | Remarques : |
| 63 | * Les attributs `m_req` et `m_iss_req` du cache contiennent respectivement les dernières requêtes reçues en provenance de la mémoire (requête de cohérence) et du processeur. Ils sont écrits par les méthodes `getRequest()` et `getIssRequest()`, et peuvent donc être lus autant de fois que nécessaire jusqu'à la réception de la requête suivante. |
| 64 | * Les méthodes `getRequest()` et `getIssRequest()` citées au-dessus ne doivent être appelées que lorsqu'il y a une requête présente sur le port correspondant. |
| 65 | * Normalement, il n'est pas nécessaire d'ajouter des variables membre dans les classes des contrôleurs. Si vous souhaitez tout de même en ajouter, mettez clairement en évidence dans votre code ces ajouts (en distiguant leur déclaration des autres) et commentez-les. |
| 66 | * La dernière partie de la méthode `simulate1Cycle` du cache L1 vous est donnée : elle effectue la consommation des réponses qui arrivent sur le port `p_in_rsp`. |
| 67 | * Comme les canaux sont fifos et que des requêtes qui transitent entre un cache et une mémoire ne peuvent pas se doubler, le cache L1 n'est pas obligé de bloquer un miss sur une adresse où il y a une écriture en cours. Ainsi, les réponses aux écritures n'ont pas d'effet spécial dans le cache. |
38 | | Pour lancer une simulation, il faut faire un clic droit sur une la classe `Simul.java` du package `simulation`, puis `Run as...` -> `java application` |
| 69 | |
| 70 | |
| 71 | == 3. Écriture des machines d'état et simulation == |
| 72 | |
| 73 | Une fois les sources du package `model` à peu près maitrisées, il faut compléter les classes `L1WtiController` et `MemWtiController` à partir des machines d'état dessinées dans la partie 1. |
| 74 | |
| 75 | Pour lancer une simulation, il faut faire un clic droit sur la classe `Simul.java` du package `simulation`, puis `Run as...` -> `java application` |
| 76 | |
| 77 | Vous pouvez changer la topcell utilisée dans le fichier `Simul.java`, de même que modifier les fichiers des différentes topcells. En particulier, les processeurs peuvent initialement contenir une liste de requêtes de lecture et d'écriture, qui doit être créée dans la topcell. Si cette liste est vide, il faut ajouter des requêtes interactivement lors de la simulation ; à l'inverse, si cette liste n'est pas vide, les requêtes qui sont ajoutées interactivement lors de la simulation sont placées à la fin de la liste. |
| 78 | |
| 79 | Remarques : |
| 80 | * Lors de la simulation interactive, les requêtes n'apparaissent que lorsqu'elles ont été consommées. Une requête qui se trouve dans un canal n'est donc pas encore affichée. |
| 81 | |