44 lines
1.4 KiB
C++
44 lines
1.4 KiB
C++
#include "SchedulerFrFcfs.h"
|
|
#include <systemc.h>
|
|
|
|
void SchedulerFrFcfs::storeRequest(tlm_generic_payload *payload)
|
|
{
|
|
Bank bank = DramExtension::getBank(payload);
|
|
buffer[bank].push_back(payload);
|
|
}
|
|
|
|
tlm_generic_payload *SchedulerFrFcfs::getNextRequest(Bank bank, BankMachine *bankMachine)
|
|
{
|
|
if (!buffer[bank].empty())
|
|
{
|
|
BmState currentState = bankMachine->getState();
|
|
if (currentState == BmState::Precharged)
|
|
{
|
|
tlm_generic_payload *result = buffer[bank].front();
|
|
buffer[bank].erase(buffer[bank].begin());
|
|
return result;
|
|
}
|
|
else if (currentState == BmState::Activated)
|
|
{
|
|
// Search for row hit
|
|
Row openRow = bankMachine->getOpenRow();
|
|
for (auto it = buffer[bank].begin(); it != buffer[bank].end(); it++)
|
|
{
|
|
if (DramExtension::getRow(*it) == openRow)
|
|
{
|
|
tlm_generic_payload *result = *it;
|
|
buffer[bank].erase(it);
|
|
return result;
|
|
}
|
|
}
|
|
// No row hit found
|
|
tlm_generic_payload *result = buffer[bank].front();
|
|
buffer[bank].erase(buffer[bank].begin());
|
|
return result;
|
|
}
|
|
else
|
|
SC_REPORT_FATAL("SchedulerFrFcfs", "Wrong BM state!");
|
|
}
|
|
return nullptr;
|
|
}
|