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