Remove length converter (2).
This commit is contained in:
@@ -64,7 +64,6 @@ void to_json(json &j, const TraceSetup &c)
|
|||||||
initiator_j["clkMhz"] = initiator.clkMhz;
|
initiator_j["clkMhz"] = initiator.clkMhz;
|
||||||
initiator_j["maxPendingReadRequests"] = initiator.maxPendingReadRequests;
|
initiator_j["maxPendingReadRequests"] = initiator.maxPendingReadRequests;
|
||||||
initiator_j["maxPendingWriteRequests"] = initiator.maxPendingWriteRequests;
|
initiator_j["maxPendingWriteRequests"] = initiator.maxPendingWriteRequests;
|
||||||
initiator_j["addLengthConverter"] = initiator.addLengthConverter;
|
|
||||||
|
|
||||||
using T = std::decay_t<decltype(initiator)>;
|
using T = std::decay_t<decltype(initiator)>;
|
||||||
if constexpr (std::is_same_v<T, TraceGenerator>)
|
if constexpr (std::is_same_v<T, TraceGenerator>)
|
||||||
@@ -292,9 +291,6 @@ void from_json(const json &j, TraceSetup &c)
|
|||||||
|
|
||||||
if (initiator_j.contains("maxPendingWriteRequests"))
|
if (initiator_j.contains("maxPendingWriteRequests"))
|
||||||
initiator_j.at("maxPendingWriteRequests").get_to(initiator.maxPendingWriteRequests);
|
initiator_j.at("maxPendingWriteRequests").get_to(initiator.maxPendingWriteRequests);
|
||||||
|
|
||||||
if (initiator_j.contains("addLengthConverter"))
|
|
||||||
initiator_j.at("addLengthConverter").get_to(initiator.addLengthConverter);
|
|
||||||
},
|
},
|
||||||
initiator);
|
initiator);
|
||||||
|
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ struct TrafficInitiator
|
|||||||
std::string name;
|
std::string name;
|
||||||
std::optional<unsigned int> maxPendingReadRequests;
|
std::optional<unsigned int> maxPendingReadRequests;
|
||||||
std::optional<unsigned int> maxPendingWriteRequests;
|
std::optional<unsigned int> maxPendingWriteRequests;
|
||||||
std::optional<bool> addLengthConverter;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TracePlayer : public TrafficInitiator
|
struct TracePlayer : public TrafficInitiator
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ using namespace tlm;
|
|||||||
|
|
||||||
StlPlayer::StlPlayer(const sc_module_name &name, const Configuration& config, const std::string &pathToTrace,
|
StlPlayer::StlPlayer(const sc_module_name &name, const Configuration& config, const std::string &pathToTrace,
|
||||||
const sc_time &playerClk, unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
const sc_time &playerClk, unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
||||||
bool addLengthConverter, TraceSetup& setup, bool relative) :
|
TraceSetup& setup, bool relative) :
|
||||||
TrafficInitiator(name, config, setup, maxPendingReadRequests, maxPendingWriteRequests,
|
TrafficInitiator(name, config, setup, maxPendingReadRequests, maxPendingWriteRequests,
|
||||||
config.memSpec->defaultBytesPerBurst, addLengthConverter),
|
config.memSpec->defaultBytesPerBurst),
|
||||||
file(pathToTrace), relative(relative), playerClk(playerClk)
|
file(pathToTrace), relative(relative), playerClk(playerClk)
|
||||||
{
|
{
|
||||||
currentBuffer = &lineContents[0];
|
currentBuffer = &lineContents[0];
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ public:
|
|||||||
const sc_core::sc_time &playerClk,
|
const sc_core::sc_time &playerClk,
|
||||||
unsigned int maxPendingReadRequests,
|
unsigned int maxPendingReadRequests,
|
||||||
unsigned int maxPendingWriteRequests,
|
unsigned int maxPendingWriteRequests,
|
||||||
bool addLengthConverter,
|
|
||||||
TraceSetup& setup,
|
TraceSetup& setup,
|
||||||
bool relative);
|
bool relative);
|
||||||
|
|
||||||
|
|||||||
@@ -79,14 +79,6 @@ TraceSetup::TraceSetup(const Configuration& config,
|
|||||||
return 0;
|
return 0;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
bool addLengthConverter = [=]() -> bool
|
|
||||||
{
|
|
||||||
if (const auto &addLengthConverter = initiator.addLengthConverter)
|
|
||||||
return *addLengthConverter;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}();
|
|
||||||
|
|
||||||
using T = std::decay_t<decltype(initiator)>;
|
using T = std::decay_t<decltype(initiator)>;
|
||||||
if constexpr (std::is_same_v<T, DRAMSysConfiguration::TracePlayer>)
|
if constexpr (std::is_same_v<T, DRAMSysConfiguration::TracePlayer>)
|
||||||
{
|
{
|
||||||
@@ -109,10 +101,10 @@ TraceSetup::TraceSetup(const Configuration& config,
|
|||||||
StlPlayer *player;
|
StlPlayer *player;
|
||||||
if (ext == "stl")
|
if (ext == "stl")
|
||||||
player = new StlPlayer(moduleName.c_str(), config, stlFile, playerClk, maxPendingReadRequests,
|
player = new StlPlayer(moduleName.c_str(), config, stlFile, playerClk, maxPendingReadRequests,
|
||||||
maxPendingWriteRequests, addLengthConverter, *this, false);
|
maxPendingWriteRequests, *this, false);
|
||||||
else if (ext == "rstl")
|
else if (ext == "rstl")
|
||||||
player = new StlPlayer(moduleName.c_str(), config, stlFile, playerClk, maxPendingReadRequests,
|
player = new StlPlayer(moduleName.c_str(), config, stlFile, playerClk, maxPendingReadRequests,
|
||||||
maxPendingWriteRequests, addLengthConverter, *this, true);
|
maxPendingWriteRequests, *this, true);
|
||||||
else
|
else
|
||||||
throw std::runtime_error("Unsupported file extension in " + name);
|
throw std::runtime_error("Unsupported file extension in " + name);
|
||||||
|
|
||||||
|
|||||||
@@ -47,9 +47,8 @@ using namespace tlm;
|
|||||||
TrafficGeneratorIf::TrafficGeneratorIf(const sc_core::sc_module_name& name, const Configuration& config,
|
TrafficGeneratorIf::TrafficGeneratorIf(const sc_core::sc_module_name& name, const Configuration& config,
|
||||||
TraceSetup& setup,
|
TraceSetup& setup,
|
||||||
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
||||||
unsigned int dataLength, bool addLengthConverter)
|
unsigned int dataLength)
|
||||||
: TrafficInitiator(name, config, setup, maxPendingReadRequests, maxPendingWriteRequests, dataLength,
|
: TrafficInitiator(name, config, setup, maxPendingReadRequests, maxPendingWriteRequests, dataLength)
|
||||||
addLengthConverter)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,8 +98,7 @@ TrafficGenerator::TrafficGenerator(const sc_module_name& name, const Configurati
|
|||||||
const DRAMSysConfiguration::TraceGenerator& conf, TraceSetup& setup)
|
const DRAMSysConfiguration::TraceGenerator& conf, TraceSetup& setup)
|
||||||
: TrafficGeneratorIf(name, config, setup, conf.maxPendingReadRequests.value_or(defaultMaxPendingReadRequests),
|
: TrafficGeneratorIf(name, config, setup, conf.maxPendingReadRequests.value_or(defaultMaxPendingReadRequests),
|
||||||
conf.maxPendingWriteRequests.value_or(defaultMaxPendingWriteRequests),
|
conf.maxPendingWriteRequests.value_or(defaultMaxPendingWriteRequests),
|
||||||
conf.dataLength.value_or(config.memSpec->defaultBytesPerBurst),
|
conf.dataLength.value_or(config.memSpec->defaultBytesPerBurst)),
|
||||||
conf.addLengthConverter.value_or(false)),
|
|
||||||
generatorClk(TrafficInitiator::evaluateGeneratorClk(conf)), conf(conf),
|
generatorClk(TrafficInitiator::evaluateGeneratorClk(conf)), conf(conf),
|
||||||
maxTransactions(conf.maxTransactions.value_or(std::numeric_limits<uint64_t>::max())),
|
maxTransactions(conf.maxTransactions.value_or(std::numeric_limits<uint64_t>::max())),
|
||||||
simMemSizeInBytes(config.memSpec->getSimMemSizeInBytes()),
|
simMemSizeInBytes(config.memSpec->getSimMemSizeInBytes()),
|
||||||
@@ -381,7 +379,7 @@ uint64_t TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::TraceG
|
|||||||
|
|
||||||
TrafficGeneratorHammer::TrafficGeneratorHammer(const sc_core::sc_module_name &name, const Configuration& config,
|
TrafficGeneratorHammer::TrafficGeneratorHammer(const sc_core::sc_module_name &name, const Configuration& config,
|
||||||
const DRAMSysConfiguration::TraceHammer &conf, TraceSetup& setup)
|
const DRAMSysConfiguration::TraceHammer &conf, TraceSetup& setup)
|
||||||
: TrafficGeneratorIf(name, config, setup, 1, 1, config.memSpec->defaultBytesPerBurst, false),
|
: TrafficGeneratorIf(name, config, setup, 1, 1, config.memSpec->defaultBytesPerBurst),
|
||||||
generatorClk(evaluateGeneratorClk(conf)), rowIncrement(conf.rowIncrement), numRequests(conf.numRequests)
|
generatorClk(evaluateGeneratorClk(conf)), rowIncrement(conf.rowIncrement), numRequests(conf.numRequests)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class TrafficGeneratorIf : public TrafficInitiator
|
|||||||
public:
|
public:
|
||||||
TrafficGeneratorIf(const sc_core::sc_module_name &name, const Configuration& config, TraceSetup& setup,
|
TrafficGeneratorIf(const sc_core::sc_module_name &name, const Configuration& config, TraceSetup& setup,
|
||||||
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
||||||
unsigned int dataLength, bool addLengthConverter);
|
unsigned int dataLength);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void sendNextPayload() override;
|
void sendNextPayload() override;
|
||||||
|
|||||||
@@ -44,10 +44,8 @@ using namespace sc_core;
|
|||||||
using namespace tlm;
|
using namespace tlm;
|
||||||
|
|
||||||
TrafficInitiator::TrafficInitiator(const sc_module_name &name, const Configuration& config, TraceSetup& setup,
|
TrafficInitiator::TrafficInitiator(const sc_module_name &name, const Configuration& config, TraceSetup& setup,
|
||||||
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests, unsigned int defaultDataLength) :
|
||||||
unsigned int defaultDataLength, bool addLengthConverter) :
|
|
||||||
sc_module(name),
|
sc_module(name),
|
||||||
addLengthConverter(addLengthConverter),
|
|
||||||
payloadEventQueue(this, &TrafficInitiator::peqCallback),
|
payloadEventQueue(this, &TrafficInitiator::peqCallback),
|
||||||
setup(setup),
|
setup(setup),
|
||||||
maxPendingReadRequests(maxPendingReadRequests),
|
maxPendingReadRequests(maxPendingReadRequests),
|
||||||
|
|||||||
@@ -121,21 +121,7 @@ int sc_main(int argc, char **argv)
|
|||||||
|
|
||||||
// Bind STL Players with DRAMSys:
|
// Bind STL Players with DRAMSys:
|
||||||
for (auto& player : players)
|
for (auto& player : players)
|
||||||
{
|
|
||||||
if (player->addLengthConverter)
|
|
||||||
{
|
|
||||||
std::string converterName("Converter_");
|
|
||||||
lengthConverters.emplace_back(std::make_unique<LengthConverter>(converterName.append(player->name()).c_str(),
|
|
||||||
dramSys->getConfig().memSpec->maxBytesPerBurst,
|
|
||||||
dramSys->getConfig().storeMode != Configuration::StoreMode::NoStorage));
|
|
||||||
player->iSocket.bind(lengthConverters.back()->tSocket);
|
|
||||||
lengthConverters.back()->iSocket.bind(dramSys->tSocket);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->iSocket.bind(dramSys->tSocket);
|
player->iSocket.bind(dramSys->tSocket);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store the starting of the simulation in wallclock time:
|
// Store the starting of the simulation in wallclock time:
|
||||||
auto start = std::chrono::high_resolution_clock::now();
|
auto start = std::chrono::high_resolution_clock::now();
|
||||||
|
|||||||
@@ -122,8 +122,7 @@ The JSON code below shows an example configuration:
|
|||||||
"tracesetup": [
|
"tracesetup": [
|
||||||
{
|
{
|
||||||
"clkMhz": 300,
|
"clkMhz": 300,
|
||||||
"name": "ddr3_example.stl",
|
"name": "ddr3_example.stl"
|
||||||
"addLengthConverter": true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"clkMhz": 2000,
|
"clkMhz": 2000,
|
||||||
@@ -160,7 +159,6 @@ Field Descriptions:
|
|||||||
|
|
||||||
Each **trace setup** device configuration can be a **trace player** ("type": "player"), a **traffic generator** ("type": "generator") or a **row hammer generator** ("type": "hammer"). By not specifing the **type** parameter, the device will act as a **trace player**.
|
Each **trace setup** device configuration can be a **trace player** ("type": "player"), a **traffic generator** ("type": "generator") or a **row hammer generator** ("type": "hammer"). By not specifing the **type** parameter, the device will act as a **trace player**.
|
||||||
All device configurations must define a **clkMhz** (operation frequency of the **traffic initiator**) and a **name** (in case of a trace player this specifies the **trace file** to play; in case of a generator this field is only for identification purposes).
|
All device configurations must define a **clkMhz** (operation frequency of the **traffic initiator**) and a **name** (in case of a trace player this specifies the **trace file** to play; in case of a generator this field is only for identification purposes).
|
||||||
The optional parameter **addLengthConverter** adds a transaction length converter between initiator and DRAMSys. This unit divides a large transaction up into several smaller transactions with the maximum length of one DRAM burst access.
|
|
||||||
The **maxPendingReadRequests** and **maxPendingWriteRequests** parameters define the maximum number of outstanding read/write requests. The current implementation delays all memory accesses if one limit is reached. The default value (0) disables the limit.
|
The **maxPendingReadRequests** and **maxPendingWriteRequests** parameters define the maximum number of outstanding read/write requests. The current implementation delays all memory accesses if one limit is reached. The default value (0) disables the limit.
|
||||||
|
|
||||||
A **traffic generator** can be configured to generate **numRequests** requests in total, of which the **rwRatio** field defines the probability of one request being a read request. The length of a request (in bytes) can be specified with the **dataLength** parameter. The **seed** parameter can be used to produce identical results for all simulations. **minAddress** and **maxAddress** specify the address range, by default the whole address range is used. The parameter **addressDistribution** can either be set to **random** or **sequential**. In case of **sequential** the additional **addressIncrement** field must be specified, defining the address increment after each request.
|
A **traffic generator** can be configured to generate **numRequests** requests in total, of which the **rwRatio** field defines the probability of one request being a read request. The length of a request (in bytes) can be specified with the **dataLength** parameter. The **seed** parameter can be used to produce identical results for all simulations. **minAddress** and **maxAddress** specify the address range, by default the whole address range is used. The parameter **addressDistribution** can either be set to **random** or **sequential**. In case of **sequential** the additional **addressIncrement** field must be specified, defining the address increment after each request.
|
||||||
|
|||||||
Reference in New Issue
Block a user