diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp index e01bb9c2..f00f072a 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp @@ -40,27 +40,42 @@ using namespace tlm; CommandTuple::Type CmdMuxStrict::selectCommand(ReadyCommands &readyCommands) { - for (auto it : readyCommands) + auto result = readyCommands.cend(); + auto it = readyCommands.cbegin(); + uint64_t lastPayloadID = UINT64_MAX; + uint64_t newPayloadID = 0; + + while (it != readyCommands.cend()) { - if (std::get(it) == sc_time_stamp()) + if (std::get(*it) == sc_time_stamp()) { - if (isCasCommand(std::get(it))) + newPayloadID = DramExtension::getPayloadID(std::get(*it)); + if (isCasCommand(std::get(*it))) { - if (DramExtension::getPayloadID(std::get(it)) == nextPayloadID) + if ((newPayloadID < lastPayloadID) && (newPayloadID == nextPayloadID)) { - nextPayloadID++; - return it; + lastPayloadID = newPayloadID; + result = it; + } + } + else // RAS command + { + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + result = it; } } } + it++; } - for (auto it : readyCommands) + + if (lastPayloadID != UINT64_MAX) { - if (std::get(it) == sc_time_stamp()) - { - if (isRasCommand(std::get(it))) - return it; - } + if (isCasCommand(std::get(*result))) + nextPayloadID++; + return *result; } - return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } diff --git a/DRAMSys/pct/SocketCoupler.h b/DRAMSys/pct/SocketCoupler.h new file mode 100644 index 00000000..aebe9c82 --- /dev/null +++ b/DRAMSys/pct/SocketCoupler.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020, 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: + * Lukas Steiner + */ + +#ifndef SOCKETCOUPLER_H +#define SOCKETCOUPLER_H + +#include +#include +#include + +template +class SocketCoupler : public sc_module +{ +public: + SocketCoupler(sc_module_name name) : sc_module(name) + { + for (unsigned i = 0; i < T; i++) + { + tSocket[i].register_nb_transport_fw(this, &SocketCoupler::nb_transport_fw, i); + tSocket[i].register_transport_dbg(this, &SocketCoupler::transport_dbg, i); + } + iSocket.register_nb_transport_bw(this, &SocketCoupler::nb_transport_bw); + } + + tlm_utils::simple_target_socket_tagged tSocket[T]; + tlm_utils::multi_passthrough_initiator_socket iSocket; + +private: + tlm::tlm_sync_enum nb_transport_fw(int id, tlm::tlm_generic_payload &payload, + tlm::tlm_phase &phase, sc_time &delay) + { + return iSocket[id]->nb_transport_fw(payload, phase, delay); + } + + unsigned transport_dbg(int id, tlm::tlm_generic_payload &trans) + { + return iSocket[id]->transport_dbg(trans); + } + + tlm::tlm_sync_enum nb_transport_bw(int id, tlm::tlm_generic_payload &payload, + tlm::tlm_phase &phase, sc_time &delay) + { + return tSocket[id]->nb_transport_bw(payload, phase, delay); + } +}; + +#endif // SOCKETCOUPLER_H diff --git a/DRAMSys/pct/createUltraPlatform.tcl b/DRAMSys/pct/createUltraPlatform.tcl new file mode 100644 index 00000000..4caab46c --- /dev/null +++ b/DRAMSys/pct/createUltraPlatform.tcl @@ -0,0 +1,85 @@ +#!/usr/bin/tclsh +# +# Copyright (c) 2020, 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: +# Matthias Jung +# Lukas Steiner + +# Setup PCT: +::pct::open_library $env(COWAREHOME)/pc/TLM2_PROTOCOLS/ConvergenSC/TLM2_PROTOCOLS.xml +::pct::clear_systemc_defines +::pct::clear_systemc_include_path + +# Import Dummy Module: +::pct::set_import_protocol_generation_flag true +::pct::set_update_existing_encaps_flag true +::pct::set_dynamic_port_arrays_flag true +::pct::set_import_scml_properties_flag true +::pct::load_all_modules "--set-category" "dummy.h" +::paultra::add_hw_instance Project:DRAMSys -inst_name i_DRAMSys +#::paultra::add_hw_instance Project:DRAMSysRecordable -inst_name i_DRAMSys + +# Add DRAMSys Library // ../[glob -type d ../../build*]/simulator/ +::pct::set_simulation_build_project_setting Debug Libraries "sqlite3 DRAMSysLibrary DRAMPower" +::pct::set_simulation_build_project_setting Debug {Library Search Paths} [concat ../../../../../build/library/ ../../../../../build/library/src/common/third_party/DRAMPower] +::pct::set_simulation_build_project_setting Debug {Defined Symbols} SC_INCLUDE_DYNAMIC_PROCESSES=1 +::pct::set_simulation_build_project_setting Debug {Compiler Flags} {-std=c++11} + +# Disable Fast Linking and Caching and Elaboration +::pct::set_simulation_build_project_setting Debug {Cache Objects} false +::pct::set_simulation_build_project_setting Debug {Fast Linking} false +::scsh::build-options -skip-elab on +### TODO: count number of cores: +::pct::set_simulation_build_project_setting Debug {Make Jobs} 16 + +# Configure DDR3 Example: +::pct::set_param_value i_DRAMSys {Constructor Arguments} pathToResources ../../../../library/resources/ +::pct::set_param_value i_DRAMSys {Constructor Arguments} simulationToRun ../../../../library/resources/simulations/ddr3-example.json + +# Build Rest of the Example system: +::paultra::add_hw_instance GFRBM:GFRBM_TLM2 -inst_name i_GFRBM_TLM2 GFRBM_TLM2 GFRBM_TLM2() +::pct::create_connection C i_GFRBM_TLM2/INIT_SOCKET i_DRAMSys/tSocket +::paultra::add_hw_instance GenericIPlib:ClockGenerator -inst_name i_ClockGenerator GIPL_CLK {GIPL_CLK(period, period_unit, duty_cycle, start_time, start_time_unit, posedge_first)} +::pct::create_connection C_1 i_ClockGenerator/CLK i_GFRBM_TLM2/CLK + +# Configure GFRBM: +::pct::set_param_value i_GFRBM_TLM2 {Scml Properties} InputFile ../../../../library/resources/traces/pct.stl +::pct::set_param_value i_GFRBM_TLM2 {Template Arguments} NUM_IN_IRQ 0 +::pct::set_param_value i_GFRBM_TLM2 {Template Arguments} NUM_OUT_IRQ 0 +::pct::set_param_value i_GFRBM_TLM2 {Extra properties} /all_encaps/LogFile foo.log +::pct::set_param_value i_GFRBM_TLM2 {Extra properties} /all_encaps/DebugLevel 6 + +# Design: +::pct::set_background_color_rgb i_DRAMSys 113 200 55 255 + + +