Reuse payload extensions.

This commit is contained in:
Lukas Steiner
2020-09-25 11:35:34 +02:00
parent 34175aebc3
commit 2097351050
9 changed files with 148 additions and 70 deletions

View File

@@ -55,13 +55,13 @@ unsigned int AddressDecoder::getUnsignedAttrFromJson(nlohmann::json obj, std::st
else
{
SC_REPORT_FATAL("AddressDecoder", ("Attribute " + strName + " is not a number.").c_str());
return (unsigned)(-1);
return static_cast<unsigned>(-1);
}
}
else
{
SC_REPORT_FATAL("AddressDecoder", ("Attribute " + strName + " is empty or not found.").c_str());
return (unsigned)(-1);
return static_cast<unsigned>(-1);
}
}
@@ -124,15 +124,15 @@ AddressDecoder::AddressDecoder(std::string pathToAddressMapping)
vColumnBits = getAttrToVectorFromJson(mapping,"COLUMN_BIT");
vByteBits = getAttrToVectorFromJson(mapping,"BYTE_BIT");
uint64_t channels = (uint64_t)(pow(2.0, vChannelBits.size()) + 0.5);
uint64_t ranks = (uint64_t)(pow(2.0, vRankBits.size()) + 0.5);
uint64_t bankgroups = (uint64_t)(pow(2.0, vBankGroupBits.size()) + 0.5);
uint64_t banks = (uint64_t)(pow(2.0, vBankBits.size()) + 0.5);
uint64_t rows = (uint64_t)(pow(2.0, vRowBits.size()) + 0.5);
uint64_t columns = (uint64_t)(pow(2.0, vColumnBits.size()) + 0.5);
uint64_t bytes = (uint64_t)(pow(2.0, vByteBits.size()) + 0.5);
unsigned channels = static_cast<unsigned>(pow(2.0, vChannelBits.size()) + 0.5);
unsigned ranks = static_cast<unsigned>(pow(2.0, vRankBits.size()) + 0.5);
unsigned bankgroups = static_cast<unsigned>(pow(2.0, vBankGroupBits.size()) + 0.5);
unsigned banks = static_cast<unsigned>(pow(2.0, vBankBits.size()) + 0.5);
unsigned rows = static_cast<unsigned>(pow(2.0, vRowBits.size()) + 0.5);
unsigned columns = static_cast<unsigned>(pow(2.0, vColumnBits.size()) + 0.5);
unsigned bytes = static_cast<unsigned>(pow(2.0, vByteBits.size()) + 0.5);
maximumAddress = bytes * columns * rows * banks * bankgroups * ranks * channels - 1;
maximumAddress = static_cast<uint64_t>(bytes) * columns * rows * banks * bankgroups * ranks * channels - 1;
banksPerGroup = banks;
banks = banksPerGroup * bankgroups * ranks;
@@ -201,78 +201,78 @@ void AddressDecoder::print()
std::cout << "Used Address Mapping:" << std::endl;
std::cout << std::endl;
for (int it = vChannelBits.size() - 1; it >= 0; it--)
for (int it = static_cast<int>(vChannelBits.size() - 1); it >= 0; it--)
{
uint64_t addressBits = (UINT64_C(1) << vChannelBits[it]);
uint64_t addressBits = (UINT64_C(1) << vChannelBits[static_cast<std::vector<unsigned>::size_type>(it)]);
for (auto it2 : vXor)
{
if (it2.first == vChannelBits[it])
if (it2.first == vChannelBits[static_cast<std::vector<unsigned>::size_type>(it)])
addressBits |= (UINT64_C(1) << it2.second);
}
std::cout << " Ch " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
}
for (int it = vRankBits.size() - 1; it >= 0; it--)
for (int it = static_cast<int>(vRankBits.size() - 1); it >= 0; it--)
{
uint64_t addressBits = (UINT64_C(1) << vRankBits[it]);
uint64_t addressBits = (UINT64_C(1) << vRankBits[static_cast<std::vector<unsigned>::size_type>(it)]);
for (auto it2 : vXor)
{
if (it2.first == vRankBits[it])
if (it2.first == vRankBits[static_cast<std::vector<unsigned>::size_type>(it)])
addressBits |= (UINT64_C(1) << it2.second);
}
std::cout << " Ra " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
}
for (int it = vBankGroupBits.size() - 1; it >= 0; it--)
for (int it = static_cast<int>(vBankGroupBits.size() - 1); it >= 0; it--)
{
uint64_t addressBits = (UINT64_C(1) << vBankGroupBits[it]);
uint64_t addressBits = (UINT64_C(1) << vBankGroupBits[static_cast<std::vector<unsigned>::size_type>(it)]);
for (auto it2 : vXor)
{
if (it2.first == vBankGroupBits[it])
if (it2.first == vBankGroupBits[static_cast<std::vector<unsigned>::size_type>(it)])
addressBits |= (UINT64_C(1) << it2.second);
}
std::cout << " Bg " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
}
for (int it = vBankBits.size() - 1; it >= 0; it--)
for (int it = static_cast<int>(vBankBits.size() - 1); it >= 0; it--)
{
uint64_t addressBits = (UINT64_C(1) << vBankBits[it]);
uint64_t addressBits = (UINT64_C(1) << vBankBits[static_cast<std::vector<unsigned>::size_type>(it)]);
for (auto it2 : vXor)
{
if (it2.first == vBankBits[it])
if (it2.first == vBankBits[static_cast<std::vector<unsigned>::size_type>(it)])
addressBits |= (UINT64_C(1) << it2.second);
}
std::cout << " Ba " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
}
for (int it = vRowBits.size() - 1; it >= 0; it--)
for (int it = static_cast<int>(vRowBits.size() - 1); it >= 0; it--)
{
uint64_t addressBits = (UINT64_C(1) << vRowBits[it]);
uint64_t addressBits = (UINT64_C(1) << vRowBits[static_cast<std::vector<unsigned>::size_type>(it)]);
for (auto it2 : vXor)
{
if (it2.first == vRowBits[it])
if (it2.first == vRowBits[static_cast<std::vector<unsigned>::size_type>(it)])
addressBits |= (UINT64_C(1) << it2.second);
}
std::cout << " Ro " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
}
for (int it = vColumnBits.size() - 1; it >= 0; it--)
for (int it = static_cast<int>(vColumnBits.size() - 1); it >= 0; it--)
{
uint64_t addressBits = (UINT64_C(1) << vColumnBits[it]);
uint64_t addressBits = (UINT64_C(1) << vColumnBits[static_cast<std::vector<unsigned>::size_type>(it)]);
for (auto it2 : vXor)
{
if (it2.first == vColumnBits[it])
if (it2.first == vColumnBits[static_cast<std::vector<unsigned>::size_type>(it)])
addressBits |= (UINT64_C(1) << it2.second);
}
std::cout << " Co " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
}
for (int it = vByteBits.size() - 1; it >= 0; it--)
for (int it = static_cast<int>(vByteBits.size() - 1); it >= 0; it--)
{
uint64_t addressBits = (UINT64_C(1) << vByteBits[it]);
uint64_t addressBits = (UINT64_C(1) << vByteBits[static_cast<std::vector<unsigned>::size_type>(it)]);
for (auto it2 : vXor)
{
if (it2.first == vByteBits[it])
if (it2.first == vByteBits[static_cast<std::vector<unsigned>::size_type>(it)])
addressBits |= (UINT64_C(1) << it2.second);
}
std::cout << " By " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;

View File

@@ -150,7 +150,7 @@ void TlmRecorder::introduceTransactionSystem(tlm_generic_payload &trans)
currentTransactionsInSystem[&trans].timeOfGeneration = SC_ZERO_TIME;
else
currentTransactionsInSystem[&trans].timeOfGeneration =
GenerationExtension::getExtension(&trans).TimeOfGeneration();
GenerationExtension::getTimeOfGeneration(trans);
PRINTDEBUGMESSAGE(name, "New transaction #" + std::to_string(id) + " generation time " +
currentTransactionsInSystem[&trans].timeOfGeneration.to_string());

View File

@@ -46,23 +46,60 @@ DramExtension::DramExtension() :
thread(0), channel(0), rank(0), bankgroup(0), bank(0),
row(0), column(0), burstlength(0), payloadID(0) {}
DramExtension::DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup,
const Bank &bank, const Row &row, const Column &column,
DramExtension::DramExtension(Thread thread, Rank rank, BankGroup bankgroup,
Bank bank, Row row, Column column,
unsigned int burstlength, uint64_t payloadID) :
thread(thread), channel(0), rank(rank), bankgroup(bankgroup), bank(bank),
row(row), column(column), burstlength(burstlength), payloadID(payloadID) {}
DramExtension::DramExtension(const Thread &thread, const Channel &channel, const Rank &rank,
const BankGroup &bankgroup, const Bank &bank, const Row &row,
const Column &column, unsigned int burstlength, uint64_t payloadID) :
DramExtension::DramExtension(Thread thread, Channel channel, Rank rank,
BankGroup bankgroup, Bank bank, Row row,
Column column, unsigned int burstlength, uint64_t payloadID) :
thread(thread), channel(channel), rank(rank), bankgroup(bankgroup), bank(bank),
row(row), column(column), burstlength(burstlength), payloadID(payloadID) {}
void DramExtension::setExtension(tlm::tlm_generic_payload *payload,
Thread thread, Channel channel, Rank rank,
BankGroup bankgroup, Bank bank, Row row,
Column column, unsigned int burstlength, uint64_t payloadID)
{
DramExtension *extension = nullptr;
payload->get_extension(extension);
if (extension != nullptr)
{
extension->thread = thread;
extension->channel = channel;
extension->rank = rank;
extension->bankgroup = bankgroup;
extension->bank = bank;
extension->row = row;
extension->column = column;
extension->burstlength = burstlength;
extension->payloadID = payloadID;
}
else
{
extension = new DramExtension(thread, channel, rank, bankgroup,
bank, row, column, burstlength, payloadID);
payload->set_auto_extension(extension);
}
}
void DramExtension::setExtension(tlm::tlm_generic_payload &payload,
Thread thread, Channel channel, Rank rank,
BankGroup bankgroup, Bank bank, Row row,
Column column, unsigned int burstlength, uint64_t payloadID)
{
setExtension(&payload, thread, channel, rank, bankgroup,
bank, row, column, burstlength, payloadID);
}
DramExtension &DramExtension::getExtension(const tlm_generic_payload *payload)
{
DramExtension *result = NULL;
DramExtension *result = nullptr;
payload->get_extension(result);
sc_assert(result != NULL);
sc_assert(result != nullptr);
return *result;
}
@@ -232,17 +269,43 @@ void GenerationExtension::copy_from(const tlm_extension_base &ext)
}
void GenerationExtension::setExtension(tlm::tlm_generic_payload *payload, sc_time timeOfGeneration)
{
GenerationExtension *extension = nullptr;
payload->get_extension(extension);
if (extension != nullptr)
{
extension->timeOfGeneration = timeOfGeneration;
}
else
{
extension = new GenerationExtension(timeOfGeneration);
payload->set_auto_extension(extension);
}
}
void GenerationExtension::setExtension(tlm::tlm_generic_payload &payload, sc_time timeOfGeneration)
{
GenerationExtension::setExtension(&payload, timeOfGeneration);
}
GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload *payload)
{
GenerationExtension *result = NULL;
GenerationExtension *result = nullptr;
payload->get_extension(result);
sc_assert(result != NULL);
sc_assert(result != nullptr);
return *result;
}
GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload &payload)
{
return GenerationExtension::getExtension(&payload);
}
sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload *payload)
{
return GenerationExtension::getExtension(payload).TimeOfGeneration();
return GenerationExtension::getExtension(payload).timeOfGeneration;
}
sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload &payload)

View File

@@ -163,16 +163,25 @@ class DramExtension : public tlm::tlm_extension<DramExtension>
{
public:
DramExtension();
DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup,
const Bank &bank, const Row &row, const Column &column,
DramExtension(Thread thread, Rank rank, BankGroup bankgroup,
Bank bank, Row row, Column column,
unsigned int burstlength, uint64_t payloadID);
DramExtension(const Thread &thread, const Channel &channel, const Rank &rank,
const BankGroup &bankgroup, const Bank &bank, const Row &row,
const Column &column, unsigned int burstlength, uint64_t payloadID);
DramExtension(Thread thread, Channel channel, Rank rank,
BankGroup bankgroup, Bank bank, Row row,
Column column, unsigned int burstlength, uint64_t payloadID);
virtual tlm::tlm_extension_base *clone() const;
virtual void copy_from(const tlm::tlm_extension_base &ext);
static void setExtension(tlm::tlm_generic_payload *payload,
Thread thread, Channel channel, Rank rank,
BankGroup bankgroup, Bank bank, Row row,
Column column, unsigned int burstlength, uint64_t payloadID);
static void setExtension(tlm::tlm_generic_payload &payload,
Thread thread, Channel channel, Rank rank,
BankGroup bankgroup, Bank bank, Row row,
Column column, unsigned int burstlength, uint64_t payloadID);
static DramExtension &getExtension(const tlm::tlm_generic_payload *payload);
static DramExtension &getExtension(const tlm::tlm_generic_payload &payload);
@@ -229,12 +238,10 @@ public:
: timeOfGeneration(timeOfGeneration) {}
virtual tlm::tlm_extension_base *clone() const;
virtual void copy_from(const tlm::tlm_extension_base &ext);
static GenerationExtension
&getExtension(const tlm::tlm_generic_payload *payload);
sc_time TimeOfGeneration() const
{
return timeOfGeneration;
}
static void setExtension(tlm::tlm_generic_payload *payload, sc_time timeOfGeneration);
static void setExtension(tlm::tlm_generic_payload &payload, sc_time timeOfGeneration);
static GenerationExtension &getExtension(const tlm::tlm_generic_payload *payload);
static GenerationExtension &getExtension(const tlm::tlm_generic_payload &payload);
static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload *payload);
static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload &payload);

View File

@@ -78,6 +78,8 @@ void BankMachine::updateState(Command command)
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
}
}

View File

@@ -48,8 +48,8 @@ RefreshManagerRankwise::RefreshManagerRankwise(std::vector<BankMachine *> &bankM
timeForNextTrigger = memSpec->getRefreshIntervalAB();
setUpDummy(refreshPayload, 0, rank);
maxPostponed = config.refreshMaxPostponed;
maxPulledin = -config.refreshMaxPulledin;
maxPostponed = static_cast<int>(config.refreshMaxPostponed);
maxPulledin = -static_cast<int>(config.refreshMaxPulledin);
}
CommandTuple::Type RefreshManagerRankwise::getNextCommand()
@@ -183,5 +183,7 @@ void RefreshManagerRankwise::updateState(Command command)
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
}
}

View File

@@ -230,16 +230,14 @@ void Arbiter::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase)
void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload)
{
// Append Generation Extension
GenerationExtension *genExtension = new GenerationExtension(sc_time_stamp());
payload.set_auto_extension(genExtension);
// Set Generation Extension and DRAM Extension
GenerationExtension::setExtension(&payload, sc_time_stamp());
unsigned int burstlength = payload.get_streaming_width();
DecodedAddress decodedAddress = addressDecoder->decodeAddress(payload.get_address());
DramExtension *extension = new DramExtension(Thread(socketId),
Channel(decodedAddress.channel), Rank(decodedAddress.rank),
BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank),
Row(decodedAddress.row), Column(decodedAddress.column),
burstlength, nextPayloadID[decodedAddress.channel]++);
payload.set_auto_extension(extension);
DramExtension::setExtension(payload, Thread(socketId),
Channel(decodedAddress.channel), Rank(decodedAddress.rank),
BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank),
Row(decodedAddress.row), Column(decodedAddress.column),
burstlength, nextPayloadID[decodedAddress.channel]++);
}

View File

@@ -46,8 +46,12 @@ MemoryManager::MemoryManager()
MemoryManager::~MemoryManager()
{
for (tlm_generic_payload *payload : freePayloads) {
for (tlm_generic_payload *payload : freePayloads)
{
// Delete data buffer
delete[] payload->get_data_ptr();
// Delete all extensions
payload->reset();
delete payload;
numberOfFrees++;
}
@@ -59,7 +63,8 @@ MemoryManager::~MemoryManager()
tlm_generic_payload *MemoryManager::allocate()
{
if (freePayloads.empty()) {
if (freePayloads.empty())
{
numberOfAllocations++;
tlm_generic_payload *payload = new tlm_generic_payload(this);
@@ -70,7 +75,9 @@ tlm_generic_payload *MemoryManager::allocate()
payload->set_data_ptr(data);
return payload;
} else {
}
else
{
tlm_generic_payload *result = freePayloads.back();
freePayloads.pop_back();
return result;
@@ -79,7 +86,6 @@ tlm_generic_payload *MemoryManager::allocate()
void MemoryManager::free(tlm_generic_payload *payload)
{
payload->reset(); // clears all extensions
freePayloads.push_back(payload);
}

View File

@@ -49,8 +49,8 @@ public:
virtual void free(tlm::tlm_generic_payload *payload);
private:
unsigned int numberOfAllocations;
unsigned int numberOfFrees;
uint64_t numberOfAllocations;
uint64_t numberOfFrees;
std::vector<tlm::tlm_generic_payload *> freePayloads;
};