From abb36943917cfa38d2105a77b9e56952fde5e78f Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 9 Apr 2014 16:53:11 +0200 Subject: [PATCH] recording data strobe information now --- dram/resources/scripts/createTraceDB.sql | 5 +- dram/resources/scripts/metrics.py | 4 +- dram/src/common/TlmRecorder.cpp | 25 ++++++++-- dram/src/common/TlmRecorder.h | 5 +- dram/src/simulation/Controller.h | 38 +++++++++++---- dram/src/simulation/SimulationManager.cpp | 57 ++++++++++++++--------- dram/src/simulation/SimulationManager.h | 11 +++-- dram/src/simulation/main.cpp | 12 ++--- 8 files changed, 104 insertions(+), 53 deletions(-) diff --git a/dram/resources/scripts/createTraceDB.sql b/dram/resources/scripts/createTraceDB.sql index b0b952df..179d1e22 100644 --- a/dram/resources/scripts/createTraceDB.sql +++ b/dram/resources/scripts/createTraceDB.sql @@ -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); diff --git a/dram/resources/scripts/metrics.py b/dram/resources/scripts/metrics.py index 4055effc..f1081033 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) 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}) diff --git a/dram/src/common/TlmRecorder.cpp b/dram/src/common/TlmRecorder.cpp index 2cd6fa4f..c5314faa 100644 --- a/dram/src/common/TlmRecorder.cpp +++ b/dram/src/common/TlmRecorder.cpp @@ -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) { diff --git a/dram/src/common/TlmRecorder.h b/dram/src/common/TlmRecorder.h index 707a1d9b..a719b506 100755 --- a/dram/src/common/TlmRecorder.h +++ b/dram/src/common/TlmRecorder.h @@ -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 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 diff --git a/dram/src/simulation/Controller.h b/dram/src/simulation/Controller.h index d342a4ef..061304af 100644 --- a/dram/src/simulation/Controller.h +++ b/dram/src/simulation/Controller.h @@ -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); } diff --git a/dram/src/simulation/SimulationManager.cpp b/dram/src/simulation/SimulationManager.cpp index 9c9dd974..dbd96f8b 100644 --- a/dram/src/simulation/SimulationManager.cpp +++ b/dram/src/simulation/SimulationManager.cpp @@ -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("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 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 */ diff --git a/dram/src/simulation/SimulationManager.h b/dram/src/simulation/SimulationManager.h index c1bb1a3f..fc7f0f52 100644 --- a/dram/src/simulation/SimulationManager.h +++ b/dram/src/simulation/SimulationManager.h @@ -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 arbiter; - Controller<> controller; - TracePlayer<> player1; - TracePlayer<> player2; + Dram<> *dram; + Arbiter *arbiter; + Controller<> *controller; + TracePlayer<> *player1; + TracePlayer<> *player2; }; } /* namespace simulation */ diff --git a/dram/src/simulation/main.cpp b/dram/src/simulation/main.cpp index e7036cdd..6bf28ef8 100644 --- a/dram/src/simulation/main.cpp +++ b/dram/src/simulation/main.cpp @@ -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();