Implemented some basics for ranks.
This commit is contained in:
@@ -42,22 +42,21 @@
|
||||
|
||||
using namespace tlm;
|
||||
|
||||
|
||||
DramExtension::DramExtension() :
|
||||
thread(0), channel(0), bank(0), bankgroup(0),
|
||||
thread(0), channel(0), rank(0), bankgroup(0), bank(0),
|
||||
row(0), column(0), burstlength(0), payloadID(0) {}
|
||||
|
||||
DramExtension::DramExtension(const Thread &thread, const Bank &bank,
|
||||
const BankGroup &bankgroup, const Row &row, const Column &column,
|
||||
DramExtension::DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup,
|
||||
const Bank &bank, const Row &row, const Column &column,
|
||||
unsigned int burstlength, uint64_t payloadID) :
|
||||
thread(thread), channel(0), bank(bank), bankgroup(bankgroup), row(row),
|
||||
column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
thread(thread), channel(0), rank(rank), bankgroup(bankgroup), bank(bank),
|
||||
row(row), column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
|
||||
DramExtension::DramExtension(const Thread &thread, const Channel &channel,
|
||||
const Bank &bank, const BankGroup &bankgroup, const Row &row,
|
||||
DramExtension::DramExtension(const Thread &thread, const Channel &channel, const Rank &rank,
|
||||
const BankGroup &bankgroup, const Bank &bank, const Row &row,
|
||||
const Column &column, unsigned int burstlength, uint64_t payloadID) :
|
||||
thread(thread), channel(channel), bank(bank), bankgroup(bankgroup), row(row),
|
||||
column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
thread(thread), channel(channel), rank(rank), bankgroup(bankgroup), bank(bank),
|
||||
row(row), column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
|
||||
DramExtension &DramExtension::getExtension(const tlm_generic_payload *payload)
|
||||
{
|
||||
@@ -73,14 +72,14 @@ DramExtension &DramExtension::getExtension(const tlm_generic_payload &payload)
|
||||
return DramExtension::getExtension(&payload);
|
||||
}
|
||||
|
||||
Bank DramExtension::getBank(const tlm_generic_payload *payload)
|
||||
Thread DramExtension::getThread(const tlm_generic_payload *payload)
|
||||
{
|
||||
return DramExtension::getExtension(payload).getBank();
|
||||
return DramExtension::getExtension(payload).getThread();
|
||||
}
|
||||
|
||||
Bank DramExtension::getBank(const tlm_generic_payload &payload)
|
||||
Thread DramExtension::getThread(const tlm_generic_payload &payload)
|
||||
{
|
||||
return DramExtension::getBank(&payload);
|
||||
return DramExtension::getThread(&payload);
|
||||
}
|
||||
|
||||
Channel DramExtension::getChannel(const tlm_generic_payload *payload)
|
||||
@@ -93,14 +92,34 @@ Channel DramExtension::getChannel(const tlm_generic_payload &payload)
|
||||
return DramExtension::getChannel(&payload);
|
||||
}
|
||||
|
||||
Thread DramExtension::getThread(const tlm_generic_payload *payload)
|
||||
Rank DramExtension::getRank(const tlm_generic_payload *payload)
|
||||
{
|
||||
return DramExtension::getExtension(payload).getThread();
|
||||
return DramExtension::getExtension(payload).getRank();
|
||||
}
|
||||
|
||||
Thread DramExtension::getThread(const tlm_generic_payload &payload)
|
||||
Rank DramExtension::getRank(const tlm_generic_payload &payload)
|
||||
{
|
||||
return DramExtension::getThread(&payload);
|
||||
return DramExtension::getRank(&payload);
|
||||
}
|
||||
|
||||
BankGroup DramExtension::getBankGroup(const tlm_generic_payload *payload)
|
||||
{
|
||||
return DramExtension::getExtension(payload).getBankGroup();
|
||||
}
|
||||
|
||||
BankGroup DramExtension::getBankGroup(const tlm_generic_payload &payload)
|
||||
{
|
||||
return DramExtension::getBankGroup(&payload);
|
||||
}
|
||||
|
||||
Bank DramExtension::getBank(const tlm_generic_payload *payload)
|
||||
{
|
||||
return DramExtension::getExtension(payload).getBank();
|
||||
}
|
||||
|
||||
Bank DramExtension::getBank(const tlm_generic_payload &payload)
|
||||
{
|
||||
return DramExtension::getBank(&payload);
|
||||
}
|
||||
|
||||
Row DramExtension::getRow(const tlm_generic_payload *payload)
|
||||
@@ -113,6 +132,16 @@ Row DramExtension::getRow(const tlm_generic_payload &payload)
|
||||
return DramExtension::getRow(&payload);
|
||||
}
|
||||
|
||||
Column DramExtension::getColumn(const tlm_generic_payload *payload)
|
||||
{
|
||||
return DramExtension::getExtension(payload).getColumn();
|
||||
}
|
||||
|
||||
Column DramExtension::getColumn(const tlm_generic_payload &payload)
|
||||
{
|
||||
return DramExtension::getColumn(&payload);
|
||||
}
|
||||
|
||||
uint64_t DramExtension::getPayloadID(const tlm_generic_payload *payload)
|
||||
{
|
||||
return DramExtension::getExtension(payload).getPayloadID();
|
||||
@@ -125,15 +154,17 @@ uint64_t DramExtension::getPayloadID(const tlm_generic_payload &payload)
|
||||
|
||||
tlm_extension_base *DramExtension::clone() const
|
||||
{
|
||||
return new DramExtension(thread, bank, bankgroup, row, column, burstlength, payloadID);
|
||||
return new DramExtension(thread, channel, rank, bankgroup, bank, row, column, burstlength, payloadID);
|
||||
}
|
||||
|
||||
void DramExtension::copy_from(const tlm_extension_base &ext)
|
||||
{
|
||||
const DramExtension &cpyFrom = static_cast<const DramExtension &>(ext);
|
||||
thread = cpyFrom.thread;
|
||||
bank = cpyFrom.bank;
|
||||
channel = cpyFrom.channel;
|
||||
rank = cpyFrom.rank;
|
||||
bankgroup = cpyFrom.bankgroup;
|
||||
bank = cpyFrom.bank;
|
||||
row = cpyFrom.row;
|
||||
column = cpyFrom.column;
|
||||
burstlength = cpyFrom.burstlength;
|
||||
@@ -149,9 +180,9 @@ Channel DramExtension::getChannel() const
|
||||
return channel;
|
||||
}
|
||||
|
||||
Bank DramExtension::getBank() const
|
||||
Rank DramExtension::getRank() const
|
||||
{
|
||||
return bank;
|
||||
return rank;
|
||||
}
|
||||
|
||||
BankGroup DramExtension::getBankGroup() const
|
||||
@@ -159,6 +190,11 @@ BankGroup DramExtension::getBankGroup() const
|
||||
return bankgroup;
|
||||
}
|
||||
|
||||
Bank DramExtension::getBank() const
|
||||
{
|
||||
return bank;
|
||||
}
|
||||
|
||||
Row DramExtension::getRow() const
|
||||
{
|
||||
return row;
|
||||
@@ -191,14 +227,12 @@ tlm_extension_base *GenerationExtension::clone() const
|
||||
|
||||
void GenerationExtension::copy_from(const tlm_extension_base &ext)
|
||||
{
|
||||
const GenerationExtension &cpyFrom = static_cast<const GenerationExtension &>
|
||||
(ext);
|
||||
const GenerationExtension &cpyFrom = static_cast<const GenerationExtension &>(ext);
|
||||
timeOfGeneration = cpyFrom.timeOfGeneration;
|
||||
|
||||
}
|
||||
|
||||
GenerationExtension &GenerationExtension::getExtension(const
|
||||
tlm::tlm_generic_payload *payload)
|
||||
GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload *payload)
|
||||
{
|
||||
GenerationExtension *result = NULL;
|
||||
payload->get_extension(result);
|
||||
@@ -206,14 +240,12 @@ GenerationExtension &GenerationExtension::getExtension(const
|
||||
return *result;
|
||||
}
|
||||
|
||||
sc_time GenerationExtension::getTimeOfGeneration(const tlm::tlm_generic_payload
|
||||
*payload)
|
||||
sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload *payload)
|
||||
{
|
||||
return GenerationExtension::getExtension(payload).TimeOfGeneration();
|
||||
}
|
||||
|
||||
sc_time GenerationExtension::getTimeOfGeneration(const tlm::tlm_generic_payload
|
||||
&payload)
|
||||
sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload &payload)
|
||||
{
|
||||
return GenerationExtension::getTimeOfGeneration(&payload);
|
||||
}
|
||||
@@ -245,6 +277,16 @@ bool operator !=(const Channel &lhs, const Channel &rhs)
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
//RANK
|
||||
bool operator ==(const Rank &lhs, const Rank &rhs)
|
||||
{
|
||||
return lhs.ID() == rhs.ID();
|
||||
}
|
||||
|
||||
bool operator !=(const Rank &lhs, const Rank &rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
//BANKGROUP
|
||||
bool operator ==(const BankGroup &lhs, const BankGroup &rhs)
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#include <iostream>
|
||||
#include <systemc.h>
|
||||
|
||||
using namespace tlm;
|
||||
|
||||
class Thread
|
||||
{
|
||||
public:
|
||||
@@ -69,6 +71,20 @@ private:
|
||||
unsigned int id;
|
||||
};
|
||||
|
||||
class Rank
|
||||
{
|
||||
public:
|
||||
explicit Rank(unsigned int id) : id(id) {}
|
||||
|
||||
unsigned int ID() const
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned int id;
|
||||
};
|
||||
|
||||
class BankGroup
|
||||
{
|
||||
public:
|
||||
@@ -145,39 +161,46 @@ private:
|
||||
};
|
||||
|
||||
|
||||
class DramExtension : public tlm::tlm_extension<DramExtension>
|
||||
class DramExtension : public tlm_extension<DramExtension>
|
||||
{
|
||||
public:
|
||||
DramExtension();
|
||||
DramExtension(const Thread &thread, const Bank &bank,
|
||||
const BankGroup &bankgroup, const Row &row, const Column &column,
|
||||
DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup,
|
||||
const Bank &bank, const Row &row, const Column &column,
|
||||
unsigned int burstlength, uint64_t payloadID);
|
||||
DramExtension(const Thread &thread, const Channel &channel, const Bank &bank,
|
||||
const BankGroup &bankgroup, const Row &row,
|
||||
DramExtension(const Thread &thread, const Channel &channel, const Rank &rank,
|
||||
const BankGroup &bankgroup, const Bank &bank, const Row &row,
|
||||
const Column &column, unsigned int burstlength, uint64_t payloadID);
|
||||
|
||||
virtual tlm_extension_base *clone() const;
|
||||
virtual void copy_from(const tlm_extension_base &ext);
|
||||
|
||||
static DramExtension &getExtension(const tlm::tlm_generic_payload *payload);
|
||||
static DramExtension &getExtension(const tlm::tlm_generic_payload &payload);
|
||||
static DramExtension &getExtension(const tlm_generic_payload *payload);
|
||||
static DramExtension &getExtension(const tlm_generic_payload &payload);
|
||||
|
||||
// Used for convience, caller could also use getExtension(..) to access these field
|
||||
static Bank getBank(const tlm::tlm_generic_payload *payload);
|
||||
static Bank getBank(const tlm::tlm_generic_payload &payload);
|
||||
static Channel getChannel(const tlm::tlm_generic_payload *payload);
|
||||
static Channel getChannel(const tlm::tlm_generic_payload &payload);
|
||||
static Thread getThread(const tlm::tlm_generic_payload *payload);
|
||||
static Thread getThread(const tlm::tlm_generic_payload &payload);
|
||||
static Row getRow(const tlm::tlm_generic_payload *payload);
|
||||
static Row getRow(const tlm::tlm_generic_payload &payload);
|
||||
static uint64_t getPayloadID(const tlm::tlm_generic_payload *payload);
|
||||
static uint64_t getPayloadID(const tlm::tlm_generic_payload &payload);
|
||||
static Thread getThread(const tlm_generic_payload *payload);
|
||||
static Thread getThread(const tlm_generic_payload &payload);
|
||||
static Channel getChannel(const tlm_generic_payload *payload);
|
||||
static Channel getChannel(const tlm_generic_payload &payload);
|
||||
static Rank getRank(const tlm_generic_payload *payload);
|
||||
static Rank getRank(const tlm_generic_payload &payload);
|
||||
static BankGroup getBankGroup(const tlm_generic_payload *payload);
|
||||
static BankGroup getBankGroup(const tlm_generic_payload &payload);
|
||||
static Bank getBank(const tlm_generic_payload *payload);
|
||||
static Bank getBank(const tlm_generic_payload &payload);
|
||||
static Row getRow(const tlm_generic_payload *payload);
|
||||
static Row getRow(const tlm_generic_payload &payload);
|
||||
static Column getColumn(const tlm_generic_payload *payload);
|
||||
static Column getColumn(const tlm_generic_payload &payload);
|
||||
static uint64_t getPayloadID(const tlm_generic_payload *payload);
|
||||
static uint64_t getPayloadID(const tlm_generic_payload &payload);
|
||||
|
||||
Thread getThread() const;
|
||||
Channel getChannel() const;
|
||||
Bank getBank() const;
|
||||
Rank getRank() const;
|
||||
BankGroup getBankGroup() const;
|
||||
Bank getBank() const;
|
||||
Row getRow() const;
|
||||
Column getColumn() const;
|
||||
|
||||
@@ -188,8 +211,9 @@ public:
|
||||
private:
|
||||
Thread thread;
|
||||
Channel channel;
|
||||
Bank bank;
|
||||
Rank rank;
|
||||
BankGroup bankgroup;
|
||||
Bank bank;
|
||||
Row row;
|
||||
Column column;
|
||||
unsigned int burstlength;
|
||||
@@ -200,21 +224,21 @@ private:
|
||||
// Used to indicate the time when a payload is created (in a traceplayer or in a core)
|
||||
// Note that this time can be different from the time the payload enters the DRAM system
|
||||
//(at that time the phase BEGIN_REQ is recorded), so timeOfGeneration =< time(BEGIN_REQ)
|
||||
class GenerationExtension : public tlm::tlm_extension<GenerationExtension>
|
||||
class GenerationExtension : public tlm_extension<GenerationExtension>
|
||||
{
|
||||
public:
|
||||
GenerationExtension(sc_time timeOfGeneration) : timeOfGeneration(
|
||||
timeOfGeneration) {}
|
||||
GenerationExtension(sc_time timeOfGeneration)
|
||||
: timeOfGeneration(timeOfGeneration) {}
|
||||
virtual tlm_extension_base *clone() const;
|
||||
virtual void copy_from(const tlm_extension_base &ext);
|
||||
static GenerationExtension &getExtension(const tlm::tlm_generic_payload
|
||||
*payload);
|
||||
static GenerationExtension
|
||||
&getExtension(const tlm_generic_payload *payload);
|
||||
sc_time TimeOfGeneration() const
|
||||
{
|
||||
return timeOfGeneration;
|
||||
}
|
||||
static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload *payload);
|
||||
static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload &payload);
|
||||
static sc_time getTimeOfGeneration(const tlm_generic_payload *payload);
|
||||
static sc_time getTimeOfGeneration(const tlm_generic_payload &payload);
|
||||
|
||||
private:
|
||||
sc_time timeOfGeneration;
|
||||
@@ -228,6 +252,9 @@ bool operator<(const Thread &lhs, const Thread &rhs);
|
||||
bool operator==(const Channel &lhs, const Channel &rhs);
|
||||
bool operator!=(const Channel &lhs, const Channel &rhs);
|
||||
|
||||
bool operator==(const Rank &lhs, const Rank &rhs);
|
||||
bool operator!=(const Rank &lhs, const Rank &rhs);
|
||||
|
||||
bool operator==(const BankGroup &lhs, const BankGroup &rhs);
|
||||
bool operator!=(const BankGroup &lhs, const BankGroup &rhs);
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
|
||||
using namespace std;
|
||||
using namespace tinyxml2;
|
||||
using namespace tlm;
|
||||
|
||||
bool TimeInterval::timeIsInInterval(sc_time time)
|
||||
{
|
||||
@@ -68,7 +69,7 @@ void reportFatal(std::string sender, std::string message)
|
||||
SC_REPORT_FATAL(sender.c_str(), message.c_str());
|
||||
}
|
||||
|
||||
std::string phaseNameToString(tlm::tlm_phase phase)
|
||||
std::string phaseNameToString(tlm_phase phase)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << phase;
|
||||
@@ -235,17 +236,17 @@ string loadTextFileContents(string filename)
|
||||
}
|
||||
}
|
||||
|
||||
void setUpDummy(tlm::tlm_generic_payload &payload, Bank bank)
|
||||
void setUpDummy(tlm_generic_payload &payload, Rank rank, Bank bank)
|
||||
{
|
||||
payload.set_address(bank.getStartAddress());
|
||||
payload.set_command(tlm::TLM_READ_COMMAND);
|
||||
payload.set_command(TLM_READ_COMMAND);
|
||||
payload.set_data_length(0);
|
||||
payload.set_response_status(tlm::TLM_OK_RESPONSE);
|
||||
payload.set_response_status(TLM_OK_RESPONSE);
|
||||
payload.set_dmi_allowed(false);
|
||||
payload.set_byte_enable_length(0);
|
||||
payload.set_streaming_width(0);
|
||||
payload.set_extension(new DramExtension(Thread(UINT_MAX), bank, BankGroup(0),
|
||||
Row(0), Column(0), 0, 0));
|
||||
payload.set_extension(new DramExtension(Thread(UINT_MAX), rank, BankGroup(0),
|
||||
bank, Row(0), Column(0), 0, 0));
|
||||
// payload takes ownership
|
||||
// TODO: Dummies muessen noch banggruppe und rank sauber bekommen .. noch was ueberlegen!!!
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ std::string queryStringParameter(tinyxml2::XMLElement *node, std::string name);
|
||||
bool queryBoolParameter(tinyxml2::XMLElement *node, std::string name);
|
||||
double queryDoubleParameter(tinyxml2::XMLElement *node, std::string name);
|
||||
|
||||
void setUpDummy(tlm::tlm_generic_payload &payload, Bank bank = Bank(0));
|
||||
void setUpDummy(tlm::tlm_generic_payload &payload, Rank rank = Rank(0), Bank bank = Bank(0));
|
||||
|
||||
#endif // UTILS_H
|
||||
|
||||
|
||||
@@ -41,14 +41,14 @@ RefreshManagerBankwise::RefreshManagerBankwise(std::map<Bank, BankMachine *> &ba
|
||||
: bankMachines(bankMachines)
|
||||
{
|
||||
memSpec = Configuration::getInstance().memSpec;
|
||||
|
||||
// TODO: implement for multiple ranks
|
||||
sc_time currentREFB = memSpec->tREFI - memSpec->clk * (memSpec->NumberOfBanks - 1);
|
||||
sc_time currentPRE = currentREFB - std::max(memSpec->clk * memSpec->NumberOfBanks, memSpec->tRP);
|
||||
timeForNextTrigger = currentPRE;
|
||||
for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++)
|
||||
{
|
||||
states[Bank(bankID)] = RmState::IDLE;
|
||||
setUpDummy(refreshPayloads[Bank(bankID)], Bank(bankID));
|
||||
setUpDummy(refreshPayloads[Bank(bankID)], Rank(0), Bank(bankID));
|
||||
triggerTimes.insert(std::pair<sc_time, Bank>(currentREFB, Bank(bankID)));
|
||||
triggerTimes.insert(std::pair<sc_time, Bank>(currentPRE, Bank(bankID)));
|
||||
currentREFB += memSpec->clk;
|
||||
|
||||
@@ -216,8 +216,9 @@ void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload)
|
||||
DecodedAddress decodedAddress = AddressDecoder::getInstance().decodeAddress(payload.get_address());
|
||||
// Check the valid range of decodedAddress
|
||||
if (addressIsValid(decodedAddress)) {
|
||||
DramExtension *extension = new DramExtension(Thread(socketId), Channel(decodedAddress.channel),
|
||||
Bank(decodedAddress.bank), BankGroup(decodedAddress.bankgroup),
|
||||
DramExtension *extension = new DramExtension(Thread(socketId),
|
||||
Channel(decodedAddress.channel), Rank(decodedAddress.rank),
|
||||
BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank),
|
||||
Row(decodedAddress.row), Column(decodedAddress.column),
|
||||
burstlength, nextPayloadID[decodedAddress.channel]++);
|
||||
payload.set_auto_extension(extension);
|
||||
@@ -226,7 +227,7 @@ void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload)
|
||||
}
|
||||
}
|
||||
|
||||
bool Arbiter::addressIsValid(DecodedAddress &decodedAddress)
|
||||
bool Arbiter::addressIsValid(DecodedAddress &decodedAddress)
|
||||
{
|
||||
if (decodedAddress.channel >= AddressDecoder::getInstance().amount["channel"]) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user