diff --git a/DRAMSys/library/src/common/XmlAddressDecoder.cpp b/DRAMSys/library/src/common/XmlAddressDecoder.cpp index 325412f5..786c3335 100644 --- a/DRAMSys/library/src/common/XmlAddressDecoder.cpp +++ b/DRAMSys/library/src/common/XmlAddressDecoder.cpp @@ -78,7 +78,6 @@ void XmlAddressDecoder::setConfiguration(std::string addressConfigURI) shifts.rank = from; masks.rank = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); amount.rank = pow(2.0, to - from + 1.0); - std::cout << "Inside rank" << std::endl; } else if (std::strcmp(child->Name(), "bank") == 0) { diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 15ae1e7a..3cf55f09 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -288,9 +288,8 @@ void Controller::sendToFrontend(tlm_generic_payload *payload, tlm_phase phase) void Controller::sendToDram(Command command, tlm_generic_payload *payload) { - sc_time execTime = Configuration::getInstance().memSpec->getExecutionTime(command); - ScheduledCommand scheduledCommand(command, sc_time_stamp(), execTime, *payload); - checker->insert(scheduledCommand); + DramExtension extension = DramExtension::getExtension(payload); + checker->insert(command, extension.getRank(), extension.getBank()); sc_time delay = SC_ZERO_TIME; tlm_phase phase; diff --git a/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp b/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp index 3e176fa8..6661b967 100644 --- a/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp @@ -48,11 +48,11 @@ CheckerDDR3::CheckerDDR3() else refreshChecker = new RefreshCheckerDDR3(memSpec); - lastScheduledByCommandAndBank = std::vector> - (numberOfCommands(), std::vector(memSpec->NumberOfBanks)); - lastScheduledByCommandAndRank = std::vector> - (numberOfCommands(), std::vector(memSpec->NumberOfRanks)); - lastScheduledByCommand = std::vector(numberOfCommands()); + 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); } @@ -64,39 +64,38 @@ CheckerDDR3::~CheckerDDR3() sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Rank rank, BankGroup, Bank bank) { - ScheduledCommand lastCommand; - + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); if (command == Command::ACT) { - lastCommand = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRTP + memSpec->tRP); + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommand = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tWL + memSpec->tCCD + memSpec->tWR + memSpec->tRP); + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->tCCD + memSpec->tWR + memSpec->tRP); - lastCommand = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRP); + lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRC); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommand = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRRD); + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommand = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); + lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommand = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); + lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); if (lastActivates[rank.ID()].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, lastActivates[rank.ID()].front() + memSpec->tFAW); @@ -105,62 +104,62 @@ sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Rank rank, BankG } else if (command == Command::RD || command == Command::RDA) { - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRCD); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommand = lastScheduledByCommand[Command::RD]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tCCD); + lastCommandStart = lastScheduledByCommand[Command::RD]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommand = lastScheduledByCommand[Command::RDA]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tCCD); + lastCommandStart = lastScheduledByCommand[Command::RDA]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommand = lastScheduledByCommand[Command::WR]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tWL + memSpec->tCCD + memSpec->tWTR); + lastCommandStart = lastScheduledByCommand[Command::WR]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->tCCD + memSpec->tWTR); - lastCommand = lastScheduledByCommand[Command::WRA]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tWL + memSpec->tCCD + memSpec->tWTR); + lastCommandStart = lastScheduledByCommand[Command::WRA]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->tCCD + memSpec->tWTR); refreshChecker->delayToSatisfyRD(bank, earliestTimeToStart); } else if (command == Command::WR || command == Command::WRA) { - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRCD); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommand = lastScheduledByCommand[Command::RD]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRL + memSpec->tCCD + 2 * memSpec->clk - memSpec->tWL); + lastCommandStart = lastScheduledByCommand[Command::RD]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->tCCD + 2 * memSpec->clk - memSpec->tWL); - lastCommand = lastScheduledByCommand[Command::RDA]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRL + memSpec->tCCD + 2 * memSpec->clk - memSpec->tWL); + lastCommandStart = lastScheduledByCommand[Command::RDA]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->tCCD + 2 * memSpec->clk - memSpec->tWL); - lastCommand = lastScheduledByCommand[Command::WR]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tCCD); + lastCommandStart = lastScheduledByCommand[Command::WR]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommand = lastScheduledByCommand[Command::WRA]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tCCD); + lastCommandStart = lastScheduledByCommand[Command::WRA]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); refreshChecker->delayToSatisfyWR(bank, earliestTimeToStart); } else if (command == Command::PRE) { - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRAS); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommand = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRTP); + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommand = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tWL + memSpec->tCCD + memSpec->tWR); + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->tCCD + memSpec->tWR); refreshChecker->delayToSatisfyPRE(bank, earliestTimeToStart); } @@ -169,31 +168,27 @@ sc_time CheckerDDR3::delayToSatisfyConstraints(Command command, Rank rank, BankG reportFatal("CheckerDDR3", "Unknown command!"); } // Check if command bus is free - if (lastScheduled.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastScheduled.getStart() + memSpec->clk); + //if (lastScheduled.isValidCommand()) + earliestTimeToStart = std::max(earliestTimeToStart, lastScheduled + memSpec->clk); return (earliestTimeToStart - sc_time_stamp()); } -void CheckerDDR3::insert(const ScheduledCommand &scheduledCommand) +void CheckerDDR3::insert(Command command, Rank rank, Bank bank) { - 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)); + PRINTDEBUGMESSAGE("CheckerDDR3", "Changing state on bank " + bank.ID() + + " command is " + commandToString(command)); - lastScheduledByCommandAndBank[command][bank.ID()] = scheduledCommand; - lastScheduledByCommandAndRank[command][rank.ID()] = scheduledCommand; - lastScheduledByCommand[command] = scheduledCommand; - lastScheduled = scheduledCommand; + lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommand[command] = sc_time_stamp(); + lastScheduled = sc_time_stamp(); if (command == Command::ACT) { if (lastActivates[rank.ID()].size() == 4) lastActivates[rank.ID()].pop(); - lastActivates[rank.ID()].push(scheduledCommand.getStart()); + lastActivates[rank.ID()].push(sc_time_stamp()); } 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 039856d6..5b5a52b8 100644 --- a/DRAMSys/library/src/controller/checker/CheckerDDR3.h +++ b/DRAMSys/library/src/controller/checker/CheckerDDR3.h @@ -49,7 +49,7 @@ public: CheckerDDR3(); ~CheckerDDR3(); sc_time delayToSatisfyConstraints(Command, Rank, BankGroup, Bank); - void insert(const ScheduledCommand &); + void insert(Command, Rank, Bank); private: const MemSpecDDR3 *memSpec; diff --git a/DRAMSys/library/src/controller/checker/CheckerIF.h b/DRAMSys/library/src/controller/checker/CheckerIF.h index 814102d3..8a914b88 100644 --- a/DRAMSys/library/src/controller/checker/CheckerIF.h +++ b/DRAMSys/library/src/controller/checker/CheckerIF.h @@ -48,13 +48,13 @@ public: virtual ~CheckerIF() {} virtual sc_time delayToSatisfyConstraints(Command, Rank, BankGroup, Bank) = 0; - virtual void insert(const ScheduledCommand &) = 0; + virtual void insert(Command, Rank, Bank) = 0; protected: - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; - std::vector lastScheduledByCommand; - ScheduledCommand lastScheduled; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; + std::vector lastScheduledByCommand; + sc_time lastScheduled; // PowerDown TODO: Implement this method? //sc_time getTimeConstraintToEnterPowerDown(Command lastCmd, Command pdnCmd) const; diff --git a/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp b/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp index 56331271..8369fb0f 100644 --- a/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp @@ -48,11 +48,11 @@ CheckerWideIO::CheckerWideIO() else refreshChecker = new RefreshCheckerWideIO(memSpec); - lastScheduledByCommandAndBank = std::vector> - (numberOfCommands(), std::vector(memSpec->NumberOfBanks)); - lastScheduledByCommandAndRank = std::vector> - (numberOfCommands(), std::vector(memSpec->NumberOfRanks)); - lastScheduledByCommand = std::vector(numberOfCommands()); + 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); } @@ -64,39 +64,38 @@ CheckerWideIO::~CheckerWideIO() sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Rank rank, BankGroup, Bank bank) { - ScheduledCommand lastCommand; - + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); if (command == Command::ACT) { - lastCommand = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRTP + memSpec->tRP); + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommand = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tWL + memSpec->tCCD + memSpec->tWR + memSpec->tRP); + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->tCCD + memSpec->tWR + memSpec->tRP); - lastCommand = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRP); + lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRC); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommand = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRRD); + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommand = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); + lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommand = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRFC); + lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); if (lastActivates[rank.ID()].size() >= 2) earliestTimeToStart = std::max(earliestTimeToStart, lastActivates[rank.ID()].front() + memSpec->tTAW); @@ -105,46 +104,46 @@ sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Rank rank, Ban } else if (command == Command::RD || command == Command::RDA) { - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRCD); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommand = lastScheduledByCommand[Command::RD]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tCCD); + lastCommandStart = lastScheduledByCommand[Command::RD]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommand = lastScheduledByCommand[Command::WR]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tWL + memSpec->tCCD + memSpec->tWTR); + lastCommandStart = lastScheduledByCommand[Command::WR]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->tCCD + memSpec->tWTR); refreshChecker->delayToSatisfyRD(bank, earliestTimeToStart); } else if (command == Command::WR || command == Command::WRA) { - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRCD); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommand = lastScheduledByCommand[Command::RD]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRL + memSpec->tCCD + 2 * memSpec->clk - memSpec->tWL); + lastCommandStart = lastScheduledByCommand[Command::RD]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->tCCD + 2 * memSpec->clk - memSpec->tWL); - lastCommand = lastScheduledByCommand[Command::WR]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tCCD); + lastCommandStart = lastScheduledByCommand[Command::WR]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); refreshChecker->delayToSatisfyWR(bank, earliestTimeToStart); } else if (command == Command::PRE) { - lastCommand = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRAS); + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommand = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tRTP); + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommand = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; - if (lastCommand.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommand.getStart() + memSpec->tWL + memSpec->tCCD + memSpec->tWR); + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + if (lastCommandStart != SC_ZERO_TIME) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->tCCD + memSpec->tWR); refreshChecker->delayToSatisfyPRE(bank, earliestTimeToStart); } @@ -153,31 +152,27 @@ sc_time CheckerWideIO::delayToSatisfyConstraints(Command command, Rank rank, Ban reportFatal("CheckerWideIO", "Unknown command!"); } // Check if command bus is free - if (lastScheduled.isValidCommand()) - earliestTimeToStart = std::max(earliestTimeToStart, lastScheduled.getStart() + memSpec->clk); + //if (lastScheduled.isValidCommand()) + earliestTimeToStart = std::max(earliestTimeToStart, lastScheduled + memSpec->clk); return (earliestTimeToStart - sc_time_stamp()); } -void CheckerWideIO::insert(const ScheduledCommand &scheduledCommand) +void CheckerWideIO::insert(Command command, Rank rank, Bank bank) { - 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)); + PRINTDEBUGMESSAGE("CheckerWideIO", "Changing state on bank " + bank.ID() + + " command is " + commandToString(command)); - lastScheduledByCommandAndBank[command][bank.ID()] = scheduledCommand; - lastScheduledByCommandAndRank[command][rank.ID()] = scheduledCommand; - lastScheduledByCommand[command] = scheduledCommand; - lastScheduled = scheduledCommand; + lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommand[command] = sc_time_stamp(); + lastScheduled = sc_time_stamp(); if (command == Command::ACT) { if (lastActivates[rank.ID()].size() == 2) lastActivates[rank.ID()].pop(); - lastActivates[rank.ID()].push(scheduledCommand.getStart()); + lastActivates[rank.ID()].push(sc_time_stamp()); } 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 b8f8c460..6d48bbd9 100644 --- a/DRAMSys/library/src/controller/checker/CheckerWideIO.h +++ b/DRAMSys/library/src/controller/checker/CheckerWideIO.h @@ -49,7 +49,7 @@ public: CheckerWideIO(); ~CheckerWideIO(); sc_time delayToSatisfyConstraints(Command, Rank, BankGroup, Bank); - void insert(const ScheduledCommand &); + void insert(Command, Rank, Bank); private: const MemSpecWideIO *memSpec;