From a11276c87658b7df45352d3a88eaa22c51ffadf7 Mon Sep 17 00:00:00 2001 From: Johannes Feldmann Date: Thu, 2 Mar 2017 20:18:36 +0100 Subject: [PATCH] ECC Controller umgebaut. Testumgebung angepasst. Weak cells manuell gesetzt. --- DRAMSys/simulator/library.pro | 3 +- .../resources/configs/mcconfigs/fifo_ecc.xml | 20 ++++++ .../configs/memspecs/wideio_less_refresh.xml | 61 +++++++++++++++++++ .../configs/simulator/wideio_ecc.xml | 15 +++++ DRAMSys/simulator/resources/resources.pri | 7 +++ .../resources/simulations/wideio-ecc.xml | 22 +++++++ .../core/configuration/Configuration.cpp | 2 + .../core/configuration/Configuration.h | 1 + DRAMSys/simulator/src/error/controllerECC.h | 59 ++++++++++-------- DRAMSys/simulator/src/error/errormodel.cpp | 20 ++++++ DRAMSys/simulator/src/simulation/DRAMSys.cpp | 57 +++++++++++------ DRAMSys/simulator/src/simulation/main.cpp | 2 +- 12 files changed, 221 insertions(+), 48 deletions(-) create mode 100644 DRAMSys/simulator/resources/configs/mcconfigs/fifo_ecc.xml create mode 100644 DRAMSys/simulator/resources/configs/memspecs/wideio_less_refresh.xml create mode 100644 DRAMSys/simulator/resources/configs/simulator/wideio_ecc.xml create mode 100644 DRAMSys/simulator/resources/simulations/wideio-ecc.xml diff --git a/DRAMSys/simulator/library.pro b/DRAMSys/simulator/library.pro index 0a930c9a..5a25d3ff 100644 --- a/DRAMSys/simulator/library.pro +++ b/DRAMSys/simulator/library.pro @@ -163,7 +163,8 @@ HEADERS += \ src/controller/core/powerdown/PowerDownManagerTimeoutBankwise.h \ src/simulation/TraceSetup.h \ src/simulation/DRAMSys.h \ - src/simulation/Setup.h + src/simulation/Setup.h \ + src/error/controllerECC.h thermalsim = $$(THERMALSIM) isEmpty(thermalsim) { diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/fifo_ecc.xml b/DRAMSys/simulator/resources/configs/mcconfigs/fifo_ecc.xml new file mode 100644 index 00000000..d6acf112 --- /dev/null +++ b/DRAMSys/simulator/resources/configs/mcconfigs/fifo_ecc.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/configs/memspecs/wideio_less_refresh.xml b/DRAMSys/simulator/resources/configs/memspecs/wideio_less_refresh.xml new file mode 100644 index 00000000..f8aa3190 --- /dev/null +++ b/DRAMSys/simulator/resources/configs/memspecs/wideio_less_refresh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/configs/simulator/wideio_ecc.xml b/DRAMSys/simulator/resources/configs/simulator/wideio_ecc.xml new file mode 100644 index 00000000..4b8ad3d1 --- /dev/null +++ b/DRAMSys/simulator/resources/configs/simulator/wideio_ecc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/resources.pri b/DRAMSys/simulator/resources/resources.pri index fc1d85c7..37b75724 100644 --- a/DRAMSys/simulator/resources/resources.pri +++ b/DRAMSys/simulator/resources/resources.pri @@ -134,3 +134,10 @@ OTHER_FILES += resources/configs/thermalsim/mem.flp OTHER_FILES += resources/configs/thermalsim/powerInfo.xml OTHER_FILES += resources/configs/thermalsim/stack.stk OTHER_FILES += resources/configs/thermalsim/config.xml + +DISTFILES += \ + $$PWD/configs/simulator/wideio_ecc.xml \ + $$PWD/configs/mcconfigs/fifo_ecc.xml \ + $$PWD/simulations/wideio-ecc.xml \ + $$PWD/traces/test_ecc.stl \ + $$PWD/configs/memspecs/wideio_less_refresh.xml diff --git a/DRAMSys/simulator/resources/simulations/wideio-ecc.xml b/DRAMSys/simulator/resources/simulations/wideio-ecc.xml new file mode 100644 index 00000000..ead21319 --- /dev/null +++ b/DRAMSys/simulator/resources/simulations/wideio-ecc.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + test_ecc.stl + + diff --git a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp index 1a7feaa4..85f0a250 100644 --- a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp +++ b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp @@ -187,6 +187,8 @@ void Configuration::setParameter(std::string name, std::string value) NumberOfDevicesOnDIMM = string2int(value); else if(name == "CheckTLM2Protocol") CheckTLM2Protocol = string2bool(value); + else if(name == "EnableControllerECC") + EnableControllerECC = string2bool(value); // Specification for ErrorChipSeed, ErrorCSVFile path and StoreMode else if(name == "ErrorChipSeed") ErrorChipSeed = string2int(value); diff --git a/DRAMSys/simulator/src/controller/core/configuration/Configuration.h b/DRAMSys/simulator/src/controller/core/configuration/Configuration.h index 40c24b8a..bff51af5 100644 --- a/DRAMSys/simulator/src/controller/core/configuration/Configuration.h +++ b/DRAMSys/simulator/src/controller/core/configuration/Configuration.h @@ -81,6 +81,7 @@ struct Configuration bool SimulationProgressBar = false; unsigned int NumberOfDevicesOnDIMM = 1; bool CheckTLM2Protocol = false; + bool EnableControllerECC = false; // MemSpec (from DRAM-Power XML) MemSpec memSpec; diff --git a/DRAMSys/simulator/src/error/controllerECC.h b/DRAMSys/simulator/src/error/controllerECC.h index b9dd772e..0a33c1c1 100644 --- a/DRAMSys/simulator/src/error/controllerECC.h +++ b/DRAMSys/simulator/src/error/controllerECC.h @@ -12,7 +12,7 @@ using namespace tlm; struct ControllerECC: sc_module { private: - map m_mBuffer; + map> m_mBuffer; public: tlm_utils::multi_passthrough_target_socket t_socket; @@ -29,38 +29,45 @@ public: // Forward interface virtual tlm::tlm_sync_enum nb_transport_fw( int id, tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_time& delay ) { - if(trans.get_command() == TLM_WRITE_COMMAND) - { - // Save all Bytes - for(unsigned i = 0; i < trans.get_data_length(); i++) - { - m_mBuffer[trans.get_address() + i] = *(trans.get_data_ptr() + i); - } - } - return i_socket[id]->nb_transport_fw( trans, phase, delay ); + if(trans.get_command() == TLM_WRITE_COMMAND) + { + // Allocate memory if necessary + if(m_mBuffer[trans.get_address()].size() != trans.get_data_length()) + m_mBuffer[trans.get_address()].resize(trans.get_data_length()); + + // Copy data + memcpy(m_mBuffer[trans.get_address()].data(), trans.get_data_ptr(), trans.get_data_length()); + } + return i_socket[id]->nb_transport_fw( trans, phase, delay ); } // Backward interface virtual tlm::tlm_sync_enum nb_transport_bw( int id, tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_time& delay ) { - if(trans.get_command() == TLM_WRITE_COMMAND) - { - // Compare all Bytes - for(unsigned i = 0; i < trans.get_data_length(); i++) - { - if(m_mBuffer[trans.get_address() + i] != *(trans.get_data_ptr() + i)) - { - std::stringstream msg; - msg << "Error Detected: Address: 0x" << hex << trans.get_address() + i - << "\n\t\tData Read: 0x" << hex << (int)*(trans.get_data_ptr() + i) - << "\n\t\tData original: 0x" << hex << (int)m_mBuffer[trans.get_address() + i]; - - DebugManager::getInstance().printDebugMessage(name(), msg.str()); - } - } - } + if(trans.get_command() == TLM_READ_COMMAND && phase == 3) + { + if(m_mBuffer[trans.get_address()].size() == trans.get_data_length()) + { + // Data can be compared, they got the same size + int error = memcmp(m_mBuffer[trans.get_address()].data(), trans.get_data_ptr(), trans.get_data_length()); + if(error) + { + // Data not equal + cout << "\nError Detected: Address: 0x" << hex << trans.get_address(); + for(unsigned n = 0; n < trans.get_data_length(); n++) + { + if(m_mBuffer[trans.get_address()].data()[n] != trans.get_data_ptr()[n]) + { + cout << "\n\t\tError Byte " << dec << n << " Orig: 0x" << hex << (int)m_mBuffer[trans.get_address()].data()[n] + << " Read: 0x" << hex << (int)trans.get_data_ptr()[n]; + } + } + cout << endl; + } + } + } return t_socket[id]->nb_transport_bw( trans, phase, delay ); } }; diff --git a/DRAMSys/simulator/src/error/errormodel.cpp b/DRAMSys/simulator/src/error/errormodel.cpp index 4e397377..91eb789b 100644 --- a/DRAMSys/simulator/src/error/errormodel.cpp +++ b/DRAMSys/simulator/src/error/errormodel.cpp @@ -105,6 +105,26 @@ void errorModel::init() //weakCells[0].row = 0; //weakCells[0].dependent = true; + weakCells[0].bit = 0; + weakCells[0].col = 0; + weakCells[0].row = 0; + weakCells[0].dependent = false; + + weakCells[0].bit = 5; + weakCells[0].col = 0; + weakCells[0].row = 0; + weakCells[0].dependent = false; + + weakCells[0].bit = 12; + weakCells[0].col = 0; + weakCells[0].row = 0; + weakCells[0].dependent = false; + + weakCells[0].bit = 22; + weakCells[0].col = 0; + weakCells[0].row = 0; + weakCells[0].dependent = false; + markBitFlips(); } diff --git a/DRAMSys/simulator/src/simulation/DRAMSys.cpp b/DRAMSys/simulator/src/simulation/DRAMSys.cpp index 41b80d42..0cb5bbc5 100644 --- a/DRAMSys/simulator/src/simulation/DRAMSys.cpp +++ b/DRAMSys/simulator/src/simulation/DRAMSys.cpp @@ -58,6 +58,9 @@ DRAMSys::DRAMSys(sc_module_name __attribute__((unused)) name, string simulationToRun, string pathToResources) : tSocket("DRAMSys_tSocket") { + // Initialize ecc pointer + ecc = 0; + logo(); // Read Configuration Setup: @@ -185,6 +188,10 @@ void DRAMSys::instantiateModules(const string &traceName, // They need to be ready before creating some modules. setupTlmRecorders(traceName, pathToResources); + // Initialize ECC Controller is enabled + if(Configuration::getInstance().EnableControllerECC) + ecc = new ControllerECC("ControllerECC"); + arbiter = new Arbiter("arbiter"); arbiter->setTlmRecorders(tlmRecorders); @@ -214,35 +221,45 @@ void DRAMSys::instantiateModules(const string &traceName, void DRAMSys::bindSockets() { - tSocket.bind(arbiter->tSocket); + // If ECC Controller enabled, put it between Trace and arbiter + if(Configuration::getInstance().EnableControllerECC) + { + tSocket.bind(ecc->t_socket); + ecc->i_socket.bind(arbiter->tSocket); + } + else + { + tSocket.bind(arbiter->tSocket); + } - if(Configuration::getInstance().CheckTLM2Protocol) + if(Configuration::getInstance().CheckTLM2Protocol) + { + for (size_t i = 0; + i < Configuration::getInstance().NumberOfMemChannels; + i++) { - for (size_t i = 0; - i < Configuration::getInstance().NumberOfMemChannels; - i++) - { - arbiter->iSocket.bind(controllersTlmCheckers[i]->target_socket); - controllersTlmCheckers[i]->initiator_socket.bind( - controllers[i]->tSocket); - controllers[i]->iSocket.bind(drams[i]->tSocket); - } + arbiter->iSocket.bind(controllersTlmCheckers[i]->target_socket); + controllersTlmCheckers[i]->initiator_socket.bind( + controllers[i]->tSocket); + controllers[i]->iSocket.bind(drams[i]->tSocket); } - else + } + else + { + for (size_t i = 0; + i < Configuration::getInstance().NumberOfMemChannels; + i++) { - for (size_t i = 0; - i < Configuration::getInstance().NumberOfMemChannels; - i++) - { - arbiter->iSocket.bind(controllers[i]->tSocket); - controllers[i]->iSocket.bind(drams[i]->tSocket); - } + arbiter->iSocket.bind(controllers[i]->tSocket); + controllers[i]->iSocket.bind(drams[i]->tSocket); } + } } DRAMSys::~DRAMSys() { - + if(ecc) + delete ecc; delete arbiter; for (auto controller : controllers) diff --git a/DRAMSys/simulator/src/simulation/main.cpp b/DRAMSys/simulator/src/simulation/main.cpp index 18e00f77..18b474e9 100644 --- a/DRAMSys/simulator/src/simulation/main.cpp +++ b/DRAMSys/simulator/src/simulation/main.cpp @@ -72,7 +72,7 @@ int sc_main(int argc, char **argv) } else { - SimulationXML = resources + "simulations/ddr3-example.xml"; + SimulationXML = resources + "simulations/wideio-ecc.xml"; } std::vector players;