diff --git a/DRAMSys/simulator/resources/configs/memconfigs/par_bs.xml b/DRAMSys/simulator/resources/configs/memconfigs/par_bs.xml
new file mode 100644
index 00000000..65be1936
--- /dev/null
+++ b/DRAMSys/simulator/resources/configs/memconfigs/par_bs.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DRAMSys/simulator/resources/resources.pri b/DRAMSys/simulator/resources/resources.pri
index 70a57f47..3f2dc9ce 100644
--- a/DRAMSys/simulator/resources/resources.pri
+++ b/DRAMSys/simulator/resources/resources.pri
@@ -2,7 +2,7 @@
# "DRAMSys/simulator/simulator.pro"
# simulation files
-OTHER_FILES += resources/simulations/sim-batch.xml
+OTHER_FILES += resources/simulations/sim-batch.xml
OTHER_FILES += resources/simulations/ddr3-example.xml
# scripts
@@ -58,6 +58,7 @@ OTHER_FILES += resources/configs/memconfigs/_old/grouper.xml
OTHER_FILES += resources/configs/memconfigs/_old/par_bs.xml
OTHER_FILES += resources/configs/memconfigs/_old/fr_fcfs_bankwise.xml
OTHER_FILES += resources/configs/memconfigs/fr_fcfs.xml
+OTHER_FILES += resources/configs/memconfigs/par_bs.xml
# memspecs
OTHER_FILES += resources/configs/memspecs/memspec.dtd
diff --git a/DRAMSys/simulator/resources/simulations/sim-batch.xml b/DRAMSys/simulator/resources/simulations/sim-batch.xml
index 06d1807c..73ca12b6 100644
--- a/DRAMSys/simulator/resources/simulations/sim-batch.xml
+++ b/DRAMSys/simulator/resources/simulations/sim-batch.xml
@@ -12,6 +12,7 @@
+
diff --git a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp
index 241c264f..a4170649 100644
--- a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp
+++ b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp
@@ -170,6 +170,8 @@ void Configuration::setParameter(std::string name, std::string value)
SimulationProgressBar = string2bool(value);
else if(name == "NumberOfDevicesOnDIMM")
NumberOfDevicesOnDIMM = string2int(value);
+ else if(name == "CheckTLM2Protocol")
+ CheckTLM2Protocol = 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 1bb478b2..01d6383a 100644
--- a/DRAMSys/simulator/src/controller/core/configuration/Configuration.h
+++ b/DRAMSys/simulator/src/controller/core/configuration/Configuration.h
@@ -85,6 +85,7 @@ struct Configuration
bool ThermalSimulation = false;
bool SimulationProgressBar = false;
unsigned int NumberOfDevicesOnDIMM = 1;
+ bool CheckTLM2Protocol = false;
//MemSpec(from DRAM-Power XML)
MemSpec memSpec;
diff --git a/DRAMSys/simulator/src/simulation/Simulation.cpp b/DRAMSys/simulator/src/simulation/Simulation.cpp
index db6709e6..7311ab08 100644
--- a/DRAMSys/simulator/src/simulation/Simulation.cpp
+++ b/DRAMSys/simulator/src/simulation/Simulation.cpp
@@ -51,8 +51,6 @@
#include "../simulation/TemperatureController.h"
#include "../controller/Controller.h"
-#define USE_EXAMPLE_INITIATOR 0
-
using namespace std;
Simulation::Simulation(sc_module_name __attribute__((unused)) name, string pathToResources, string traceName, DramSetup setup,
@@ -118,6 +116,10 @@ void Simulation::instantiateModules(const string &traceName, const string &pathT
#if USE_EXAMPLE_INITIATOR
init = new ExampleInitiator("init");
+ if(Configuration::getInstance().CheckTLM2Protocol) {
+ string str = "ExampleInitiatorTLMChecker";
+ exampleInitiatorTlmChecker = new tlm_utils::tlm2_base_protocol_checker<>(str.c_str());
+ }
#else
for (size_t i = 0; i < Configuration::getInstance().NumberOfTracePlayers; i++) {
std::string playerStr = "tracePlayer" + std::to_string(i);
@@ -147,10 +149,14 @@ void Simulation::instantiateModules(const string &traceName, const string &pathT
totalTransactions += player->getNumberOfLines(pathToResources + string("traces/") + devices[i].trace);
}
players.push_back(player);
+
+ if(Configuration::getInstance().CheckTLM2Protocol) {
+ string str = "TLMCheckerPlayer"+ std::to_string(i);
+ tlm_utils::tlm2_base_protocol_checker<> * playerTlmChecker = new tlm_utils::tlm2_base_protocol_checker<>(str.c_str());
+ playersTlmCheckers.push_back(playerTlmChecker);
+ }
}
-
remainingTransactions = totalTransactions;
-
#endif /* USE_EXAMPLE_INITIATOR */
// Create and properly initialize TLM recorders. They need to be ready before creating some modules.
@@ -170,22 +176,55 @@ void Simulation::instantiateModules(const string &traceName, const string &pathT
dram->setTlmRecorder(tlmRecorders[i]);
dram->setDramController(controllers[i]);
drams.push_back(dram);
+
+ if(Configuration::getInstance().CheckTLM2Protocol) {
+ str = "TLMCheckerController"+ std::to_string(i);
+ tlm_utils::tlm2_base_protocol_checker<> * controllerTlmChecker = new tlm_utils::tlm2_base_protocol_checker<>(str.c_str());
+ controllersTlmCheckers.push_back(controllerTlmChecker);
+ }
}
}
void Simulation::bindSockets()
{
#if USE_EXAMPLE_INITIATOR
- init->socket.bind(arbiter->tSocket);
-#else
- for (auto player : players) {
- player->iSocket.bind(arbiter->tSocket);
+ if(Configuration::getInstance().CheckTLM2Protocol) {
+ init->socket.bind(exampleInitiatorTlmChecker->target_socket);
+ exampleInitiatorTlmChecker->initiator_socket.bind(arbiter->tSocket);
+
+ 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);
+ }
}
+ else {
+ init->socket.bind(arbiter->tSocket);
+
+#else
+ if(Configuration::getInstance().CheckTLM2Protocol) {
+ for (size_t i = 0; i < players.size(); i++) {
+ players[i]->iSocket.bind(playersTlmCheckers[i]->target_socket);
+ playersTlmCheckers[i]->initiator_socket.bind(arbiter->tSocket);
+ }
+
+ 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);
+ }
+ }
+ else {
+ for (auto player : players) {
+ player->iSocket.bind(arbiter->tSocket);
+ }
+
#endif
- for (size_t i = 0; i < Configuration::getInstance().NumberOfMemChannels; i++) {
- arbiter->iSocket.bind(controllers[i]->tSocket);
- controllers[i]->iSocket.bind(drams[i]->tSocket);
+ for (size_t i = 0; i < Configuration::getInstance().NumberOfMemChannels; i++) {
+ arbiter->iSocket.bind(controllers[i]->tSocket);
+ controllers[i]->iSocket.bind(drams[i]->tSocket);
+ }
}
}
@@ -195,6 +234,11 @@ Simulation::~Simulation()
delete player;
}
+#if USE_EXAMPLE_INITIATOR
+ delete init;
+ delete exampleInitiatorTlmChecker;
+#endif
+
delete arbiter;
for (auto controller : controllers) {
@@ -208,6 +252,14 @@ Simulation::~Simulation()
for (auto rec : tlmRecorders) {
delete rec;
}
+
+ for (auto tlmChecker : playersTlmCheckers) {
+ delete tlmChecker;
+ }
+
+ for (auto tlmChecker : controllersTlmCheckers) {
+ delete tlmChecker;
+ }
}
void Simulation::start()
@@ -279,4 +331,3 @@ void Simulation::report(string message)
DebugManager::getInstance().printDebugMessage(this->name(), message);
cout << message << endl;
}
-
diff --git a/DRAMSys/simulator/src/simulation/Simulation.h b/DRAMSys/simulator/src/simulation/Simulation.h
index 29d39584..e9091dc5 100644
--- a/DRAMSys/simulator/src/simulation/Simulation.h
+++ b/DRAMSys/simulator/src/simulation/Simulation.h
@@ -52,6 +52,9 @@
#include "../controller/Controller.h"
#include "../common/third_party/tinyxml2/tinyxml2.h"
#include "ExampleInitiator.h"
+#include "../common/tlm2_base_protocol_checker.h"
+
+#define USE_EXAMPLE_INITIATOR 0
struct DramSetup
{
@@ -99,8 +102,14 @@ private:
// A vector of pointers to all trace player (devices which acquire the bus
// and initiate transactions targeting the memory)
std::vector players;
- // All transactions pass through the same arbiter
+ //TLM 2.0 Protocol Checkers
+ std::vector*> playersTlmCheckers;
+ std::vector*> controllersTlmCheckers;
+#if USE_EXAMPLE_INITIATOR
ExampleInitiator *init;
+ tlm_utils::tlm2_base_protocol_checker<>* exampleInitiatorTlmChecker;
+#endif
+ // All transactions pass through the same arbiter
Arbiter *arbiter;
// Each DRAM unit has a controller
std::vector controllers;
@@ -123,4 +132,3 @@ private:
};
#endif /* SIMULATIONMANAGER_H_ */
-
diff --git a/DRAMSys/tests/error/sim-batch.xml b/DRAMSys/tests/error/sim-batch.xml
index 31ee9130..7b741534 100644
--- a/DRAMSys/tests/error/sim-batch.xml
+++ b/DRAMSys/tests/error/sim-batch.xml
@@ -12,6 +12,7 @@
+
diff --git a/DRAMSys/tests/simple/sim-batch.xml b/DRAMSys/tests/simple/sim-batch.xml
index a439c09c..f7efc847 100644
--- a/DRAMSys/tests/simple/sim-batch.xml
+++ b/DRAMSys/tests/simple/sim-batch.xml
@@ -12,6 +12,7 @@
+
diff --git a/README.md b/README.md
index c2949924..88aa6cd6 100644
--- a/README.md
+++ b/README.md
@@ -406,6 +406,7 @@ The DRAMSys' main configuration file is presented below.
+
@@ -508,7 +509,8 @@ The XML code below shows a typic configuration:
-
+
+
@@ -636,6 +638,9 @@ Below are listed the configuration sections and configuration fields.
- "0": disables the simulation progress bar
- *NumberOfDevicesOnDIMM* (unsigned int)
- Number of devices on dual inline memory module
+ - *CheckTLM2Protocol* (boolean)
+ - "1": enables the TLM 2.0 Protocol Checking
+ - "0": disables the TLM 2.0 Protocol Checking
- **Temperature Simulator Configuration**
- *TemperatureScale* (string)