Add new dram extensions.

This commit is contained in:
Lukas Steiner
2022-04-26 11:10:30 +02:00
parent ef29af81e3
commit 7c1642bc58
2 changed files with 201 additions and 0 deletions

View File

@@ -41,6 +41,153 @@
using namespace sc_core;
using namespace tlm;
ArbiterExtension::ArbiterExtension(Thread thread, Channel channel, uint64_t threadPayloadID,
const sc_core::sc_time& timeOfGeneration) :
thread(thread), channel(channel), threadPayloadID(threadPayloadID), timeOfGeneration(timeOfGeneration)
{}
void ArbiterExtension::setExtension(tlm::tlm_generic_payload& trans, Thread thread, Channel channel)
{
auto* extension = trans.get_extension<ArbiterExtension>();
if (extension != nullptr)
{
extension->thread = thread;
extension->channel = channel;
extension->threadPayloadID = 0;
extension->timeOfGeneration = SC_ZERO_TIME;
}
else
{
extension = new ArbiterExtension(thread, channel, 0, SC_ZERO_TIME);
trans.set_auto_extension(extension);
}
}
void ArbiterExtension::setIDAndTimeOfGeneration(tlm::tlm_generic_payload& trans, uint64_t threadPayloadID,
const sc_core::sc_time& timeOfGeneration)
{
assert(trans.get_extension<ArbiterExtension>() != nullptr);
auto* extension = trans.get_extension<ArbiterExtension>();
extension->threadPayloadID = threadPayloadID;
extension->timeOfGeneration = timeOfGeneration;
}
tlm_extension_base* ArbiterExtension::clone() const
{
return new ArbiterExtension(thread, channel, threadPayloadID, timeOfGeneration);
}
void ArbiterExtension::copy_from(const tlm_extension_base& ext)
{
const auto& cpyFrom = dynamic_cast<const ArbiterExtension&>(ext);
thread = cpyFrom.thread;
channel = cpyFrom.channel;
threadPayloadID = cpyFrom.threadPayloadID;
timeOfGeneration = cpyFrom.timeOfGeneration;
}
Thread ArbiterExtension::getThread(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ArbiterExtension>()->thread;
}
Channel ArbiterExtension::getChannel(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ArbiterExtension>()->channel;
}
uint64_t ArbiterExtension::getThreadPayloadID(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ArbiterExtension>()->threadPayloadID;
}
sc_time ArbiterExtension::getTimeOfGeneration(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ArbiterExtension>()->timeOfGeneration;
}
ControllerExtension::ControllerExtension(uint64_t channelPayloadID, Rank rank, BankGroup bankGroup, Bank bank, Row row,
Column column, unsigned int burstLength) :
channelPayloadID(channelPayloadID), rank(rank), bankGroup(bankGroup), bank(bank), row(row), column(column),
burstLength(burstLength)
{}
void ControllerExtension::setExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank,
BankGroup bankGroup, Bank bank, Row row, Column column, unsigned int burstLength)
{
auto* extension = trans.get_extension<ControllerExtension>();
if (extension != nullptr)
{
extension->channelPayloadID = channelPayloadID;
extension->rank = rank;
extension->bankGroup = bankGroup;
extension->bank = bank;
extension->row = row;
extension->column = column;
extension->burstLength = burstLength;
}
else
{
extension = new ControllerExtension(channelPayloadID, rank, bankGroup, bank, row, column, burstLength);
trans.set_auto_extension(extension);
}
}
tlm_extension_base* ControllerExtension::clone() const
{
return new ControllerExtension(channelPayloadID, rank, bankGroup, bank, row, column, burstLength);
}
void ControllerExtension::copy_from(const tlm_extension_base& ext)
{
const auto& cpyFrom = dynamic_cast<const ControllerExtension&>(ext);
channelPayloadID = cpyFrom.channelPayloadID;
rank = cpyFrom.rank;
bankGroup = cpyFrom.bankGroup;
bank = cpyFrom.bank;
row = cpyFrom.row;
column = cpyFrom.column;
burstLength = cpyFrom.burstLength;
}
uint64_t ControllerExtension::getChannelPayloadID(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ControllerExtension>()->channelPayloadID;
}
Rank ControllerExtension::getRank(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ControllerExtension>()->rank;
}
BankGroup ControllerExtension::getBankGroup(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ControllerExtension>()->bankGroup;
}
Bank ControllerExtension::getBank(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ControllerExtension>()->bank;
}
Row ControllerExtension::getRow(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ControllerExtension>()->row;
}
Column ControllerExtension::getColumn(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ControllerExtension>()->column;
}
unsigned ControllerExtension::getBurstLength(const tlm::tlm_generic_payload& trans)
{
return trans.get_extension<ControllerExtension>()->burstLength;
}
DramExtension::DramExtension() :
thread(0), channel(0), rank(0), bankGroup(0), bank(0),
row(0), column(0), burstLength(0),

View File

@@ -154,6 +154,60 @@ private:
unsigned int id;
};
class ArbiterExtension : public tlm::tlm_extension<ArbiterExtension>
{
public:
static void setExtension(tlm::tlm_generic_payload& trans, Thread thread, Channel channel);
static void setIDAndTimeOfGeneration(tlm::tlm_generic_payload& trans, uint64_t threadPayloadID,
const sc_core::sc_time& timeOfGeneration);
tlm::tlm_extension_base* clone() const override;
void copy_from(const tlm::tlm_extension_base& ext) override;
static Thread getThread(const tlm::tlm_generic_payload& trans);
static Channel getChannel(const tlm::tlm_generic_payload& trans);
static uint64_t getThreadPayloadID(const tlm::tlm_generic_payload& trans);
static sc_core::sc_time getTimeOfGeneration(const tlm::tlm_generic_payload& trans);
private:
ArbiterExtension(Thread thread, Channel channel, uint64_t threadPayloadID, const sc_core::sc_time& timeOfGeneration);
Thread thread;
Channel channel;
uint64_t threadPayloadID;
sc_core::sc_time timeOfGeneration;
};
class ControllerExtension : public tlm::tlm_extension<ControllerExtension>
{
public:
static void setExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank, BankGroup bankGroup,
Bank bank, Row row, Column column, unsigned burstLength);
//static ControllerExtension& getExtension(const tlm::tlm_generic_payload& trans);
tlm::tlm_extension_base* clone() const override;
void copy_from(const tlm::tlm_extension_base& ext) override;
static uint64_t getChannelPayloadID(const tlm::tlm_generic_payload& trans);
static Rank getRank(const tlm::tlm_generic_payload& trans);
static BankGroup getBankGroup(const tlm::tlm_generic_payload& trans);
static Bank getBank(const tlm::tlm_generic_payload& trans);
static Row getRow(const tlm::tlm_generic_payload& trans);
static Column getColumn(const tlm::tlm_generic_payload& trans);
static unsigned getBurstLength(const tlm::tlm_generic_payload& trans);
private:
ControllerExtension(uint64_t channelPayloadID, Rank rank, BankGroup bankGroup, Bank bank, Row row, Column column,
unsigned burstLength);
uint64_t channelPayloadID;
Rank rank;
BankGroup bankGroup;
Bank bank;
Row row;
Column column;
unsigned burstLength;
};
class DramExtension : public tlm::tlm_extension<DramExtension>
{