Changeset 289


Ignore:
Timestamp:
Jan 20, 2013, 7:09:37 PM (11 years ago)
Author:
cfuguet
Message:

Introducing cache data ram with bit masking in the Memory Cache.
The goal of this modifications is the alignment of the SOCLIB model
against the VHDL one.

Due to this new property in the Cache Data of the Memory Cache,
the FSM's of this component do not need to read and then write when
doing a not full word write operation.

Location:
trunk/modules/vci_mem_cache_v4/caba/source
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_mem_cache_v4/caba/source/include/mem_cache_directory_v4.h

    r284 r289  
    620620  }; // end class HeapDirectory
    621621
     622  ////////////////////////////////////////////////////////////////////////
     623  //                        Cache Data
     624  ////////////////////////////////////////////////////////////////////////
     625  class CacheData {
     626    private:
     627      const uint32_t m_sets;
     628      const uint32_t m_ways;
     629      const uint32_t m_words;
     630
     631      uint32_t *** m_cache_data;
     632
     633    public:
     634
     635      CacheData(uint32_t ways, uint32_t sets, uint32_t words)
     636        : m_sets(sets), m_ways(ways), m_words(words) {
     637
     638          m_cache_data = new uint32_t ** [ways];
     639          for ( size_t i=0 ; i < ways ; i++ ) {
     640            m_cache_data[i] = new uint32_t * [sets];
     641          }
     642          for ( size_t i=0; i<ways; i++ ) {
     643            for ( size_t j=0; j<sets; j++ ) {
     644              m_cache_data[i][j] = new uint32_t [words];
     645            }
     646          }
     647        }
     648
     649      ~CacheData() {
     650          for(size_t i=0; i<m_ways ; i++){
     651              for(size_t j=0; j<m_sets ; j++){
     652                  delete [] m_cache_data[i][j];
     653              }
     654          }
     655          for(size_t i=0; i<m_ways ; i++){
     656              delete [] m_cache_data[i];
     657          }
     658          delete [] m_cache_data;
     659      }
     660
     661      uint32_t read (
     662          const uint32_t &way,
     663          const uint32_t &set,
     664          const uint32_t &word) const {
     665
     666        assert((set  < m_sets ) && "Cache data error: Trying to read a wrong set" );
     667        assert((way  < m_ways ) && "Cache data error: Trying to read a wrong way" );
     668        assert((word < m_words) && "Cache data error: Trying to read a wrong word");
     669
     670        return m_cache_data[way][set][word];
     671      }
     672
     673      void read_line(
     674          const uint32_t &way,
     675          const uint32_t &set,
     676          sc_core::sc_signal<uint32_t> * cache_line)
     677      {
     678        assert((set < m_sets ) && "Cache data error: Trying to read a wrong set" );
     679        assert((way < m_ways ) && "Cache data error: Trying to read a wrong way" );
     680     
     681        for (uint32_t word=0; word<m_words; word++)
     682          cache_line[word].write(m_cache_data[way][set][word]);
     683      }
     684
     685      void write (
     686          const uint32_t &way,
     687          const uint32_t &set,
     688          const uint32_t &word,
     689          const uint32_t &data,
     690          const uint32_t &be = 0xF) {
     691
     692        assert((set  < m_sets ) && "Cache data error: Trying to write a wrong set" );
     693        assert((way  < m_ways ) && "Cache data error: Trying to write a wrong way" );
     694        assert((word < m_words) && "Cache data error: Trying to write a wrong word");
     695        assert((be  <= 0xF    ) && "Cache data error: Trying to write a wrong word cell");
     696
     697        if (be == 0x0) return;
     698
     699        if (be == 0xF) {
     700            m_cache_data[way][set][word] = data;
     701            return;
     702        }
     703
     704        uint32_t mask = 0;
     705        if  (be & 0x1) mask = mask | 0x000000FF;
     706        if  (be & 0x2) mask = mask | 0x0000FF00;
     707        if  (be & 0x4) mask = mask | 0x00FF0000;
     708        if  (be & 0x8) mask = mask | 0xFF000000;
     709
     710        m_cache_data[way][set][word] =
     711          (data & mask) | (m_cache_data[way][set][word] & ~mask);
     712      }
     713  }; // end class CacheData
    622714
    623715}} // end namespaces
  • trunk/modules/vci_mem_cache_v4/caba/source/include/vci_mem_cache_v4.h

    r284 r289  
    420420      UpdateTab       m_update_tab;       // pending update & invalidate
    421421      CacheDirectory  m_cache_directory;  // data cache directory
     422      CacheData       m_cache_data;       // data array[set][way][word]
    422423      HeapDirectory   m_heap;             // heap for copies
    423 
    424       data_t      *** m_cache_data;       // data array[set][way][word]
    425424
    426425      // adress masks
  • trunk/modules/vci_mem_cache_v4/caba/source/src/vci_mem_cache_v4.cpp

    r284 r289  
    276276    p_vci_ixr("vci_ixr"),
    277277
     278    m_seglist(mtp.getSegmentList(vci_tgt_index)),
     279    m_cseglist(mtc.getSegmentList(vci_tgt_index_cleanup)),
     280
    278281    m_initiators( 1 << vci_param::S ),
    279282    m_heap_size( heap_size ),
     
    283286    m_srcid_ixr( mtx.indexForId(vci_ixr_index) ),
    284287    m_srcid_ini( mtc.indexForId(vci_ini_index) ),
    285     m_seglist(mtp.getSegmentList(vci_tgt_index)),
    286     m_cseglist(mtc.getSegmentList(vci_tgt_index_cleanup)),
    287288    m_transaction_tab_lines(transaction_tab_lines),
    288289    m_transaction_tab( transaction_tab_lines, nwords ),
     
    290291    m_update_tab( update_tab_lines ),
    291292    m_cache_directory( nways, nsets, nwords, vci_param::N ),
     293    m_cache_data( nways, nsets, nwords ),
    292294    m_heap( m_heap_size ),
    293295
     
    409411          m_cseg[i] = &(*seg);
    410412          i++;
    411       }
    412 
    413       // Memory cache allocation & initialisation
    414       m_cache_data = new data_t**[nways];
    415       for ( size_t i=0 ; i<nways ; ++i ) {
    416         m_cache_data[i] = new data_t*[nsets];
    417       }
    418       for ( size_t i=0; i<nways; ++i ) {
    419         for ( size_t j=0; j<nsets; ++j ) {
    420           m_cache_data[i][j] = new data_t[nwords];
    421           for ( size_t k=0; k<nwords; k++){
    422             m_cache_data[i][j][k]=0;
    423           }
    424         }
    425413      }
    426414
     
    558546    /////////////////////////////////
    559547  {
    560     for(size_t i=0; i<m_ways ; i++){
    561       for(size_t j=0; j<m_sets ; j++){
    562         delete [] m_cache_data[i][j];
    563       }
    564     }
    565     for(size_t i=0; i<m_ways ; i++){
    566       delete [] m_cache_data[i];
    567     }
    568     delete [] m_cache_data;
    569 
    570548    delete [] r_ixr_rsp_to_xram_rsp_rok;
    571549
     
    13181296        size_t set        = m_y[(vci_addr_t)(m_cmd_read_addr_fifo.read())];
    13191297        size_t way        = r_read_way.read();
    1320         for ( size_t i=0 ; i<m_words ; i++ ) r_read_data[i] = m_cache_data[way][set][i];
     1298
     1299        m_cache_data.read_line(way, set, r_read_data);
    13211300
    13221301        // update the cache directory
     
    14121391        size_t set = m_y[(vci_addr_t)(m_cmd_read_addr_fifo.read())];
    14131392        size_t way = r_read_way.read();
    1414         for ( size_t i=0 ; i<m_words ; i++ ) r_read_data[i] = m_cache_data[way][set][i];
     1393
     1394        m_cache_data.read_line(way, set, r_read_data);
    14151395
    14161396        // update the cache directory
     
    17891769
    17901770        // initialize the be field for all words
    1791         for ( size_t i=0 ; i<m_words ; i++ )
    1792         {
    1793           if ( i == index ) r_write_be[i] = m_cmd_write_be_fifo.read();
    1794           else              r_write_be[i] = 0x0;
    1795         }
    1796 
    1797         if( !((m_cmd_write_be_fifo.read() == 0x0)||(m_cmd_write_be_fifo.read() == 0xF)) )
    1798           r_write_byte = true;
    1799         else
    1800           r_write_byte = false;
     1771        for ( size_t word=0 ; word<m_words ; word++ )
     1772        {
     1773          if ( word == index ) r_write_be[word] = m_cmd_write_be_fifo.read();
     1774          else                 r_write_be[word] = 0x0;
     1775        }
    18011776
    18021777        if( m_cmd_write_eop_fifo.read() )
     
    18541829        r_write_data[index] = m_cmd_write_data_fifo.read();
    18551830        r_write_word_count  = r_write_word_count.read() + 1;
    1856 
    1857         if( !((m_cmd_write_be_fifo.read() == 0x0)||(m_cmd_write_be_fifo.read() == 0xF)) )
    1858           r_write_byte = true;
    18591831
    18601832        if ( m_cmd_write_eop_fifo.read() )
     
    19171889          else
    19181890          {
    1919             if (r_write_byte.read())
    1920             {
    1921               r_write_fsm = WRITE_DIR_READ;
    1922             }
    1923             else
    1924             {
    1925               r_write_fsm = WRITE_DIR_HIT;
    1926             }
     1891            r_write_fsm = WRITE_DIR_HIT;
    19271892          }
    19281893        }
     
    19611926      size_t set  = m_y[(vci_addr_t)(r_write_address.read())];
    19621927      size_t way  = r_write_way.read();
    1963       for(size_t i=0 ; i<m_words ; i++)
     1928      for(size_t word=0 ; word<m_words ; word++)
    19641929      {
    19651930        data_t mask = 0;
    1966         if  (r_write_be[i].read() & 0x1) mask = mask | 0x000000FF;
    1967         if  (r_write_be[i].read() & 0x2) mask = mask | 0x0000FF00;
    1968         if  (r_write_be[i].read() & 0x4) mask = mask | 0x00FF0000;
    1969         if  (r_write_be[i].read() & 0x8) mask = mask | 0xFF000000;
     1931        if  (r_write_be[word].read() & 0x1) mask = mask | 0x000000FF;
     1932        if  (r_write_be[word].read() & 0x2) mask = mask | 0x0000FF00;
     1933        if  (r_write_be[word].read() & 0x4) mask = mask | 0x00FF0000;
     1934        if  (r_write_be[word].read() & 0x8) mask = mask | 0xFF000000;
    19701935
    19711936        // complete only if mask is not null (for energy consumption)
    1972         if ( r_write_be[i].read() || r_write_is_cnt.read() )
    1973         {
    1974           r_write_data[i]  = (r_write_data[i].read() & mask) |
    1975             (m_cache_data[way][set][i] & ~mask);
    1976         }
     1937        r_write_data[word]  = (r_write_data[word].read() & mask) |
     1938          (m_cache_data.read(way, set, word) & ~mask);
     1939
    19771940      } // end for
    19781941
    19791942      // test if a coherence broadcast is required
    1980       if( r_write_is_cnt.read() && r_write_count.read() )
    1981       {
    1982         r_write_fsm = WRITE_BC_TRT_LOCK;
    1983       }
    1984       else
    1985       {
    1986         r_write_fsm = WRITE_DIR_HIT;
    1987       }
     1943      r_write_fsm = WRITE_BC_TRT_LOCK;
    19881944
    19891945#if DEBUG_MEMC_WRITE
     
    20341990      if( no_update )
    20351991      {
    2036         for(size_t i=0 ; i<m_words ; i++)
    2037         {
    2038           if  ( r_write_be[i].read() )
     1992        for(size_t word=0 ; word<m_words ; word++)
     1993        {
     1994          m_cache_data.write(way, set, word, r_write_data[word].read(), r_write_be[word].read());
     1995
     1996          if ( m_monitor_ok )
    20391997          {
    2040             m_cache_data[way][set][i]  = r_write_data[i].read();
    2041 
    2042             if ( m_monitor_ok )
    2043             {
    2044               vci_addr_t address = (r_write_address.read() & ~(vci_addr_t)0x3F) | i<<2;
    2045               char buf[80];
    2046               snprintf(buf, 80, "WRITE_DIR_HIT srcid %d", r_write_srcid.read());
    2047               check_monitor( buf, address, r_write_data[i].read() );
    2048             }
     1998            vci_addr_t address = (r_write_address.read() & ~(vci_addr_t)0x3F) | word<<2;
     1999            char buf[80];
     2000            snprintf(buf, 80, "WRITE_DIR_HIT srcid %d", r_write_srcid.read());
     2001            check_monitor( buf, address, r_write_data[word].read() );
    20492002          }
    20502003        }
     
    21222075        if ( wok )    // write data in cache
    21232076        {
    2124           for(size_t i=0 ; i<m_words ; i++)
     2077          for(size_t word=0 ; word<m_words ; word++)
    21252078          {
    2126             if ( r_write_be[i].read() )
    2127             {
    2128               m_cache_data[way][set][i] = r_write_data[i].read();
    2129 
    2130               if ( m_monitor_ok )
    2131               {
    2132                 vci_addr_t address = (r_write_address.read() & ~(vci_addr_t)0x3F) | i<<2;
    2133                 char buf[80];
    2134                 snprintf(buf, 80, "WRITE_UPT_LOCK srcid %d", srcid);
    2135                 check_monitor(buf, address, r_write_data[i].read() );
    2136               }
     2079            m_cache_data.write(way, set, word, r_write_data[word].read(), r_write_be[word].read());
     2080
     2081            if ( m_monitor_ok )
     2082            {
     2083              vci_addr_t address = (r_write_address.read() & ~(vci_addr_t)0x3F) | word<<2;
     2084              char buf[80];
     2085              snprintf(buf, 80, "WRITE_UPT_LOCK srcid %d", srcid);
     2086              check_monitor(buf, address, r_write_data[word].read() );
    21372087            }
    21382088          }
     
    23732323
    23742324          // initialize the be field for all words
    2375           for ( size_t i=0 ; i<m_words ; i++ )
     2325          for ( size_t word=0 ; word<m_words ; word++ )
    23762326          {
    2377             if ( i == index ) r_write_be[i] = m_cmd_write_be_fifo.read();
    2378             else              r_write_be[i] = 0x0;
     2327            if ( word == index ) r_write_be[word] = m_cmd_write_be_fifo.read();
     2328            else                 r_write_be[word] = 0x0;
    23792329          }
    2380 
    2381           if( !((m_cmd_write_be_fifo.read() == 0x0)||(m_cmd_write_be_fifo.read() == 0xF)) )
    2382             r_write_byte = true;
    2383           else
    2384             r_write_byte = false;
    23852330
    23862331          if( m_cmd_write_eop_fifo.read() )
     
    24282373        }
    24292374#endif
    2430         size_t    hit_index = 0;
    2431         size_t    wok_index = 0;
    2432         vci_addr_t  addr      = (vci_addr_t)r_write_address.read();
     2375        size_t  hit_index = 0;
     2376        size_t  wok_index = 0;
     2377        vci_addr_t  addr  = (vci_addr_t)r_write_address.read();
    24332378        bool    hit_read  = m_transaction_tab.hit_read(m_nline[addr], hit_index);
    24342379        bool    hit_write = m_transaction_tab.hit_write(m_nline[addr]);
     
    31123057
    31133058                // copy the victim line in a local buffer
    3114                 for (size_t i=0 ; i<m_words ; i++)
    3115                   r_xram_rsp_victim_data[i] = m_cache_data[way][set][i];
     3059                m_cache_data.read_line(way, set, r_xram_rsp_victim_data);
    31163060
    31173061                r_xram_rsp_victim_copy      = victim.owner.srcid;
     
    32283172            size_t set   = r_xram_rsp_victim_set.read();
    32293173            size_t way   = r_xram_rsp_victim_way.read();
    3230             for(size_t i=0; i<m_words ; i++)
    3231             {
    3232                 m_cache_data[way][set][i] = r_xram_rsp_trt_buf.wdata[i];
     3174            for(size_t word=0; word<m_words ; word++)
     3175            {
     3176                m_cache_data.write(way, set, word, r_xram_rsp_trt_buf.wdata[word]);
    32333177
    32343178                if ( m_monitor_ok )
    32353179                {
    3236                     vci_addr_t address = r_xram_rsp_trt_buf.nline<<6 | i<<2;
    3237                     check_monitor("XRAM_RSP_DIR_UPDT", address, r_xram_rsp_trt_buf.wdata[i]);
     3180                    vci_addr_t address = r_xram_rsp_trt_buf.nline<<6 | word<<2;
     3181                    check_monitor("XRAM_RSP_DIR_UPDT", address, r_xram_rsp_trt_buf.wdata[word]);
    32383182                }
    32393183            }
     
    44134357
    44144358            // read data in cache & check data change
    4415             bool ok = ( r_cas_rdata[0].read() == m_cache_data[way][set][word] );
     4359            bool ok = ( r_cas_rdata[0].read() == m_cache_data.read(way, set, word) );
    44164360            if ( r_cas_cpt.read()==4 )  // 64 bits CAS
    4417                 ok &= ( r_cas_rdata[1] == m_cache_data[way][set][word+1] );
     4361                ok &= ( r_cas_rdata[1] == m_cache_data.read(way, set, word+1));
    44184362
    44194363            // to avoid livelock, force the atomic access to fail pseudo-randomly
     
    44354379    std::cout << "  <MEMC " << name() << ".CAS_DIR_HIT_READ> Test if CAS success:"
    44364380              << " / expected value = " << r_cas_rdata[0].read()
    4437               << " / actual value = " << m_cache_data[way][set][word]
     4381              << " / actual value = " << m_cache_data.read(way, set, word)
    44384382              << " / forced_fail = " << forced_fail << std::endl;
    44394383}
     
    44694413
    44704414                // cache update
    4471                 m_cache_data[way][set][word] = r_cas_wdata.read();
     4415                m_cache_data.write(way, set, word, r_cas_wdata.read());
    44724416                if(r_cas_cpt.read()==4)
    4473                     m_cache_data[way][set][word+1] = m_cmd_cas_wdata_fifo.read();
     4417                    m_cache_data.write(way, set, word+1, m_cmd_cas_wdata_fifo.read());
    44744418
    44754419                // monitor
     
    45304474                    size_t word = m_x[(vci_addr_t)(m_cmd_cas_addr_fifo.read())];
    45314475
    4532                     m_cache_data[way][set][word] = r_cas_wdata.read();
     4476                    m_cache_data.write(way, set, word, r_cas_wdata.read());
    45334477                    if(r_cas_cpt.read()==4)
    4534                         m_cache_data[way][set][word+1] = m_cmd_cas_wdata_fifo.read();
     4478                        m_cache_data.write(way, set, word+1, m_cmd_cas_wdata_fifo.read());
    45354479
    45364480                    // monitor
     
    47144658                        else
    47154659                        {
    4716                             r_cas_to_ixr_cmd_data[i] = m_cache_data[way][set][i];
     4660                            r_cas_to_ixr_cmd_data[i] = m_cache_data.read(way, set, i);
    47174661                        }
    47184662                    }
     
    47684712                    size_t word = m_x[(vci_addr_t)(m_cmd_cas_addr_fifo.read())];
    47694713
    4770                     m_cache_data[way][set][word] = r_cas_wdata.read();
     4714                    m_cache_data.write(way, set, word, r_cas_wdata.read());
    47714715                    if(r_cas_cpt.read()==4)
    4772                         m_cache_data[way][set][word+1] = m_cmd_cas_wdata_fifo.read();
     4716                        m_cache_data.write(way, set, word+1, m_cmd_cas_wdata_fifo.read());
    47734717
    47744718                    // monitor
Note: See TracChangeset for help on using the changeset viewer.