Minor changes in arbiter.

This commit is contained in:
Lukas Steiner
2021-01-27 13:57:01 +01:00
parent d86dc97a28
commit a06bd9fc5b
2 changed files with 37 additions and 30 deletions

View File

@@ -44,7 +44,6 @@ using namespace tlm;
Arbiter::Arbiter(sc_module_name name, std::string pathToAddressMapping) :
sc_module(name), payloadEventQueue(this, &Arbiter::peqCallback),
maxActiveTransactions(Configuration::getInstance().maxActiveTransactions),
tCK(Configuration::getInstance().memSpec->tCK),
arbitrationDelayFw(Configuration::getInstance().arbitrationDelayFw),
arbitrationDelayBw(Configuration::getInstance().arbitrationDelayBw)
@@ -61,10 +60,12 @@ ArbiterSimple::ArbiterSimple(sc_module_name name, std::string pathToAddressMappi
Arbiter(name, pathToAddressMapping) {}
ArbiterFifo::ArbiterFifo(sc_module_name name, std::string pathToAddressMapping) :
Arbiter(name, pathToAddressMapping) {}
Arbiter(name, pathToAddressMapping),
maxActiveTransactions(Configuration::getInstance().maxActiveTransactions) {}
ArbiterReorder::ArbiterReorder(sc_module_name name, std::string pathToAddressMapping) :
Arbiter(name, pathToAddressMapping) {}
Arbiter(name, pathToAddressMapping),
maxActiveTransactions(Configuration::getInstance().maxActiveTransactions) {}
Arbiter::~Arbiter()
{
@@ -73,36 +74,35 @@ Arbiter::~Arbiter()
void Arbiter::end_of_elaboration()
{
for (unsigned i = 0; i < tSocket.size(); i++) // initiator side
{
threadIsBusy.push_back(false);
nextThreadPayloadIDToAppend.push_back(0);
activeTransactions.push_back(0);
outstandingEndReq.push_back(nullptr);
}
// initiator side
threadIsBusy = std::vector<bool>(tSocket.size(), false);
nextThreadPayloadIDToAppend = std::vector<uint64_t>(tSocket.size(), 0);
for (unsigned i = 0; i < iSocket.size(); i++) // channel side
{
channelIsBusy.push_back(false);
pendingRequests.push_back(std::queue<tlm_generic_payload *>());
nextChannelPayloadIDToAppend.push_back(0);
}
// channel side
channelIsBusy = std::vector<bool>(iSocket.size(), false);
pendingRequests = std::vector<std::queue<tlm_generic_payload *>>(iSocket.size(),
std::queue<tlm_generic_payload *>());
nextChannelPayloadIDToAppend = std::vector<uint64_t>(iSocket.size(), 0);
}
void ArbiterSimple::end_of_elaboration()
{
Arbiter::end_of_elaboration();
for (unsigned i = 0; i < tSocket.size(); i++) // initiator side
pendingResponses.push_back(std::queue<tlm_generic_payload *>());
// initiator side
pendingResponses = std::vector<std::queue<tlm_generic_payload *>>(tSocket.size(),
std::queue<tlm_generic_payload *>());
}
void ArbiterFifo::end_of_elaboration()
{
Arbiter::end_of_elaboration();
for (unsigned i = 0; i < tSocket.size(); i++) // initiator side
pendingResponses.push_back(std::queue<tlm_generic_payload *>());
// initiator side
activeTransactions = std::vector<unsigned int>(tSocket.size(), 0);
outstandingEndReq = std::vector<tlm_generic_payload *>(tSocket.size(), nullptr);
pendingResponses = std::vector<std::queue<tlm_generic_payload *>>(tSocket.size(),
std::queue<tlm_generic_payload *>());
lastEndReq = std::vector<sc_time>(iSocket.size(), sc_max_time());
lastEndResp = std::vector<sc_time>(tSocket.size(), sc_max_time());
@@ -112,11 +112,12 @@ void ArbiterReorder::end_of_elaboration()
{
Arbiter::end_of_elaboration();
for (unsigned i = 0; i < tSocket.size(); i++) // initiator side
{
pendingResponses.push_back(std::set<tlm_generic_payload *, ThreadPayloadIDCompare>());
nextThreadPayloadIDToReturn.push_back(0);
}
// initiator side
activeTransactions = std::vector<unsigned int>(tSocket.size(), 0);
outstandingEndReq = std::vector<tlm_generic_payload *>(tSocket.size(), nullptr);
pendingResponses = std::vector<std::set<tlm_generic_payload *, ThreadPayloadIDCompare>>
(tSocket.size(), std::set<tlm_generic_payload *, ThreadPayloadIDCompare>());
nextThreadPayloadIDToReturn = std::vector<uint64_t>(tSocket.size(), 0);
lastEndReq = std::vector<sc_time>(iSocket.size(), sc_max_time());
lastEndResp = std::vector<sc_time>(tSocket.size(), sc_max_time());

View File

@@ -78,11 +78,6 @@ protected:
std::vector<uint64_t> nextThreadPayloadIDToAppend;
std::vector<uint64_t> nextChannelPayloadIDToAppend;
std::vector<unsigned int> activeTransactions;
const unsigned maxActiveTransactions;
std::vector<tlm::tlm_generic_payload *> outstandingEndReq;
tlm::tlm_sync_enum nb_transport_fw(int id, tlm::tlm_generic_payload &payload,
tlm::tlm_phase &phase, sc_time &fwDelay);
tlm::tlm_sync_enum nb_transport_bw(int, tlm::tlm_generic_payload &payload,
@@ -103,6 +98,7 @@ public:
private:
virtual void end_of_elaboration() override;
virtual void peqCallback(tlm::tlm_generic_payload &payload, const tlm::tlm_phase &phase) override;
std::vector<std::queue<tlm::tlm_generic_payload *>> pendingResponses;
};
@@ -115,6 +111,11 @@ public:
private:
virtual void end_of_elaboration() override;
virtual void peqCallback(tlm::tlm_generic_payload &payload, const tlm::tlm_phase &phase) override;
std::vector<unsigned int> activeTransactions;
const unsigned maxActiveTransactions;
std::vector<tlm::tlm_generic_payload *> outstandingEndReq;
std::vector<std::queue<tlm::tlm_generic_payload *>> pendingResponses;
std::vector<sc_time> lastEndReq;
@@ -131,6 +132,9 @@ private:
virtual void end_of_elaboration() override;
virtual void peqCallback(tlm::tlm_generic_payload &payload, const tlm::tlm_phase &phase) override;
std::vector<unsigned int> activeTransactions;
const unsigned maxActiveTransactions;
struct ThreadPayloadIDCompare
{
bool operator() (const tlm::tlm_generic_payload *lhs, const tlm::tlm_generic_payload *rhs) const
@@ -138,6 +142,8 @@ private:
return DramExtension::getThreadPayloadID(lhs) < DramExtension::getThreadPayloadID(rhs);
}
};
std::vector<tlm::tlm_generic_payload *> outstandingEndReq;
std::vector<std::set<tlm::tlm_generic_payload*, ThreadPayloadIDCompare>> pendingResponses;
std::vector<sc_time> lastEndReq;