- Timestamp:
- Aug 22, 2013, 6:45:38 PM (11 years ago)
- Location:
- branches/RWT/modules/vci_mem_cache/caba/source/include
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/RWT/modules/vci_mem_cache/caba/source/include
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/branches/ODCCP/modules/vci_mem_cache/caba/source/include merged eligible /branches/v5/modules/vci_mem_cache/caba/source/include 441-467
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
branches/RWT/modules/vci_mem_cache/caba/source/include/mem_cache_directory.h
r477 r495 6 6 #include <cassert> 7 7 #include "arithmetics.h" 8 9 // !!!10 // The L1_MULTI_CACHE mechanism does no longer work with the new pktid encoding11 // of TSAR. Turning the define below to a non null value will cause the memcache12 // 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 016 8 17 9 //#define RANDOM_EVICTION … … 46 38 bool inst; // Is the owner an ICache ? 47 39 size_t srcid; // The SRCID of the owner 48 #if L1_MULTI_CACHE49 size_t cache_id; // In multi_cache configuration50 #endif51 40 52 41 //////////////////////// 53 42 // Constructors 54 43 //////////////////////// 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 { 61 47 inst = i_inst; 62 48 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 { 69 53 inst = a.inst; 70 54 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 { 77 59 inst = false; 78 60 srcid = 0; 79 #if L1_MULTI_CACHE80 cache_id= 0;81 #endif82 61 } 83 62 // end constructors … … 116 95 owner.inst = 0; 117 96 owner.srcid = 0; 118 #if L1_MULTI_CACHE119 owner.cache_id= 0;120 #endif121 97 ptr = 0; 122 98 } … … 177 153 << " ; Count = " << count 178 154 << " ; Owner = " << owner.srcid 179 #if L1_MULTI_CACHE180 << "." << owner.cache_id181 #endif182 155 << " " << owner.inst 183 156 << " ; Pointer = " << ptr << std::endl; … … 328 301 // - entry : the entry value 329 302 ///////////////////////////////////////////////////////////////////// 330 void write(const size_t &set, const size_t &way, const DirectoryEntry &entry) 303 void write( const size_t &set, 304 const size_t &way, 305 const DirectoryEntry &entry) 331 306 { 332 307 assert( (set<m_sets) … … 374 349 DirectoryEntry select(const size_t &set, size_t &way) 375 350 { 376 assert( (set < m_sets)351 assert( (set < m_sets) 377 352 && "Cache Directory : (select) The set index is invalid"); 378 353 379 for(size_t i=0; i<m_ways; i++){ 380 if(!m_dir_tab[set][i].valid){ 381 way=i; 382 return DirectoryEntry(m_dir_tab[set][way]); 354 // looking for an empty slot 355 for(size_t i=0; i<m_ways; i++) 356 { 357 if( not m_dir_tab[set][i].valid ) 358 { 359 way=i; 360 return DirectoryEntry(m_dir_tab[set][way]); 361 } 383 362 } 384 }385 363 386 364 #ifdef RANDOM_EVICTION 387 lfsr = (lfsr >> 1) ^ ((-(lfsr & 1)) & 0xd0000001);388 way = lfsr % m_ways;389 return DirectoryEntry(m_dir_tab[set][way]);365 lfsr = (lfsr >> 1) ^ ((-(lfsr & 1)) & 0xd0000001); 366 way = lfsr % m_ways; 367 return DirectoryEntry(m_dir_tab[set][way]); 390 368 #endif 391 369 392 for(size_t i=0; i<m_ways; i++){ 393 if(!(m_lru_tab[set][i].recent) && !(m_dir_tab[set][i].lock)){ 394 way=i; 395 return DirectoryEntry(m_dir_tab[set][way]); 370 // looking for a not locked and not recently used entry 371 for(size_t i=0; i<m_ways; i++) 372 { 373 if((not m_lru_tab[set][i].recent) && (not m_dir_tab[set][i].lock) ) 374 { 375 way=i; 376 return DirectoryEntry(m_dir_tab[set][way]); 377 } 396 378 } 397 } 398 for(size_t i=0; i<m_ways; i++){ 399 if( !(m_lru_tab[set][i].recent) && (m_dir_tab[set][i].lock)){ 400 way=i; 401 return DirectoryEntry(m_dir_tab[set][way]); 379 380 // looking for a locked not recently used entry 381 for(size_t i=0; i<m_ways; i++) 382 { 383 if( (not m_lru_tab[set][i].recent) && (m_dir_tab[set][i].lock)) 384 { 385 way=i; 386 return DirectoryEntry(m_dir_tab[set][way]); 387 } 402 388 } 403 } 404 for(size_t i=0; i<m_ways; i++){ 405 if( (m_lru_tab[set][i].recent) && !(m_dir_tab[set][i].lock)){ 406 way=i; 407 return DirectoryEntry(m_dir_tab[set][way]); 389 390 // looking for a recently used entry not locked 391 for(size_t i=0; i<m_ways; i++) 392 { 393 if( (m_lru_tab[set][i].recent) && (not m_dir_tab[set][i].lock)) 394 { 395 way=i; 396 return DirectoryEntry(m_dir_tab[set][way]); 397 } 408 398 } 409 } 410 way = 0; 411 return DirectoryEntry(m_dir_tab[set][0]); 399 400 // select way 0 (even if entry is locked and recently used) 401 way = 0; 402 return DirectoryEntry(m_dir_tab[set][0]); 412 403 } // end select() 413 404 … … 443 434 //////////////////////// 444 435 HeapEntry() 445 :owner(false,0 446 #if L1_MULTI_CACHE 447 ,0 448 #endif 449 ) 436 :owner(false,0) 450 437 { 451 438 next = 0; … … 455 442 // Constructor 456 443 //////////////////////// 457 HeapEntry(const HeapEntry &entry){ 444 HeapEntry(const HeapEntry &entry) 445 { 458 446 owner.inst = entry.owner.inst; 459 447 owner.srcid = entry.owner.srcid; 460 #if L1_MULTI_CACHE461 owner.cache_id = entry.owner.cache_id;462 #endif463 448 next = entry.next; 464 449 } // end constructor … … 467 452 // The copy() function copies an existing source entry to a target 468 453 ///////////////////////////////////////////////////////////////////// 469 void copy(const HeapEntry &entry){ 454 void copy(const HeapEntry &entry) 455 { 470 456 owner.inst = entry.owner.inst; 471 457 owner.srcid = entry.owner.srcid; 472 #if L1_MULTI_CACHE473 owner.cache_id = entry.owner.cache_id;474 #endif475 458 next = entry.next; 476 459 } // end copy() … … 483 466 << " -- owner.inst : " << std::dec << owner.inst << std::endl 484 467 << " -- owner.srcid : " << std::dec << owner.srcid << std::endl 485 #if L1_MULTI_CACHE486 << " -- owner.cache_id : " << std::dec << owner.cache_id << std::endl487 #endif488 468 << " -- next : " << std::dec << next << std::endl; 489 469 … … 646 626 // Cache Data 647 627 //////////////////////////////////////////////////////////////////////// 648 class CacheData { 628 class CacheData 629 { 649 630 private: 650 631 const uint32_t m_sets; … … 656 637 public: 657 638 639 /////////////////////////////////////////////////////// 658 640 CacheData(uint32_t ways, uint32_t sets, uint32_t words) 659 : m_sets(sets), m_ways(ways), m_words(words) {660 641 : m_sets(sets), m_ways(ways), m_words(words) 642 { 661 643 m_cache_data = new uint32_t ** [ways]; 662 for ( size_t i=0 ; i < ways ; i++ ) { 663 m_cache_data[i] = new uint32_t * [sets]; 644 for ( size_t i=0 ; i < ways ; i++ ) 645 { 646 m_cache_data[i] = new uint32_t * [sets]; 664 647 } 665 for ( size_t i=0; i<ways; i++ ) { 666 for ( size_t j=0; j<sets; j++ ) { 667 m_cache_data[i][j] = new uint32_t [words]; 668 } 648 for ( size_t i=0; i<ways; i++ ) 649 { 650 for ( size_t j=0; j<sets; j++ ) 651 { 652 m_cache_data[i][j] = new uint32_t [words]; 653 } 669 654 } 670 } 671 672 ~CacheData() { 673 for(size_t i=0; i<m_ways ; i++){ 674 for(size_t j=0; j<m_sets ; j++){ 655 } 656 //////////// 657 ~CacheData() 658 { 659 for(size_t i=0; i<m_ways ; i++) 660 { 661 for(size_t j=0; j<m_sets ; j++) 662 { 675 663 delete [] m_cache_data[i][j]; 676 664 } 677 665 } 678 for(size_t i=0; i<m_ways ; i++){ 666 for(size_t i=0; i<m_ways ; i++) 667 { 679 668 delete [] m_cache_data[i]; 680 669 } 681 670 delete [] m_cache_data; 682 671 } 683 684 uint32_t read ( 685 const uint32_t &way, 686 const uint32_t &set, 687 const uint32_t &word) const { 688 689 assert((set < m_sets ) && "Cache data error: Trying to read a wrong set" ); 690 assert((way < m_ways ) && "Cache data error: Trying to read a wrong way" ); 691 assert((word < m_words) && "Cache data error: Trying to read a wrong word"); 692 693 return m_cache_data[way][set][word]; 694 } 695 696 void read_line( 697 const uint32_t &way, 698 const uint32_t &set, 699 sc_core::sc_signal<uint32_t> * cache_line) 700 { 701 assert((set < m_sets ) && "Cache data error: Trying to read a wrong set" ); 702 assert((way < m_ways ) && "Cache data error: Trying to read a wrong way" ); 703 704 for (uint32_t word=0; word<m_words; word++) 705 cache_line[word].write(m_cache_data[way][set][word]); 706 } 707 708 void write ( 709 const uint32_t &way, 710 const uint32_t &set, 711 const uint32_t &word, 712 const uint32_t &data, 713 const uint32_t &be = 0xF) { 714 715 assert((set < m_sets ) && "Cache data error: Trying to write a wrong set" ); 716 assert((way < m_ways ) && "Cache data error: Trying to write a wrong way" ); 717 assert((word < m_words) && "Cache data error: Trying to write a wrong word"); 718 assert((be <= 0xF ) && "Cache data error: Trying to write a wrong word cell"); 719 720 if (be == 0x0) return; 721 722 if (be == 0xF) { 723 m_cache_data[way][set][word] = data; 724 return; 725 } 726 727 uint32_t mask = 0; 728 if (be & 0x1) mask = mask | 0x000000FF; 729 if (be & 0x2) mask = mask | 0x0000FF00; 730 if (be & 0x4) mask = mask | 0x00FF0000; 731 if (be & 0x8) mask = mask | 0xFF000000; 732 733 m_cache_data[way][set][word] = 734 (data & mask) | (m_cache_data[way][set][word] & ~mask); 672 ////////////////////////////////////////// 673 uint32_t read ( const uint32_t &way, 674 const uint32_t &set, 675 const uint32_t &word) const 676 { 677 assert((set < m_sets ) && "Cache data error: Trying to read a wrong set" ); 678 assert((way < m_ways ) && "Cache data error: Trying to read a wrong way" ); 679 assert((word < m_words) && "Cache data error: Trying to read a wrong word"); 680 681 return m_cache_data[way][set][word]; 682 } 683 ////////////////////////////////////////// 684 void read_line( const uint32_t &way, 685 const uint32_t &set, 686 sc_core::sc_signal<uint32_t> * cache_line) 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 691 for (uint32_t word=0; word<m_words; word++) 692 cache_line[word].write(m_cache_data[way][set][word]); 693 } 694 ///////////////////////////////////////// 695 void write ( const uint32_t &way, 696 const uint32_t &set, 697 const uint32_t &word, 698 const uint32_t &data, 699 const uint32_t &be = 0xF) 700 { 701 702 assert((set < m_sets ) && "Cache data error: Trying to write a wrong set" ); 703 assert((way < m_ways ) && "Cache data error: Trying to write a wrong way" ); 704 assert((word < m_words) && "Cache data error: Trying to write a wrong word"); 705 assert((be <= 0xF ) && "Cache data error: Trying to write a wrong be"); 706 707 if (be == 0x0) return; 708 709 if (be == 0xF) 710 { 711 m_cache_data[way][set][word] = data; 712 return; 713 } 714 715 uint32_t mask = 0; 716 if (be & 0x1) mask = mask | 0x000000FF; 717 if (be & 0x2) mask = mask | 0x0000FF00; 718 if (be & 0x4) mask = mask | 0x00FF0000; 719 if (be & 0x8) mask = mask | 0xFF000000; 720 721 m_cache_data[way][set][word] = 722 (data & mask) | (m_cache_data[way][set][word] & ~mask); 735 723 } 736 724 }; // end class CacheData
Note: See TracChangeset
for help on using the changeset viewer.