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;