diff --git a/dram/resources/configs/memconfigs/memconfig.xml b/dram/resources/configs/memconfigs/memconfig.xml
index ba84ec9e..1da98872 100644
--- a/dram/resources/configs/memconfigs/memconfig.xml
+++ b/dram/resources/configs/memconfigs/memconfig.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/dram/src/common/dramExtension.h b/dram/src/common/dramExtension.h
index 9bbf4b04..de07576d 100644
--- a/dram/src/common/dramExtension.h
+++ b/dram/src/common/dramExtension.h
@@ -13,52 +13,83 @@
class Thread
{
-public :
- explicit Thread(unsigned int id) : id(id) {}
+public:
+ explicit Thread(unsigned int id) :
+ id(id)
+ {
+ }
- unsigned int ID() const { return id;}
+ unsigned int ID() const
+ {
+ return id;
+ }
private:
unsigned int id;
};
-
class Channel
{
-public :
- explicit Channel(unsigned int id) : id(id) {}
- unsigned int ID() const { return id;}
+public:
+ explicit Channel(unsigned int id) :
+ id(id)
+ {
+ }
+ unsigned int ID() const
+ {
+ return id;
+ }
private:
unsigned int id;
};
class BankGroup
{
-public :
- explicit BankGroup(unsigned int id) : id(id) {}
- unsigned int ID() const { return id;}
+public:
+ explicit BankGroup(unsigned int id) :
+ id(id)
+ {
+ }
+ unsigned int ID() const
+ {
+ return id;
+ }
private:
unsigned int id;
};
class Bank
{
-public :
- explicit Bank(unsigned int id) : id(id) {}
- unsigned int ID() const { return id;}
+public:
+ explicit Bank(unsigned int id) :
+ id(id)
+ {
+ }
+ unsigned int ID() const
+ {
+ return id;
+ }
private:
unsigned int id;
};
-
class Row
{
-public :
+public:
static const Row NO_ROW;
- Row() : id(0), isNoRow(true) {}
- explicit Row(unsigned int id) : id(id), isNoRow(false) {}
+ Row() :
+ id(0), isNoRow(true)
+ {
+ }
+ explicit Row(unsigned int id) :
+ id(id), isNoRow(false)
+ {
+ }
- unsigned int ID() const { return id;}
+ unsigned int ID() const
+ {
+ return id;
+ }
private:
unsigned int id;
bool isNoRow;
@@ -68,10 +99,16 @@ private:
class Column
{
-public :
- explicit Column(unsigned int id) : id(id) {}
+public:
+ explicit Column(unsigned int id) :
+ id(id)
+ {
+ }
- unsigned int ID() const { return id;}
+ unsigned int ID() const
+ {
+ return id;
+ }
private:
unsigned int id;
};
@@ -95,50 +132,90 @@ bool operator!=(const Row &lhs, const Row &rhs);
bool operator==(const Column &lhs, const Column &rhs);
bool operator!=(const Column &lhs, const Column &rhs);
-class DramExtension : public tlm::tlm_extension
+class DramExtension: public tlm::tlm_extension
{
private:
Thread thread;
Channel channel;
Bank bank;
- Row row;
+ BankGroup bankgroup;
+ Row row;
Column column;
unsigned int burstlength;
public:
- DramExtension():thread(0),channel(0),bank(0),row(0),column(0),burstlength(0){}
- DramExtension(const Thread& thread, const Bank& bank, const Row& row, const Column& column, unsigned int burstlength=0) :
- thread(thread),channel(0),bank(bank),row(row),column(column), burstlength(burstlength){}
- DramExtension(const Thread& thread,const Channel& channel, const Bank& bank, const Row& row, const Column& column, unsigned int burstlength=0) :
- thread(thread),channel(channel),bank(bank),row(row),column(column), burstlength(burstlength){}
+ DramExtension() :
+ thread(0), channel(0), bank(0), bankgroup(0), row(0), column(0), burstlength(0)
+ {
+ }
+ DramExtension(const Thread& thread, const Bank& bank, const BankGroup& bankgroup,
+ const Row& row, const Column& column, unsigned int burstlength = 0) :
+ thread(thread), channel(0), bank(bank), bankgroup(bankgroup), row(row), column(column), burstlength(
+ burstlength)
+ {
+ }
+ DramExtension(const Thread& thread, const Channel& channel, const Bank& bank,
+ const BankGroup& bankgroup, const Row& row, const Column& column,
+ unsigned int burstlength = 0) :
+ thread(thread), channel(channel), bank(bank), bankgroup(bankgroup), row(row), column(
+ column), burstlength(burstlength)
+ {
+ }
-
- ~DramExtension(){}
+ ~DramExtension()
+ {
+ }
virtual tlm_extension_base* clone() const
{
- return new DramExtension(thread, bank, row, column, burstlength);
+ return new DramExtension(thread, bank, bankgroup, row, column, burstlength);
}
virtual void copy_from(const tlm_extension_base& ext)
{
const DramExtension& cpyFrom = static_cast(ext);
thread = cpyFrom.thread;
bank = cpyFrom.bank;
+ bankgroup = cpyFrom.bankgroup;
row = cpyFrom.row;
column = cpyFrom.column;
burstlength = cpyFrom.burstlength;
}
- const Thread& getThread() const{return thread;}
- const Channel& getChannel() const{return channel;}
- const Bank& getBank() const{return bank;}
- const Row& getRow() const{return row;}
- const Column& getColumn() const{return column;}
- const unsigned int getBurstlength() const{return burstlength;}
+ const Thread& getThread() const
+ {
+ return thread;
+ }
+ const Channel& getChannel() const
+ {
+ return channel;
+ }
+ const Bank& getBank() const
+ {
+ return bank;
+ }
+ const BankGroup& getBankGroup() const
+ {
+ return bankgroup;
+ }
+ const Row& getRow() const
+ {
+ return row;
+ }
+ const Column& getColumn() const
+ {
+ return column;
+ }
+ const unsigned int getBurstlength() const
+ {
+ return burstlength;
+ }
- void setRow(const Row& row){this->row = row;}
+ void setRow(const Row& row)
+ {
+ this->row = row;
+ }
- static DramExtension& getExtension(const tlm::tlm_generic_payload *payload);
- static DramExtension& getExtension(const tlm::tlm_generic_payload &payload);
+ static DramExtension& getExtension(const tlm::tlm_generic_payload *payload);
+ static DramExtension& getExtension(const tlm::tlm_generic_payload &payload);
};
#endif /* DRAMEXTENSION_H_ */
diff --git a/dram/src/core/powerdown/PowerDownManager.cpp b/dram/src/core/powerdown/PowerDownManager.cpp
index f6c0c82b..55d343f7 100644
--- a/dram/src/core/powerdown/PowerDownManager.cpp
+++ b/dram/src/core/powerdown/PowerDownManager.cpp
@@ -8,6 +8,7 @@
#include "PowerDownManager.h"
#include "../ControllerCore.h"
#include "../../common/Utils.h"
+#include "../utils/Utils.h"
using namespace tlm;
@@ -251,14 +252,7 @@ void PowerDownManager::init()
for (Bank bank : controller.getBanks())
{
tlm_generic_payload& payload = powerDownPayloads[bank];
- payload.set_address(getStartAddress(bank));
- payload.set_command(tlm::TLM_READ_COMMAND);
- payload.set_data_length(0);
- payload.set_response_status(tlm::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(0), bank, Row(0), Column(0))); //payload takes ownership
+ setUpDummy(payload, bank);
//send payload
ScheduledCommand pdn(Command::PDNP, SC_ZERO_TIME, SC_ZERO_TIME,
diff --git a/dram/src/core/refresh/RefreshManager.cpp b/dram/src/core/refresh/RefreshManager.cpp
index dda7c261..d421d257 100644
--- a/dram/src/core/refresh/RefreshManager.cpp
+++ b/dram/src/core/refresh/RefreshManager.cpp
@@ -7,6 +7,7 @@
#include "RefreshManager.h"
#include "../ControllerCore.h"
+#include "../utils/Utils.h"
using namespace tlm;
namespace core {
@@ -92,15 +93,7 @@ void RefreshManager::setupTransactions()
{
for (Bank bank : controller.getBanks())
{
- tlm_generic_payload& payload = refreshPayloads.at(bank.ID());
- payload.set_address(getStartAddress(bank));
- payload.set_command(tlm::TLM_READ_COMMAND);
- payload.set_data_length(0);
- payload.set_response_status(tlm::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(0), bank, Row(0), Column(0))); //payload takes ownership
+ setUpDummy(refreshPayloads.at(bank.ID()), bank);
}
}
diff --git a/dram/src/core/refresh/RefreshManagerBankwise.cpp b/dram/src/core/refresh/RefreshManagerBankwise.cpp
index 13e0446b..10b99668 100644
--- a/dram/src/core/refresh/RefreshManagerBankwise.cpp
+++ b/dram/src/core/refresh/RefreshManagerBankwise.cpp
@@ -115,14 +115,7 @@ bool RefreshManagerBankwise::RefreshManagerForBank::isInvalidated(sc_time time)
void RefreshManagerBankwise::RefreshManagerForBank::setupTransaction()
{
- refreshPayload.set_address(getStartAddress(bank));
- refreshPayload.set_command(tlm::TLM_READ_COMMAND);
- refreshPayload.set_data_length(0);
- refreshPayload.set_response_status(tlm::TLM_OK_RESPONSE);
- refreshPayload.set_dmi_allowed(false);
- refreshPayload.set_byte_enable_length(0);
- refreshPayload.set_streaming_width(0);
- refreshPayload.set_extension(new DramExtension(Thread(0), bank, Row(0), Column(0))); //payload takes ownership
+ setUpDummy(refreshPayload, bank);
}
void RefreshManagerBankwise::reInitialize(tlm::tlm_generic_payload& payload, sc_time time)
diff --git a/dram/src/core/utils/Utils.cpp b/dram/src/core/utils/Utils.cpp
index 3a2ef906..23aa45c2 100644
--- a/dram/src/core/utils/Utils.cpp
+++ b/dram/src/core/utils/Utils.cpp
@@ -83,3 +83,15 @@ sc_time core::getBurstLengthOnDataStrobe(unsigned int burstlength)
return config.Timings.clk * (burstlength / config.DataRate);
}
+
+void core::setUpDummy(tlm::tlm_generic_payload& payload, Bank& bank)
+{
+ payload.set_address(getStartAddress(bank));
+ payload.set_command(tlm::TLM_READ_COMMAND);
+ payload.set_data_length(0);
+ payload.set_response_status(tlm::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(0), bank, getBankGroup(bank), Row(0), Column(0))); //payload takes ownership
+}
diff --git a/dram/src/core/utils/Utils.h b/dram/src/core/utils/Utils.h
index f07b1d0e..fcdc907a 100644
--- a/dram/src/core/utils/Utils.h
+++ b/dram/src/core/utils/Utils.h
@@ -39,5 +39,7 @@ bool isClkAligned(sc_time time, sc_time clk);
BankGroup getBankGroup(Bank bank);
+void setUpDummy(tlm::tlm_generic_payload& payload, Bank& bank);
+
};
#endif /* UTILS_H_ */
diff --git a/dram/src/simulation/Arbiter.h b/dram/src/simulation/Arbiter.h
index cf6612d7..da63b81d 100644
--- a/dram/src/simulation/Arbiter.h
+++ b/dram/src/simulation/Arbiter.h
@@ -17,6 +17,7 @@
#include
#include "../common/xmlAddressdecoder.h"
#include "../common/dramExtension.h"
+#include "../core/utils/Utils.h"
#include
@@ -135,7 +136,7 @@ private:
unsigned int burstlength = payload.get_streaming_width();
node n;
xmlAddressDecoder::getInstance().getNode(static_cast(payload.get_address()), &n);
- DramExtension* extension = new DramExtension(Thread(socketId+1), Channel(n.channel), Bank(n.bank), Row(n.row), Column(n.colum),burstlength);
+ DramExtension* extension = new DramExtension(Thread(socketId+1), Channel(n.channel), Bank(n.bank), core::getBankGroup(Bank(n.bank)), Row(n.row), Column(n.colum),burstlength);
payload.set_auto_extension(extension);
}
};
diff --git a/dram/src/simulation/Controller.h b/dram/src/simulation/Controller.h
index fe4047b2..3d4c51a7 100644
--- a/dram/src/simulation/Controller.h
+++ b/dram/src/simulation/Controller.h
@@ -207,6 +207,8 @@ private:
Scheduler* scheduler;
std::map numberOfPayloadsInSystem;
+ tlm::tlm_generic_payload* backpressure = NULL;
+
tlm_utils::peq_with_cb_and_phase frontendPEQ;
tlm_utils::peq_with_cb_and_phase dramPEQ;
tlm_utils::peq_with_cb_and_phase controllerPEQ;
@@ -214,6 +216,16 @@ private:
sc_time inputBufferDelay;
DebugManager& debugManager;
+ unsigned int getNumberOfPayloadsInSystem()
+ {
+ unsigned int sum = 0;
+ for(Bank bank : controller->getBanks())
+ {
+ sum += numberOfPayloadsInSystem[bank];
+ }
+ return sum;
+ }
+
void payloadEntersSystem(tlm_generic_payload& payload)
{
Bank bank = DramExtension::getExtension(payload).getBank();
@@ -296,11 +308,26 @@ private:
if (phase == BEGIN_REQ)
{
payload.acquire();
+ if(getNumberOfPayloadsInSystem() == controller->config.MaxNrOfTransactions)
+ {
+ printDebugMessage("##Backpressure: Max number of transactions in system reached");
+ backpressure = &payload;
+ return TLM_ACCEPTED;
+ }
+
payloadEntersSystem(payload);
frontendPEQ.notify(payload, phase, inputBufferDelay);
}
else if (phase == END_RESP)
{
+ if(backpressure != NULL)
+ {
+ payloadEntersSystem(*backpressure);
+ frontendPEQ.notify(*backpressure, BEGIN_REQ, inputBufferDelay);
+ backpressure = NULL;
+ }
+
+ payloadLeavesSystem(payload);
payload.release();
}
@@ -335,13 +362,11 @@ private:
{
TlmRecorder::getInstance().recordPhase(payload, BEGIN_RESP, sc_time_stamp());
sendToFrontend(payload, BEGIN_RESP, SC_ZERO_TIME);
- payloadLeavesSystem(payload);
}
else if (phase == END_RDA || phase == END_WRA)
{
TlmRecorder::getInstance().recordPhase(payload, BEGIN_RESP, sc_time_stamp());
sendToFrontend(payload, BEGIN_RESP, SC_ZERO_TIME);
- payloadLeavesSystem(payload);
scheduleNextPayload(bank);
}
else if (isIn(phase, { BEGIN_ACT, BEGIN_PRE, BEGIN_PRE_ALL, BEGIN_RDA, BEGIN_WRA }))
diff --git a/dram/src/simulation/main.cpp b/dram/src/simulation/main.cpp
index 26a75e68..c250b023 100644
--- a/dram/src/simulation/main.cpp
+++ b/dram/src/simulation/main.cpp
@@ -35,13 +35,13 @@ int sc_main(int argc, char **argv)
string memconfig = "memconfig.xml";
string memspec = "MICRON_4Gb_DDR4-1866_8bit_A.xml";
-// string memspec = "MatzesWideIO.xml";
+// memspec = "MatzesWideIO.xml";
string stl1 = "chstone-sha_32.stl";
- stl1 = "empty.stl";
- unsigned int burstlength1 = 4;
+ //stl1 = "empty.stl";
+ unsigned int burstlength1 = 8;
string stl2 = "mediabench-h263decode_32.stl";
- // stl2 = "trace.stl";
- unsigned int burstlength2 = 4;
+ stl2 = "trace.stl";
+ unsigned int burstlength2 = 8;
string traceName = "tpr.tdb";
SimulationManager simulationManager("sim",memconfig,memspec,stl1,burstlength1, stl2,burstlength2, traceName, resources,false);