#ifndef SOCLIB_CABA_MEM_CACHE_DIRECTORY_V1_H #define SOCLIB_CABA_MEM_CACHE_DIRECTORY_V1_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 is_cnt; // directory entry is a counter bool dirty; // entry dirty bool lock; // entry locked tag_t tag; // tag of the entry copy_t d_copies; // vector of copies for data copy_t i_copies; // vector of copies for instructions size_t count; // number of copies DirectoryEntry() { valid = false; is_cnt = false; dirty = false; lock = false; tag = 0; d_copies = 0; i_copies = 0; count = 0; } DirectoryEntry(const DirectoryEntry &source) { valid = source.valid; is_cnt = source.is_cnt; dirty = source.dirty; tag = source.tag; lock = source.lock; d_copies = source.d_copies; i_copies = source.i_copies; count = source.count; } ///////////////////////////////////////////////////////////////////// // The init() function initializes the entry ///////////////////////////////////////////////////////////////////// void init() { valid = false; is_cnt= false; dirty = false; lock = false; } ///////////////////////////////////////////////////////////////////// // The copy() function copies an existing source entry to a target ///////////////////////////////////////////////////////////////////// void copy(const DirectoryEntry &source) { valid = source.valid; is_cnt = source.is_cnt; dirty = source.dirty; tag = source.tag; lock = source.lock; d_copies = source.d_copies; i_copies = source.i_copies; count = source.count; } //////////////////////////////////////////////////////////////////// // The print() function prints the entry //////////////////////////////////////////////////////////////////// void print() { std::cout << "Valid = " << valid << " ; IS COUNT = " << is_cnt << " ; Dirty = " << dirty << " ; Lock = " << lock << " ; Tag = " << std::hex << tag << " ; d_copies = " << d_copies << " ; i_copies = " << i_copies << " ; count = " << count << std::endl; } }; // end class DirectoryEntry //////////////////////////////////////////////////////////////////////// // The directory //////////////////////////////////////////////////////////////////////// class CacheDirectory { typedef sc_dt::sc_uint<40> 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