diff --git a/DRAMSys/library/CMakeLists.txt b/DRAMSys/library/CMakeLists.txt index fba3d293..5634ba6d 100644 --- a/DRAMSys/library/CMakeLists.txt +++ b/DRAMSys/library/CMakeLists.txt @@ -45,7 +45,7 @@ set(DCMAKE_SH="CMAKE_SH-NOTFOUND") add_subdirectory(src/common/third_party/DRAMPower) # Add nlohmann: -set(JSON_BuildTests OFF) +set(JSON_BuildTests OFF CACHE INTERNAL "") add_subdirectory(src/common/third_party/nlohmann) # Add SystemC: diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 735ba8ec..8ff1d7f6 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -71,8 +71,8 @@ Controller::Controller(sc_module_name name) : memSpec = config.memSpec; ranksNumberOfPayloads = std::vector(memSpec->numberOfRanks); - // reserve buffer for a least 100 command tuples - readyCommands.reserve(100); + // reserve buffer for command tuples + readyCommands.reserve(memSpec->numberOfBanks); // instantiate timing checker if (memSpec->memoryType == "DDR3") @@ -274,28 +274,30 @@ void Controller::controllerMethod() if (!readyCommands.empty()) { commandTuple = cmdMux->selectCommand(readyCommands); - if (std::get(commandTuple) != Command::NOP) // can happen with FIFO strict + Command command = std::get(commandTuple); + tlm_generic_payload *payload = std::get(commandTuple); + if (command != Command::NOP) // can happen with FIFO strict { - Rank rank = DramExtension::getRank(std::get(commandTuple)); - BankGroup bankgroup = DramExtension::getBankGroup(std::get(commandTuple)); - Bank bank = DramExtension::getBank(std::get(commandTuple)); + Rank rank = DramExtension::getRank(payload); + BankGroup bankgroup = DramExtension::getBankGroup(payload); + Bank bank = DramExtension::getBank(payload); - if (isRankCommand(std::get(commandTuple))) + if (isRankCommand(command)) { for (auto it : bankMachinesOnRank[rank.ID()]) - it->updateState(std::get(commandTuple)); + it->updateState(command); } else - bankMachines[bank.ID()]->updateState(std::get(commandTuple)); + bankMachines[bank.ID()]->updateState(command); - refreshManagers[rank.ID()]->updateState(std::get(commandTuple)); - powerDownManagers[rank.ID()]->updateState(std::get(commandTuple)); - checker->insert(std::get(commandTuple), rank, bankgroup, bank); + refreshManagers[rank.ID()]->updateState(command); + powerDownManagers[rank.ID()]->updateState(command); + checker->insert(command, rank, bankgroup, bank); - if (isCasCommand(std::get(commandTuple))) + if (isCasCommand(command)) { - scheduler->removeRequest(std::get(commandTuple)); - respQueue->insertPayload(std::get(commandTuple), memSpec->getIntervalOnDataStrobe(std::get(commandTuple)).end); + scheduler->removeRequest(payload); + respQueue->insertPayload(payload, memSpec->getIntervalOnDataStrobe(command).end); sc_time triggerTime = respQueue->getTriggerTime(); if (triggerTime != sc_max_time()) @@ -306,7 +308,7 @@ void Controller::controllerMethod() if (ranksNumberOfPayloads[rank.ID()] == 0) powerDownManagers[rank.ID()]->triggerEntry(); - sendToDram(std::get(commandTuple), std::get(commandTuple)); + sendToDram(command, payload); } else readyCmdBlocked = true;