Changed data structures of timing checkers from ScheduledCommand to sc_time.
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -48,11 +48,11 @@ CheckerDDR3::CheckerDDR3()
|
||||
else
|
||||
refreshChecker = new RefreshCheckerDDR3(memSpec);
|
||||
|
||||
lastScheduledByCommandAndBank = std::vector<std::vector<ScheduledCommand>>
|
||||
(numberOfCommands(), std::vector<ScheduledCommand>(memSpec->NumberOfBanks));
|
||||
lastScheduledByCommandAndRank = std::vector<std::vector<ScheduledCommand>>
|
||||
(numberOfCommands(), std::vector<ScheduledCommand>(memSpec->NumberOfRanks));
|
||||
lastScheduledByCommand = std::vector<ScheduledCommand>(numberOfCommands());
|
||||
lastScheduledByCommandAndBank = std::vector<std::vector<sc_time>>
|
||||
(numberOfCommands(), std::vector<sc_time>(memSpec->NumberOfBanks));
|
||||
lastScheduledByCommandAndRank = std::vector<std::vector<sc_time>>
|
||||
(numberOfCommands(), std::vector<sc_time>(memSpec->NumberOfRanks));
|
||||
lastScheduledByCommand = std::vector<sc_time>(numberOfCommands());
|
||||
|
||||
lastActivates = std::vector<std::queue<sc_time>>(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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<std::vector<ScheduledCommand>> lastScheduledByCommandAndBank;
|
||||
std::vector<std::vector<ScheduledCommand>> lastScheduledByCommandAndRank;
|
||||
std::vector<ScheduledCommand> lastScheduledByCommand;
|
||||
ScheduledCommand lastScheduled;
|
||||
std::vector<std::vector<sc_time>> lastScheduledByCommandAndBank;
|
||||
std::vector<std::vector<sc_time>> lastScheduledByCommandAndRank;
|
||||
std::vector<sc_time> lastScheduledByCommand;
|
||||
sc_time lastScheduled;
|
||||
|
||||
// PowerDown TODO: Implement this method?
|
||||
//sc_time getTimeConstraintToEnterPowerDown(Command lastCmd, Command pdnCmd) const;
|
||||
|
||||
@@ -48,11 +48,11 @@ CheckerWideIO::CheckerWideIO()
|
||||
else
|
||||
refreshChecker = new RefreshCheckerWideIO(memSpec);
|
||||
|
||||
lastScheduledByCommandAndBank = std::vector<std::vector<ScheduledCommand>>
|
||||
(numberOfCommands(), std::vector<ScheduledCommand>(memSpec->NumberOfBanks));
|
||||
lastScheduledByCommandAndRank = std::vector<std::vector<ScheduledCommand>>
|
||||
(numberOfCommands(), std::vector<ScheduledCommand>(memSpec->NumberOfRanks));
|
||||
lastScheduledByCommand = std::vector<ScheduledCommand>(numberOfCommands());
|
||||
lastScheduledByCommandAndBank = std::vector<std::vector<sc_time>>
|
||||
(numberOfCommands(), std::vector<sc_time>(memSpec->NumberOfBanks));
|
||||
lastScheduledByCommandAndRank = std::vector<std::vector<sc_time>>
|
||||
(numberOfCommands(), std::vector<sc_time>(memSpec->NumberOfRanks));
|
||||
lastScheduledByCommand = std::vector<sc_time>(numberOfCommands());
|
||||
|
||||
lastActivates = std::vector<std::queue<sc_time>>(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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user