Implemented some basics for ranks.

This commit is contained in:
Lukas Steiner (2)
2019-09-12 14:56:06 +02:00
parent 26c3bd23c1
commit b9700f1ee5
6 changed files with 139 additions and 68 deletions

View File

@@ -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)

View File

@@ -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);

View File

@@ -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!!!
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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;