Deleted Added
sdiff udiff text old ( 6145:15cca6ab723a ) new ( 6151:bc6b84108443 )
full compact
1
2/*
3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright

--- 599 unchanged lines hidden (view full) ---

608 g_system_ptr->getProfiler()->swPrefetchLatency(miss_latency, type, respondingMach);
609 return; // Ignore the software prefetch, don't callback the driver
610 }
611
612 // Profile the miss latency for all non-zero demand misses
613 if (miss_latency != 0) {
614 g_system_ptr->getProfiler()->missLatency(miss_latency, type, respondingMach);
615
616 #if 0
617 uinteger_t tick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick"));
618 uinteger_t tick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick_cmpr"));
619 uinteger_t stick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick"));
620 uinteger_t stick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick_cmpr"));
621 cout << "END PROC " << m_version << hex << " tick = " << tick << " tick_cmpr = " << tick_cmpr << " stick = " << stick << " stick_cmpr = " << stick_cmpr << " cycle = "<< g_eventQueue_ptr->getTime() << dec << endl;
622 #endif
623
624 }
625
626 bool write =
627 (type == CacheRequestType_ST) ||
628 (type == CacheRequestType_ST_XACT) ||
629 (type == CacheRequestType_LDX_XACT) ||
630 (type == CacheRequestType_ATOMIC);

--- 148 unchanged lines hidden (view full) ---

779}
780
781void Sequencer::printDebug(){
782 //notify driver of debug
783 g_system_ptr->getDriver()->printDebug();
784}
785
786// Returns true if the sequencer already has a load or store outstanding
787bool Sequencer::isReady(const CacheMsg& request) const {
788
789 if (m_outstanding_count >= g_SEQUENCER_OUTSTANDING_REQUESTS) {
790 //cout << "TOO MANY OUTSTANDING: " << m_outstanding_count << " " << g_SEQUENCER_OUTSTANDING_REQUESTS << " VER " << m_version << endl;
791 //printProgress(cout);
792 return false;
793 }
794 int thread = request.getThreadID();
795
796 // This code allows reads to be performed even when we have a write
797 // request outstanding for the line
798 bool write =
799 (request.getType() == CacheRequestType_ST) ||
800 (request.getType() == CacheRequestType_ST_XACT) ||
801 (request.getType() == CacheRequestType_LDX_XACT) ||
802 (request.getType() == CacheRequestType_ATOMIC);

--- 12 unchanged lines hidden (view full) ---

815
816 if (TSO) {
817 return m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->isReady();
818 }
819 return true;
820}
821
822// Called by Driver (Simics or Tester).
823void Sequencer::makeRequest(const CacheMsg& request) {
824 //assert(isReady(request));
825 bool write = (request.getType() == CacheRequestType_ST) ||
826 (request.getType() == CacheRequestType_ST_XACT) ||
827 (request.getType() == CacheRequestType_LDX_XACT) ||
828 (request.getType() == CacheRequestType_ATOMIC);
829
830 if (TSO && (request.getPrefetch() == PrefetchBit_No) && write) {
831 assert(m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->isReady());
832 m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->insertStore(request);

--- 19 unchanged lines hidden (view full) ---

852 data_ptr);
853
854 if (hit && (request.getType() == CacheRequestType_IFETCH || !REMOVE_SINGLE_CYCLE_DCACHE_FAST_PATH) ) {
855 DEBUG_MSG(SEQUENCER_COMP, MedPrio, "Fast path hit");
856 hitCallback(request, *data_ptr, GenericMachineType_L1Cache, thread);
857 return true;
858 }
859
860 #if 0
861 uinteger_t tick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick"));
862 uinteger_t tick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick_cmpr"));
863 uinteger_t stick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick"));
864 uinteger_t stick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick_cmpr"));
865 cout << "START PROC " << m_version << hex << " tick = " << tick << " tick_cmpr = " << tick_cmpr << " stick = " << stick << " stick_cmpr = " << stick_cmpr << " cycle = "<< g_eventQueue_ptr->getTime() << dec << endl;;
866 #endif
867
868 if (TSO && (request.getType() == CacheRequestType_LD || request.getType() == CacheRequestType_IFETCH)) {
869
870 // See if we can satisfy the load entirely from the store buffer
871 SubBlock subblock(line_address(request.getAddress()), request.getSize());
872 if (m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->trySubBlock(subblock)) {
873 DataBlock dummy;
874 hitCallback(request, dummy, GenericMachineType_NULL, thread); // Call with an 'empty' datablock, since the data is in the store buffer

--- 165 unchanged lines hidden (view full) ---

1040 n->m_L1Cache_L1IcacheMemory_vec[m_version]->getMemoryValue(addr, value, size_in_bytes);
1041 found = true;
1042 } else if (n->m_L1Cache_L1DcacheMemory_vec[m_version]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){
1043 n->m_L1Cache_L1DcacheMemory_vec[m_version]->getMemoryValue(addr, value, size_in_bytes);
1044 found = true;
1045 } else if (Protocol::m_CMP && n->m_L2Cache_L2cacheMemory_vec[l2_ver]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){
1046 n->m_L2Cache_L2cacheMemory_vec[l2_ver]->getMemoryValue(addr, value, size_in_bytes);
1047 found = true;
1048 // } else if (n->TBE_TABLE_MEMBER_VARIABLE->isPresent(lineAddr)){
1049// ASSERT(n->TBE_TABLE_MEMBER_VARIABLE->isPresent(lineAddr));
1050// L1Cache_TBE tbeEntry = n->TBE_TABLE_MEMBER_VARIABLE->lookup(lineAddr);
1051
1052// int offset = addr.getOffset();
1053// for(int i=0; i1054// value[i] = tbeEntry.getDataBlk().getByte(offset + i);
1055// }
1056
1057// found = true;
1058 } else {
1059 // Address not found
1060 //cout << " " << m_chip_ptr->getID() << " NOT IN CACHE, Value at Directory is: " << (int) value[0] << endl;
1061 n = dynamic_cast<Chip*>(g_system_ptr->getChip(map_Address_to_DirectoryNode(addr)/RubyConfig::numberOfDirectoryPerChip()));
1062 int dir_version = map_Address_to_DirectoryNode(addr)%RubyConfig::numberOfDirectoryPerChip();
1063 for(unsigned int i=0; i<size_in_bytes; ++i){
1064 int offset = addr.getOffset();
1065 value[i] = n->m_Directory_directory_vec[dir_version]->lookup(lineAddr).m_DataBlk.getByte(offset + i);

--- 27 unchanged lines hidden (view full) ---

1093 int l2_ver = l2_mach.num%RubyConfig::numberOfL2CachePerChip();
1094 // LUKE - use variable names instead of macros
1095 //cout << "number of L2caches per chip = " << RubyConfig::numberOfL2CachePerChip(m_version) << endl;
1096 //cout << "L1I cache vec size = " << n->m_L1Cache_L1IcacheMemory_vec.size() << endl;
1097 //cout << "L1D cache vec size = " << n->m_L1Cache_L1DcacheMemory_vec.size() << endl;
1098 //cout << "L1cache_cachememory size = " << n->m_L1Cache_cacheMemory_vec.size() << endl;
1099 //cout << "L1cache_l2cachememory size = " << n->m_L1Cache_L2cacheMemory_vec.size() << endl;
1100 // if (Protocol::m_TwoLevelCache) {
1101// if(Protocol::m_CMP){
1102// cout << "CMP L2 cache vec size = " << n->m_L2Cache_L2cacheMemory_vec.size() << endl;
1103// }
1104// else{
1105// cout << "L2 cache vec size = " << n->m_L1Cache_cacheMemory_vec.size() << endl;
1106// }
1107// }
1108
1109 assert(n->m_L1Cache_L1IcacheMemory_vec[m_version] != NULL);
1110 assert(n->m_L1Cache_L1DcacheMemory_vec[m_version] != NULL);
1111 if (Protocol::m_TwoLevelCache) {
1112 if(Protocol::m_CMP){
1113 assert(n->m_L2Cache_L2cacheMemory_vec[l2_ver] != NULL);
1114 }
1115 else{

--- 5 unchanged lines hidden (view full) ---

1121 n->m_L1Cache_L1IcacheMemory_vec[m_version]->setMemoryValue(addr, value, size_in_bytes);
1122 found = true;
1123 } else if (n->m_L1Cache_L1DcacheMemory_vec[m_version]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){
1124 n->m_L1Cache_L1DcacheMemory_vec[m_version]->setMemoryValue(addr, value, size_in_bytes);
1125 found = true;
1126 } else if (Protocol::m_CMP && n->m_L2Cache_L2cacheMemory_vec[l2_ver]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){
1127 n->m_L2Cache_L2cacheMemory_vec[l2_ver]->setMemoryValue(addr, value, size_in_bytes);
1128 found = true;
1129 // } else if (n->TBE_TABLE_MEMBER_VARIABLE->isTagPresent(lineAddr)){
1130// L1Cache_TBE& tbeEntry = n->TBE_TABLE_MEMBER_VARIABLE->lookup(lineAddr);
1131// DataBlock tmpData;
1132// int offset = addr.getOffset();
1133// for(int i=0; i1134// tmpData.setByte(offset + i, value[i]);
1135// }
1136// tbeEntry.setDataBlk(tmpData);
1137// tbeEntry.setDirty(true);
1138 } else {
1139 // Address not found
1140 n = dynamic_cast<Chip*>(g_system_ptr->getChip(map_Address_to_DirectoryNode(addr)/RubyConfig::numberOfDirectoryPerChip()));
1141 int dir_version = map_Address_to_DirectoryNode(addr)%RubyConfig::numberOfDirectoryPerChip();
1142 for(unsigned int i=0; i<size_in_bytes; ++i){
1143 int offset = addr.getOffset();
1144 n->m_Directory_directory_vec[dir_version]->lookup(lineAddr).m_DataBlk.setByte(offset + i, value[i]);
1145 }

--- 16 unchanged lines hidden ---