#ifndef SOCLIB_CABA_MEM_CACHE_DIRECTORY_H #define SOCLIB_CABA_MEM_CACHE_DIRECTORY_H #include #include #include #include "arithmetics.h" namespace soclib { namespace caba { using namespace sc_core; //////////////////////////////////////////////////////////////////////// // A LRU entry //////////////////////////////////////////////////////////////////////// class LruEntry { public: bool recent; void init() { recent=false; } }; // end class LruEntry //////////////////////////////////////////////////////////////////////// // A directory entry //////////////////////////////////////////////////////////////////////// class DirectoryEntry { typedef uint32_t tag_t; typedef uint32_t size_t; typedef uint32_t copy_t; public: bool valid; // entry valid bool dirty; // entry dirty bool lock; // entry locked tag_t tag; // tag of the entry copy_t copies; // vector of copies DirectoryEntry() { valid = false; dirty = false; lock = false; tag = 0; copies = 0; } DirectoryEntry(const DirectoryEntry &source) { valid = source.valid; dirty = source.dirty; tag = source.tag; lock = source.lock; copies = source.copies; } ///////////////////////////////////////////////////////////////////// // The init() function initializes the entry ///////////////////////////////////////////////////////////////////// void init() { valid = false; dirty = false; lock = false; } ///////////////////////////////////////////////////////////////////// // The copy() function copies an existing source entry to a target ///////////////////////////////////////////////////////////////////// void copy(const DirectoryEntry &source) { valid = source.valid; dirty = source.dirty; tag = source.tag; lock = source.lock; copies = source.copies; } //////////////////////////////////////////////////////////////////// // The print() function prints the entry //////////////////////////////////////////////////////////////////// void print() { std::cout << "Valid = " << valid << " ; Dirty = " << dirty << " ; Lock = " << lock << " ; Tag = " << std::hex << tag << " ; copies = " << copies << std::endl; } }; // end class DirectoryEntry //////////////////////////////////////////////////////////////////////// // The directory //////////////////////////////////////////////////////////////////////// class CacheDirectory { typedef uint32_t addr_t; typedef uint32_t data_t; typedef uint32_t tag_t; typedef uint32_t size_t; private: // Directory constants size_t m_ways; size_t m_sets; size_t m_words; size_t m_width; // the directory & lru tables DirectoryEntry **m_dir_tab; LruEntry **m_lru_tab; public: //////////////////////// // Constructor //////////////////////// CacheDirectory( size_t ways, size_t sets, size_t words, size_t address_width) { m_ways = ways; m_sets = sets; m_words = words; m_width = address_width; m_dir_tab = new DirectoryEntry*[sets]; for ( size_t i=0; i> (L2(m_words) + 2)) & (m_sets - 1); const tag_t tag = (tag_t)(address >> (L2(m_sets) + L2(m_words) + 2)); #undef L2 bool hit = false; for ( size_t i=0 ; i