diff --git a/README.md b/README.md
index d1307761..4eabcd46 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,24 @@
-dram
-====
+de.uni-kl.ems.dram.vp.system
+============================
Generic DRAM controller
+
+#Setup with Eclipse
+
+1. Start Eclipse ($eclipse)
+2. -> Import
+ -> Git
+ -> Projects from Git
+ -> Existing Local Repository
+ -> Add Path to $dram.vp.system
+ -> Import Existing Projects
+ -> Finish
+
+3. Configure Eclipse:
+ -> Run Configurations
+ -> Environment
+ -> Variable: LD_LIBRARY_PATH = /opt/systemc/lib-linux64/:/opt/gcc/lib64
+
+
+
+
diff --git a/docs/.~lock.Timings.ods# b/docs/.~lock.Timings.ods#
deleted file mode 100644
index c8aeb4af..00000000
--- a/docs/.~lock.Timings.ods#
+++ /dev/null
@@ -1 +0,0 @@
-Jonny Schlemminger,jonny,ubuntu,08.04.2014 14:51,file:///home/jonny/.config/libreoffice/4;
\ No newline at end of file
diff --git a/dram/.cproject b/dram/.cproject
index bb76d239..0ebeb50d 100644
--- a/dram/.cproject
+++ b/dram/.cproject
@@ -1,168 +1,27 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- make
-
- standalone
- true
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ dram
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.core.ccnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/dram/.settings/language.settings.xml b/dram/.settings/language.settings.xml
index 127cd8ac..f518d5a9 100644
--- a/dram/.settings/language.settings.xml
+++ b/dram/.settings/language.settings.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/dram/resources/configs/memconfigs/.gitignore b/dram/resources/configs/memconfigs/.gitignore
new file mode 100644
index 00000000..c5a87587
--- /dev/null
+++ b/dram/resources/configs/memconfigs/.gitignore
@@ -0,0 +1 @@
+memconfig.xml
\ No newline at end of file
diff --git a/dram/resources/configs/memconfigs/fifo.xml b/dram/resources/configs/memconfigs/fifo.xml
new file mode 100644
index 00000000..e0c9501c
--- /dev/null
+++ b/dram/resources/configs/memconfigs/fifo.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dram/resources/configs/memconfigs/fr_fcfs.xml b/dram/resources/configs/memconfigs/fr_fcfs.xml
new file mode 100644
index 00000000..ad54f1e4
--- /dev/null
+++ b/dram/resources/configs/memconfigs/fr_fcfs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dram/resources/configs/memconfigs/fr_fcfs_unaware.xml b/dram/resources/configs/memconfigs/fr_fcfs_unaware.xml
new file mode 100644
index 00000000..1da98872
--- /dev/null
+++ b/dram/resources/configs/memconfigs/fr_fcfs_unaware.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dram/resources/configs/memconfigs/par_bs.xml b/dram/resources/configs/memconfigs/par_bs.xml
new file mode 100644
index 00000000..2cc90b3a
--- /dev/null
+++ b/dram/resources/configs/memconfigs/par_bs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dram/resources/configs/memconfigs/par_bs_unaware.xml b/dram/resources/configs/memconfigs/par_bs_unaware.xml
new file mode 100644
index 00000000..f2e238a6
--- /dev/null
+++ b/dram/resources/configs/memconfigs/par_bs_unaware.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dram/resources/configs/memspecs/MatzesWideIO.xml b/dram/resources/configs/memspecs/MatzesWideIO.xml
index 1fde1e2c..57599053 100644
--- a/dram/resources/configs/memspecs/MatzesWideIO.xml
+++ b/dram/resources/configs/memspecs/MatzesWideIO.xml
@@ -28,7 +28,7 @@
-
+
diff --git a/dram/resources/scripts/createTraceDB.sql b/dram/resources/scripts/createTraceDB.sql
index 179d1e22..136a3d41 100644
--- a/dram/resources/scripts/createTraceDB.sql
+++ b/dram/resources/scripts/createTraceDB.sql
@@ -17,9 +17,11 @@ CREATE TABLE GeneralInfo(
NumberOfTransactions INTEGER,
TraceEnd INTEGER,
NumberOfBanks INTEGER,
- Description TEXT,
clk INTEGER,
- UnitOfTime TEXT
+ UnitOfTime TEXT,
+ Memconfig TEXT,
+ Memspec TEXT,
+ Traces TEXt
);
@@ -47,6 +49,7 @@ CREATE TABLE Transactions(
TThread INTEGER,
TChannel INTEGER,
TBank INTEGER,
+ TBankgroup INTEGER,
TRow INTEGER,
TColumn INTEGER,
Command TEXT,
diff --git a/dram/resources/scripts/metrics.py b/dram/resources/scripts/metrics.py
index f1081033..f771a292 100644
--- a/dram/resources/scripts/metrics.py
+++ b/dram/resources/scripts/metrics.py
@@ -35,7 +35,7 @@ def getTraceLength(connection):
@metric
def average_response_latency_in_ns(connection):
cursor = connection.cursor()
- cursor.execute("""SELECT avg(ranges.end-ranges.begin)/1000 FROM transactions INNER JOIN ranges
+ cursor.execute("""SELECT avg(transactions.DataStrobeEnd-ranges.begin)/1000 FROM transactions INNER JOIN ranges
ON transactions.range = ranges.ID where TThread != 0""")
result = cursor.fetchone()
@@ -44,7 +44,7 @@ def average_response_latency_in_ns(connection):
@threadMetric
def average_response_latency_in_ns(connection, thread):
cursor = connection.cursor()
- query = """SELECT avg(ranges.end-ranges.begin)/1000 FROM transactions INNER JOIN ranges
+ query = """SELECT avg(transactions.DataStrobeEnd-ranges.begin)/1000 FROM transactions INNER JOIN ranges
ON transactions.range = ranges.ID where TThread = :Thread """
cursor.execute(query, {"Thread": thread})
diff --git a/dram/src/common/DebugManager.cpp b/dram/src/common/DebugManager.cpp
index e11e42c8..819c9195 100644
--- a/dram/src/common/DebugManager.cpp
+++ b/dram/src/common/DebugManager.cpp
@@ -23,7 +23,7 @@ void DebugManager::printDebugMessage(string sender, string message)
cout << " at " << sc_time_stamp() << "\t in " << sender << "\t: " << message << endl;
if (writeToFile)
- debugFile << " at " << sc_time_stamp().to_default_time_units() << " in " << sender << "\t: " << message << "\n";
+ debugFile << " at " << sc_time_stamp() << " in " << sender << "\t: " << message << "\n";
}
}
diff --git a/dram/src/common/TlmRecorder.cpp b/dram/src/common/TlmRecorder.cpp
index 73a4dbae..d77184ff 100644
--- a/dram/src/common/TlmRecorder.cpp
+++ b/dram/src/common/TlmRecorder.cpp
@@ -41,8 +41,6 @@ void TlmRecorder::recordPhase(tlm::tlm_generic_payload& trans, tlm::tlm_phase ph
if (currentTransactionsInSystem.count(&trans) == 0)
introduceNewTransactionToSystem(time, trans);
- unsigned int id = currentTransactionsInSystem[&trans];
-
string phaseName = phaseNameToString(phase);
string phaseBeginPrefix = "BEGIN_";
string phaseEndPrefix = "END_";
@@ -73,7 +71,7 @@ void TlmRecorder::recordDebugMessage(std::string message, sc_time time)
void TlmRecorder::createTables(string pathToURI)
{
- string initial = getFileContents(pathToURI);
+ string initial = loadTextFileContents(pathToURI);
executeSqlCommand(initial);
}
@@ -89,7 +87,7 @@ void TlmRecorder::setUpTransactionTerminatingPhases()
void TlmRecorder::prepareSqlStatements()
{
insertTransactionString =
- "INSERT INTO Transactions VALUES (:id,:rangeID,:address,:burstlength,:thread,:channel,:bank,:row,:column,:command,:dataStrobeBegin,:dataStrobeEnd)";
+ "INSERT INTO Transactions VALUES (:id,:rangeID,:address,:burstlength,:thread,:channel,:bank,:bankgroup,:row,:column,:command,:dataStrobeBegin,:dataStrobeEnd)";
insertRangeString = "INSERT INTO Ranges VALUES (:id,:begin,:end)";
updateRangeString = "UPDATE Ranges SET End = :end WHERE ID = :id";
updateDataStrobeString = "UPDATE Transactions SET DataStrobeBegin = :begin, DataStrobeEnd = :end WHERE ID = :id";
@@ -99,7 +97,8 @@ void TlmRecorder::prepareSqlStatements()
updatePhaseString =
"UPDATE Phases SET PhaseEnd = :end WHERE Transact = :trans AND PhaseName = :name";
insertGeneralInfoString =
- "INSERT INTO GeneralInfo (NumberOfTransactions,TraceEnd,NumberOfBanks,description,clk,UnitOfTime) Values (:numberOfTransactions,:end,:numberOfBanks,:description,:clk,:unitOfTime)";
+ "INSERT INTO GeneralInfo (NumberOfTransactions,TraceEnd,NumberOfBanks,clk,UnitOfTime,Memconfig,Memspec,Traces) Values "
+ "(:numberOfTransactions,:end,:numberOfBanks,:clk,:unitOfTime,:memconfig,:memspec,:traces)";
insertDebugMessageString = "INSERT INTO DebugMessages (Time,Message) Values (:time,:message)";
sqlite3_prepare(db, insertTransactionString.c_str(), -1, &insertTransactionStatement, 0);
@@ -134,9 +133,11 @@ void TlmRecorder::insertGeneralInfo()
sqlite3_bind_int64(insertGeneralInfoStatement, 2, recordingEndTime.value());
sqlite3_bind_int(insertGeneralInfoStatement, 3,
core::Configuration::getInstance().NumberOfBanks);
- sqlite3_bind_text(insertGeneralInfoStatement, 4, "", 0, NULL);
- sqlite3_bind_int(insertGeneralInfoStatement, 5, core::Configuration::getInstance().Timings.clk.value());
- sqlite3_bind_text(insertGeneralInfoStatement, 6, "PS", 2, NULL);
+ sqlite3_bind_int(insertGeneralInfoStatement, 4, core::Configuration::getInstance().Timings.clk.value());
+ sqlite3_bind_text(insertGeneralInfoStatement, 5, "PS", 2, NULL);
+ sqlite3_bind_text(insertGeneralInfoStatement, 6, memconfig.c_str(), memconfig.length(), NULL);
+ sqlite3_bind_text(insertGeneralInfoStatement, 7, memspec.c_str(), memspec.length(), NULL);
+ sqlite3_bind_text(insertGeneralInfoStatement, 8, traces.c_str(), traces.length(), NULL);
executeSqlStatement(insertGeneralInfoStatement);
}
void TlmRecorder::insertTransactionInDB(unsigned int id, tlm::tlm_generic_payload& trans)
@@ -145,17 +146,17 @@ void TlmRecorder::insertTransactionInDB(unsigned int id, tlm::tlm_generic_payloa
sqlite3_bind_int(insertTransactionStatement, 2, id);
sqlite3_bind_int(insertTransactionStatement, 3, trans.get_address());
sqlite3_bind_int(insertTransactionStatement, 4, trans.get_streaming_width());
- sqlite3_bind_text(insertTransactionStatement, 10,
- trans.get_command() == tlm::TLM_READ_COMMAND ? "R" : "W", 1, 0);
+
const DramExtension& extension = DramExtension::getExtension(trans);
sqlite3_bind_int(insertTransactionStatement, 5, extension.getThread().ID());
sqlite3_bind_int(insertTransactionStatement, 6, extension.getChannel().ID());
sqlite3_bind_int(insertTransactionStatement, 7, extension.getBank().ID());
- sqlite3_bind_int(insertTransactionStatement, 8, extension.getRow().ID());
- sqlite3_bind_int(insertTransactionStatement, 9, extension.getColumn().ID());
- sqlite3_bind_int(insertTransactionStatement, 10, 0);
+ sqlite3_bind_int(insertTransactionStatement, 8, extension.getBankGroup().ID());
+ sqlite3_bind_int(insertTransactionStatement, 9, extension.getRow().ID());
+ sqlite3_bind_int(insertTransactionStatement, 10, extension.getColumn().ID());
sqlite3_bind_int(insertTransactionStatement, 11, 0);
+ sqlite3_bind_int(insertTransactionStatement, 12, 0);
executeSqlStatement(insertTransactionStatement);
}
@@ -244,25 +245,7 @@ void TlmRecorder::executeSqlCommand(string command)
printDebugMessage("Database created successfully");
}
-string TlmRecorder::getFileContents(string filename)
-{
- ifstream in(filename.c_str(), ios::in | ios::binary);
- if (in)
- {
- string contents;
- in.seekg(0, ios::end);
- contents.resize(in.tellg());
- in.seekg(0, ios::beg);
- in.read(&contents[0], contents.size());
- in.close();
- return (contents);
- }
- else
- {
- reportFatal("Error in TraceRecorder", "Could not load sql script from " + filename);
- return "";
- }
- }
+
void TlmRecorder::printDebugMessage(std::string message)
{
diff --git a/dram/src/common/TlmRecorder.h b/dram/src/common/TlmRecorder.h
index a719b506..19293037 100755
--- a/dram/src/common/TlmRecorder.h
+++ b/dram/src/common/TlmRecorder.h
@@ -30,12 +30,14 @@ public:
void recordDebugMessage(std::string message, sc_time time);
void updateDataStrobe(const sc_time& begin, const sc_time& end, tlm::tlm_generic_payload& trans);
void closeConnection();
-
+ void recordMemconfig(string memconfig){this->memconfig = memconfig;}
+ void recordMemspec(string memspec){this->memspec = memspec;}
+ void recordTracenames(string traces){this->traces = traces;}
private:
+ std::string memconfig,memspec,traces;
TlmRecorder();
~TlmRecorder();
- std::string getFileContents(std::string filename);
void executeSqlCommand(std::string command);
void executeSqlStatement(sqlite3_stmt* statement);
@@ -59,6 +61,7 @@ private:
map currentTransactionsInSystem;
unsigned int transactionIDCounter;
sc_time recordingEndTime;
+
std::vector transactionTerminatingPhases;
sqlite3 *db;
sqlite3_stmt *insertTransactionStatement, *insertRangeStatement, *updateRangeStatement,
diff --git a/dram/src/common/Utils.cpp b/dram/src/common/Utils.cpp
index 5696e9f6..2b9fd287 100644
--- a/dram/src/common/Utils.cpp
+++ b/dram/src/common/Utils.cpp
@@ -1,6 +1,7 @@
#include "Utils.h"
#include
#include
+#include
using namespace std;
using namespace tinyxml2;
@@ -10,7 +11,6 @@ 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::ostringstream oss;
@@ -19,7 +19,8 @@ std::string phaseNameToString(tlm::tlm_phase phase)
return str;
}
-unsigned int queryUIntParameter(XMLElement* node, string name) {
+unsigned int queryUIntParameter(XMLElement* node, string name)
+{
int result;
XMLElement* element;
for (element = node->FirstChildElement("parameter"); element != NULL;
@@ -34,7 +35,7 @@ unsigned int queryUIntParameter(XMLElement* node, string name) {
}
}
- reportFatal("Query XML","Parameter '" + name +"' does not exist.");
+ reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
return 0;
}
@@ -52,7 +53,8 @@ bool parameterExists(tinyxml2::XMLElement* node, std::string name)
return false;
}
-double queryDoubleParameter(XMLElement* node, string name) {
+double queryDoubleParameter(XMLElement* node, string name)
+{
double result;
XMLElement* element;
for (element = node->FirstChildElement("parameter"); element != NULL;
@@ -67,11 +69,12 @@ double queryDoubleParameter(XMLElement* node, string name) {
}
}
- reportFatal("Query XML","Parameter '" + name +"' does not exist.");
+ reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
return 0;
}
-bool queryBoolParameter(XMLElement* node, string name) {
+bool queryBoolParameter(XMLElement* node, string name)
+{
bool result;
XMLElement* element;
for (element = node->FirstChildElement("parameter"); element != NULL;
@@ -86,11 +89,12 @@ bool queryBoolParameter(XMLElement* node, string name) {
}
}
- reportFatal("Query XML","Parameter '" + name +"' does not exist.");
+ reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
return 0;
}
-string queryStringParameter(XMLElement* node, string name) {
+string queryStringParameter(XMLElement* node, string name)
+{
XMLElement* element;
for (element = node->FirstChildElement("parameter"); element != NULL;
element = element->NextSiblingElement("parameter"))
@@ -101,7 +105,7 @@ string queryStringParameter(XMLElement* node, string name) {
}
}
- reportFatal("Query XML","Parameter '" + name +"' does not exist.");
+ reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
return 0;
}
@@ -109,8 +113,29 @@ void loadXML(string uri, XMLDocument& doc)
{
XMLError error = doc.LoadFile(uri.c_str());
- if (error) {
+ if (error)
+ {
reportFatal("Configuration", "Error loading xml from: " + uri);
}
}
+string loadTextFileContents(string filename)
+{
+
+ ifstream in(filename.c_str(), ios::in | ios::binary);
+ if (in)
+ {
+ string contents;
+ in.seekg(0, ios::end);
+ contents.resize(in.tellg());
+ in.seekg(0, ios::beg);
+ in.read(&contents[0], contents.size());
+ in.close();
+ return (contents);
+ }
+ else
+ {
+ reportFatal("Error loading file", "Could not load textfile from " + filename);
+ return "";
+ }
+}
diff --git a/dram/src/common/Utils.h b/dram/src/common/Utils.h
index 2c1ee2f9..503de3fa 100644
--- a/dram/src/common/Utils.h
+++ b/dram/src/common/Utils.h
@@ -41,6 +41,7 @@ bool isIn(const T& value, const std::vector& collection)
void reportFatal(std::string sender, std::string message);
std::string phaseNameToString(tlm::tlm_phase phase);
+std::string loadTextFileContents(std::string filename);
void loadXML(std::string uri, tinyxml2::XMLDocument& doc);
bool parameterExists(tinyxml2::XMLElement* node, std::string name);
diff --git a/dram/src/common/dramExtension.cpp b/dram/src/common/dramExtension.cpp
index 591ec8ab..3697c95f 100644
--- a/dram/src/common/dramExtension.cpp
+++ b/dram/src/common/dramExtension.cpp
@@ -29,6 +29,12 @@ bool operator !=(const Thread& lhs, const Thread& rhs)
return !(lhs == rhs);
}
+bool operator <(const Thread& lhs, const Thread& rhs)
+{
+ return lhs.ID() < rhs.ID();
+}
+
+
bool operator ==(const Channel& lhs, const Channel& rhs)
{
return lhs.ID() == rhs.ID();
@@ -88,3 +94,4 @@ bool operator !=(const Column& lhs, const Column& rhs)
{
return !(lhs == rhs);
}
+
diff --git a/dram/src/common/dramExtension.h b/dram/src/common/dramExtension.h
index de07576d..e2aab786 100644
--- a/dram/src/common/dramExtension.h
+++ b/dram/src/common/dramExtension.h
@@ -115,6 +115,7 @@ private:
bool operator==(const Thread &lhs, const Thread &rhs);
bool operator!=(const Thread &lhs, const Thread &rhs);
+bool operator<(const Thread &lhs, const Thread &rhs);
bool operator==(const Channel &lhs, const Channel &rhs);
bool operator!=(const Channel &lhs, const Channel &rhs);
diff --git a/dram/src/core/utils/Utils.cpp b/dram/src/core/utils/Utils.cpp
index 23aa45c2..8d002557 100644
--- a/dram/src/core/utils/Utils.cpp
+++ b/dram/src/core/utils/Utils.cpp
@@ -67,7 +67,7 @@ BankGroup getBankGroup(Bank bank)
for (unsigned int bank = 0; bank < Configuration::getInstance().NumberOfBanks; bank++)
{
- unsigned int group = bank / Configuration::getInstance().NumberOfBankGroups;
+ unsigned int group = bank % Configuration::getInstance().NumberOfBankGroups;
bankgroups.insert(std::pair(Bank(bank), BankGroup(group)));
}
}
diff --git a/dram/src/scheduler/Fifo.cpp b/dram/src/scheduler/Fifo.cpp
index 26c142f3..b89648f6 100644
--- a/dram/src/scheduler/Fifo.cpp
+++ b/dram/src/scheduler/Fifo.cpp
@@ -29,7 +29,8 @@ gp* Fifo::getTransactionForBank(Bank bank)
void Fifo::popTransactionForBank(Bank bank, gp* payload)
{
- sc_assert(hasTransactionForBank(bank));
+ sc_assert(DramExtension::getExtension(payload).getBank() == bank);
+
buffer[bank].pop_front();
}
diff --git a/dram/src/scheduler/Fr_Fcfs.cpp b/dram/src/scheduler/Fr_Fcfs.cpp
index 4bdfd740..e59bef5a 100644
--- a/dram/src/scheduler/Fr_Fcfs.cpp
+++ b/dram/src/scheduler/Fr_Fcfs.cpp
@@ -8,8 +8,8 @@ using namespace core;
namespace scheduler {
-FR_FCFS::FR_FCFS(core::ControllerCore& controller, bool refreshAware, bool adaptiveOpenPage) :
- controllerBankstates(controller.state.bankStates), refreshAware(refreshAware), adaptiveOpenPage(
+FR_FCFS::FR_FCFS(const core::BankStates& bankstates, bool useExternalStates, bool adaptiveOpenPage) :
+ externalBankstates(bankstates), useExternalStates(useExternalStates), adaptiveOpenPage(
adaptiveOpenPage)
{
}
@@ -23,16 +23,34 @@ bool FR_FCFS::hasTransactionForBank(Bank bank)
return !buffer[bank].empty();
}
+
+bool FR_FCFS::isEmpty()
+{
+ for(unsigned int i = 0; i < Configuration::getInstance().NumberOfBanks;++i)
+ {
+ if(!buffer[Bank(i)].empty())
+ return false;
+ }
+ return true;
+}
+
void FR_FCFS::schedule(gp* payload)
{
buffer[DramExtension::getExtension(payload).getBank()].emplace_back(payload);
}
+
+void FR_FCFS::schedule(std::vector payloads)
+{
+ for(gp* payload: payloads)
+ schedule(payload);
+}
+
gp* FR_FCFS::getTransactionForBank(Bank bank)
{
sc_assert(hasTransactionForBank(bank));
- Row openRowOnBank = (refreshAware) ? controllerBankstates.getRowInRowBuffer(bank) : internalBankstates.getRowInRowBuffer(bank);
+ Row openRowOnBank = (useExternalStates) ? externalBankstates.getRowInRowBuffer(bank) : internalBankstates.getRowInRowBuffer(bank);
auto rowHits = findRowHits(bank, openRowOnBank);
gp* result = rowHits.empty() ? buffer[bank].front() : rowHits.front();
@@ -65,6 +83,15 @@ gp* FR_FCFS::getTransactionForBank(Bank bank)
}
}
+gp* FR_FCFS::popOldest(Bank bank)
+{
+ assert(hasTransactionForBank(bank));
+
+ gp* result = buffer[bank].front();
+ buffer[bank].pop_front();
+ return result;
+}
+
std::vector FR_FCFS::findRowHits(Bank bank, Row row)
{
vector found;
@@ -78,11 +105,11 @@ std::vector FR_FCFS::findRowHits(Bank bank, Row row)
void FR_FCFS::popTransactionForBank(Bank bank, gp* payload)
{
- sc_assert(
- hasTransactionForBank(bank) && bank == DramExtension::getExtension(payload).getBank());
+ sc_assert(DramExtension::getExtension(payload).getBank() == bank);
+
buffer[bank].remove(payload);
- if (!refreshAware)
+ if (!useExternalStates)
{
internalBankstates.openRowInRowBuffer(bank, DramExtension::getExtension(payload).getRow());
}
diff --git a/dram/src/scheduler/Fr_Fcfs.h b/dram/src/scheduler/Fr_Fcfs.h
index f8473ee1..8e166b51 100644
--- a/dram/src/scheduler/Fr_Fcfs.h
+++ b/dram/src/scheduler/Fr_Fcfs.h
@@ -5,13 +5,14 @@
#include "../core/ControllerCore.h"
#include
#include