recording data strobe information now

This commit is contained in:
robert
2014-04-09 16:53:11 +02:00
parent e51deb97ec
commit abb3694391
8 changed files with 104 additions and 53 deletions

View File

@@ -49,7 +49,10 @@ CREATE TABLE Transactions(
TBank INTEGER,
TRow INTEGER,
TColumn INTEGER,
Command TEXT);
Command TEXT,
DataStrobeBegin INTEGER,
DataStrobeEnd INTEGER
);
CREATE INDEX ranges_index ON Transactions(Range);
CREATE INDEX "phasesTransactions" ON "Phases" ("Transact" ASC);

View File

@@ -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) FROM transactions INNER JOIN ranges
cursor.execute("""SELECT avg(ranges.end-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) FROM transactions INNER JOIN ranges
query = """SELECT avg(ranges.end-ranges.begin)/1000 FROM transactions INNER JOIN ranges
ON transactions.range = ranges.ID where TThread = :Thread """
cursor.execute(query, {"Thread": thread})

View File

@@ -89,9 +89,11 @@ void TlmRecorder::setUpTransactionTerminatingPhases()
void TlmRecorder::prepareSqlStatements()
{
insertTransactionString =
"INSERT INTO Transactions VALUES (:id,:rangeID,:address,:burstlength,:thread,:channel,:bank,:row,:column,:command)";
"INSERT INTO Transactions VALUES (:id,:rangeID,:address,:burstlength,:thread,:channel,:bank,: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";
insertPhaseString =
"INSERT INTO Phases (PhaseName,PhaseBegin,PhaseEnd,Transact) VALUES (:name,:begin,:end,:transaction)";
updatePhaseString =
@@ -99,11 +101,13 @@ void TlmRecorder::prepareSqlStatements()
insertGeneralInfoString =
"INSERT INTO GeneralInfo (NumberOfTransactions,TraceEnd,NumberOfBanks,description,clk,UnitOfTime) Values (:numberOfTransactions,:end,:numberOfBanks,:description,:clk,:unitOfTime)";
insertDebugMessageString = "INSERT INTO DebugMessages (Time,Message) Values (:time,:message)";
sqlite3_prepare(db, insertTransactionString.c_str(), -1, &insertTransactionStatement, 0);
sqlite3_prepare(db, insertRangeString.c_str(), -1, &insertRangeStatement, 0);
sqlite3_prepare(db, updateRangeString.c_str(), -1, &updateRangeStatement, 0);
sqlite3_prepare(db, insertPhaseString.c_str(), -1, &insertPhaseStatement, 0);
sqlite3_prepare(db, updatePhaseString.c_str(), -1, &updatePhaseStatement, 0);
sqlite3_prepare(db, updateDataStrobeString.c_str(), -1, &updateDataStrobeStatement, 0);
sqlite3_prepare(db, insertGeneralInfoString.c_str(), -1, &insertGeneralInfoStatement, 0);
sqlite3_prepare(db, insertDebugMessageString.c_str(), -1, &insertDebugMessageStatement, 0);
}
@@ -150,6 +154,8 @@ void TlmRecorder::insertTransactionInDB(unsigned int id, tlm::tlm_generic_payloa
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, 11, 0);
executeSqlStatement(insertTransactionStatement);
}
@@ -181,6 +187,15 @@ void TlmRecorder::updatePhaseEndInDB(string phaseName, const sc_time& time,
executeSqlStatement(updatePhaseStatement);
}
void TlmRecorder::updateDataStrobe(const sc_time& begin,const sc_time& end, tlm::tlm_generic_payload& trans)
{
unsigned int id = getElementFromMap(currentTransactionsInSystem, &trans);
sqlite3_bind_int64(updateDataStrobeStatement, 1, begin.value());
sqlite3_bind_int64(updateDataStrobeStatement, 2, end.value());
sqlite3_bind_int(updateDataStrobeStatement, 3, id);
executeSqlStatement(updateDataStrobeStatement);
}
void TlmRecorder::introduceNewTransactionToSystem(const sc_time& time,
tlm::tlm_generic_payload& trans)
{
@@ -242,8 +257,12 @@ string TlmRecorder::getFileContents(string filename)
in.close();
return (contents);
}
throw(errno);
}
else
{
reportFatal("Error in TraceRecorder", "Could not load sql script from " + filename);
return "";
}
}
void TlmRecorder::printDebugMessage(std::string message)
{

View File

@@ -28,6 +28,7 @@ public:
void recordPhase(tlm::tlm_generic_payload &trans, tlm::tlm_phase phase, sc_time time);
void recordPhase(tlm::tlm_generic_payload &trans, std::string name, sc_time begin, sc_time end);
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();
private:
@@ -61,8 +62,8 @@ private:
std::vector<tlm::tlm_phase> transactionTerminatingPhases;
sqlite3 *db;
sqlite3_stmt *insertTransactionStatement, *insertRangeStatement, *updateRangeStatement,
*insertPhaseStatement, *updatePhaseStatement, *insertGeneralInfoStatement, *insertDebugMessageStatement;
*insertPhaseStatement, *updatePhaseStatement, *insertGeneralInfoStatement, *insertDebugMessageStatement, *updateDataStrobeStatement;
std::string insertTransactionString, insertRangeString, updateRangeString, insertPhaseString, updatePhaseString, insertGeneralInfoString,
insertDebugMessageString;
insertDebugMessageString, updateDataStrobeString;
};
#endif

View File

@@ -61,12 +61,14 @@ public:
void buildScheduler()
{
string selectedScheduler = Configuration::getInstance().Scheduler;
if(selectedScheduler == "FR_FCFS")
scheduler = new FR_FCFS(*controller,Configuration::getInstance().RefreshAwareScheduling,Configuration::getInstance().AdaptiveOpenPagePolicy);
else if(selectedScheduler == "FIFO")
if (selectedScheduler == "FR_FCFS")
scheduler = new FR_FCFS(*controller,
Configuration::getInstance().RefreshAwareScheduling,
Configuration::getInstance().AdaptiveOpenPagePolicy);
else if (selectedScheduler == "FIFO")
scheduler = new Fifo();
else
reportFatal(name(),"unsupporeted scheduler: " + selectedScheduler);
reportFatal(name(), "unsupported scheduler: " + selectedScheduler);
}
void terminateSimulation()
@@ -86,52 +88,74 @@ public:
case Command::Read:
dramPEQ.notify(payload, BEGIN_RD, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_RD, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_RD, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_RD, command.getEnd());
break;
case Command::ReadA:
dramPEQ.notify(payload, BEGIN_RDA, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_RDA, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_RDA, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_RDA, command.getEnd());
break;
case Command::Write:
dramPEQ.notify(payload, BEGIN_WR, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_WR, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_WR, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_WR, command.getEnd());
break;
case Command::WriteA:
dramPEQ.notify(payload, BEGIN_WRA, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_WRA, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_WRA, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_WRA, command.getEnd());
break;
case Command::AutoRefresh:
dramPEQ.notify(payload, BEGIN_AUTO_REFRESH, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_AUTO_REFRESH, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_AUTO_REFRESH, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_AUTO_REFRESH, command.getEnd());
break;
case Command::Activate:
dramPEQ.notify(payload, BEGIN_ACT, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_ACT, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_ACT, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_ACT, command.getEnd());
break;
case Command::Precharge:
dramPEQ.notify(payload, BEGIN_PRE, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_PRE, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_PRE, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_PRE, command.getEnd());
break;
case Command::PrechargeAll:
dramPEQ.notify(payload, BEGIN_PRE_ALL, command.getStart() - sc_time_stamp());
dramPEQ.notify(payload, END_PRE_ALL, command.getEnd() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_PRE_ALL, command.getStart());
TlmRecorder::getInstance().recordPhase(payload, END_PRE_ALL, command.getEnd());
break;
case Command::PDNA:
dramPEQ.notify(payload, BEGIN_PDNA, command.getStart() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_PDNA, command.getStart());
break;
case Command::PDNP:
dramPEQ.notify(payload, BEGIN_PDNP, command.getStart() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_PDNP, command.getStart());
break;
case Command::SREF:
dramPEQ.notify(payload, BEGIN_SREF, command.getStart() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, BEGIN_SREF, command.getStart());
break;
case Command::PDNAX:
dramPEQ.notify(payload, END_PDNA, command.getStart() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, END_PDNA, command.getStart());
break;
case Command::PDNPX:
dramPEQ.notify(payload, END_PDNP, command.getStart() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, END_PDNP, command.getStart());
break;
case Command::SREFX:
dramPEQ.notify(payload, END_SREF, command.getStart() - sc_time_stamp());
TlmRecorder::getInstance().recordPhase(payload, END_SREF, command.getStart());
break;
default:
SC_REPORT_FATAL(0, "unsupported command in controller");
@@ -195,7 +219,7 @@ private:
void scheduleNextPayload(Bank bank)
{
if(bank.ID() == 5)
if (bank.ID() == 5)
{
int i = 5;
++i;
@@ -282,8 +306,6 @@ private:
void dramPEQCallback(tlm_generic_payload& payload, const tlm_phase& phase)
{
TlmRecorder::getInstance().recordPhase(payload, phase, sc_time_stamp());
Bank bank = DramExtension::getExtension(payload).getBank();
if (phase == BEGIN_RD || phase == BEGIN_WR)
{
@@ -303,7 +325,7 @@ private:
payloadLeavesSystem(payload);
scheduleNextPayload(bank);
}
else if (isIn(phase, { BEGIN_ACT, BEGIN_PRE, BEGIN_PRE_ALL, BEGIN_RDA,BEGIN_WRA }))
else if (isIn(phase, { BEGIN_ACT, BEGIN_PRE, BEGIN_PRE_ALL, BEGIN_RDA, BEGIN_WRA }))
{
sendToDram(payload, phase, SC_ZERO_TIME);
}

View File

@@ -18,35 +18,38 @@ using namespace std;
namespace simulation {
SimulationManager::SimulationManager(sc_module_name name, string memconfig, string memspec,
string stl1, unsigned int burstlength1, string stl2,
unsigned int burstlenght2, string traceName, string pathToResources,
bool silent) :
dram("dram"), arbiter("arbiter"), controller("controller"), player1("player1",
pathToResources + string("traces/") + stl1,burstlength1, this), player2("player2",
pathToResources + string("traces/") + stl2,burstlenght2, this), traceName(traceName)
string stl1, unsigned int burstlength1, string stl2, unsigned int burstlenght2,
string traceName, string pathToResources, bool silent) :
traceName(traceName)
{
SC_THREAD(terminationThread);
cout << pathToResources + string("configs/memconfigs/") + memconfig << endl;
cout << pathToResources + string("configs/memspecs/") + memspec << endl;
xmlAddressDecoder::addressConfigURI = pathToResources + string("configs/addressConfig.xml");
TlmRecorder::dbName = traceName;
TlmRecorder::sqlScriptURI = pathToResources + string("scripts/createTraceDB.sql");
Configuration::memconfigUri = pathToResources + string("configs/memconfigs/") + memconfig;
Configuration::memspecUri = pathToResources + string("configs/memspecs/") + memspec;
player1.iSocket.bind(arbiter.tSockets[0]);
player2.iSocket.bind(arbiter.tSockets[1]);
arbiter.iSocket.bind(controller.tSocket);
controller.iSocket.bind(dram.tSocket);
dram = new Dram<>("dram");
arbiter = new Arbiter<numberOfTracePlayers,128>("arbiter");
controller = new Controller<>("controller");
player1 = new TracePlayer<>("player1", pathToResources + string("traces/") + stl1, burstlength1,
this);
player2 = new TracePlayer<>("player2", pathToResources + string("traces/") + stl2, burstlenght2,
this);
player1->iSocket.bind(arbiter->tSockets[0]);
player2->iSocket.bind(arbiter->tSockets[1]);
arbiter->iSocket.bind(controller->tSocket);
controller->iSocket.bind(dram->tSocket);
vector<string> whiteList;
if(!silent)
if (!silent)
{
whiteList.push_back(controller.name());
whiteList.push_back(player2.name());
whiteList.push_back(player1.name());
whiteList.push_back(controller->name());
whiteList.push_back(player2->name());
whiteList.push_back(player1->name());
whiteList.push_back(this->name());
whiteList.push_back(TlmRecorder::senderName);
whiteList.push_back(ControllerCore::senderName);
@@ -55,14 +58,24 @@ SimulationManager::SimulationManager(sc_module_name name, string memconfig, stri
DebugManager::getInstance().addToWhiteList(whiteList);
}
SimulationManager::~SimulationManager()
{
delete dram;
delete arbiter;
delete controller;
delete player1;
delete player2;
}
void SimulationManager::startSimulation()
{
clock_t begin = clock();
DebugManager::getInstance().printDebugMessage(name(), "Starting simulation");
player1.start();
player2.start();
player1->start();
player2->start();
sc_start();
clock_t end = clock();
@@ -87,13 +100,11 @@ void SimulationManager::terminationThread()
{
wait(terminateSimulation);
DebugManager::getInstance().printDebugMessage(this->name(), "Terminating simulation");
controller.terminateSimulation();
controller->terminateSimulation();
//waits for the termination of all pending powerdown phases in the dram system
wait(sc_time(50, SC_NS));
TlmRecorder::getInstance().closeConnection();
sc_stop();
}
} /* namespace simulation */

View File

@@ -26,6 +26,7 @@ public:
std::string stl1, unsigned int burstlength1, std::string stl2,
unsigned int burstlenght2, std::string traceName, std::string pathToResources,
bool silent = false);
~SimulationManager();
void startSimulation();
void tracePlayerFinishedCallback(string name) override;
@@ -34,11 +35,11 @@ private:
sc_event terminateSimulation;
constexpr static unsigned int numberOfTracePlayers = 2;
std::string traceName;
Dram<> dram;
Arbiter<numberOfTracePlayers, 128> arbiter;
Controller<> controller;
TracePlayer<> player1;
TracePlayer<> player2;
Dram<> *dram;
Arbiter<numberOfTracePlayers, 128> *arbiter;
Controller<> *controller;
TracePlayer<> *player1;
TracePlayer<> *player2;
};
} /* namespace simulation */

View File

@@ -35,17 +35,11 @@ int sc_main(int argc, char **argv)
string memconfig = "memconfig.xml";
string memspec = "MatzesWideIO.xml";
string stl1 = "chstone-sha_32.stl";
string stl1 = "trace.stl";
unsigned int burstlength1 = 4;
string stl2 = "mediabench-h263decode_32.stl";
string stl2 = "empty.stl";
unsigned int burstlength2 = 4;
string traceName = "unaware_long.tdb";
Configuration::memspecUri = "/home/robert/git/dram/dram/resources/configs/memspecs/MatzesWideIO.xml";
Configuration::memconfigUri = "/home/robert/git/dram/dram/resources/configs/memconfigs/memconfig.xml";
// Configuration::memconfigUri = resources + string("configs/memconfigs/") + memconfig;
// Configuration::memconfigUri = resources + string("configs/memspecs/") + memspec;
string traceName = "tpr.tdb";
SimulationManager simulationManager("sim",memconfig,memspec,stl1,burstlength1, stl2,burstlength2, traceName, resources,false);
simulationManager.startSimulation();