Add "dataAlignment" field for random traffic generators
This commit is contained in:
@@ -128,6 +128,7 @@ struct TrafficGenerator
|
|||||||
std::optional<uint64_t> seed;
|
std::optional<uint64_t> seed;
|
||||||
std::optional<uint64_t> maxTransactions;
|
std::optional<uint64_t> maxTransactions;
|
||||||
std::optional<unsigned> dataLength;
|
std::optional<unsigned> dataLength;
|
||||||
|
std::optional<unsigned> dataAlignment;
|
||||||
|
|
||||||
uint64_t numRequests;
|
uint64_t numRequests;
|
||||||
double rwRatio;
|
double rwRatio;
|
||||||
@@ -145,6 +146,7 @@ NLOHMANN_JSONIFY_ALL_THINGS(TrafficGenerator,
|
|||||||
seed,
|
seed,
|
||||||
maxTransactions,
|
maxTransactions,
|
||||||
dataLength,
|
dataLength,
|
||||||
|
dataAlignment,
|
||||||
numRequests,
|
numRequests,
|
||||||
rwRatio,
|
rwRatio,
|
||||||
addressDistribution,
|
addressDistribution,
|
||||||
@@ -162,6 +164,7 @@ struct TrafficGeneratorStateMachine
|
|||||||
std::optional<uint64_t> seed;
|
std::optional<uint64_t> seed;
|
||||||
std::optional<uint64_t> maxTransactions;
|
std::optional<uint64_t> maxTransactions;
|
||||||
std::optional<unsigned> dataLength;
|
std::optional<unsigned> dataLength;
|
||||||
|
std::optional<unsigned> dataAlignment;
|
||||||
std::vector<std::variant<TrafficGeneratorActiveState, TrafficGeneratorIdleState>> states;
|
std::vector<std::variant<TrafficGeneratorActiveState, TrafficGeneratorIdleState>> states;
|
||||||
std::vector<TrafficGeneratorStateTransition> transitions;
|
std::vector<TrafficGeneratorStateTransition> transitions;
|
||||||
};
|
};
|
||||||
@@ -174,6 +177,7 @@ NLOHMANN_JSONIFY_ALL_THINGS(TrafficGeneratorStateMachine,
|
|||||||
seed,
|
seed,
|
||||||
maxTransactions,
|
maxTransactions,
|
||||||
dataLength,
|
dataLength,
|
||||||
|
dataAlignment,
|
||||||
states,
|
states,
|
||||||
transitions)
|
transitions)
|
||||||
|
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ int sc_main(int argc, char **argv)
|
|||||||
for (auto const &initiator_config : configuration.tracesetup.value())
|
for (auto const &initiator_config : configuration.tracesetup.value())
|
||||||
{
|
{
|
||||||
uint64_t memorySize = dramSys->getConfig().memSpec->getSimMemSizeInBytes();
|
uint64_t memorySize = dramSys->getConfig().memSpec->getSimMemSizeInBytes();
|
||||||
unsigned int dataLength = dramSys->getConfig().memSpec->defaultBytesPerBurst;
|
unsigned int defaultDataLength = dramSys->getConfig().memSpec->defaultBytesPerBurst;
|
||||||
|
|
||||||
auto initiator = std::visit(
|
auto initiator = std::visit(
|
||||||
[=, &memoryManager](auto &&config) -> std::unique_ptr<Initiator>
|
[=, &memoryManager](auto &&config) -> std::unique_ptr<Initiator>
|
||||||
@@ -120,7 +120,7 @@ int sc_main(int argc, char **argv)
|
|||||||
return std::make_unique<TrafficGenerator>(config,
|
return std::make_unique<TrafficGenerator>(config,
|
||||||
memoryManager,
|
memoryManager,
|
||||||
memorySize,
|
memorySize,
|
||||||
dataLength,
|
defaultDataLength,
|
||||||
transactionFinished,
|
transactionFinished,
|
||||||
termianteInitiator);
|
termianteInitiator);
|
||||||
}
|
}
|
||||||
@@ -143,7 +143,7 @@ int sc_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
StlPlayer player(
|
StlPlayer player(
|
||||||
tracePath.c_str(), config.clkMhz, dataLength, traceType, false);
|
tracePath.c_str(), config.clkMhz, defaultDataLength, traceType, false);
|
||||||
|
|
||||||
return std::make_unique<SimpleInitiator<StlPlayer>>(config.name.c_str(),
|
return std::make_unique<SimpleInitiator<StlPlayer>>(config.name.c_str(),
|
||||||
memoryManager,
|
memoryManager,
|
||||||
@@ -156,7 +156,7 @@ int sc_main(int argc, char **argv)
|
|||||||
else if constexpr (std::is_same_v<T, DRAMSys::Config::RowHammer>)
|
else if constexpr (std::is_same_v<T, DRAMSys::Config::RowHammer>)
|
||||||
{
|
{
|
||||||
RowHammer hammer(
|
RowHammer hammer(
|
||||||
config.numRequests, config.clkMhz, config.rowIncrement, dataLength);
|
config.numRequests, config.clkMhz, config.rowIncrement, defaultDataLength);
|
||||||
|
|
||||||
return std::make_unique<SimpleInitiator<RowHammer>>(config.name.c_str(),
|
return std::make_unique<SimpleInitiator<RowHammer>>(config.name.c_str(),
|
||||||
memoryManager,
|
memoryManager,
|
||||||
|
|||||||
@@ -43,15 +43,17 @@ RandomProducer::RandomProducer(uint64_t numRequests,
|
|||||||
std::optional<uint64_t> minAddress,
|
std::optional<uint64_t> minAddress,
|
||||||
std::optional<uint64_t> maxAddress,
|
std::optional<uint64_t> maxAddress,
|
||||||
uint64_t memorySize,
|
uint64_t memorySize,
|
||||||
unsigned int dataLength)
|
unsigned int dataLength,
|
||||||
|
unsigned int dataAlignment)
|
||||||
: numberOfRequests(numRequests),
|
: numberOfRequests(numRequests),
|
||||||
seed(seed.value_or(DEFAULT_SEED)),
|
seed(seed.value_or(DEFAULT_SEED)),
|
||||||
rwRatio(rwRatio),
|
rwRatio(rwRatio),
|
||||||
randomGenerator(this->seed),
|
randomGenerator(this->seed),
|
||||||
generatorPeriod(sc_core::sc_time(1.0 / static_cast<double>(clkMhz), sc_core::SC_US)),
|
generatorPeriod(sc_core::sc_time(1.0 / static_cast<double>(clkMhz), sc_core::SC_US)),
|
||||||
dataLength(dataLength),
|
dataLength(dataLength),
|
||||||
|
dataAlignment(dataAlignment),
|
||||||
randomAddressDistribution(minAddress.value_or(DEFAULT_MIN_ADDRESS),
|
randomAddressDistribution(minAddress.value_or(DEFAULT_MIN_ADDRESS),
|
||||||
maxAddress.value_or((memorySize / dataLength) - 1))
|
maxAddress.value_or((memorySize) - dataLength))
|
||||||
{
|
{
|
||||||
if (minAddress > memorySize - 1)
|
if (minAddress > memorySize - 1)
|
||||||
SC_REPORT_FATAL("TrafficGenerator", "minAddress is out of range.");
|
SC_REPORT_FATAL("TrafficGenerator", "minAddress is out of range.");
|
||||||
@@ -69,7 +71,11 @@ RandomProducer::RandomProducer(uint64_t numRequests,
|
|||||||
Request RandomProducer::nextRequest()
|
Request RandomProducer::nextRequest()
|
||||||
{
|
{
|
||||||
Request request;
|
Request request;
|
||||||
request.address = randomAddressDistribution(randomGenerator) * dataLength;
|
request.address = randomAddressDistribution(randomGenerator);
|
||||||
|
|
||||||
|
// Align address
|
||||||
|
request.address = request.address - (request.address % dataAlignment);
|
||||||
|
|
||||||
request.command = readWriteDistribution(randomGenerator) < rwRatio ? Request::Command::Read
|
request.command = readWriteDistribution(randomGenerator) < rwRatio ? Request::Command::Read
|
||||||
: Request::Command::Write;
|
: Request::Command::Write;
|
||||||
request.length = dataLength;
|
request.length = dataLength;
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ public:
|
|||||||
std::optional<uint64_t> minAddress,
|
std::optional<uint64_t> minAddress,
|
||||||
std::optional<uint64_t> maxAddress,
|
std::optional<uint64_t> maxAddress,
|
||||||
uint64_t memorySize,
|
uint64_t memorySize,
|
||||||
unsigned int dataLength);
|
unsigned int dataLength,
|
||||||
|
unsigned int dataAlignment);
|
||||||
|
|
||||||
Request nextRequest() override;
|
Request nextRequest() override;
|
||||||
|
|
||||||
@@ -62,6 +63,7 @@ public:
|
|||||||
const double rwRatio;
|
const double rwRatio;
|
||||||
const sc_core::sc_time generatorPeriod;
|
const sc_core::sc_time generatorPeriod;
|
||||||
const unsigned int dataLength;
|
const unsigned int dataLength;
|
||||||
|
const unsigned int dataAlignment;
|
||||||
|
|
||||||
std::default_random_engine randomGenerator;
|
std::default_random_engine randomGenerator;
|
||||||
std::uniform_real_distribution<double> readWriteDistribution{0.0, 1.0};
|
std::uniform_real_distribution<double> readWriteDistribution{0.0, 1.0};
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const &config,
|
TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const &config,
|
||||||
MemoryManager &memoryManager,
|
MemoryManager &memoryManager,
|
||||||
uint64_t memorySize,
|
uint64_t memorySize,
|
||||||
unsigned int dataLength,
|
unsigned int defaultDataLength,
|
||||||
std::function<void()> transactionFinished,
|
std::function<void()> transactionFinished,
|
||||||
std::function<void()> terminateInitiator)
|
std::function<void()> terminateInitiator)
|
||||||
: consumer(
|
: consumer(
|
||||||
@@ -51,6 +51,9 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine
|
|||||||
std::move(terminateInitiator)),
|
std::move(terminateInitiator)),
|
||||||
stateTransistions(config.transitions)
|
stateTransistions(config.transitions)
|
||||||
{
|
{
|
||||||
|
unsigned int dataLength = config.dataLength.value_or(defaultDataLength);
|
||||||
|
unsigned int dataAlignment = config.dataAlignment.value_or(dataLength);
|
||||||
|
|
||||||
for (auto const &state : config.states)
|
for (auto const &state : config.states)
|
||||||
{
|
{
|
||||||
std::visit(
|
std::visit(
|
||||||
@@ -72,7 +75,8 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine
|
|||||||
activeState.minAddress,
|
activeState.minAddress,
|
||||||
activeState.maxAddress,
|
activeState.maxAddress,
|
||||||
memorySize,
|
memorySize,
|
||||||
dataLength);
|
dataLength,
|
||||||
|
dataAlignment);
|
||||||
|
|
||||||
producers.emplace(activeState.id, std::move(producer));
|
producers.emplace(activeState.id, std::move(producer));
|
||||||
}
|
}
|
||||||
@@ -105,7 +109,7 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine
|
|||||||
TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const &config,
|
TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const &config,
|
||||||
MemoryManager &memoryManager,
|
MemoryManager &memoryManager,
|
||||||
uint64_t memorySize,
|
uint64_t memorySize,
|
||||||
unsigned int dataLength,
|
unsigned int defaultDataLength,
|
||||||
std::function<void()> transactionFinished,
|
std::function<void()> transactionFinished,
|
||||||
std::function<void()> terminateInitiator)
|
std::function<void()> terminateInitiator)
|
||||||
: consumer(
|
: consumer(
|
||||||
@@ -117,6 +121,9 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const &conf
|
|||||||
std::move(transactionFinished),
|
std::move(transactionFinished),
|
||||||
std::move(terminateInitiator))
|
std::move(terminateInitiator))
|
||||||
{
|
{
|
||||||
|
unsigned int dataLength = config.dataLength.value_or(defaultDataLength);
|
||||||
|
unsigned int dataAlignment = config.dataAlignment.value_or(dataLength);
|
||||||
|
|
||||||
if (config.addressDistribution == DRAMSys::Config::AddressDistribution::Random)
|
if (config.addressDistribution == DRAMSys::Config::AddressDistribution::Random)
|
||||||
{
|
{
|
||||||
auto producer = std::make_unique<RandomProducer>(config.numRequests,
|
auto producer = std::make_unique<RandomProducer>(config.numRequests,
|
||||||
@@ -126,7 +133,8 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const &conf
|
|||||||
config.minAddress,
|
config.minAddress,
|
||||||
config.maxAddress,
|
config.maxAddress,
|
||||||
memorySize,
|
memorySize,
|
||||||
dataLength);
|
dataLength,
|
||||||
|
dataAlignment);
|
||||||
producers.emplace(0, std::move(producer));
|
producers.emplace(0, std::move(producer));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -49,14 +49,14 @@ public:
|
|||||||
TrafficGenerator(DRAMSys::Config::TrafficGenerator const &config,
|
TrafficGenerator(DRAMSys::Config::TrafficGenerator const &config,
|
||||||
MemoryManager &memoryManager,
|
MemoryManager &memoryManager,
|
||||||
uint64_t memorySize,
|
uint64_t memorySize,
|
||||||
unsigned int dataLength,
|
unsigned int defaultDataLength,
|
||||||
std::function<void()> transactionFinished,
|
std::function<void()> transactionFinished,
|
||||||
std::function<void()> terminateInitiator);
|
std::function<void()> terminateInitiator);
|
||||||
|
|
||||||
TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const &config,
|
TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const &config,
|
||||||
MemoryManager &memoryManager,
|
MemoryManager &memoryManager,
|
||||||
uint64_t memorySize,
|
uint64_t memorySize,
|
||||||
unsigned int dataLength,
|
unsigned int defaultDataLength,
|
||||||
std::function<void()> transactionFinished,
|
std::function<void()> transactionFinished,
|
||||||
std::function<void()> terminateInitiator);
|
std::function<void()> terminateInitiator);
|
||||||
|
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2022, Technische Universität Kaiserslautern
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* 3. Neither the name of the copyright holder nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Lukas Steiner
|
|
||||||
* Derek Christ
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "request/Request.h"
|
|
||||||
#include "request/RequestProducer.h"
|
|
||||||
|
|
||||||
class DbiProducer : public RequestProducer
|
|
||||||
{
|
|
||||||
Request nextRequest() override {}
|
|
||||||
uint64_t totalRequests() override {}
|
|
||||||
sc_core::sc_time clkPeriod() override {}
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user