Code cleanup.

This commit is contained in:
Lukas Steiner
2020-04-07 17:49:58 +02:00
parent 36a8982d79
commit 37dcd71c49
17 changed files with 28 additions and 321 deletions

View File

@@ -140,11 +140,9 @@ add_library(DRAMSysLibrary
src/simulation/Arbiter.cpp
src/simulation/DRAMSys.cpp
src/simulation/ExampleInitiator.h
src/simulation/IArbiter.h
src/simulation/MemoryManager.cpp
src/simulation/ReorderBuffer.h
src/simulation/Setup.cpp
src/simulation/SimpleArbiter.h
src/simulation/StlPlayer.h
src/simulation/TemperatureController.cpp
src/simulation/TraceGenerator.h

View File

@@ -41,7 +41,6 @@
#include "TlmRecorder.h"
#include "dramExtensions.h"
#include "XmlAddressDecoder.h"
#include "../configuration/Configuration.h"
#include "../controller/Command.h"

View File

@@ -49,7 +49,6 @@
#include <cerrno>
#include <tlm.h>
#include <systemc.h>
#include "XmlAddressDecoder.h"
#include "DebugManager.h"
#include "utils.h"

View File

@@ -40,7 +40,6 @@
#include "Configuration.h"
#include "ConfigurationLoader.h"
#include "../common/XmlAddressDecoder.h"
std::string Configuration::memspecUri = "";
std::string Configuration::mcconfigUri = "";
@@ -230,28 +229,13 @@ std::uint64_t Configuration::getSimMemSizeInBytes()
// The bus width is given in bits, e.g., 64-bit data bus, 128-bit data bus, etc.
unsigned int Configuration::getDataBusWidth()
{
unsigned int dataBusWidth = memSpec->bitWidth * numberOfDevicesOnDIMM;
assert(dataBusWidth > 0);
return dataBusWidth;
return memSpec->bitWidth * numberOfDevicesOnDIMM;
}
// Returns the number of bytes transfered in a burst
unsigned int Configuration::getBytesPerBurst()
{
// First multiply to get the number of bits in a burst, then divide by 8 to get the value in bytes. The order is important. Think on a single x4 device.
unsigned int bytesPerBurst = (memSpec->burstLength * getDataBusWidth()) / 8;
assert(bytesPerBurst > 0);
if (numberOfDevicesOnDIMM > 1) {
// The least significant bits of the physical address are the byte
// offset of the N-byte-wide memory module (DIMM) (a single data word
// or burst element has N bytes. N = 2^(# bits for byte offset)).
unsigned int burstElementSizeInBytes =
AddressDecoder::getInstance().amount.bytes;
assert(bytesPerBurst == (burstElementSizeInBytes * memSpec->burstLength));
}
return bytesPerBurst;
return (memSpec->burstLength * getDataBusWidth()) / 8;
}
// Changes the number of bytes depeding on the ECC Controller. This function is needed for modules which get data directly or indirectly from the ECC Controller

View File

@@ -8,7 +8,6 @@
#include "ECC/ECC.h"
#include "../common/XmlAddressDecoder.h"
#include "../common/DebugManager.h"
class ECCBaseClass : sc_module

View File

@@ -40,7 +40,7 @@
#include <iostream>
#include <systemc.h>
#include "../configuration/Configuration.h"
#include "../common/XmlAddressDecoder.h"
#include "../common/AddressDecoder.h"
#include "../common/third_party/DRAMPower/src/libdrampower/LibDRAMPower.h"
class errorModel : public sc_module

View File

@@ -46,7 +46,7 @@
#include <tlm_utils/multi_passthrough_target_socket.h>
#include <tlm_utils/multi_passthrough_initiator_socket.h>
#include <tlm_utils/peq_with_cb_and_phase.h>
#include "../common/XmlAddressDecoder.h"
#include "../common/AddressDecoder.h"
#include "../common/dramExtensions.h"
#include "../configuration/ConfigurationLoader.h"

View File

@@ -44,6 +44,7 @@
#include "DRAMSys.h"
#include "Setup.h"
#include "../common/third_party/tinyxml2/tinyxml2.h"
#include "../common/TlmRecorder.h"
#include "../common/DebugManager.h"
#include "../common/XmlAddressDecoder.h"
@@ -81,7 +82,6 @@ DRAMSys::DRAMSys(sc_module_name name,
std::string simconfig;
std::string thermalconfig;
// TODO: Setup never used?
Setup setup(simulationToRun,
memspec,
mcconfig,
@@ -163,8 +163,8 @@ DRAMSys::DRAMSys(sc_module_name name,
void DRAMSys::logo()
{
#define REDTXT(s) std::string("\033[0;31m"+std::string(s)+"\033[0m")
#define BOLDBLUETXT(s) std::string("\033[1;34m"+std::string(s)+"\033[0m")
#define REDTXT(s) std::string("\033[0;31m" + std::string(s) + "\033[0m")
#define BOLDBLUETXT(s) std::string("\033[1;34m" + std::string(s) + "\033[0m")
std::cout << std::endl;
std::cout << REDTXT(" |||") << std::endl;
std::cout << REDTXT(" +---+ Microelectronic Systems") << std::endl;
@@ -172,7 +172,7 @@ void DRAMSys::logo()
std::cout << REDTXT("=| |= ") << BOLDBLUETXT("University of Kaiserslautern")
<< std::endl;
std::cout << REDTXT(" +---+ ") << std::endl;
std::cout << REDTXT(" ||| ") << "DRAMSys v4.0" << std::endl;
std::cout << REDTXT(" ||| ") << "DRAMSys4.0" << std::endl;
std::cout << std::endl;
#undef REDTXT
#undef BOLDBLUETXT
@@ -180,7 +180,7 @@ void DRAMSys::logo()
void DRAMSys::setupDebugManager(const std::string &traceName __attribute__((unused)))
{
#ifdef DEBUGGING
#ifndef NDEBUG
auto &dbg = DebugManager::getInstance();
dbg.writeToConsole = false;
dbg.writeToFile = true;

View File

@@ -48,7 +48,6 @@
#include "ReorderBuffer.h"
#include <tlm_utils/multi_passthrough_target_socket.h>
#include <tlm_utils/multi_passthrough_initiator_socket.h>
#include "../common/third_party/tinyxml2/tinyxml2.h"
#include "../common/tlm2_base_protocol_checker.h"
#include "../error/eccbaseclass.h"
#include "../controller/ControllerIF.h"

View File

@@ -1,135 +0,0 @@
/*
* Copyright (c) 2018, University of 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:
* Felipe S. Prado
* Matthias Jung
*/
#ifndef IARBITER_H
#define IARBITER_H
#include <tlm.h>
#include <systemc.h>
#include <iostream>
#include <vector>
#include <queue>
#include <tlm_utils/multi_passthrough_target_socket.h>
#include <tlm_utils/multi_passthrough_initiator_socket.h>
#include "../configuration/ConfigurationLoader.h"
struct IArbiter : public sc_module
{
public:
tlm_utils::multi_passthrough_target_socket<IArbiter> tSocket;
tlm_utils::multi_passthrough_initiator_socket<IArbiter> iSocket;
SC_CTOR(IArbiter)
{
// One or more devices can accesss all the memory units through the arbiter.
// Devices' initiator sockets are bound to arbiter's target sockets.
// As soon the arbiter receives a request in any of its target sockets it should treat and forward it to the proper memory channel.
tSocket.register_nb_transport_fw(this, &IArbiter::nb_transport_fw);
// The arbiter communicates with one or more memory unity through one or more sockets (one or more memory channels).
// Each of the arbiter's initiator sockets is bound to a memory controller's target socket.
// Anytime an transaction comes from a memory unity to the arbiter the "bw" callback is called.
iSocket.register_nb_transport_bw(this, &IArbiter::nb_transport_bw);
tSocket.register_transport_dbg(this, &IArbiter::transport_dbg);
}
virtual void setTlmRecorder(TlmRecorder *recorder) = 0;
virtual bool isOutputBufferFull(unsigned int initiatorSocket) = 0;
virtual void incrementNumberOfOutputBufferTransactions(unsigned int
initiatorSocket) = 0;
protected:
// Initiated by initiator side
// This function is called when an arbiter's target socket receives a transaction from a device
virtual tlm::tlm_sync_enum nb_transport_fw(int id, tlm::tlm_generic_payload &payload,
tlm::tlm_phase &phase, sc_time &fwDelay) = 0;
// Initiated by dram side
// This function is called when an arbiter's initiator socket receives a transaction from a memory controller
virtual tlm::tlm_sync_enum nb_transport_bw(int channelId,
tlm::tlm_generic_payload &payload, tlm::tlm_phase &phase, sc_time &bwDelay) = 0;
virtual unsigned int transport_dbg(int /*id*/,
tlm::tlm_generic_payload &trans) = 0;
void appendDramExtension(int socketId, tlm::tlm_generic_payload &payload)
{
// Append Generation Extension
GenerationExtension *genExtension = new GenerationExtension(clkAlign(
sc_time_stamp(), Configuration::getInstance().ControllerClk));
payload.set_auto_extension(genExtension);
unsigned int burstlength = payload.get_streaming_width();
DecodedAddress decodedAddress = XmlAddressDecoder::getInstance().decodeAddress(
payload.get_address());
// Check the valid range of decodedAddress
if (addressIsValid(decodedAddress)) {
DramExtension *extension = new DramExtension(Thread(socketId + 1),
Channel(decodedAddress.channel), Bank(decodedAddress.bank),
BankGroup(decodedAddress.bankgroup), Row(decodedAddress.row),
Column(decodedAddress.column), burstlength, 0);
payload.set_auto_extension(extension);
} else {
SC_REPORT_FATAL("Arbiter", "Decoded Address are not inside the valid range");
}
}
bool addressIsValid(DecodedAddress &decodedAddress)
{
if (decodedAddress.channel >=
XmlAddressDecoder::getInstance().amount.channel) {
return false;
}
if (decodedAddress.bank >= XmlAddressDecoder::getInstance().amount.bank) {
return false;
}
// if (decodedAddress.bankgroup >
// XmlAddressDecoder::getInstance().amount["bankgroup"]) {
// return false;
// }
if (decodedAddress.column >=
XmlAddressDecoder::getInstance().amount.column) {
return false;
}
if (decodedAddress.row >= XmlAddressDecoder::getInstance().amount.row) {
return false;
}
return true;
}
};
#endif // IARBITER_H

View File

@@ -39,11 +39,14 @@
#include "../configuration/Configuration.h"
#include <iostream>
MemoryManager::MemoryManager(): numberOfAllocations(0), numberOfFrees(0) {}
using namespace tlm;
MemoryManager::MemoryManager()
: numberOfAllocations(0), numberOfFrees(0) {}
MemoryManager::~MemoryManager()
{
for (gp *payload : freePayloads) {
for (tlm_generic_payload *payload : freePayloads) {
delete[] payload->get_data_ptr();
delete payload;
numberOfFrees++;
@@ -54,11 +57,11 @@ MemoryManager::~MemoryManager()
//PRINTDEBUGMESSAGE("MemoryManager","Number of freed payloads: " + to_string(numberOfFrees));
}
gp *MemoryManager::allocate()
tlm_generic_payload *MemoryManager::allocate()
{
if (freePayloads.empty()) {
numberOfAllocations++;
gp *payload = new gp(this);
tlm_generic_payload *payload = new tlm_generic_payload(this);
// Allocate a data buffer and initialize it with zeroes:
unsigned int dataLength = Configuration::getInstance().getBytesPerBurst();
@@ -68,13 +71,13 @@ gp *MemoryManager::allocate()
payload->set_data_ptr(data);
return payload;
} else {
gp *result = freePayloads.back();
tlm_generic_payload *result = freePayloads.back();
freePayloads.pop_back();
return result;
}
}
void MemoryManager::free(gp *payload)
void MemoryManager::free(tlm_generic_payload *payload)
{
payload->reset(); // clears all extensions
freePayloads.push_back(payload);

View File

@@ -39,20 +39,19 @@
#include <tlm.h>
#include <vector>
typedef tlm::tlm_generic_payload gp;
class MemoryManager : public tlm::tlm_mm_interface
{
public:
MemoryManager();
virtual ~MemoryManager();
virtual gp *allocate();
virtual void free(gp *payload);
virtual tlm::tlm_generic_payload *allocate();
virtual void free(tlm::tlm_generic_payload *payload);
private:
unsigned int numberOfAllocations;
unsigned int numberOfFrees;
std::vector<gp *> freePayloads;
std::vector<tlm::tlm_generic_payload *> freePayloads;
};
#endif // MEMORYMANAGER_H

View File

@@ -1,137 +0,0 @@
/*
* Copyright (c) 2018, University of 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:
* Felipe S. Prado
* Matthias Jung
*/
#ifndef SIMPLEARBITER_H
#define SIMPLEARBITER_H
#include "IArbiter.h"
#include "../common/XmlAddressDecoder.h"
#include "../common/dramExtensions.h"
// Annotated References [X,Y] --> Please refer to TLM AT Cheat Sheet on README
struct SimpleArbiter: public IArbiter {
public:
SimpleArbiter(sc_module_name name) : IArbiter(name)
{
}
void setTlmRecorder(TlmRecorder *recorder)
{
tlmRecorder = recorder;
}
virtual bool isOutputBufferFull(unsigned int /*initiatorSocket*/)
{
return false;
}
virtual void incrementNumberOfOutputBufferTransactions(unsigned
int /*initiatorSocket*/)
{
}
protected:
TlmRecorder *tlmRecorder;
// Initiated by initiator side
// This function is called when an arbiter's target socket receives a transaction from a device
virtual tlm::tlm_sync_enum nb_transport_fw(int id, tlm::tlm_generic_payload &payload,
tlm::tlm_phase &phase, sc_time &fwDelay)
{
if (phase == BEGIN_REQ) {
payload.acquire();
// adjust address offset, e.g. for gem5 simulation
payload.set_address(payload.get_address() -
Configuration::getInstance().AddressOffset);
// In the begin request phase the socket ID is appended to the payload.
// It will extracted from the payload and used later.
appendDramExtension(id, payload);
tlmRecorder->recordArbiterPhase(payload, phase, sc_time_stamp() + fwDelay);
tlmRecorder->recordArbiterPhase(payload, END_REQ, sc_time_stamp() + fwDelay);
tlmRecorder->recordPhase(payload, phase, sc_time_stamp() + fwDelay);
// Forward Path [1.0]
iSocket[getISocketIndex(payload)]->nb_transport_fw(payload, phase, fwDelay);
} else if (phase == END_RESP) {
payload.release();
tlmRecorder->recordArbiterPhase(payload, phase, sc_time_stamp() + fwDelay);
} else {
SC_REPORT_FATAL("Arbiter", "Illegal phase received by initiator");
}
// 4-Phase Handshake [1.1]
// 4-Phase Handshake [1.7]
return tlm::TLM_ACCEPTED;
}
// Initiated by dram side
// This function is called when an arbiter's initiator socket receives a transaction from a memory controller
virtual tlm::tlm_sync_enum nb_transport_bw(int /*channelId*/,
tlm::tlm_generic_payload &payload, tlm::tlm_phase &phase, sc_time &bwDelay)
{
tlmRecorder->recordPhase(payload, phase, bwDelay + sc_time_stamp());
tSocket[DramExtension::getThread(payload).ID()]->nb_transport_bw(payload,
TPhase, bwDelay);
if (phase == BEGIN_RESP) {
// Early Completion [3.1]
tlmRecorder->recordPhase(payload, END_RESP, bwDelay + sc_time_stamp());
tlmRecorder->recordArbiterPhase(payload, BEGIN_RESP, sc_time_stamp() + bwDelay);
return tlm::TLM_COMPLETED;
}
// 4-Phase Handshake [1.3]
return tlm::TLM_ACCEPTED;
}
virtual unsigned int transport_dbg(int /*id*/, tlm::tlm_generic_payload &trans)
{
// adjust address offset:
trans.set_address(trans.get_address() -
Configuration::getInstance().AddressOffset);
return iSocket[getISocketIndex(trans)]->transport_dbg(trans);
}
virtual unsigned int getISocketIndex(tlm::tlm_generic_payload &payload)
{
return DramExtension::getBank(payload).ID();
}
};
#endif // SIMPLEARBITER_H

View File

@@ -40,7 +40,7 @@
#ifndef STLPLAYER_H
#define STLPLAYER_H
#include "../common/XmlAddressDecoder.h"
#include <sstream>
#include "TracePlayer.h"
template<bool relative>
@@ -83,7 +83,7 @@ public:
numberOfTransactions++;
}
// Allocate a generic payload for this request.
gp *payload = this->allocatePayload();
tlm::tlm_generic_payload *payload = this->allocatePayload();
payload->acquire();
unsigned char *data = payload->get_data_ptr();
@@ -126,8 +126,8 @@ public:
iss >> address;
if (address.empty())
SC_REPORT_FATAL("StlPlayer",
("Malformed trace file. Address could not be found (line " + std::to_string(
lineCnt) + ").").c_str());
("Malformed trace file. Address could not be found (line "
+ std::to_string(lineCnt) + ").").c_str());
unsigned long long addr = std::stoull(address.c_str(), 0, 16);
// Get the data if necessary.

View File

@@ -60,7 +60,7 @@ public:
this->terminate();
}
gp *payload = this->allocatePayload();
tlm::tlm_generic_payload *payload = this->allocatePayload();
payload->acquire();
unsigned char *dataElement = new unsigned
char[16]; // TODO: column / burst breite

View File

@@ -53,7 +53,7 @@ TracePlayer::TracePlayer(sc_module_name name, TracePlayerListener *listener) :
storageEnabled = true;
}
gp *TracePlayer::allocatePayload()
tlm_generic_payload *TracePlayer::allocatePayload()
{
return memoryManager.allocate();
}

View File

@@ -49,7 +49,6 @@
#include "MemoryManager.h"
#include "../configuration/Configuration.h"
#include "../common/DebugManager.h"
#include "../common/XmlAddressDecoder.h"
#include "TracePlayerListener.h"
struct TracePlayer : public sc_module
@@ -61,7 +60,7 @@ public:
unsigned int getNumberOfLines(std::string pathToTrace);
protected:
gp *allocatePayload();
tlm::tlm_generic_payload *allocatePayload();
tlm_utils::peq_with_cb_and_phase<TracePlayer> payloadEventQueue;
void finish();
void terminate();