| 1 | #include "l1cache.h"
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 | void L1Cache::read()
|
|---|
| 5 | {
|
|---|
| 6 | // On donne la priorité aux éléments en attente :
|
|---|
| 7 | // - si des éléments sont présents dans la file d'attente
|
|---|
| 8 | // on les envoie
|
|---|
| 9 | // - TODO on doit pouvoir les packer pour pouvoir les envoyer par deux
|
|---|
| 10 | // - si aucun élément n'est présent dans la liste, on arrête d'envoyer (in_activate = false)
|
|---|
| 11 | // indépendemment,
|
|---|
| 12 | // - si on recoit un élement, on regarde s'il est chargé dans le cache:
|
|---|
| 13 | // - si il est chargé, on le place dans la liste des addresses à envoyer,
|
|---|
| 14 | // on attend un moment timeout avant de l'envoyer
|
|---|
| 15 | // - si il n'est pas chargé, on envoit une requete au cache L2,
|
|---|
| 16 | // on le place dans la liste des addresses à envoyer.
|
|---|
| 17 | // - XXX le timeout devrait peut etre etre effectué, meme pour les données non présentes dans le L1
|
|---|
| 18 |
|
|---|
| 19 | miss_info = false;
|
|---|
| 20 | hit_info = false;
|
|---|
| 21 |
|
|---|
| 22 | if (in_activate) {
|
|---|
| 23 |
|
|---|
| 24 | // Retrieves the address
|
|---|
| 25 | RawAddress req = in_data;
|
|---|
| 26 | Address element(req, cstore->get_line_width());
|
|---|
| 27 |
|
|---|
| 28 | // Si la donnée est chargée dans le cache
|
|---|
| 29 | if (cstore->is_loaded(element)) {
|
|---|
| 30 |
|
|---|
| 31 | out_activate = true;
|
|---|
| 32 |
|
|---|
| 33 | // affichage de l'action
|
|---|
| 34 | cout << sc_time_stamp() << " L1Cache : access to loaded data [" << element << "] -> hit" << endl;
|
|---|
| 35 |
|
|---|
| 36 |
|
|---|
| 37 | hit_info = true;
|
|---|
| 38 | out_data = in_data;
|
|---|
| 39 | } else {
|
|---|
| 40 |
|
|---|
| 41 | // affichage de l'action
|
|---|
| 42 | cout << sc_time_stamp() << " L1Cache : access to loaded data [" << element << "] -> miss" << endl;
|
|---|
| 43 |
|
|---|
| 44 | miss_info = true;
|
|---|
| 45 | processing_queue->insert(element, latency);
|
|---|
| 46 | processing_queue->print();
|
|---|
| 47 | }
|
|---|
| 48 | }
|
|---|
| 49 |
|
|---|
| 50 | Address *head = processing_queue->get_next_ready();
|
|---|
| 51 | if (head != NULL)
|
|---|
| 52 | {
|
|---|
| 53 | cout << "has ready elements " << endl;
|
|---|
| 54 | //processing_queue->print();
|
|---|
| 55 |
|
|---|
| 56 | cstore->do_load(*head);
|
|---|
| 57 |
|
|---|
| 58 | // Envoi de la réponse au processeur
|
|---|
| 59 | RawAddress req(head->as_absolute());
|
|---|
| 60 | out_activate = true;
|
|---|
| 61 | out_data = req;
|
|---|
| 62 | } else if (! in_activate) {
|
|---|
| 63 | out_activate = false;
|
|---|
| 64 | }
|
|---|
| 65 |
|
|---|
| 66 | processing_queue->update_time();
|
|---|
| 67 |
|
|---|
| 68 | }
|
|---|
| 69 |
|
|---|
| 70 |
|
|---|
| 71 | void L1Cache::write()
|
|---|
| 72 | {
|
|---|
| 73 | // cout << sc_time_stamp() << " L1Cache.write()" << endl;
|
|---|
| 74 | }
|
|---|