Ignore:
Timestamp:
Aug 20, 2013, 2:13:08 PM (11 years ago)
Author:
devigne
Message:

Merge with the lastest version of trunk

Location:
branches/ODCCP/modules/vci_mem_cache
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/ODCCP/modules/vci_mem_cache

  • branches/ODCCP/modules/vci_mem_cache/caba/source/include/mem_cache_directory.h

    r460 r494  
    66#include <cassert>
    77#include "arithmetics.h"
    8 
    9 // !!!
    10 // The L1_MULTI_CACHE mechanism does no longer work with the new pktid encoding
    11 // of TSAR. Turning the define below to a non null value will cause the memcache
    12 // to behave in an unpredicted way.
    13 // TODO Either remove the mechanism from the mem cache or update its behaviour.
    14 
    15 #define L1_MULTI_CACHE 0
    168
    179//#define RANDOM_EVICTION
     
    4638      bool      inst;       // Is the owner an ICache ?
    4739      size_t    srcid;      // The SRCID of the owner
    48 #if L1_MULTI_CACHE
    49       size_t    cache_id;   // In multi_cache configuration
    50 #endif
    5140
    5241    ////////////////////////
    5342    // Constructors
    5443    ////////////////////////
    55       Owner(bool   i_inst
    56             ,size_t i_srcid
    57 #if L1_MULTI_CACHE
    58             ,size_t i_cache_id
    59 #endif
    60             ){
     44      Owner(bool   i_inst,
     45            size_t i_srcid)
     46      {
    6147        inst    = i_inst;
    6248        srcid   = i_srcid;
    63 #if L1_MULTI_CACHE
    64         cache_id= i_cache_id;
    65 #endif
    66       }
    67 
    68       Owner(const Owner &a){
     49      }
     50
     51      Owner(const Owner &a)
     52      {
    6953        inst    = a.inst;
    7054        srcid   = a.srcid;
    71 #if L1_MULTI_CACHE
    72         cache_id= a.cache_id;
    73 #endif
    74       }
    75 
    76       Owner(){
     55      }
     56
     57      Owner()
     58      {
    7759        inst    = false;
    7860        srcid   = 0;
    79 #if L1_MULTI_CACHE
    80         cache_id= 0;
    81 #endif
    8261      }
    8362      // end constructors
     
    11695      owner.inst    = 0;
    11796      owner.srcid   = 0;
    118 #if L1_MULTI_CACHE
    119       owner.cache_id= 0;
    120 #endif
    12197      ptr           = 0;
    12298    }
     
    176152                << " ; Count = " << count
    177153                << " ; Owner = " << owner.srcid
    178 #if L1_MULTI_CACHE
    179                 << "." << owner.cache_id
    180 #endif
    181154                << " " << owner.inst
    182155                << " ; Pointer = " << ptr << std::endl;
     
    327300    // - entry : the entry value
    328301    /////////////////////////////////////////////////////////////////////
    329     void write(const size_t &set, const size_t &way, const DirectoryEntry &entry)
     302    void write( const size_t         &set,
     303                const size_t         &way,
     304                const DirectoryEntry &entry)
    330305    {
    331306      assert( (set<m_sets)
     
    373348    DirectoryEntry select(const size_t &set, size_t &way)
    374349    {
    375       assert( (set < m_sets)
     350        assert( (set < m_sets)
    376351          && "Cache Directory : (select) The set index is invalid");
    377352
    378       for(size_t i=0; i<m_ways; i++){
    379         if(!m_dir_tab[set][i].valid){
    380           way=i;
    381           return DirectoryEntry(m_dir_tab[set][way]);
     353        // looking for an empty slot
     354        for(size_t i=0; i<m_ways; i++)
     355        {
     356            if( not m_dir_tab[set][i].valid )
     357            {
     358                way=i;
     359                return DirectoryEntry(m_dir_tab[set][way]);
     360            }
    382361        }
    383       }
    384362
    385363#ifdef RANDOM_EVICTION
    386       lfsr = (lfsr >> 1) ^ ((-(lfsr & 1)) & 0xd0000001);
    387       way = lfsr % m_ways;
    388       return DirectoryEntry(m_dir_tab[set][way]);
     364        lfsr = (lfsr >> 1) ^ ((-(lfsr & 1)) & 0xd0000001);
     365        way = lfsr % m_ways;
     366        return DirectoryEntry(m_dir_tab[set][way]);
    389367#endif
    390368
    391       for(size_t i=0; i<m_ways; i++){
    392         if(!(m_lru_tab[set][i].recent) && !(m_dir_tab[set][i].lock)){
    393           way=i;
    394           return DirectoryEntry(m_dir_tab[set][way]);
     369        // looking for a not locked and not recently used entry
     370        for(size_t i=0; i<m_ways; i++)
     371        {
     372            if((not m_lru_tab[set][i].recent) && (not m_dir_tab[set][i].lock) )
     373            {
     374                way=i;
     375                return DirectoryEntry(m_dir_tab[set][way]);
     376            }
    395377        }
    396       }
    397       for(size_t i=0; i<m_ways; i++){
    398         if( !(m_lru_tab[set][i].recent) && (m_dir_tab[set][i].lock)){
    399           way=i;
    400           return DirectoryEntry(m_dir_tab[set][way]);
     378
     379        // looking for a locked not recently used entry
     380        for(size_t i=0; i<m_ways; i++)
     381        {
     382            if( (not m_lru_tab[set][i].recent) && (m_dir_tab[set][i].lock))
     383            {
     384                way=i;
     385                return DirectoryEntry(m_dir_tab[set][way]);
     386            }
    401387        }
    402       }
    403       for(size_t i=0; i<m_ways; i++){
    404         if( (m_lru_tab[set][i].recent) && !(m_dir_tab[set][i].lock)){
    405           way=i;
    406           return DirectoryEntry(m_dir_tab[set][way]);
     388
     389        // looking for a recently used entry not locked
     390        for(size_t i=0; i<m_ways; i++)
     391        {
     392            if( (m_lru_tab[set][i].recent) && (not m_dir_tab[set][i].lock))
     393            {
     394                way=i;
     395                return DirectoryEntry(m_dir_tab[set][way]);
     396            }
    407397        }
    408       }
    409       way = 0;
    410       return DirectoryEntry(m_dir_tab[set][0]);
     398
     399        // select way 0 (even if entry is locked and recently used)
     400        way = 0;
     401        return DirectoryEntry(m_dir_tab[set][0]);
    411402    } // end select()
    412403
     
    442433    ////////////////////////
    443434      HeapEntry()
    444       :owner(false,0
    445 #if L1_MULTI_CACHE
    446              ,0
    447 #endif
    448              )
     435      :owner(false,0)
    449436      {
    450437        next = 0;
     
    454441    // Constructor
    455442    ////////////////////////
    456       HeapEntry(const HeapEntry &entry){
     443      HeapEntry(const HeapEntry &entry)
     444      {
    457445        owner.inst  = entry.owner.inst;
    458446        owner.srcid = entry.owner.srcid;
    459 #if L1_MULTI_CACHE
    460         owner.cache_id = entry.owner.cache_id;
    461 #endif       
    462447        next           = entry.next;
    463448      } // end constructor
     
    466451    // The copy() function copies an existing source entry to a target
    467452    /////////////////////////////////////////////////////////////////////
    468       void copy(const HeapEntry &entry){
     453      void copy(const HeapEntry &entry)
     454      {
    469455        owner.inst     = entry.owner.inst;
    470456        owner.srcid    = entry.owner.srcid;
    471 #if L1_MULTI_CACHE
    472         owner.cache_id = entry.owner.cache_id;
    473 #endif
    474457        next           = entry.next;
    475458      } // end copy()
     
    482465        << " -- owner.inst     : " << std::dec << owner.inst << std::endl
    483466        << " -- owner.srcid    : " << std::dec << owner.srcid << std::endl
    484 #if L1_MULTI_CACHE
    485         << " -- owner.cache_id : " << std::dec << owner.cache_id << std::endl
    486 #endif
    487467        << " -- next           : " << std::dec << next << std::endl;
    488468
     
    645625  //                        Cache Data
    646626  ////////////////////////////////////////////////////////////////////////
    647   class CacheData {
     627  class CacheData
     628  {
    648629    private:
    649630      const uint32_t m_sets;
     
    655636    public:
    656637
     638      ///////////////////////////////////////////////////////
    657639      CacheData(uint32_t ways, uint32_t sets, uint32_t words)
    658         : m_sets(sets), m_ways(ways), m_words(words) {
    659 
     640        : m_sets(sets), m_ways(ways), m_words(words)
     641      {
    660642          m_cache_data = new uint32_t ** [ways];
    661           for ( size_t i=0 ; i < ways ; i++ ) {
    662             m_cache_data[i] = new uint32_t * [sets];
     643          for ( size_t i=0 ; i < ways ; i++ )
     644          {
     645              m_cache_data[i] = new uint32_t * [sets];
    663646          }
    664           for ( size_t i=0; i<ways; i++ ) {
    665             for ( size_t j=0; j<sets; j++ ) {
    666               m_cache_data[i][j] = new uint32_t [words];
    667             }
     647          for ( size_t i=0; i<ways; i++ )
     648          {
     649              for ( size_t j=0; j<sets; j++ )
     650              {
     651                  m_cache_data[i][j] = new uint32_t [words];
     652              }
    668653          }
    669         }
    670 
    671       ~CacheData() {
    672           for(size_t i=0; i<m_ways ; i++){
    673               for(size_t j=0; j<m_sets ; j++){
     654      }
     655      ////////////
     656      ~CacheData()
     657      {
     658          for(size_t i=0; i<m_ways ; i++)
     659          {
     660              for(size_t j=0; j<m_sets ; j++)
     661              {
    674662                  delete [] m_cache_data[i][j];
    675663              }
    676664          }
    677           for(size_t i=0; i<m_ways ; i++){
     665          for(size_t i=0; i<m_ways ; i++)
     666          {
    678667              delete [] m_cache_data[i];
    679668          }
    680669          delete [] m_cache_data;
    681670      }
    682 
    683       uint32_t read (
    684           const uint32_t &way,
    685           const uint32_t &set,
    686           const uint32_t &word) const {
    687 
    688         assert((set  < m_sets ) && "Cache data error: Trying to read a wrong set" );
    689         assert((way  < m_ways ) && "Cache data error: Trying to read a wrong way" );
    690         assert((word < m_words) && "Cache data error: Trying to read a wrong word");
    691 
    692         return m_cache_data[way][set][word];
    693       }
    694 
    695       void read_line(
    696           const uint32_t &way,
    697           const uint32_t &set,
    698           sc_core::sc_signal<uint32_t> * cache_line)
    699       {
    700         assert((set < m_sets ) && "Cache data error: Trying to read a wrong set" );
    701         assert((way < m_ways ) && "Cache data error: Trying to read a wrong way" );
    702 
    703         for (uint32_t word=0; word<m_words; word++)
    704           cache_line[word].write(m_cache_data[way][set][word]);
    705       }
    706 
    707       void write (
    708           const uint32_t &way,
    709           const uint32_t &set,
    710           const uint32_t &word,
    711           const uint32_t &data,
    712           const uint32_t &be = 0xF) {
    713 
    714         assert((set  < m_sets ) && "Cache data error: Trying to write a wrong set" );
    715         assert((way  < m_ways ) && "Cache data error: Trying to write a wrong way" );
    716         assert((word < m_words) && "Cache data error: Trying to write a wrong word");
    717         assert((be  <= 0xF    ) && "Cache data error: Trying to write a wrong word cell");
    718 
    719         if (be == 0x0) return;
    720 
    721         if (be == 0xF) {
    722             m_cache_data[way][set][word] = data;
    723             return;
    724         }
    725 
    726         uint32_t mask = 0;
    727         if  (be & 0x1) mask = mask | 0x000000FF;
    728         if  (be & 0x2) mask = mask | 0x0000FF00;
    729         if  (be & 0x4) mask = mask | 0x00FF0000;
    730         if  (be & 0x8) mask = mask | 0xFF000000;
    731 
    732         m_cache_data[way][set][word] =
    733           (data & mask) | (m_cache_data[way][set][word] & ~mask);
     671      //////////////////////////////////////////
     672      uint32_t read ( const uint32_t &way,
     673                      const uint32_t &set,
     674                      const uint32_t &word) const
     675      {
     676          assert((set  < m_sets ) && "Cache data error: Trying to read a wrong set" );
     677          assert((way  < m_ways ) && "Cache data error: Trying to read a wrong way" );
     678          assert((word < m_words) && "Cache data error: Trying to read a wrong word");
     679
     680          return m_cache_data[way][set][word];
     681      }
     682      //////////////////////////////////////////
     683      void read_line( const uint32_t &way,
     684                      const uint32_t &set,
     685                      sc_core::sc_signal<uint32_t> * cache_line)
     686      {
     687          assert((set < m_sets ) && "Cache data error: Trying to read a wrong set" );
     688          assert((way < m_ways ) && "Cache data error: Trying to read a wrong way" );
     689
     690          for (uint32_t word=0; word<m_words; word++)
     691              cache_line[word].write(m_cache_data[way][set][word]);
     692      }
     693      /////////////////////////////////////////
     694      void write ( const uint32_t &way,
     695                   const uint32_t &set,
     696                   const uint32_t &word,
     697                   const uint32_t &data,
     698                   const uint32_t &be = 0xF)
     699      {
     700
     701          assert((set  < m_sets ) && "Cache data error: Trying to write a wrong set" );
     702          assert((way  < m_ways ) && "Cache data error: Trying to write a wrong way" );
     703          assert((word < m_words) && "Cache data error: Trying to write a wrong word");
     704          assert((be  <= 0xF    ) && "Cache data error: Trying to write a wrong be");
     705
     706          if (be == 0x0) return;
     707
     708          if (be == 0xF)
     709          {
     710              m_cache_data[way][set][word] = data;
     711              return;
     712          }
     713
     714          uint32_t mask = 0;
     715          if  (be & 0x1) mask = mask | 0x000000FF;
     716          if  (be & 0x2) mask = mask | 0x0000FF00;
     717          if  (be & 0x4) mask = mask | 0x00FF0000;
     718          if  (be & 0x8) mask = mask | 0xFF000000;
     719
     720          m_cache_data[way][set][word] =
     721              (data & mask) | (m_cache_data[way][set][word] & ~mask);
    734722      }
    735723  }; // end class CacheData
Note: See TracChangeset for help on using the changeset viewer.