diff --git a/dram/dramSys/dramSys.pro b/dram/dramSys/dramSys.pro index 1b3163b3..810dd8b5 100644 --- a/dram/dramSys/dramSys.pro +++ b/dram/dramSys/dramSys.pro @@ -22,7 +22,10 @@ INCLUDEPATH += ../src/common/third_party/DRAMPower/src/libdrampower DEFINES += TIXML_USE_STL DEFINES += SC_INCLUDE_DYNAMIC_PROCESSES DEFINES += USE_XERCES=1 -DEFINES += NDEBUG +release { + DEFINES += NDEBUG +} + QMAKE_CXXFLAGS += -std=c++11 QMAKE_CXXFLAGS += -isystem /opt/systemc/include @@ -116,12 +119,14 @@ HEADERS += \ ../src/simulation/SimulationManager.h \ ../src/simulation/Simulation.h \ ../src/simulation/MemoryManager.h \ - ../src/simulation/ISimulation.h \ ../src/simulation/Dram.h \ ../src/simulation/Arbiter.h \ ../src/common/libDRAMPower.h \ ../src/controller/core/RowBufferStates.h \ ../src/controller/scheduler/readwritegrouper.h \ ../src/simulation/ReorderBuffer.h \ - ../src/controller/core/configuration/MemSpec.h + ../src/controller/core/configuration/MemSpec.h \ + ../src/simulation/TlmPacketGenerator.h \ + ../src/simulation/StlPlayer.h \ + ../src/simulation/TracePlayerListener.h diff --git a/dram/src/common/xmlAddressdecoder.cpp b/dram/src/common/xmlAddressdecoder.cpp index 67eb278c..4d1cab11 100644 --- a/dram/src/common/xmlAddressdecoder.cpp +++ b/dram/src/common/xmlAddressdecoder.cpp @@ -9,7 +9,6 @@ string xmlAddressDecoder::addressConfigURI = ""; xmlAddressDecoder::xmlAddressDecoder(string addressConfigURI) { - tinyxml2::XMLDocument doc; loadXML(addressConfigURI, doc); diff --git a/dram/src/controller/Controller.h b/dram/src/controller/Controller.h index b08a835d..3d5bfec8 100644 --- a/dram/src/controller/Controller.h +++ b/dram/src/controller/Controller.h @@ -68,6 +68,7 @@ public: virtual void send(const ScheduledCommand& command, tlm_generic_payload& payload) override; virtual void send(Trigger trigger, sc_time time, tlm_generic_payload& payload) override; + tlm_utils::simple_initiator_socket iSocket; tlm_utils::simple_target_socket tSocket; diff --git a/dram/src/controller/core/powerdown/PowerDownManager.cpp b/dram/src/controller/core/powerdown/PowerDownManager.cpp index f49ec845..978c72cf 100644 --- a/dram/src/controller/core/powerdown/PowerDownManager.cpp +++ b/dram/src/controller/core/powerdown/PowerDownManager.cpp @@ -145,7 +145,7 @@ bool PowerDownManager::canSleep() return true; } -bool PowerDownManager::isInSelfRefresh(Bank bank) +bool PowerDownManager::isInSelfRefresh(Bank /*bank*/) { return powerDownState == PowerDownState::PDNSelfRefresh; } diff --git a/dram/src/controller/core/refresh/RefreshManager.cpp b/dram/src/controller/core/refresh/RefreshManager.cpp index ed287f55..af4c1b91 100644 --- a/dram/src/controller/core/refresh/RefreshManager.cpp +++ b/dram/src/controller/core/refresh/RefreshManager.cpp @@ -79,7 +79,7 @@ void RefreshManager::planNextRefresh() controller.wrapper.send(REFTrigger, nextPlannedRefresh, refreshPayloads[Bank(0)]); } -void RefreshManager::reInitialize(Bank bank, sc_time time) +void RefreshManager::reInitialize(Bank /*bank*/, sc_time time) { nextPlannedRefresh = clkAlign(time, Alignment::DOWN); planNextRefresh(); diff --git a/dram/src/controller/scheduler/readwritegrouper.cpp b/dram/src/controller/scheduler/readwritegrouper.cpp index 6c2d9306..c96dd0e3 100644 --- a/dram/src/controller/scheduler/readwritegrouper.cpp +++ b/dram/src/controller/scheduler/readwritegrouper.cpp @@ -94,6 +94,7 @@ gp *ReadWriteGrouper::getNextPayload() else { sc_assert(false); + return NULL; } } @@ -127,7 +128,10 @@ bool ReadWriteGrouper::hasPayloads() else if(batches.size() == 2) return (getLatestReadBatch().hasPayloads() || getLatestWriteBatch().hasPayloads()); else + { sc_assert(false); + return NULL; + } } diff --git a/dram/src/simulation/ISimulation.h b/dram/src/simulation/ISimulation.h deleted file mode 100644 index 2877656f..00000000 --- a/dram/src/simulation/ISimulation.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef ISIMULATION_H_ -#define ISIMULATION_H_ - - -namespace simulation { - -class ISimulation -{ -public: - virtual ~ISimulation(){} - virtual void transactionFinished() = 0; -}; - -} // namespace simulation - - -#endif diff --git a/dram/src/simulation/Simulation.cpp b/dram/src/simulation/Simulation.cpp index 6f233309..75113baf 100644 --- a/dram/src/simulation/Simulation.cpp +++ b/dram/src/simulation/Simulation.cpp @@ -15,11 +15,10 @@ #include #include #include "../common/Utils.h" +#include "StlPlayer.h" using namespace std; -namespace simulation { - Simulation::Simulation(sc_module_name /*name*/, string pathToResources, string traceName, DramSetup setup, std::vector devices) : traceName(traceName), dramSetup(setup) @@ -36,17 +35,18 @@ Simulation::Simulation(sc_module_name /*name*/, string pathToResources, string t instantiateModules(pathToResources, devices); bindSockets(); setupDebugManager(traceName); - calculateNumberOfTransaction(devices, pathToResources); } void Simulation::setupDebugManager(const string& traceName) { auto& dbg = DebugManager::getInstance(); - dbg.addToWhiteList(controller->name()); - dbg.addToWhiteList(player2->name()); dbg.addToWhiteList(player1->name()); + dbg.addToWhiteList(player2->name()); + dbg.addToWhiteList(player3->name()); + dbg.addToWhiteList(player4->name()); + dbg.addToWhiteList(this->name()); dbg.addToWhiteList(Scheduler::sendername); dbg.addToWhiteList(TlmRecorder::senderName); @@ -82,19 +82,20 @@ void Simulation::instantiateModules(const string &pathToResources, const std::ve dram = new Dram<>("dram"); arbiter = new Arbiter("arbiter"); controller = new Controller<>("controller"); - reorder = new ReorderBuffer<>("reorder"); + //reorder = new ReorderBuffer<>("reorder"); - player1 = new TracePlayer<>("player1", pathToResources + string("traces/") + devices[0].trace, devices[0].burstLength, devices[0].clkMhz, this); - player2 = new TracePlayer<>("player2", pathToResources + string("traces/") + devices[1].trace, devices[1].burstLength, devices[1].clkMhz, this); - player3 = new TracePlayer<>("player3", pathToResources + string("traces/") + devices[2].trace, devices[2].burstLength, devices[2].clkMhz, this); - player4 = new TracePlayer<>("player4", pathToResources + string("traces/") + devices[3].trace, devices[3].burstLength, devices[3].clkMhz, this); + //player1 = new StlPlayer<>("player1", pathToResources + string("traces/") + devices[0].trace, devices[0].clkMhz, this); + player1 = new TlmPacketGenerator<>("player1", 0, this); + player2 = new StlPlayer<>("player2", pathToResources + string("traces/") + devices[1].trace, devices[1].clkMhz, this); + player3 = new StlPlayer<>("player3", pathToResources + string("traces/") + devices[2].trace, devices[2].clkMhz, this); + player4 = new StlPlayer<>("player4", pathToResources + string("traces/") + devices[3].trace, devices[3].clkMhz, this); } void Simulation::bindSockets() { - //player1->iSocket.bind(arbiter->tSockets[0]); - player1->iSocket.bind(reorder->tSocket); - reorder->iSocket.bind(arbiter->tSockets[0]); + player1->iSocket.bind(arbiter->tSockets[0]); + //player1->iSocket.bind(reorder->tSocket); + //reorder->iSocket.bind(arbiter->tSockets[0]); player2->iSocket.bind(arbiter->tSockets[1]); player3->iSocket.bind(arbiter->tSockets[2]); @@ -103,15 +104,6 @@ void Simulation::bindSockets() controller->iSocket.bind(dram->tSocket); } -void Simulation::calculateNumberOfTransaction(std::vector devices, string pathToResources) -{ - totalTransactions = getNumberOfTransactions(pathToResources + string("traces/") + devices[0].trace); - totalTransactions += getNumberOfTransactions(pathToResources + string("traces/") + devices[1].trace); - totalTransactions += getNumberOfTransactions(pathToResources + string("traces/") + devices[2].trace); - totalTransactions += getNumberOfTransactions(pathToResources + string("traces/") + devices[3].trace); - remainingTransactions = totalTransactions; -} - Simulation::~Simulation() { delete dram; @@ -129,24 +121,23 @@ void Simulation::start() report(headline); report(" -> setup: \t\t" + getFileName(traceName)); report(" -> memspec: \t\t" + Configuration::getInstance().memSpec.MemoryId); - report(" -> transactions: \t" + to_string(totalTransactions)); cout << endl; simulationStartTime = clock(); - player1->start(); - player2->start(); - player3->start(); - player4->start(); + player1->nextPayload(); + player2->nextPayload(); + player3->nextPayload(); + player4->nextPayload(); sc_set_stop_mode(SC_STOP_FINISH_DELTA); sc_start(); } -void inline Simulation::transactionFinished() +void inline Simulation::tracePlayerTerminates() { - remainingTransactions--; - loadbar(totalTransactions - remainingTransactions, totalTransactions); - if (remainingTransactions == 0) + static unsigned int finishedTracePlayers = 0; + finishedTracePlayers++; + + if (finishedTracePlayers == NumberOfTracePlayers) { - cout << endl; terminateSimulation.notify(); } } @@ -168,21 +159,3 @@ void Simulation::report(string message) DebugManager::getInstance().printDebugMessage(this->name(), message); cout << message << endl; } - -unsigned int Simulation::getNumberOfTransactions(string uri) -{ - std::ifstream file(uri); - unsigned int lineCount = 0; - string line; - - while (std::getline(file, line)) - { - if(!line.empty()) - lineCount++; - } - - return lineCount; -} - -} /* namespace simulation */ - diff --git a/dram/src/simulation/Simulation.h b/dram/src/simulation/Simulation.h index 9218321d..47e963c8 100644 --- a/dram/src/simulation/Simulation.h +++ b/dram/src/simulation/Simulation.h @@ -11,13 +11,12 @@ #include "Dram.h" #include "Arbiter.h" #include "TracePlayer.h" +#include "TlmPacketGenerator.h" #include "ReorderBuffer.h" #include "../controller/Controller.h" -#include "ISimulation.h" #include #include - -namespace simulation { +#include "TracePlayerListener.h" struct DramSetup { @@ -39,7 +38,7 @@ struct Device unsigned int burstLength; }; -class Simulation: public ISimulation, public sc_module +class Simulation: public sc_module, public TracePlayerListener { public: SC_HAS_PROCESS(Simulation); @@ -50,7 +49,7 @@ public: void start(); void stop(); - void inline transactionFinished() override; + virtual void tracePlayerTerminates() override; constexpr static unsigned int NumberOfTracePlayers = 4; private: @@ -69,19 +68,12 @@ private: TracePlayer<> *player3; TracePlayer<> *player4; - unsigned int totalTransactions; - unsigned int remainingTransactions; clock_t simulationStartTime; - unsigned int getNumberOfTransactions(string uri); - void report(std::string message); void setupDebugManager(const string& traceName); void setupTlmRecorder(const string &traceName, const string &pathToResources, const DramSetup &setup, const std::vector &devices); void instantiateModules(const string &pathToResources, const std::vector &devices); void bindSockets(); - void calculateNumberOfTransaction(std::vector devices, string pathToResources); }; -} /* namespace simulation */ - #endif /* SIMULATIONMANAGER_H_ */ diff --git a/dram/src/simulation/SimulationManager.cpp b/dram/src/simulation/SimulationManager.cpp index fa394f78..9f8d2d30 100644 --- a/dram/src/simulation/SimulationManager.cpp +++ b/dram/src/simulation/SimulationManager.cpp @@ -11,9 +11,7 @@ #include "../common/Utils.h" using namespace std; using namespace tinyxml2; -using namespace simulation; -namespace simulation { SimulationManager::SimulationManager(string resources) : silent(false), resources(resources) @@ -118,17 +116,17 @@ void SimulationManager::checkPaths() void SimulationManager::runSimulation(string traceName, DramSetup dramSetup, vector traceSetup) { - int pid = fork(); - int status = 0; - if (pid == 0) - { +// int pid = fork(); +// int status = 0; +// if (pid == 0) +// { Simulation* simulation = new Simulation("sim", resources, traceName, dramSetup, traceSetup); simulation->start(); delete simulation; - _Exit(0); - } + // _Exit(0); + //} - waitpid(pid, &status, 0); + //waitpid(pid, &status, 0); } void SimulationManager::startTraceAnalyzer() @@ -182,6 +180,3 @@ void SimulationBatch::print() } } -} -/* namespace simulation */ - diff --git a/dram/src/simulation/SimulationManager.h b/dram/src/simulation/SimulationManager.h index 8e3f5707..5dde2838 100644 --- a/dram/src/simulation/SimulationManager.h +++ b/dram/src/simulation/SimulationManager.h @@ -14,13 +14,11 @@ #include "Simulation.h" #include "../common/third_party/tinyxml2.h" -namespace simulation { - struct SimulationBatch { std::string simulationName; - std::vector dramSetups; + std::vector dramSetups; std::map> traceSetups; void print(); }; @@ -51,6 +49,4 @@ private: void report(std::string message); }; -} /* namespace simulation */ - #endif /* SIMULATIONMANAGER_H_ */ diff --git a/dram/src/simulation/StlPlayer.h b/dram/src/simulation/StlPlayer.h new file mode 100644 index 00000000..884756c2 --- /dev/null +++ b/dram/src/simulation/StlPlayer.h @@ -0,0 +1,114 @@ +#ifndef STLPLAYER_H +#define STLPLAYER_H + + +#include "../common/xmlAddressdecoder.h" +#include "TracePlayer.h" + +using namespace std; +using namespace tlm; + +template +struct StlPlayer: public TracePlayer +{ +public: + StlPlayer(sc_module_name /*name*/, string pathToTrace, unsigned int clkMhz, + TracePlayerListener* listener); + virtual void nextPayload() override + { + string line; + while(line.empty() && file) + { + std::getline(file, line); + } + + if(!file) + { + this->terminate(); + return; + } + + + std::istringstream iss(line); + string time, command, address; + iss >> time >> command >> address; + long parsedAdress = std::stoi(address.c_str(), 0, 16); + + gp* payload = this->allocatePayload(); + unsigned char * dataElement = new unsigned char[16]; // TODO: column / burst breite + + payload->set_address(parsedAdress); + payload->set_response_status(TLM_INCOMPLETE_RESPONSE); + payload->set_dmi_allowed(false); + payload->set_byte_enable_length(0); + payload->set_streaming_width(burstlenght); + this->setDataPointer(payload, dataElement); + + if (command == "read") + { + payload->set_command(TLM_READ_COMMAND); + } + else if (command == "write") + { + payload->set_command(TLM_WRITE_COMMAND); + + // Parse and set data + string data; + iss >> data; + + if(!data.empty()) + { + //cout << "parsing write data: " << data << std::endl; + + for(int i = 0; i < 16; i++) // TODO column / burst breite + { + std::string byteString = "0x"; + byteString.append(data.substr(2*(i+1), 2)); + //cout << byteString << " " << std::stoi(byteString.c_str(), 0, 16) << endl; + dataElement[i] = std::stoi(byteString.c_str(), 0, 16); + } + } + } + else + { + SC_REPORT_FATAL(0, + (string("Corrupted tracefile, command ") + command + string(" unknown")).c_str()); + } + + sc_time sendingTime = std::stoi(time.c_str())*clk; + + if (sendingTime <= sc_time_stamp()) + { + this->payloadEventQueue.notify(*payload, BEGIN_REQ, SC_ZERO_TIME); + } + else + { + this->payloadEventQueue.notify(*payload, BEGIN_REQ, sendingTime - sc_time_stamp()); + } + } + + +private: + ifstream file; + unsigned int burstlenght; + sc_time clk; +}; + + +template +StlPlayer::StlPlayer(sc_module_name /*name*/, string pathToTrace, unsigned int clkMhz, + TracePlayerListener* listener) : + TracePlayer(listener),file(pathToTrace) +{ + if (!file.is_open()) + SC_REPORT_FATAL(0, (string("Could not open trace ") + pathToTrace).c_str()); + + if(clkMhz == 0) + clk = core::Configuration::getInstance().memSpec.clk; + else + clk = core::FrequencyToClk(clkMhz); + + this->burstlenght = core::Configuration::getInstance().memSpec.BurstLength; +} + +#endif // STLPLAYER_H diff --git a/dram/src/simulation/TlmPacketGenerator.h b/dram/src/simulation/TlmPacketGenerator.h new file mode 100644 index 00000000..5230d3f5 --- /dev/null +++ b/dram/src/simulation/TlmPacketGenerator.h @@ -0,0 +1,61 @@ +#ifndef TLMPACKETGENERATOR_H +#define TLMPACKETGENERATOR_H + + +#include "TracePlayer.h" + +using namespace std; +using namespace tlm; + +template +struct TlmPacketGenerator: public TracePlayer +{ +public: + TlmPacketGenerator(sc_module_name /*name*/, unsigned int clkMhz, + TracePlayerListener* listener); + + virtual void nextPayload() override + { + if(transCounter >= 1000) // TODO set limit! + { + this->terminate(); + } + + gp* payload = this->allocatePayload(); + + unsigned char * dataElement = new unsigned char[16]; // TODO: column / burst breite + + payload->set_address(0x0); + payload->set_response_status(TLM_INCOMPLETE_RESPONSE); + payload->set_dmi_allowed(false); + payload->set_byte_enable_length(0); + payload->set_streaming_width(this->burstlenght); + this->setDataPointer(payload, dataElement); + payload->set_command(TLM_READ_COMMAND); + + transCounter++; + this->payloadEventQueue.notify(*payload, BEGIN_REQ, SC_ZERO_TIME); + } + + +private: + unsigned int burstlenght; + sc_time clk; + unsigned int transCounter; +}; + + +template +TlmPacketGenerator::TlmPacketGenerator(sc_module_name /*name*/, unsigned int clkMhz, + TracePlayerListener* listener) : + TracePlayer(listener), transCounter(0) +{ + if(clkMhz == 0) + clk = core::Configuration::getInstance().memSpec.clk; + else + clk = core::FrequencyToClk(clkMhz); + + this->burstlenght = core::Configuration::getInstance().memSpec.BurstLength; +} + +#endif diff --git a/dram/src/simulation/TracePlayer.h b/dram/src/simulation/TracePlayer.h index 2fc5edbd..fc05f2f1 100644 --- a/dram/src/simulation/TracePlayer.h +++ b/dram/src/simulation/TracePlayer.h @@ -16,13 +16,13 @@ #include #include #include "MemoryManager.h" -#include "ISimulation.h" #include "../controller/core/configuration/Configuration.h" #include "../common/DebugManager.h" #include "../common/xmlAddressdecoder.h" #include "../common/TlmRecorder.h" #include "../common/dramExtension.h" #include "../controller/core/TimingCalculation.h" +#include "TracePlayerListener.h" using namespace std; using namespace tlm; @@ -32,134 +32,65 @@ struct TracePlayer: public sc_module { public: tlm_utils::simple_initiator_socket iSocket; - TracePlayer(sc_module_name /*name*/, string pathToTrace, unsigned int burstLength, unsigned int clkMhz, - simulation::ISimulation* simulationManager); + TracePlayer(TracePlayerListener* listener); + virtual void nextPayload() = 0; - void start(); +protected: + gp* allocatePayload(); + tlm_utils::peq_with_cb_and_phase payloadEventQueue; + void terminate(); + void setDataPointer(gp* p, unsigned char * data); + void printDebugMessage(std::string message); private: - void generateNextPayload(); tlm_sync_enum nb_transport_bw(tlm_generic_payload& payload, tlm_phase& phase, sc_time& bwDelay); void peqCallback(tlm_generic_payload& payload, const tlm_phase& phase); void sendToTarget(tlm_generic_payload& payload, const tlm_phase& phase, const sc_time& delay); - tlm_utils::peq_with_cb_and_phase payloadEventQueue; MemoryManager memoryManager; - ifstream file; - unsigned int burstlenght; - sc_time clk; - unsigned int numberOfPendingTransactions; unsigned int transactionsSent; - unsigned int transactionsReceived; - simulation::ISimulation* simulationManager; + TracePlayerListener* listener; }; + template -TracePlayer::TracePlayer(sc_module_name, string pathToTrace, unsigned int burstLength, unsigned int clkMhz, simulation::ISimulation *simulationManager) : - payloadEventQueue(this, &TracePlayer::peqCallback), file(pathToTrace), burstlenght(burstLength), - numberOfPendingTransactions(0), transactionsSent(0), transactionsReceived(0), simulationManager(simulationManager) +TracePlayer::TracePlayer(TracePlayerListener* listener) : + payloadEventQueue(this, &TracePlayer::peqCallback), transactionsSent(0), listener(listener) { - if (!file.is_open()) - SC_REPORT_FATAL(0, (string("Could not open trace ") + pathToTrace).c_str()); - - if(clkMhz == 0) - clk = core::Configuration::getInstance().memSpec.clk; - else - clk = core::FrequencyToClk(clkMhz); - - this->burstlenght = core::Configuration::getInstance().memSpec.BurstLength; iSocket.register_nb_transport_bw(this, &TracePlayer::nb_transport_bw); } + template -void TracePlayer::start() +gp *TracePlayer::allocatePayload() { - bool fileIsEmpty = file.peek() == std::ifstream::traits_type::eof(); - if (!fileIsEmpty) - { - generateNextPayload(); - } + return memoryManager.allocate(); } template -void TracePlayer::generateNextPayload() +void TracePlayer::terminate() { - string line; - if (std::getline(file, line)) - { - if(line.empty()) - { - generateNextPayload(); - return; - } - std::istringstream iss(line); - string time, command, address; - iss >> time >> command >> address; - long parsedAdress = std::stoi(address.c_str(), 0, 16); - - gp* payload = memoryManager.allocate(); - payload->set_address(parsedAdress); - - // Set data pointer - unsigned char * dataElement = new unsigned char[16]; // TODO: column / burst breite - payload->set_data_length(16); // TODO: column / burst breite - payload->set_data_ptr(dataElement); - for(int i = 0; i < 16; i++) // TODO: column / burst breite - dataElement[i] = 0; - - if (command == "read") - { - payload->set_command(TLM_READ_COMMAND); - } - else if (command == "write") - { - payload->set_command(TLM_WRITE_COMMAND); - - // Parse and set data - string data; - iss >> data; - - if(!data.empty()) - { - //cout << "parsing write data: " << data << std::endl; - - for(int i = 0; i < 16; i++) // TODO column / burst breite - { - std::string byteString = "0x"; - byteString.append(data.substr(2*(i+1), 2)); - //cout << byteString << " " << std::stoi(byteString.c_str(), 0, 16) << endl; - dataElement[i] = std::stoi(byteString.c_str(), 0, 16); - } - } - } - else - { - SC_REPORT_FATAL(0, - (string("Corrupted tracefile, command ") + command + string(" unknown")).c_str()); - } - - payload->set_response_status(TLM_INCOMPLETE_RESPONSE); - payload->set_dmi_allowed(false); - payload->set_byte_enable_length(0); - payload->set_streaming_width(burstlenght); - - sc_time sendingTime = std::stoi(time.c_str())*clk; - GenerationExtension* genExtension = new GenerationExtension(sendingTime); - payload->set_auto_extension(genExtension); - - if (sendingTime <= sc_time_stamp()) - { - payloadEventQueue.notify(*payload, BEGIN_REQ, SC_ZERO_TIME); - } - else - { - payloadEventQueue.notify(*payload, BEGIN_REQ, sendingTime - sc_time_stamp()); - } - numberOfPendingTransactions++; - } + cout << sc_time_stamp() << " " << this->name() << " terminated" << std::endl; + listener->tracePlayerTerminates(); } +template +void TracePlayer::printDebugMessage(std::string message) +{ + DebugManager::getInstance().printDebugMessage(this->name(), message); +} + +//todo move +template +void TracePlayer::setDataPointer(gp* payload, unsigned char * dataElement) +{ + //check if payload takes ownership + payload->set_data_length(16); // TODO: column / burst breite ..... buswidth * burst /8 + payload->set_data_ptr(dataElement); + for(int i = 0; i < 16; i++) // TODO: column / burst breite + dataElement[i] = 0; +} template tlm_sync_enum TracePlayer::nb_transport_bw(tlm_generic_payload &payload, tlm_phase &phase, sc_time &bwDelay) @@ -171,9 +102,12 @@ tlm_sync_enum TracePlayer::nb_transport_bw(tlm_generic_payload &payloa template void TracePlayer::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase) { + if (phase == BEGIN_REQ) { payload.acquire(); + GenerationExtension* genExtension = new GenerationExtension(sc_time_stamp()); + payload.set_auto_extension(genExtension); sendToTarget(payload, phase, SC_ZERO_TIME); transactionsSent++; @@ -182,20 +116,12 @@ void TracePlayer::peqCallback(tlm_generic_payload &payload, const tlm_ } else if (phase == END_REQ) { - generateNextPayload(); + nextPayload(); } else if (phase == BEGIN_RESP) { sendToTarget(payload, END_RESP, SC_ZERO_TIME); payload.release(); - - simulationManager->transactionFinished(); - numberOfPendingTransactions--; - transactionsReceived++; - - DebugManager::getInstance().printDebugMessage(name(), - "Pending transactions in core: " - + std::to_string(transactionsSent - transactionsReceived)); } else if (phase == END_RESP) { diff --git a/dram/src/simulation/TracePlayerListener.h b/dram/src/simulation/TracePlayerListener.h new file mode 100644 index 00000000..4c0afd82 --- /dev/null +++ b/dram/src/simulation/TracePlayerListener.h @@ -0,0 +1,10 @@ +#ifndef TRACEPLAYERLISTENER_H +#define TRACEPLAYERLISTENER_H + +class TracePlayerListener +{ +public: + virtual void tracePlayerTerminates() = 0; +}; + +#endif // TRACEPLAYERLISTENER_H diff --git a/dram/src/simulation/main.cpp b/dram/src/simulation/main.cpp index 00797a88..72b44ef8 100644 --- a/dram/src/simulation/main.cpp +++ b/dram/src/simulation/main.cpp @@ -16,7 +16,6 @@ using namespace std; -using namespace simulation; string resources;