From 6eef8ff1e6da707c3a4d125cb06075507b391548 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Tue, 17 Sep 2019 21:31:57 +0200 Subject: [PATCH] Rank inclusion part 2. --- .../configs/memspecs/memspec_ranktest.xml | 2 +- .../library/src/common/XmlAddressDecoder.cpp | 4 +- .../library/src/controller/BankMachine.cpp | 72 ++++++++++--------- DRAMSys/library/src/controller/BankMachine.h | 14 ++-- DRAMSys/library/src/controller/Controller.cpp | 12 ++-- .../src/controller/checker/CheckerDDR3.cpp | 31 ++++---- .../src/controller/checker/CheckerDDR3.h | 5 +- .../src/controller/checker/CheckerIF.h | 3 +- .../src/controller/checker/CheckerWideIO.cpp | 31 ++++---- .../src/controller/checker/CheckerWideIO.h | 5 +- .../core/scheduling/ScheduledCommand.cpp | 5 ++ .../core/scheduling/ScheduledCommand.h | 1 + DRAMSys/library/src/simulation/Arbiter.cpp | 18 ++--- 13 files changed, 102 insertions(+), 101 deletions(-) diff --git a/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml b/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml index 45606d2b..cd5852ec 100644 --- a/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml +++ b/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml @@ -5,7 +5,7 @@ - + diff --git a/DRAMSys/library/src/common/XmlAddressDecoder.cpp b/DRAMSys/library/src/common/XmlAddressDecoder.cpp index 65795e97..1c819b57 100644 --- a/DRAMSys/library/src/common/XmlAddressDecoder.cpp +++ b/DRAMSys/library/src/common/XmlAddressDecoder.cpp @@ -82,7 +82,9 @@ DecodedAddress XmlAddressDecoder::decodeAddress(sc_dt::uint64 addr) result.channel = (addr & masks["channel"]) >> shifts["channel"]; result.rank = (addr & masks["rank"]) >> shifts["rank"]; //result.bankgroup = (addr & masks["bankgroup"]) >> shifts["bankgroup"]; - result.bank = (addr & masks["bank"]) >> shifts["bank"]; + unsigned banksPerRank = Configuration::getInstance().memSpec->NumberOfBanks + / Configuration::getInstance().memSpec->NumberOfRanks; + result.bank = ((addr & masks["bank"]) >> shifts["bank"]) + result.rank * banksPerRank; unsigned banksPerGroup = Configuration::getInstance().memSpec->NumberOfBanks / Configuration::getInstance().memSpec->NumberOfBankGroups; result.bankgroup = result.bank / banksPerGroup; diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index 7765ff9d..836edb97 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -34,9 +34,15 @@ #include "BankMachine.h" -BankMachine::BankMachine(SchedulerIF *scheduler, CheckerIF *checker, - Rank rank, BankGroup bankgroup, Bank bank) - : scheduler(scheduler), checker(checker), rank(rank), bankgroup(bankgroup), bank(bank) {} +BankMachine::BankMachine(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) + : scheduler(scheduler), checker(checker), bank(bank) +{ + MemSpec *memSpec = Configuration::getInstance().memSpec; + unsigned banksPerRank = memSpec->NumberOfBanks / memSpec->NumberOfRanks; + unsigned banksPerGroup = memSpec->NumberOfBanks / memSpec->NumberOfBankGroups; + rank = Rank(bank.ID() / banksPerRank); + bankgroup = BankGroup(bank.ID() / banksPerGroup); +} std::pair BankMachine::getNextCommand() { @@ -97,9 +103,8 @@ BmState BankMachine::getState() return currentState; } -BankMachineOpen::BankMachineOpen(SchedulerIF *scheduler, CheckerIF *checker, - Rank rank, BankGroup bankgroup, Bank bank) - : BankMachine(scheduler, checker, rank, bankgroup, bank) {} +BankMachineOpen::BankMachineOpen(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) + : BankMachine(scheduler, checker, bank) {} sc_time BankMachineOpen::startBankMachine() { @@ -113,7 +118,7 @@ sc_time BankMachineOpen::startBankMachine() DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss { - delay = checker->delayToSatisfyConstraints(Command::ACT, bank); + delay = checker->delayToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; nextRow = extension.getRow(); } @@ -123,12 +128,12 @@ sc_time BankMachineOpen::startBankMachine() { if (currentPayload->get_command() == TLM_READ_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::RD, bank); + delay = checker->delayToSatisfyConstraints(Command::RD, rank, bankgroup, bank); nextCommand = Command::RD; } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::WR, bank); + delay = checker->delayToSatisfyConstraints(Command::WR, rank, bankgroup, bank); nextCommand = Command::WR; } else @@ -136,7 +141,7 @@ sc_time BankMachineOpen::startBankMachine() } else // row miss { - delay = checker->delayToSatisfyConstraints(Command::PRE, bank); + delay = checker->delayToSatisfyConstraints(Command::PRE, rank, bankgroup, bank); nextCommand = Command::PRE; nextRow = extension.getRow(); } @@ -145,9 +150,8 @@ sc_time BankMachineOpen::startBankMachine() return delay; } -BankMachineClosed::BankMachineClosed(SchedulerIF *scheduler, CheckerIF *checker, - Rank rank, BankGroup bankgroup, Bank bank) - : BankMachine(scheduler, checker, rank, bankgroup, bank) {} +BankMachineClosed::BankMachineClosed(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) + : BankMachine(scheduler, checker, bank) {} sc_time BankMachineClosed::startBankMachine() { @@ -161,7 +165,7 @@ sc_time BankMachineClosed::startBankMachine() DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss { - delay = checker->delayToSatisfyConstraints(Command::ACT, bank); + delay = checker->delayToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; nextRow = extension.getRow(); } @@ -171,12 +175,12 @@ sc_time BankMachineClosed::startBankMachine() { if (currentPayload->get_command() == TLM_READ_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::RDA, bank); + delay = checker->delayToSatisfyConstraints(Command::RDA, rank, bankgroup, bank); nextCommand = Command::RDA; } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::WRA, bank); + delay = checker->delayToSatisfyConstraints(Command::WRA, rank, bankgroup, bank); nextCommand = Command::WRA; } else @@ -184,7 +188,7 @@ sc_time BankMachineClosed::startBankMachine() } else // row miss { - delay = checker->delayToSatisfyConstraints(Command::PRE, bank); + delay = checker->delayToSatisfyConstraints(Command::PRE, rank, bankgroup, bank); nextCommand = Command::PRE; nextRow = extension.getRow(); } @@ -193,9 +197,8 @@ sc_time BankMachineClosed::startBankMachine() return delay; } -BankMachineOpenAdaptive::BankMachineOpenAdaptive(SchedulerIF *scheduler, CheckerIF *checker, - Rank rank, BankGroup bankgroup, Bank bank) - : BankMachine(scheduler, checker, rank, bankgroup, bank) {} +BankMachineOpenAdaptive::BankMachineOpenAdaptive(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) + : BankMachine(scheduler, checker, bank) {} sc_time BankMachineOpenAdaptive::startBankMachine() { @@ -209,7 +212,7 @@ sc_time BankMachineOpenAdaptive::startBankMachine() DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss { - delay = checker->delayToSatisfyConstraints(Command::ACT, bank); + delay = checker->delayToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; nextRow = extension.getRow(); } @@ -221,12 +224,12 @@ sc_time BankMachineOpenAdaptive::startBankMachine() { if (currentPayload->get_command() == TLM_READ_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::RDA, bank); + delay = checker->delayToSatisfyConstraints(Command::RDA, rank, bankgroup, bank); nextCommand = Command::RDA; } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::WRA, bank); + delay = checker->delayToSatisfyConstraints(Command::WRA, rank, bankgroup, bank); nextCommand = Command::WRA; } else @@ -236,12 +239,12 @@ sc_time BankMachineOpenAdaptive::startBankMachine() { if (currentPayload->get_command() == TLM_READ_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::RD, bank); + delay = checker->delayToSatisfyConstraints(Command::RD, rank, bankgroup, bank); nextCommand = Command::RD; } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::WR, bank); + delay = checker->delayToSatisfyConstraints(Command::WR, rank, bankgroup, bank); nextCommand = Command::WR; } else @@ -250,7 +253,7 @@ sc_time BankMachineOpenAdaptive::startBankMachine() } else // row miss { - delay = checker->delayToSatisfyConstraints(Command::PRE, bank); + delay = checker->delayToSatisfyConstraints(Command::PRE, rank, bankgroup, bank); nextCommand = Command::PRE; nextRow = extension.getRow(); } @@ -259,9 +262,8 @@ sc_time BankMachineOpenAdaptive::startBankMachine() return delay; } -BankMachineClosedAdaptive::BankMachineClosedAdaptive(SchedulerIF *scheduler, CheckerIF *checker, - Rank rank, BankGroup bankgroup, Bank bank) - : BankMachine(scheduler, checker, rank, bankgroup, bank) {} +BankMachineClosedAdaptive::BankMachineClosedAdaptive(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) + : BankMachine(scheduler, checker, bank) {} sc_time BankMachineClosedAdaptive::startBankMachine() { @@ -275,7 +277,7 @@ sc_time BankMachineClosedAdaptive::startBankMachine() DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss { - delay = checker->delayToSatisfyConstraints(Command::ACT, bank); + delay = checker->delayToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; nextRow = extension.getRow(); } @@ -287,12 +289,12 @@ sc_time BankMachineClosedAdaptive::startBankMachine() { if (currentPayload->get_command() == TLM_READ_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::RD, bank); + delay = checker->delayToSatisfyConstraints(Command::RD, rank, bankgroup, bank); nextCommand = Command::RD; } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::WR, bank); + delay = checker->delayToSatisfyConstraints(Command::WR, rank, bankgroup, bank); nextCommand = Command::WR; } else @@ -302,12 +304,12 @@ sc_time BankMachineClosedAdaptive::startBankMachine() { if (currentPayload->get_command() == TLM_READ_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::RDA, bank); + delay = checker->delayToSatisfyConstraints(Command::RDA, rank, bankgroup, bank); nextCommand = Command::RDA; } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) { - delay = checker->delayToSatisfyConstraints(Command::WRA, bank); + delay = checker->delayToSatisfyConstraints(Command::WRA, rank, bankgroup, bank); nextCommand = Command::WRA; } else @@ -316,7 +318,7 @@ sc_time BankMachineClosedAdaptive::startBankMachine() } else // row miss TODO: remove this, can never happen { - delay = checker->delayToSatisfyConstraints(Command::PRE, bank); + delay = checker->delayToSatisfyConstraints(Command::PRE, rank, bankgroup, bank); nextCommand = Command::PRE; nextRow = extension.getRow(); SC_REPORT_FATAL("BankMachine", "Should never be reached for this policy"); diff --git a/DRAMSys/library/src/controller/BankMachine.h b/DRAMSys/library/src/controller/BankMachine.h index 910afe6b..af4ac52d 100644 --- a/DRAMSys/library/src/controller/BankMachine.h +++ b/DRAMSys/library/src/controller/BankMachine.h @@ -70,7 +70,7 @@ public: BmState getState(); protected: - BankMachine(SchedulerIF *, CheckerIF *, Rank, BankGroup, Bank); + BankMachine(SchedulerIF *, CheckerIF *, Bank); tlm_generic_payload *currentPayload = nullptr; SchedulerIF *scheduler; CheckerIF *checker; @@ -79,36 +79,36 @@ protected: BmState currentState = BmState::Precharged; Row currentRow; sc_time timeToSchedule = SC_ZERO_TIME; - Rank rank; - BankGroup bankgroup; + Rank rank = Rank(0); + BankGroup bankgroup = BankGroup(0); Bank bank; }; class BankMachineOpen final : public BankMachine { public: - BankMachineOpen(SchedulerIF *, CheckerIF *, Rank, BankGroup, Bank); + BankMachineOpen(SchedulerIF *, CheckerIF *, Bank); sc_time startBankMachine(); }; class BankMachineClosed final : public BankMachine { public: - BankMachineClosed(SchedulerIF *, CheckerIF *, Rank, BankGroup, Bank); + BankMachineClosed(SchedulerIF *, CheckerIF *, Bank); sc_time startBankMachine(); }; class BankMachineOpenAdaptive final : public BankMachine { public: - BankMachineOpenAdaptive(SchedulerIF *, CheckerIF *, Rank, BankGroup, Bank); + BankMachineOpenAdaptive(SchedulerIF *, CheckerIF *, Bank); sc_time startBankMachine(); }; class BankMachineClosedAdaptive final : public BankMachine { public: - BankMachineClosedAdaptive(SchedulerIF *, CheckerIF *, Rank, BankGroup, Bank); + BankMachineClosedAdaptive(SchedulerIF *, CheckerIF *, Bank); sc_time startBankMachine(); }; diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 99be6756..8c98beb5 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -96,14 +96,12 @@ Controller::Controller(sc_module_name name) : if (config.AdaptivePagePolicy) { for (unsigned bankID = 0; bankID < config.memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineOpenAdaptive - (scheduler, checker, Rank(0), BankGroup(0), Bank(bankID))); + bankMachines.push_back(new BankMachineOpenAdaptive(scheduler, checker, Bank(bankID))); } else { for (unsigned bankID = 0; bankID < config.memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineOpen - (scheduler, checker, Rank(0), BankGroup(0), Bank(bankID))); + bankMachines.push_back(new BankMachineOpen(scheduler, checker, Bank(bankID))); } } else @@ -111,14 +109,12 @@ Controller::Controller(sc_module_name name) : if (config.AdaptivePagePolicy) { for (unsigned bankID = 0; bankID < config.memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineClosedAdaptive - (scheduler, checker, Rank(0), BankGroup(0), Bank(bankID))); + bankMachines.push_back(new BankMachineClosedAdaptive(scheduler, checker, Bank(bankID))); } else { for (unsigned bankID = 0; bankID < config.memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineClosed - (scheduler, checker, Rank(0), BankGroup(0), Bank(bankID))); + bankMachines.push_back(new BankMachineClosed(scheduler, checker, Bank(bankID))); } } diff --git a/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp b/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp index 2e183798..3e176fa8 100644 --- a/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp @@ -50,7 +50,11 @@ CheckerDDR3::CheckerDDR3() lastScheduledByCommandAndBank = std::vector> (numberOfCommands(), std::vector(memSpec->NumberOfBanks)); + lastScheduledByCommandAndRank = std::vector> + (numberOfCommands(), std::vector(memSpec->NumberOfRanks)); lastScheduledByCommand = std::vector(numberOfCommands()); + + lastActivates = std::vector>(memSpec->NumberOfRanks); } CheckerDDR3::~CheckerDDR3() @@ -58,7 +62,7 @@ CheckerDDR3::~CheckerDDR3() delete refreshChecker; } -sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Bank bank) +sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Rank rank, BankGroup, Bank bank) { ScheduledCommand lastCommand; @@ -82,11 +86,11 @@ sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Bank bank) if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRC); - lastCommand = lastScheduledByCommand[Command::ACT]; + lastCommand = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRRD); - lastCommand = lastScheduledByCommand[Command::REFA]; + lastCommand = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); @@ -94,7 +98,8 @@ sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Bank bank) if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); - delayToSatisfyFAW(earliestTimeToStart); + if (lastActivates[rank.ID()].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, lastActivates[rank.ID()].front() + memSpec->tFAW); refreshChecker->delayToSatisfyACT(bank, earliestTimeToStart); } @@ -170,33 +175,25 @@ sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Bank bank) return (earliestTimeToStart - sc_time_stamp()); } -void CheckerDDR3::delayToSatisfyFAW(sc_time &earliestTimeToStart) -{ - if (lastActivates.size() >= 4) - { - sc_time earliestTime = lastActivates.front() + memSpec->tFAW; - if (earliestTime > earliestTimeToStart) - earliestTimeToStart = earliestTime; - } -} - void CheckerDDR3::insert(const ScheduledCommand &scheduledCommand) { Command command = scheduledCommand.getCommand(); + Rank rank = scheduledCommand.getRank(); Bank bank = scheduledCommand.getBank(); PRINTDEBUGMESSAGE("CheckerDDR3", "Changing state on bank " + to_string(scheduledCommand.getBank().ID()) + " command is " + commandToString(command)); lastScheduledByCommandAndBank[command][bank.ID()] = scheduledCommand; + lastScheduledByCommandAndRank[command][rank.ID()] = scheduledCommand; lastScheduledByCommand[command] = scheduledCommand; lastScheduled = scheduledCommand; if (command == Command::ACT) { - if (lastActivates.size() == 4) - lastActivates.pop(); - lastActivates.push(scheduledCommand.getStart()); + if (lastActivates[rank.ID()].size() == 4) + lastActivates[rank.ID()].pop(); + lastActivates[rank.ID()].push(scheduledCommand.getStart()); } else if (command == Command::REFA || command == Command::REFB) refreshChecker->insert(bank); diff --git a/DRAMSys/library/src/controller/checker/CheckerDDR3.h b/DRAMSys/library/src/controller/checker/CheckerDDR3.h index 9082ea17..039856d6 100644 --- a/DRAMSys/library/src/controller/checker/CheckerDDR3.h +++ b/DRAMSys/library/src/controller/checker/CheckerDDR3.h @@ -48,15 +48,14 @@ class CheckerDDR3 final : public CheckerIF public: CheckerDDR3(); ~CheckerDDR3(); - sc_time delayToSatisfyConstraints(Command, Bank); + sc_time delayToSatisfyConstraints(Command, Rank, BankGroup, Bank); void insert(const ScheduledCommand &); private: const MemSpecDDR3 *memSpec; // Four activate window - std::queue lastActivates; - void delayToSatisfyFAW(sc_time &); + std::vector> lastActivates; RefreshCheckerDDR3Dummy *refreshChecker; diff --git a/DRAMSys/library/src/controller/checker/CheckerIF.h b/DRAMSys/library/src/controller/checker/CheckerIF.h index c1586373..814102d3 100644 --- a/DRAMSys/library/src/controller/checker/CheckerIF.h +++ b/DRAMSys/library/src/controller/checker/CheckerIF.h @@ -47,11 +47,12 @@ class CheckerIF public: virtual ~CheckerIF() {} - virtual sc_time delayToSatisfyConstraints(Command, Bank) = 0; + virtual sc_time delayToSatisfyConstraints(Command, Rank, BankGroup, Bank) = 0; virtual void insert(const ScheduledCommand &) = 0; protected: std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; ScheduledCommand lastScheduled; diff --git a/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp b/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp index 6cc5dc8f..56331271 100644 --- a/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp @@ -50,7 +50,11 @@ CheckerWideIO::CheckerWideIO() lastScheduledByCommandAndBank = std::vector> (numberOfCommands(), std::vector(memSpec->NumberOfBanks)); + lastScheduledByCommandAndRank = std::vector> + (numberOfCommands(), std::vector(memSpec->NumberOfRanks)); lastScheduledByCommand = std::vector(numberOfCommands()); + + lastActivates = std::vector>(memSpec->NumberOfRanks); } CheckerWideIO::~CheckerWideIO() @@ -58,7 +62,7 @@ CheckerWideIO::~CheckerWideIO() delete refreshChecker; } -sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Bank bank) +sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Rank rank, BankGroup, Bank bank) { ScheduledCommand lastCommand; @@ -82,11 +86,11 @@ sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Bank bank) if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRC); - lastCommand = lastScheduledByCommand[Command::ACT]; + lastCommand = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRRD); - lastCommand = lastScheduledByCommand[Command::REFA]; + lastCommand = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); @@ -94,7 +98,8 @@ sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Bank bank) if (lastCommand.isValidCommand()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); - delayToSatisfyTAW(earliestTimeToStart); + if (lastActivates[rank.ID()].size() >= 2) + earliestTimeToStart = std::max(earliestTimeToStart, lastActivates[rank.ID()].front() + memSpec->tTAW); refreshChecker->delayToSatisfyACT(bank, earliestTimeToStart); } @@ -154,33 +159,25 @@ sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Bank bank) return (earliestTimeToStart - sc_time_stamp()); } -void CheckerWideIO::delayToSatisfyTAW(sc_time &earliestTimeToStart) -{ - if (lastActivates.size() >= 2) - { - sc_time earliestTime = lastActivates.front() + memSpec->tTAW; - if (earliestTime > earliestTimeToStart) - earliestTimeToStart = earliestTime; - } -} - void CheckerWideIO::insert(const ScheduledCommand &scheduledCommand) { Command command = scheduledCommand.getCommand(); + Rank rank = scheduledCommand.getRank(); Bank bank = scheduledCommand.getBank(); PRINTDEBUGMESSAGE("CheckerWideIO", "Changing state on bank " + to_string(scheduledCommand.getBank().ID()) + " command is " + commandToString(command)); lastScheduledByCommandAndBank[command][bank.ID()] = scheduledCommand; + lastScheduledByCommandAndRank[command][rank.ID()] = scheduledCommand; lastScheduledByCommand[command] = scheduledCommand; lastScheduled = scheduledCommand; if (command == Command::ACT) { - if (lastActivates.size() == 2) - lastActivates.pop(); - lastActivates.push(scheduledCommand.getStart()); + if (lastActivates[rank.ID()].size() == 2) + lastActivates[rank.ID()].pop(); + lastActivates[rank.ID()].push(scheduledCommand.getStart()); } else if (command == Command::REFA || command == Command::REFB) refreshChecker->insert(bank); diff --git a/DRAMSys/library/src/controller/checker/CheckerWideIO.h b/DRAMSys/library/src/controller/checker/CheckerWideIO.h index 29950347..b8f8c460 100644 --- a/DRAMSys/library/src/controller/checker/CheckerWideIO.h +++ b/DRAMSys/library/src/controller/checker/CheckerWideIO.h @@ -48,15 +48,14 @@ class CheckerWideIO final : public CheckerIF public: CheckerWideIO(); ~CheckerWideIO(); - sc_time delayToSatisfyConstraints(Command, Bank); + sc_time delayToSatisfyConstraints(Command, Rank, BankGroup, Bank); void insert(const ScheduledCommand &); private: const MemSpecWideIO *memSpec; // Four activate window - std::queue lastActivates; - void delayToSatisfyTAW(sc_time &); + std::vector> lastActivates; RefreshCheckerWideIODummy *refreshChecker; diff --git a/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.cpp b/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.cpp index 6933c521..bdfebd0e 100644 --- a/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.cpp +++ b/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.cpp @@ -90,6 +90,11 @@ sc_time ScheduledCommand::getExecutionTime() const return executionTime; } +Rank ScheduledCommand::getRank() const +{ + return extension.getRank(); +} + Bank ScheduledCommand::getBank() const { return extension.getBank(); diff --git a/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.h b/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.h index cca521a2..9dde8bfb 100644 --- a/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.h +++ b/DRAMSys/library/src/controller/core/scheduling/ScheduledCommand.h @@ -72,6 +72,7 @@ public: Command getCommand() const; sc_time getExecutionTime() const; + Rank getRank() const; Bank getBank() const; BankGroup getBankGroup() const; Row getRow() const; diff --git a/DRAMSys/library/src/simulation/Arbiter.cpp b/DRAMSys/library/src/simulation/Arbiter.cpp index 0752e07c..45554403 100644 --- a/DRAMSys/library/src/simulation/Arbiter.cpp +++ b/DRAMSys/library/src/simulation/Arbiter.cpp @@ -229,17 +229,19 @@ void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload) bool Arbiter::addressIsValid(DecodedAddress &decodedAddress) { + // TODO: correct this function if (decodedAddress.channel >= AddressDecoder::getInstance().amount["channel"]) { return false; } - if (decodedAddress.bank >= AddressDecoder::getInstance().amount["bank"]) { - return false; - } - // TODO: this test case should be corrected! - /*if (decodedAddress.bankgroup >= AddressDecoder::getInstance().amount["bankgroup"]) { - std::cout << decodedAddress.bankgroup << " " << AddressDecoder::getInstance().amount["bankgroup"] << std::endl; - return false; - }*/ +// if (decodedAddress.rank >= AddressDecoder::getInstance().amount["rank"]) { +// return false; +// } +// if (decodedAddress.bank >= AddressDecoder::getInstance().amount["bank"]) { +// return false; +// } +// if (decodedAddress.bankgroup >= AddressDecoder::getInstance().amount["bankgroup"]) { +// return false; +// } if (decodedAddress.column >= AddressDecoder::getInstance().amount["column"]) { return false; }