diff --git a/DRAMSys/DRAMSys.pro b/DRAMSys/DRAMSys.pro new file mode 100644 index 00000000..0852d9e4 --- /dev/null +++ b/DRAMSys/DRAMSys.pro @@ -0,0 +1,36 @@ +TEMPLATE = subdirs + +thermalsim = $$(THERMALSIM) +isEmpty(thermalsim) { + thermalsim = false +} + +$$eval(thermalsim) { + message(Thermal Simulation Feature Enabled) +} else { + message(Thermal Simulation Feature Disabled) +} + +SUBDIRS += simulator/library.pro +SUBDIRS += simulator/simulator.pro +SUBDIRS += analyzer/traceAnalyzer.pro + + +# Check if gem5 is installed: +gem5 = $$(GEM5) +isEmpty(gem5) { + message(GEM5 environment variable not found) + message(Gem5 Simulation Disabled) +} else { + message(Gem5 Simulation Feature Enabled) + message(Gem5 home is $${gem5}) + DEFINES += DRAMSYS_GEM5 + SUBDIRS += gem5/gem5.pro +} + +# Build Sub Projects in the order given above +CONFIG += ordered + +# Additional Files: +# tests folder (DRAMSys/tests) +include(tests/tests.pri) diff --git a/DRAMSys/analyzer/scripts/plots.py b/DRAMSys/analyzer/scripts/plots.py index 8b7621a9..dc2153d3 100755 --- a/DRAMSys/analyzer/scripts/plots.py +++ b/DRAMSys/analyzer/scripts/plots.py @@ -31,7 +31,7 @@ def memory_utilisation_window(connection, tracePath, steps): cursor.execute(" SELECT WindowSize FROM GeneralInfo ") windowSize = float(cursor.fetchone()[0]) # All possible cases of data transfers inside a time window - queryFull = """ SELECT sum(DataStrobeEnd - DataStrobeBegin) FROM transactions Where DataStrobeBegin > ? and DataStrobeEnd < ?""" # The data transfer begins and ends inside the time window + queryFull = """ SELECT sum(DataStrobeEnd - DataStrobeBegin) FROM transactions Where DataStrobeBegin >= ? and DataStrobeEnd <= ?""" # The data transfer begins and ends inside the time window queryEnd = """ SELECT sum(DataStrobeEnd - ?) FROM transactions Where DataStrobeBegin < ? and DataStrobeEnd > ? and DataStrobeEnd <=?""" # Only the end of the data transfer is inside the time window queryBegin = """ SELECT sum(? - DataStrobeBegin) FROM transactions Where DataStrobeBegin >= ? and DataStrobeBegin < ? and DataStrobeEnd > ?""" # Only the beginning of the data transfer is inside the time window queryPart = """ SELECT DataStrobeBegin FROM transactions Where DataStrobeBegin <= ? and DataStrobeEnd >= ?""" # The data transfer occupies all the time window @@ -83,6 +83,15 @@ def memory_utilisation_window(connection, tracePath, steps): plt.figure() + # Write data to a file for matlab: + outputFileNameBWMatlab = 'memory_utilization_percent_' + basename + '.txt' + + f = open(outputFileNameBWMatlab, 'w') + for i in range(steps): + line = "{} {}\n".format(time[i], bandwidthPercentage[i]) + f.write(line) + + #Plot Bandwidth in Percent plt.plot(time, bandwidthPercentage) plt.xlabel('Time [ns]') diff --git a/DRAMSys/analyzer/scripts/scripts.pri b/DRAMSys/analyzer/scripts/scripts.pri index 2e78599c..2e99f781 100644 --- a/DRAMSys/analyzer/scripts/scripts.pri +++ b/DRAMSys/analyzer/scripts/scripts.pri @@ -5,4 +5,5 @@ OTHER_FILES += scripts/memUtil.py OTHER_FILES += scripts/metrics.py OTHER_FILES += scripts/tests.py OTHER_FILES += scripts/plots.py +OTHER_FILES += scripts/sonification.pl diff --git a/DRAMSys/analyzer/scripts/sonification.pl b/DRAMSys/analyzer/scripts/sonification.pl new file mode 100644 index 00000000..75f5d615 --- /dev/null +++ b/DRAMSys/analyzer/scripts/sonification.pl @@ -0,0 +1,84 @@ +#!/bin/perl -w +use MIDI; # ...which "use"s MIDI::Track et al +use DBI; +use Data::Dumper; +use warnings; +use strict; + +my $dbfile = shift || die("No File"); +my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","",""); + + +# Get time: +my $sth = $dbh->prepare("SELECT clk FROM GeneralInfo"); +$sth->execute(); +my $result = $sth->fetch; +my $timebase = $result->[0]; + +$sth = $dbh->prepare("SELECT p.PhaseName, p.PhaseBegin, p.PhaseEnd, t.TBank + FROM Phases p, Transactions t + WHERE (p.PhaseName = 'WR' OR p.PhaseName = 'RD') + AND p.Transact = t.ID + ORDER BY PhaseBegin"); +$sth->execute(); + +my @score; + +push(\@score, ['text_event', 0, 'Sonification']); +push(\@score, ['patch_change', 0, 1, 8]); +push(\@score, ['instrument_name', 0, 81]); + +while(my @row = $sth->fetchrow_array) +{ + #print $row[0]."\t".$row[1]."\t".$row[2]."\t".$row[3]."\n"; + # ('note', starttime, duration, channel, note, velocity) + my $note; + if($row[3] == 0) + { + $note = 72; #C + } + elsif($row[3] == 1) + { + $note = 75; #Eb + } + elsif($row[3] == 2) + { + $note = 76; #E + } + elsif($row[3] == 3) + { + $note = 77; #F + } + elsif($row[3] == 4) + { + $note = 78; #Gb + } + elsif($row[3] == 5) + { + $note = 79; #G + } + elsif($row[3] == 6) + { + $note = 82; #Bb + } + elsif($row[3] == 7) + { + $note = 84; #C + } + push(\@score, ['note', $row[1]/$timebase, 1, 1, $note, 96]); +} + +#print Dumper(\@score); + +#MIDI::Score::dump_score( \@score ); + +my $track = MIDI::Track->new; +my @events = @{MIDI::Score::score_r_to_events_r( \@score )}; + +$track->events(@events); +#$track->dump(); + +my $opus = MIDI::Opus->new({ 'format' => 0, 'ticks' => 240, 'tracks' => [ $track ] }); +$opus->write_to_file('cowbell.mid'); + + diff --git a/DRAMSys/analyzer/traceAnalyzer.pro b/DRAMSys/analyzer/traceAnalyzer.pro index f630aab0..8225d3fc 100644 --- a/DRAMSys/analyzer/traceAnalyzer.pro +++ b/DRAMSys/analyzer/traceAnalyzer.pro @@ -11,26 +11,27 @@ CONFIG += no_keywords CONFIG += python + unix:!macx { - QMAKE_CXXFLAGS += -std=c++11 - CONFIG += qwt - QMAKE_CXXFLAGS += -Xlinker -export-dynamic - QMAKE_RPATHDIR += $${libqwt_home} - message(Linker options QMAKE_RPATHDIR is $${QMAKE_RPATHDIR}) + # Python library and header files + python_home = $$(PYTHON_HOME) + isEmpty(python_home) { + python_home = /opt/python/lib + } + message(Python home is $${python_home}) + + python_headers = $$(PYTHON_HEADERS) + isEmpty(python_headers) { + python_headers = /opt/python/include/python3.5m + } + message(Getting python headers from $${python_headers}) + + QMAKE_CXXFLAGS += -std=c++11 + CONFIG += qwt + QMAKE_CXXFLAGS += -Xlinker -export-dynamic + QMAKE_RPATHDIR += $${libqwt_home} + message(Linker options QMAKE_RPATHDIR is $${QMAKE_RPATHDIR}) - # Python library and header files - python_home = $$(PYTHON_HOME) - isEmpty(python_home) { - python_home = /opt/python/lib - } - message(Python home is $${python_home}) - - python_headers = $$(PYTHON_HEADERS) - isEmpty(python_headers) { - python_headers = /opt/python/include/python3.5m - } - message(Getting python headers from $${python_headers}) - CONFIG(python){ LIBS += -L$${python_home} -lpython3.5m INCLUDEPATH += $${python_headers} @@ -38,15 +39,20 @@ unix:!macx { } macx: { - CONFIG += c++11 - QMAKE_CXXFLAGS += -std=c++0x -stdlib=libc++ - QMAKE_LFLAGS += -F$$(LIBQWT_HOME) - LIBS += -F$$(LIBQWT_HOME) -framework qwt - INCLUDEPATH += $$(LIBQWT_HEADERS) - DEPENDPATH += $$replace(LIBQWT_HOME, lib, ) - INCLUDEPATH += $$(PYTHON_HEADERS) - LIBS += -L$$(PYTHON_HOME) -lpython3.6 - CONFIG-=app_bundle + message(Building on a MAC) + + CONFIG += c++11 + QMAKE_CXXFLAGS += -std=c++0x -stdlib=libc++ + + QMAKE_LFLAGS += -F$$(LIBQWT_HOME) + LIBS += -F$$(LIBQWT_HOME) -framework qwt + INCLUDEPATH += $$(LIBQWT_HEADERS) + DEPENDPATH += $$replace(LIBQWT_HOME, lib, ) + + INCLUDEPATH += /usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/Headers/ + LIBS += -L/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/ -lpython3.6 + + CONFIG-=app_bundle } # QWT library and header files @@ -158,6 +164,5 @@ FORMS += \ evaluationtool.ui # Additional Files: -# scripts (DRAMSys/analyzer/scripts) include(scripts/scripts.pri) diff --git a/DRAMSys/analyzer/traceanalyzer.cpp b/DRAMSys/analyzer/traceanalyzer.cpp index bffd186b..55ecbd86 100644 --- a/DRAMSys/analyzer/traceanalyzer.cpp +++ b/DRAMSys/analyzer/traceanalyzer.cpp @@ -93,9 +93,14 @@ TraceAnalyzer::~TraceAnalyzer() void TraceAnalyzer::on_actionOpen_triggered() { - QStringList paths = QFileDialog::getOpenFileNames(this,tr("Open Tracefile"),"",tr("Tracefile(*.tdb)")); + QStringList paths = QFileDialog::getOpenFileNames(this, + tr("Open Tracefile"), + "../simulator/", + tr("Tracefile (*.tdb)")); if(paths.isEmpty()) + { return; + } for(const QString &path: paths) { diff --git a/DRAMSys/dram.vp.system.pro b/DRAMSys/dram.vp.system.pro deleted file mode 100644 index 9fa840ef..00000000 --- a/DRAMSys/dram.vp.system.pro +++ /dev/null @@ -1,20 +0,0 @@ -TEMPLATE = subdirs - -thermalsim = $$(THERMALSIM) -isEmpty(thermalsim) { - thermalsim = false -} - -$$eval(thermalsim) { - message(Thermal Simulation Feature Enabled) -} else { - message(Thermal Simulation Feature Disabled) -} - -SUBDIRS += simulator/simulator.pro -SUBDIRS += analyzer/traceAnalyzer.pro - -# Additional Files: -# tests folder (DRAMSys/tests) -include(tests/tests.pri) - diff --git a/DRAMSys/gem5/gem5.pro b/DRAMSys/gem5/gem5.pro new file mode 100644 index 00000000..cb3dcc2d --- /dev/null +++ b/DRAMSys/gem5/gem5.pro @@ -0,0 +1,75 @@ +TARGET = DRAMSys_gem5 +TEMPLATE = app +CONFIG += console +CONFIG -= app_bundle +CONFIG -= qt + +# gem5 parameters: +gem5_arch = 'ARM' +gem5_variant = 'opt' +gem5_root = $$(GEM5) + +systemc_home = $$(SYSTEMC_HOME) +isEmpty(systemc_home) { + systemc_home = /opt/systemc +} +message(SystemC home is $${systemc_home}) + +systemc_target_arch = $$(SYSTEMC_TARGET_ARCH) +isEmpty(systemc_target_arch) { + systemc_target_arch = linux64 +} + +message(SystemC target architecture is $${systemc_target_arch}) + +unix:!macx { + message(Building on a GNU/Linux) + QMAKE_RPATHDIR += $${systemc_home}/lib-$${systemc_target_arch} + message(Linker options QMAKE_RPATHDIR is $${QMAKE_RPATHDIR}) +} + +DEFINES += TIXML_USE_STL +DEFINES += SC_INCLUDE_DYNAMIC_PROCESSES +DEFINES += DRAMSYS_GEM5 + +unix:!macx { + QMAKE_CXXFLAGS += -std=c++11 -O0 -g +} + +macx: { + CONFIG += c++11 + QMAKE_CXXFLAGS += -std=c++0x -stdlib=libc++ -O0 -g +} + +INCLUDEPATH += ../simulator/src/simulation/ +INCLUDEPATH += $${systemc_home}/include +INCLUDEPATH += ../simulator/src/common/third_party/DRAMPower/src +INCLUDEPATH += ../simulator/src/common/third_party/DRAMPower/src/libdrampower +INCLUDEPATH += $${gem5_root}/build/$${gem5_arch}/ +INCLUDEPATH += $${gem5_root}/util/tlm/examples/slave_port +INCLUDEPATH += $${gem5_root}/util/tlm/examples/common +INCLUDEPATH += $${gem5_root}/util/tlm/ +INCLUDEPATH += $${gem5_root}/util/systemc + +LIBS += -L$${systemc_home}/lib-$${systemc_target_arch} -lsystemc +LIBS += ../simulator/libDRAMSys.a +LIBS += ../../DRAMSys/simulator/src/common/third_party/DRAMPower/src/libdrampower.a +LIBS += -lsqlite3 +LIBS += -L$${gem5_root}/build/$${gem5_arch} -lgem5_$${gem5_variant} + +SOURCES += $${gem5_root}/util/systemc/sc_gem5_control.cc +SOURCES += $${gem5_root}/util/systemc/sc_logger.cc +SOURCES += $${gem5_root}/util/systemc/sc_module.cc +SOURCES += $${gem5_root}/util/systemc/stats.cc +SOURCES += $${gem5_root}/util/tlm/examples/common/cli_parser.cc +SOURCES += $${gem5_root}/util/tlm/examples/common/report_handler.cc +SOURCES += $${gem5_root}/util/tlm/master_transactor.cc +SOURCES += $${gem5_root}/util/tlm/sc_master_port.cc +SOURCES += $${gem5_root}/util/tlm/sc_slave_port.cc +SOURCES += $${gem5_root}/util/tlm/slave_transactor.cc +SOURCES += $${gem5_root}/util/tlm/sc_ext.cc +SOURCES += $${gem5_root}/util/tlm/sc_mm.cc +SOURCES += $${gem5_root}/util/tlm/sim_control.cc + +SOURCES += main.cpp + diff --git a/DRAMSys/gem5/main.cpp b/DRAMSys/gem5/main.cpp new file mode 100644 index 00000000..a7dc0d21 --- /dev/null +++ b/DRAMSys/gem5/main.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2015, University of Kaiserslautern + * Copyright (c) 2016, Dresden University of Technology (TU Dresden) + * 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 + * Christian Menard + * Abdul Mutaal Ahmad + */ + +#include +#include +#include +#include + +#include "DRAMSys.h" +#include "TraceSetup.h" + +#include "report_handler.hh" +#include "sc_target.hh" +#include "sim_control.hh" +#include "slave_transactor.hh" +#include "stats.hh" + +using namespace std; + +class Gem5SimControlDRAMsys: public Gem5SystemC::Gem5SimControl +{ +public: + Gem5SimControlDRAMsys(string configFile) : + Gem5SystemC::Gem5SimControl("gem5",configFile,0,"") + { + } + + void afterSimulate() + { + sc_stop(); + } +}; + +string pathOfFile(string file) +{ + return file.substr(0, file.find_last_of('/')); +} + +int sc_main(int argc, char **argv) +{ + SC_REPORT_INFO("sc_main", "Simulation Setup"); + + string SimulationXML; + string gem5ConfigFile; + string resources; + + if(argc > 1) + { + // Get path of resources: + resources = pathOfFile(argv[0]) + + string("/../../DRAMSys/simulator/resources/"); + + SimulationXML = argv[1]; + gem5ConfigFile = argv[2]; + } + else + { + SC_REPORT_FATAL("sc_main","Please provide configuration files"); + } + + // Instantiate DRAMSys: + DRAMSys dramSys("DRAMSys", SimulationXML, resources); + + // Instantiate gem5: + Gem5SimControlDRAMsys sim_control(gem5ConfigFile); + Gem5SystemC::Gem5SlaveTransactor transactor("transactor", "transactor"); + + transactor.socket.bind(dramSys.tSocket); + transactor.sim_control.bind(sim_control); + + SC_REPORT_INFO("sc_main", "Start of Simulation"); + + sc_core::sc_set_stop_mode(SC_STOP_FINISH_DELTA); + sc_core::sc_start(); + + if (!sc_core::sc_end_of_simulation_invoked()) + { + SC_REPORT_INFO("sc_main","Simulation stopped without explicit sc_stop()"); + sc_core::sc_stop(); + } + + SC_REPORT_INFO("sc_main", "End of Simulation"); + + return EXIT_SUCCESS; +} diff --git a/DRAMSys/pct/buildDRAMSys.sh b/DRAMSys/pct/buildDRAMSys.sh new file mode 100755 index 00000000..7b578cc9 --- /dev/null +++ b/DRAMSys/pct/buildDRAMSys.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +JOBS=$(nproc --all) + +rm -rf lib +mkdir lib +cd lib +DRAMSYS_PCT=true qmake ../../simulator/library.pro +DRAMSYS_PCT=true make -j$JOBS diff --git a/DRAMSys/pct/createPlatform.tcl b/DRAMSys/pct/createPlatform.tcl new file mode 100644 index 00000000..d90015b5 --- /dev/null +++ b/DRAMSys/pct/createPlatform.tcl @@ -0,0 +1,82 @@ +#!/usr/bin/tclsh +# +# Copyright (c) 2017, 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: +# Matthias Jung + +# 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" +::pct::create_instance Project:DRAMSys /HARDWARE i_DRAMSys DRAMSys {DRAMSys(simulationToRun, pathToResources)} + +# Add DRAMSys Library // ../[glob -type d ../../build*]/simulator/ +::pct::set_simulation_build_project_setting Debug Libraries "sqlite3 DRAMSys drampower" +::pct::set_simulation_build_project_setting Debug {Library Search Paths} [concat ../lib/ /usr/lib64/ ../../simulator/src/common/third_party/DRAMPower/src/] +::pct::set_simulation_build_project_setting Debug {Defined Symbols} SC_INCLUDE_DYNAMIC_PROCESSES=1 + +# 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 /HARDWARE/i_DRAMSys {Constructor Arguments} pathToResources ../../simulator/resources/ +::pct::set_param_value /HARDWARE/i_DRAMSys {Constructor Arguments} simulationToRun ../../simulator/resources/simulations/ddr3-example.xml + +# Build Rest of the Example system: +::pct::open_library "GFRBM" +::pct::create_instance GFRBM:GFRBM_TLM2 /HARDWARE i_GFRBM_TLM2 GFRBM_TLM2 GFRBM_TLM2() +::pct::create_connection C /HARDWARE /HARDWARE/i_GFRBM_TLM2/INIT_SOCKET /HARDWARE/i_DRAMSys/tSocket +::pct::open_library "GenericIPlib" +::pct::create_instance GenericIPlib:ClockGenerator /HARDWARE i_ClockGenerator GIPL_CLK {GIPL_CLK(period, period_unit, duty_cycle, start_time, start_time_unit, posedge_first)} +::pct::create_connection C_1 /HARDWARE /HARDWARE/i_ClockGenerator/CLK /HARDWARE/i_GFRBM_TLM2/CLK + +# Configure GFRBM: +::pct::set_param_value /HARDWARE/i_GFRBM_TLM2 {Scml Properties} InputFile ../../simulator/resources/traces/pct.stl +::pct::set_param_value /HARDWARE/i_GFRBM_TLM2 {Template Arguments} NUM_IN_IRQ 0 +::pct::set_param_value /HARDWARE/i_GFRBM_TLM2 {Template Arguments} NUM_OUT_IRQ 0 +::pct::set_param_value /HARDWARE/i_GFRBM_TLM2 {Extra properties} /all_encaps/LogFile foo.log +::pct::set_param_value /HARDWARE/i_GFRBM_TLM2 {Extra properties} /all_encaps/DebugLevel 6 + +# Design: +::pct::set_background_color_rgb /HARDWARE/i_DRAMSys 113 200 55 255 + diff --git a/DRAMSys/pct/dummy.h b/DRAMSys/pct/dummy.h new file mode 100644 index 00000000..cd199d30 --- /dev/null +++ b/DRAMSys/pct/dummy.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017, 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: + * Matthias Jung + */ + +#ifndef DRAMSYS_H_ +#define DRAMSYS_H_ + +#include +#include +#include + +#include + + +/** + * This is just a dummy module. Platform Architect is not able to parse the + * real module... + */ + +class DRAMSys: public sc_module +{ +public: + tlm_utils::multi_passthrough_target_socket tSocket; + + sc_event terminateSimulation; + + SC_HAS_PROCESS(DRAMSys); + DRAMSys(sc_module_name name, + string simulationToRun, + string pathToResources); +}; + +#endif /* SIMULATIONMANAGER_H_ */ + diff --git a/DRAMSys/simulator/library.pro b/DRAMSys/simulator/library.pro new file mode 100644 index 00000000..5e9f63a4 --- /dev/null +++ b/DRAMSys/simulator/library.pro @@ -0,0 +1,219 @@ +TARGET = DRAMSys + +TEMPLATE = lib +CONFIG += staticlib +CONFIG += console +CONFIG -= app_bundle +CONFIG -= qt + +system(cd ../../DRAMSys/simulator/src/common/third_party/DRAMPower; make src/libdrampower.a;) + +systemc_home = $$(SYSTEMC_HOME) +isEmpty(systemc_home) { + systemc_home = /opt/systemc +} + +# Check if PCT's SystemC should be used? +dramsys_pct = $$(DRAMSYS_PCT) +isEmpty(dramsys_pct) { + dramsys_pct = false +} + +$$eval(dramsys_pct) { + # PCT: + message(PCT Simulation Feature Enabled) + systemc_home = /software/Synopsys_CoWare/K-2015.12-SP1/SLS/linux/common + INCLUDEPATH += $${systemc_home}/include/tlm + + DEFINES += DRAMSYS_PCT +} + +# Check if gem5 should be used +gem5 = $$(GEM5) +isEmpty(gem5) { + message(GEM5 environment variable not found) + message(Gem5 Simulation Disabled) +} else { + message(Gem5 Simulation Feature Enabled) + message(Gem5 home is $${gem5}) + DEFINES += DRAMSYS_GEM5 +} + +message(SystemC home is $${systemc_home}) + +systemc_target_arch = $$(SYSTEMC_TARGET_ARCH) +isEmpty(systemc_target_arch) { + systemc_target_arch = linux64 +} +message(SystemC target architecture is $${systemc_target_arch}) + +INCLUDEPATH += $${systemc_home}/include + +INCLUDEPATH += src/common/third_party/DRAMPower/src +INCLUDEPATH += src/common/third_party/DRAMPower/src/libdrampower + +DEFINES += TIXML_USE_STL +DEFINES += SC_INCLUDE_DYNAMIC_PROCESSES + +unix:!macx { + QMAKE_CXXFLAGS += -std=c++11 -O0 -g +} + +macx: { + CONFIG += c++11 + QMAKE_CXXFLAGS += -std=c++0x -stdlib=libc++ -O0 -g +} + +QMAKE_CXXFLAGS += -isystem $${systemc_home}/include + +SOURCES += \ + src/common/third_party/tinyxml2/tinyxml2.cpp \ + src/common/xmlAddressdecoder.cpp \ + src/common/Utils.cpp \ + src/common/TlmRecorder.cpp \ + src/common/dramExtension.cpp \ + src/common/DebugManager.cpp \ + src/controller/core/configuration/Configuration.cpp \ + src/controller/core/powerdown/PowerDownManagerTimeout.cpp \ + src/controller/core/powerdown/PowerDownManagerBankwise.cpp \ + src/controller/core/powerdown/PowerDownManager.cpp \ + src/controller/scheduler/ThreadLoad.cpp \ + src/controller/scheduler/PARBS.cpp \ + src/controller/scheduler/Fr_Fcfs.cpp \ + src/controller/scheduler/Fifo.cpp \ + src/controller/core/refresh/RefreshManagerBankwise.cpp \ + src/controller/core/refresh/RefreshManager.cpp \ + src/controller/core/scheduling/checker/WriteChecker.cpp \ + src/controller/core/scheduling/checker/RefreshChecker.cpp \ + src/controller/core/scheduling/checker/ReadChecker.cpp \ + src/controller/core/scheduling/checker/PrechargeChecker.cpp \ + src/controller/core/scheduling/checker/PrechargeAllChecker.cpp \ + src/controller/core/scheduling/checker/PowerDownChecker.cpp \ + src/controller/core/scheduling/checker/ActivateChecker.cpp \ + src/controller/core/scheduling/ScheduledCommand.cpp \ + src/controller/core/TimingCalculation.cpp \ + src/controller/core/Slots.cpp \ + src/controller/core/ControllerCore.cpp \ + src/simulation/MemoryManager.cpp \ + src/simulation/TemperatureController.cpp \ + src/controller/scheduler/readwritegrouper.cpp \ + src/controller/core/configuration/ConfigurationLoader.cpp \ + src/controller/core/powerdown/NoPowerDown.cpp \ + src/controller/Command.cpp \ + src/controller/ControllerState.cpp \ + src/controller/RowBufferStates.cpp \ + src/controller/scheduler/IScheduler.cpp \ + src/controller/scheduler/FifoStrict.cpp \ + src/error/errormodel.cpp \ + src/controller/Controller.cpp \ + src/simulation/TracePlayer.cpp \ + src/simulation/StlPlayer.cpp \ + src/controller/core/powerdown/PowerDownManagerTimeoutBankwise.cpp \ + src/simulation/TraceSetup.cpp \ + src/simulation/DRAMSys.cpp \ + src/simulation/Setup.cpp + +HEADERS += \ + src/common/third_party/tinyxml2/tinyxml2.h \ + src/common/xmlAddressdecoder.h \ + src/common/Utils.h \ + src/common/TlmRecorder.h \ + src/common/tlm2_base_protocol_checker.h \ + src/common/protocol.h \ + src/common/dramExtension.h \ + src/common/DebugManager.h \ + src/controller/core/configuration/Configuration.h \ + src/controller/core/powerdown/PowerDownManagerTimeout.h \ + src/controller/core/powerdown/PowerDownManagerBankwise.h \ + src/controller/core/powerdown/PowerDownManager.h \ + src/controller/scheduler/ThreadLoad.h \ + src/controller/scheduler/PARBS.h \ + src/controller/scheduler/Fr_Fcfs.h \ + src/controller/scheduler/Fifo.h \ + src/controller/Controller.h \ + src/controller/core/refresh/RefreshManagerBankwise.h \ + src/controller/core/refresh/RefreshManager.h \ + src/controller/core/refresh/IRefreshManager.h \ + src/controller/core/scheduling/checker/WriteChecker.h \ + src/controller/core/scheduling/checker/RefreshChecker.h \ + src/controller/core/scheduling/checker/ReadChecker.h \ + src/controller/core/scheduling/checker/PrechargeChecker.h \ + src/controller/core/scheduling/checker/PrechargeAllChecker.h \ + src/controller/core/scheduling/checker/PowerDownChecker.h \ + src/controller/core/scheduling/checker/ICommandChecker.h \ + src/controller/core/scheduling/checker/ActivateChecker.h \ + src/controller/core/scheduling/Trigger.h \ + src/controller/core/scheduling/ScheduledCommand.h \ + src/controller/core/TimingCalculation.h \ + src/controller/core/Slots.h \ + src/controller/core/ControllerCore.h \ + src/simulation/TracePlayer.h \ + src/simulation/MemoryManager.h \ + src/simulation/Dram.h \ + src/simulation/Arbiter.h \ + src/common/libDRAMPower.h \ + src/controller/scheduler/readwritegrouper.h \ + src/simulation/ReorderBuffer.h \ + src/controller/core/configuration/MemSpec.h \ + src/controller/core/configuration/thermalSimConfig.h \ + src/simulation/StlPlayer.h \ + src/simulation/TracePlayerListener.h \ + src/simulation/TraceGenerator.h \ + src/simulation/TemperatureController.h \ + src/controller/core/powerdown/NoPowerDown.h \ + src/controller/Command.h \ + src/controller/RowBufferStates.h \ + src/controller/ControllerState.h \ + src/controller/core/powerdown/IPowerDownManager.h \ + src/controller/scheduler/IScheduler.h \ + src/controller/scheduler/FifoStrict.h \ + src/controller/IController.h \ + src/controller/core/configuration/ConfigurationLoader.h \ + src/error/errormodel.h \ + src/simulation/ExampleInitiator.h \ + src/controller/core/powerdown/PowerDownManagerTimeoutBankwise.h \ + src/simulation/TraceSetup.h \ + src/simulation/DRAMSys.h \ + src/simulation/Setup.h + +thermalsim = $$(THERMALSIM) +isEmpty(thermalsim) { + thermalsim = false +} + +$$eval(thermalsim) { + message(Thermal Simulation Feature Enabled) + + libthreed_ice_home = $$(LIBTHREED_ICE_HOME) + isEmpty(libthreed_ice_home) { + libthreed_ice_home = /opt/3D-ICE/ + } + message(LIBTHREED_ICE_HOME path is $${libthreed_ice_home}) + + libsuperlu_home = $$(LIBSUPERLU_HOME) + isEmpty(libsuperlu_home) { + libsuperlu_home = /opt/SuperLU_4.3/ + } + message(LIBSUPERLU_HOME path is $${libthreed_ice_home}) + + LIBS += -L$${libthreed_ice_home}/lib -lthreed-ice-2.2.4 + LIBS += -L$${libsuperlu_home}/lib -lsuperlu_4.3 + LIBS += -lblas + message(Libraries: $${LIBS}) + + INCLUDEPATH += $${libthreed_ice_home}/include + INCLUDEPATH += $${libsuperlu_home}/SRC + INCLUDEPATH += $${systemc_home}/include + message(Include paths: $${INCLUDEPATH}) + + QMAKE_CXXFLAGS += -DTHERMALSIM + message(Compiler flags: $${QMAKE_CXXFLAGS}) + +} else { + message(Thermal Simulation Feature Disabled) +} + +# Additional Files: +# resources folder (DRAMSys/simulator/resources) +include(resources/resources.pri) + diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/_old/fr_fcfs_bankwise.xml b/DRAMSys/simulator/resources/configs/mcconfigs/_old/fr_fcfs_bankwise.xml deleted file mode 100644 index b9448e54..00000000 --- a/DRAMSys/simulator/resources/configs/mcconfigs/_old/fr_fcfs_bankwise.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/_old/fr_fcfs_unaware.xml b/DRAMSys/simulator/resources/configs/mcconfigs/_old/fr_fcfs_unaware.xml deleted file mode 100644 index 0e4816cb..00000000 --- a/DRAMSys/simulator/resources/configs/mcconfigs/_old/fr_fcfs_unaware.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/_old/grouper.xml b/DRAMSys/simulator/resources/configs/mcconfigs/_old/grouper.xml deleted file mode 100644 index 2f843ecd..00000000 --- a/DRAMSys/simulator/resources/configs/mcconfigs/_old/grouper.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/_old/par_bs.xml b/DRAMSys/simulator/resources/configs/mcconfigs/_old/par_bs.xml deleted file mode 100644 index af7f33bd..00000000 --- a/DRAMSys/simulator/resources/configs/mcconfigs/_old/par_bs.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/_old/par_bs_unaware.xml b/DRAMSys/simulator/resources/configs/mcconfigs/_old/par_bs_unaware.xml deleted file mode 100644 index c0b02587..00000000 --- a/DRAMSys/simulator/resources/configs/mcconfigs/_old/par_bs_unaware.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/fifo.xml b/DRAMSys/simulator/resources/configs/mcconfigs/fifo.xml index 2048948f..08135f13 100644 --- a/DRAMSys/simulator/resources/configs/mcconfigs/fifo.xml +++ b/DRAMSys/simulator/resources/configs/mcconfigs/fifo.xml @@ -4,11 +4,17 @@ + - + + diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/fifoStrict.xml b/DRAMSys/simulator/resources/configs/mcconfigs/fifoStrict.xml index 164f89f6..5c58a9c5 100644 --- a/DRAMSys/simulator/resources/configs/mcconfigs/fifoStrict.xml +++ b/DRAMSys/simulator/resources/configs/mcconfigs/fifoStrict.xml @@ -4,12 +4,17 @@ - + + - + + - diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/fr_fcfs.xml b/DRAMSys/simulator/resources/configs/mcconfigs/fr_fcfs.xml index 50532f62..fad8b021 100644 --- a/DRAMSys/simulator/resources/configs/mcconfigs/fr_fcfs.xml +++ b/DRAMSys/simulator/resources/configs/mcconfigs/fr_fcfs.xml @@ -4,19 +4,18 @@ + - - - + + diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/par_bs.xml b/DRAMSys/simulator/resources/configs/mcconfigs/par_bs.xml index 24418246..78a8afd7 100644 --- a/DRAMSys/simulator/resources/configs/mcconfigs/par_bs.xml +++ b/DRAMSys/simulator/resources/configs/mcconfigs/par_bs.xml @@ -4,12 +4,17 @@ - + + - + + - diff --git a/DRAMSys/simulator/resources/configs/memspecs/WideIO.xml b/DRAMSys/simulator/resources/configs/memspecs/wideio.xml similarity index 100% rename from DRAMSys/simulator/resources/configs/memspecs/WideIO.xml rename to DRAMSys/simulator/resources/configs/memspecs/wideio.xml diff --git a/DRAMSys/simulator/resources/configs/simulator/ddr3-single-device.xml b/DRAMSys/simulator/resources/configs/simulator/ddr3-single-device.xml new file mode 100644 index 00000000..35fd3dec --- /dev/null +++ b/DRAMSys/simulator/resources/configs/simulator/ddr3-single-device.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/configs/simulator/ddr3.xml b/DRAMSys/simulator/resources/configs/simulator/ddr3.xml new file mode 100644 index 00000000..9e322605 --- /dev/null +++ b/DRAMSys/simulator/resources/configs/simulator/ddr3.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/configs/simulator/sms.xml b/DRAMSys/simulator/resources/configs/simulator/sms.xml new file mode 100644 index 00000000..deec1b3b --- /dev/null +++ b/DRAMSys/simulator/resources/configs/simulator/sms.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/configs/simulator/wideio.xml b/DRAMSys/simulator/resources/configs/simulator/wideio.xml new file mode 100644 index 00000000..8ba8f3ba --- /dev/null +++ b/DRAMSys/simulator/resources/configs/simulator/wideio.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/configs/simulator/wideio_thermal.xml b/DRAMSys/simulator/resources/configs/simulator/wideio_thermal.xml new file mode 100644 index 00000000..42dcda72 --- /dev/null +++ b/DRAMSys/simulator/resources/configs/simulator/wideio_thermal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/configs/thermalsim/config.xml b/DRAMSys/simulator/resources/configs/thermalsim/config.xml new file mode 100644 index 00000000..4d32315e --- /dev/null +++ b/DRAMSys/simulator/resources/configs/thermalsim/config.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/DRAMSys/simulator/resources/resources.pri b/DRAMSys/simulator/resources/resources.pri index 23f0e606..dc2a316a 100644 --- a/DRAMSys/simulator/resources/resources.pri +++ b/DRAMSys/simulator/resources/resources.pri @@ -1,13 +1,20 @@ # Relative paths to "DRAMSys/simulator" because this file is included in # "DRAMSys/simulator/simulator.pro" -# simulation files -OTHER_FILES += resources/simulations/sim-batch.xml +# Simulation Files OTHER_FILES += resources/simulations/ddr3-example.xml OTHER_FILES += resources/simulations/ddr3-single-device.xml +OTHER_FILES += resources/simulations/wideio-example.xml OTHER_FILES += resources/simulations/sms-example.xml -# scripts +# Simulator Files +OTHER_FILES += resources/configs/simulator/wideio.xml +OTHER_FILES += resources/configs/simulator/ddr3.xml +OTHER_FILES += resources/configs/simulator/ddr3-single-device.xml +OTHER_FILES += resources/configs/simulator/wideio_thermal.xml +OTHER_FILES += resources/configs/simulator/sms.xml + +# Scripts OTHER_FILES += resources/scripts/address_scrambler.pl OTHER_FILES += resources/scripts/createTraceDB.sql OTHER_FILES += resources/scripts/stride_detection.pl @@ -16,7 +23,7 @@ OTHER_FILES += resources/scripts/video_rendering/temperatur.job.pl OTHER_FILES += resources/scripts/video_rendering/temperatur.pl OTHER_FILES += resources/scripts/video_rendering/Makefile -# trace files +# Trace Files OTHER_FILES += resources/traces/chstone-aes_32.stl OTHER_FILES += resources/traces/test2.stl OTHER_FILES += resources/traces/voco2.stl @@ -58,23 +65,16 @@ OTHER_FILES += resources/traces/sms_t2.stl OTHER_FILES += resources/traces/sms_t3.stl OTHER_FILES += resources/traces/sms_t4.stl -# mcconfigs +# Memory Controller Configs OTHER_FILES += resources/configs/mcconfigs/fifoStrict.xml OTHER_FILES += resources/configs/mcconfigs/fifo.xml -OTHER_FILES += resources/configs/mcconfigs/_old/par_bs_unaware.xml -OTHER_FILES += resources/configs/mcconfigs/_old/fr_fcfs_unaware.xml -OTHER_FILES += resources/configs/mcconfigs/_old/grouper.xml -OTHER_FILES += resources/configs/mcconfigs/_old/par_bs.xml -OTHER_FILES += resources/configs/mcconfigs/_old/fr_fcfs_bankwise.xml OTHER_FILES += resources/configs/mcconfigs/fr_fcfs.xml OTHER_FILES += resources/configs/mcconfigs/par_bs.xml -OTHER_FILES += resources/configs/mcconfigs/sms.xml -# memspecs +# Memspecs OTHER_FILES += resources/configs/memspecs/memspec.dtd OTHER_FILES += resources/configs/memspecs/MatzesWideIO.xml OTHER_FILES += resources/configs/memspecs/DDR4.xml -OTHER_FILES += resources/configs/memspecs/WideIO.xml OTHER_FILES += resources/configs/memspecs/MatzesWideIO-short.xml OTHER_FILES += resources/configs/memspecs/MICRON_1Gb_DDR3-1600_8bit_G.xml OTHER_FILES += resources/configs/memspecs/JEDEC_256Mb_WIDEIO_SDR-200_128bit.xml @@ -111,8 +111,9 @@ OTHER_FILES += resources/configs/memspecs/MICRON_4Gb_LPDDR3-1333_32bit_A.xml OTHER_FILES += resources/configs/memspecs/MICRON_4Gb_LPDDR3-1600_32bit_A.xml OTHER_FILES += resources/configs/memspecs/SAMSUNG_K4B1G1646E_1Gb_DDR3-1600_16bit.xml OTHER_FILES += resources/configs/memspecs/SAMSUNG_K4B4G1646Q_4Gb_DDR3-1066_16bit.xml +OTHER_FILES += resources/configs/memspecs/wideio.xml -# address mapping configs +# Address Mapping Configs OTHER_FILES += resources/configs/amconfigs/am_ddr3.xml OTHER_FILES += resources/configs/amconfigs/am_ddr3_x16_brc.xml OTHER_FILES += resources/configs/amconfigs/am_ddr3_x16_rbc.xml @@ -131,9 +132,9 @@ OTHER_FILES += resources/configs/amconfigs/am_ddr3_1Gbx8_p1KB_brc.xml OTHER_FILES += resources/configs/amconfigs/am_ddr3_4x4Gbx16_dimm_p2KB_brc.xml OTHER_FILES += resources/configs/amconfigs/am_ddr3_4x4Gbx16_dimm_p2KB_rbc.xml -# thermal simulation configs +# Thermal Simulation configs OTHER_FILES += resources/configs/thermalsim/core.flp OTHER_FILES += resources/configs/thermalsim/mem.flp OTHER_FILES += resources/configs/thermalsim/powerInfo.xml OTHER_FILES += resources/configs/thermalsim/stack.stk - +OTHER_FILES += resources/configs/thermalsim/config.xml diff --git a/DRAMSys/simulator/resources/simulations/ddr3-example.xml b/DRAMSys/simulator/resources/simulations/ddr3-example.xml index 643716ef..7fda33e5 100644 --- a/DRAMSys/simulator/resources/simulations/ddr3-example.xml +++ b/DRAMSys/simulator/resources/simulations/ddr3-example.xml @@ -1,63 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - ddr3_example.stl - - - + + + + + + + ddr3_example.stl + - diff --git a/DRAMSys/simulator/resources/simulations/ddr3-single-device.xml b/DRAMSys/simulator/resources/simulations/ddr3-single-device.xml index e6653583..c028331c 100644 --- a/DRAMSys/simulator/resources/simulations/ddr3-single-device.xml +++ b/DRAMSys/simulator/resources/simulations/ddr3-single-device.xml @@ -1,58 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - ddr3_single_dev_example.stl - - - + + + + + + + ddr3_single_dev_example.stl + - diff --git a/DRAMSys/simulator/resources/simulations/sim-batch.xml b/DRAMSys/simulator/resources/simulations/sim-batch.xml deleted file mode 100644 index 0752914c..00000000 --- a/DRAMSys/simulator/resources/simulations/sim-batch.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - chstone-adpcm_32.stl - - - - - diff --git a/DRAMSys/simulator/resources/simulations/sms-example.xml b/DRAMSys/simulator/resources/simulations/sms-example.xml index 16383801..d1a2f734 100644 --- a/DRAMSys/simulator/resources/simulations/sms-example.xml +++ b/DRAMSys/simulator/resources/simulations/sms-example.xml @@ -1,55 +1,22 @@ - - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - + - - - + - - - + - - - sms_t1.stl - sms_t2.stl - sms_t3.stl - sms_t4.stl - - + + sms_t1.stl + sms_t2.stl + sms_t3.stl + sms_t4.stl + diff --git a/DRAMSys/simulator/resources/simulations/wideio-example.xml b/DRAMSys/simulator/resources/simulations/wideio-example.xml new file mode 100644 index 00000000..c0847e17 --- /dev/null +++ b/DRAMSys/simulator/resources/simulations/wideio-example.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + chstone-adpcm_32.stl + + diff --git a/DRAMSys/simulator/simulator.pro b/DRAMSys/simulator/simulator.pro index 4d98bf05..b95f4256 100644 --- a/DRAMSys/simulator/simulator.pro +++ b/DRAMSys/simulator/simulator.pro @@ -1,12 +1,10 @@ -TARGET = dramSys +TARGET = DRAMSys TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt -system(cd ../../DRAMSys/simulator/src/common/third_party/DRAMPower; make src/libdrampower.a;) - systemc_home = $$(SYSTEMC_HOME) isEmpty(systemc_home) { systemc_home = /opt/systemc @@ -17,35 +15,14 @@ systemc_target_arch = $$(SYSTEMC_TARGET_ARCH) isEmpty(systemc_target_arch) { systemc_target_arch = linux64 } + message(SystemC target architecture is $${systemc_target_arch}) -QMAKE_RPATHDIR += $${systemc_home}/lib-$${systemc_target_arch} -message(Linker options QMAKE_RPATHDIR is $${QMAKE_RPATHDIR}) - -libboost_home = $$(LIBBOOST_HOME) -isEmpty(libboost_home) { - libboost_home = /opt/boost/lib +unix:!macx { + message(Building on a GNU/Linux) + QMAKE_RPATHDIR += $${systemc_home}/lib-$${systemc_target_arch} + message(Linker options QMAKE_RPATHDIR is $${QMAKE_RPATHDIR}) } -message(LIBBOOST home is $${libboost_home}) - -LIBS += -L$${systemc_home}/lib-$${systemc_target_arch} -lsystemc -LIBS += -L$${libboost_home} -lboost_filesystem -lboost_system - - -LIBS += -lsqlite3 -LIBS += -lpthread -LIBS += -L../../DRAMSys/simulator/src/common/third_party/DRAMPower/src/ -ldrampower - -libboost_headers = $$(LIBBOOST_HEADERS) -isEmpty(libboost_headers) { - libboost_headers = /opt/boost/include -} -message(Getting LIBOOST headers from $${libboost_headers}) - -INCLUDEPATH += $${systemc_home}/include -INCLUDEPATH += $${libboost_headers} -INCLUDEPATH += src/common/third_party/DRAMPower/src -INCLUDEPATH += src/common/third_party/DRAMPower/src/libdrampower DEFINES += TIXML_USE_STL DEFINES += SC_INCLUDE_DYNAMIC_PROCESSES @@ -59,160 +36,14 @@ macx: { QMAKE_CXXFLAGS += -std=c++0x -stdlib=libc++ -O0 -g } -QMAKE_CXXFLAGS += -isystem $${systemc_home}/include -QMAKE_CXXFLAGS += -isystem $${libboost_headers} +INCLUDEPATH += src/simulation/ +INCLUDEPATH += $${systemc_home}/include +INCLUDEPATH += src/common/third_party/DRAMPower/src +INCLUDEPATH += src/common/third_party/DRAMPower/src/libdrampower -SOURCES += \ - src/common/third_party/tinyxml2/tinyxml2.cpp \ - src/common/xmlAddressdecoder.cpp \ - src/common/Utils.cpp \ - src/common/TlmRecorder.cpp \ - src/common/dramExtension.cpp \ - src/common/DebugManager.cpp \ - src/controller/core/configuration/Configuration.cpp \ - src/controller/core/powerdown/PowerDownManagerTimeout.cpp \ - src/controller/core/powerdown/PowerDownManagerBankwise.cpp \ - src/controller/core/powerdown/PowerDownManager.cpp \ - src/controller/scheduler/ThreadLoad.cpp \ - src/controller/scheduler/PARBS.cpp \ - src/controller/scheduler/Fr_Fcfs.cpp \ - src/controller/scheduler/Fifo.cpp \ - src/controller/core/refresh/RefreshManagerBankwise.cpp \ - src/controller/core/refresh/RefreshManager.cpp \ - src/controller/core/scheduling/checker/WriteChecker.cpp \ - src/controller/core/scheduling/checker/RefreshChecker.cpp \ - src/controller/core/scheduling/checker/ReadChecker.cpp \ - src/controller/core/scheduling/checker/PrechargeChecker.cpp \ - src/controller/core/scheduling/checker/PrechargeAllChecker.cpp \ - src/controller/core/scheduling/checker/PowerDownChecker.cpp \ - src/controller/core/scheduling/checker/ActivateChecker.cpp \ - src/controller/core/scheduling/ScheduledCommand.cpp \ - src/controller/core/TimingCalculation.cpp \ - src/controller/core/Slots.cpp \ - src/controller/core/ControllerCore.cpp \ - src/simulation/SimulationManager.cpp \ - src/simulation/Simulation.cpp \ - src/simulation/MemoryManager.cpp \ - src/simulation/main.cpp \ - src/simulation/TemperatureController.cpp \ - src/controller/scheduler/readwritegrouper.cpp \ - src/controller/core/configuration/ConfigurationLoader.cpp \ - src/controller/core/powerdown/NoPowerDown.cpp \ - src/controller/Command.cpp \ - src/controller/ControllerState.cpp \ - src/controller/RowBufferStates.cpp \ - src/controller/scheduler/IScheduler.cpp \ - src/controller/scheduler/FifoStrict.cpp \ - src/error/errormodel.cpp \ - src/controller/Controller.cpp \ - src/simulation/TracePlayer.cpp \ - src/simulation/StlPlayer.cpp \ - src/controller/core/powerdown/PowerDownManagerTimeoutBankwise.cpp \ - src/controller/scheduler/SMS.cpp \ - src/controller/scheduler/ReadyBatch.cpp - -HEADERS += \ - src/common/third_party/tinyxml2/tinyxml2.h \ - src/common/xmlAddressdecoder.h \ - src/common/Utils.h \ - src/common/TlmRecorder.h \ - src/common/tlm2_base_protocol_checker.h \ - src/common/protocol.h \ - src/common/dramExtension.h \ - src/common/DebugManager.h \ - src/controller/core/configuration/Configuration.h \ - src/controller/core/powerdown/PowerDownManagerTimeout.h \ - src/controller/core/powerdown/PowerDownManagerBankwise.h \ - src/controller/core/powerdown/PowerDownManager.h \ - src/controller/scheduler/ThreadLoad.h \ - src/controller/scheduler/PARBS.h \ - src/controller/scheduler/Fr_Fcfs.h \ - src/controller/scheduler/Fifo.h \ - src/controller/Controller.h \ - src/controller/core/refresh/RefreshManagerBankwise.h \ - src/controller/core/refresh/RefreshManager.h \ - src/controller/core/refresh/IRefreshManager.h \ - src/controller/core/scheduling/checker/WriteChecker.h \ - src/controller/core/scheduling/checker/RefreshChecker.h \ - src/controller/core/scheduling/checker/ReadChecker.h \ - src/controller/core/scheduling/checker/PrechargeChecker.h \ - src/controller/core/scheduling/checker/PrechargeAllChecker.h \ - src/controller/core/scheduling/checker/PowerDownChecker.h \ - src/controller/core/scheduling/checker/ICommandChecker.h \ - src/controller/core/scheduling/checker/ActivateChecker.h \ - src/controller/core/scheduling/Trigger.h \ - src/controller/core/scheduling/ScheduledCommand.h \ - src/controller/core/TimingCalculation.h \ - src/controller/core/Slots.h \ - src/controller/core/ControllerCore.h \ - src/simulation/TracePlayer.h \ - src/simulation/SimulationManager.h \ - src/simulation/Simulation.h \ - src/simulation/MemoryManager.h \ - src/simulation/Dram.h \ - src/simulation/Arbiter.h \ - src/common/libDRAMPower.h \ - src/controller/scheduler/readwritegrouper.h \ - src/simulation/ReorderBuffer.h \ - src/controller/core/configuration/MemSpec.h \ - src/controller/core/configuration/thermalSimConfig.h \ - src/simulation/StlPlayer.h \ - src/simulation/TracePlayerListener.h \ - src/simulation/TraceGenerator.h \ - src/simulation/TemperatureController.h \ - src/controller/core/powerdown/NoPowerDown.h \ - src/controller/Command.h \ - src/controller/RowBufferStates.h \ - src/controller/ControllerState.h \ - src/controller/core/powerdown/IPowerDownManager.h \ - src/controller/scheduler/IScheduler.h \ - src/controller/scheduler/FifoStrict.h \ - src/controller/IController.h \ - src/controller/core/configuration/ConfigurationLoader.h \ - src/error/errormodel.h \ - src/simulation/ExampleInitiator.h \ - src/controller/core/powerdown/PowerDownManagerTimeoutBankwise.h \ - src/controller/scheduler/SMS.h \ - src/controller/scheduler/ReadyBatch.h - -thermalsim = $$(THERMALSIM) -isEmpty(thermalsim) { - thermalsim = false -} - -$$eval(thermalsim) { - message(Thermal Simulation Feature Enabled) - - libthreed_ice_home = $$(LIBTHREED_ICE_HOME) - isEmpty(libthreed_ice_home) { - libthreed_ice_home = /opt/3D-ICE/ - } - message(LIBTHREED_ICE_HOME path is $${libthreed_ice_home}) - - libsuperlu_home = $$(LIBSUPERLU_HOME) - isEmpty(libsuperlu_home) { - libsuperlu_home = /opt/SuperLU_4.3/ - } - message(LIBSUPERLU_HOME path is $${libthreed_ice_home}) - - LIBS += -L$${libthreed_ice_home}/lib -lthreed-ice-2.2.4 - LIBS += -L$${libsuperlu_home}/lib -lsuperlu_4.3 - LIBS += -lblas - message(Libraries: $${LIBS}) - - INCLUDEPATH += $${libthreed_ice_home}/include - INCLUDEPATH += $${libsuperlu_home}/SRC - INCLUDEPATH += $${systemc_home}/include - message(Include paths: $${INCLUDEPATH}) - - QMAKE_CXXFLAGS += -DTHERMALSIM - message(Compiler flags: $${QMAKE_CXXFLAGS}) - -} else { - message(Thermal Simulation Feature Disabled) -} - -# Additional Files: -# resources folder (DRAMSys/simulator/resources) -include(resources/resources.pri) +LIBS += -L$${systemc_home}/lib-$${systemc_target_arch} -lsystemc +LIBS += libDRAMSys.a +LIBS += ../../DRAMSys/simulator/src/common/third_party/DRAMPower/src/libdrampower.a +LIBS += -lsqlite3 +SOURCES += src/simulation/main.cpp diff --git a/DRAMSys/simulator/src/common/DebugManager.h b/DRAMSys/simulator/src/common/DebugManager.h index 17e55c72..3be8492b 100644 --- a/DRAMSys/simulator/src/common/DebugManager.h +++ b/DRAMSys/simulator/src/common/DebugManager.h @@ -41,15 +41,14 @@ #include #include +#include "Utils.h" + class DebugManager { public: ~DebugManager(); - static inline DebugManager& getInstance() - { - static DebugManager manager; - return manager; - } + + DEF_SINGLETON(DebugManager); bool writeToConsole; bool writeToFile; diff --git a/DRAMSys/simulator/src/common/TlmRecorder.cpp b/DRAMSys/simulator/src/common/TlmRecorder.cpp index 0f2466f4..8fbe5a69 100644 --- a/DRAMSys/simulator/src/common/TlmRecorder.cpp +++ b/DRAMSys/simulator/src/common/TlmRecorder.cpp @@ -38,7 +38,6 @@ #include #include -#include #include "TlmRecorder.h" #include "protocol.h" @@ -219,9 +218,15 @@ void TlmRecorder::Transaction::setPhaseEnd(string name, sc_time end) void TlmRecorder::openDB(std::string name) { - boost::filesystem::wpath file(name); - if(boost::filesystem::exists(file)) - boost::filesystem::remove(file); + ifstream f(name.c_str()); + if(f.good()) + { + if(remove(name.c_str()) != 0) + { + SC_REPORT_FATAL("TlmRecorder", "Error deleting file" ); + } + } + if (sqlite3_open(name.c_str(), &db) != SQLITE_OK) { SC_REPORT_FATAL("Error in TraceRecorder", "Error cannot open database"); diff --git a/DRAMSys/simulator/src/common/Utils.cpp b/DRAMSys/simulator/src/common/Utils.cpp index a791071b..e5b09fee 100644 --- a/DRAMSys/simulator/src/common/Utils.cpp +++ b/DRAMSys/simulator/src/common/Utils.cpp @@ -44,7 +44,6 @@ using namespace std; using namespace tinyxml2; - bool TimeInterval::timeIsInInterval(sc_time time) { return (start < time && time < end); diff --git a/DRAMSys/simulator/src/common/Utils.h b/DRAMSys/simulator/src/common/Utils.h index 1de06366..98212eda 100644 --- a/DRAMSys/simulator/src/common/Utils.h +++ b/DRAMSys/simulator/src/common/Utils.h @@ -43,11 +43,19 @@ #include #include #include -#include #include #include "dramExtension.h" #include "third_party/tinyxml2/tinyxml2.h" + +#define DEF_SINGLETON( NAME ) \ +public: \ + static NAME& getInstance() \ + { \ + static NAME _instance; \ + return _instance; \ + } + //TODO : move to timing specific header sc_time getDistance(sc_time a, sc_time b); @@ -118,45 +126,5 @@ double queryDoubleParameter(tinyxml2::XMLElement* node, std::string name); void setUpDummy(tlm::tlm_generic_payload& payload, Bank& bank); -#define DEFINE_ENUM_CLASS_WITH_STRING_CONVERSIONS_TOSTRING_CASE(r, data, elem) \ - case data::elem : return BOOST_PP_STRINGIZE(elem); - -#define DEFINE_ENUM_CLASS_WITH_STRING_CONVERSIONS_TOENUM_IF(r, data, elem) \ - if (BOOST_PP_SEQ_TAIL(data) == BOOST_PP_STRINGIZE(elem)) \ - return BOOST_PP_SEQ_HEAD(data)::elem; else - -#define DEFINE_ENUM_CLASS_WITH_STRING_CONVERSIONS(enumName, enumerators) \ - enum class enumName { \ - BOOST_PP_SEQ_ENUM(enumerators) \ - }; \ - \ - inline const char *EnumToString(enumName v) \ - { \ - switch (v) { \ - BOOST_PP_SEQ_FOR_EACH( \ - DEFINE_ENUM_CLASS_WITH_STRING_CONVERSIONS_TOSTRING_CASE, \ - enumName, \ - enumerators \ - ) \ - default: return "[Unknown " BOOST_PP_STRINGIZE(name) "]"; \ - } \ - } \ - \ - inline enumName StringToEnum(std::string s) \ - { \ - BOOST_PP_SEQ_FOR_EACH( \ - DEFINE_ENUM_CLASS_WITH_STRING_CONVERSIONS_TOENUM_IF, \ - (enumName)(s), \ - enumerators \ - ) \ - { \ - SC_REPORT_FATAL("Configuration", \ - ("Invalid string \"" + s + "\" for conversion into enum \"" \ - + BOOST_PP_STRINGIZE(enumName) + "\"").c_str() \ - ); \ - \ - } \ - } - #endif /* UTILS_COMMON_H_ */ diff --git a/DRAMSys/simulator/src/common/xmlAddressdecoder.cpp b/DRAMSys/simulator/src/common/xmlAddressdecoder.cpp index 24c3c356..31304f1d 100644 --- a/DRAMSys/simulator/src/common/xmlAddressdecoder.cpp +++ b/DRAMSys/simulator/src/common/xmlAddressdecoder.cpp @@ -44,32 +44,41 @@ using namespace std; using namespace tinyxml2; -tinyxml2::XMLElement* xmlAddressDecoder::addressmapping = NULL; +xmlAddressDecoder::xmlAddressDecoder() +{ + addressmapping = NULL; +} xmlAddressDecoder::xmlAddressDecoder(string addressConfigURI) { - tinyxml2::XMLDocument doc; - - loadXML(addressConfigURI, doc); - xmlAddressDecoder(doc.FirstChildElement("dramconfig")->FirstChildElement("addressmap")); - + setConfiguration(addressConfigURI); } xmlAddressDecoder::xmlAddressDecoder(XMLElement* addressmap) { - tinyxml2::XMLDocument doc; - string xmlNodeName(addressmap->Name()); - if( xmlNodeName != "addressmapping") - reportFatal("AddressDecorder", "addressmap node expected"); + setConfiguration(addressmap); +} - if(addressmap->Attribute("src")) +void xmlAddressDecoder::setConfiguration(std::string addressConfigURI) +{ + tinyxml2::XMLDocument doc; + loadXML(addressConfigURI, doc); + setConfiguration(doc.RootElement()); +} + +void xmlAddressDecoder::setConfiguration(tinyxml2::XMLElement* addressMap) +{ + tinyxml2::XMLDocument doc; + string xmlNodeName(addressMap->Name()); + + if( xmlNodeName != "addressmapping") { - string src(addressmap->Attribute("src")); - loadXML(src, doc); - addressmap = (doc.FirstChildElement("addressmapping")); + reportFatal("AddressDecorder", "addressmap node expected"); } - for(XMLElement* child = addressmap->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for(XMLElement* child = addressMap->FirstChildElement(); + child != NULL; + child = child->NextSiblingElement()) { int from; int to; @@ -80,10 +89,10 @@ xmlAddressDecoder::xmlAddressDecoder(XMLElement* addressmap) shifts[child->Name()] = from; masks[child->Name()] = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); amount[child->Name()] = pow(2.0, to - from + 1.0); - //std::cout << child->Name() << " XXXX " << pow(2.0, to - from + 1.0) <(pair.second)< #include +#include "Utils.h" #include "third_party/tinyxml2/tinyxml2.h" struct DecodedAddress { - DecodedAddress():channel(0),rank(0),bankgroup(0),row(0),bank(0),column(0),bytes(0){} + DecodedAddress() : channel(0), + rank(0), + bankgroup(0), + row(0), + bank(0), + column(0), + bytes(0) + { + } + unsigned int channel; unsigned int rank; unsigned int bankgroup; @@ -62,35 +72,27 @@ struct DecodedAddress class xmlAddressDecoder { - public: - - static tinyxml2::XMLElement* addressmapping; - static inline xmlAddressDecoder& getInstance() - { - static xmlAddressDecoder decoder(xmlAddressDecoder::addressmapping); - return decoder; - } - - static inline void Initialize(tinyxml2::XMLElement* mapping) - { - addressmapping = mapping; - xmlAddressDecoder::getInstance(); - addressmapping = NULL; - } - - DecodedAddress decodeAddress(sc_dt::uint64 addr); - sc_dt::uint64 encodeAddress(DecodedAddress n); - - - void print(); private: + + xmlAddressDecoder(); xmlAddressDecoder(std::string URI); xmlAddressDecoder(tinyxml2::XMLElement* addressMap); std::map masks; std::map shifts; + tinyxml2::XMLElement* addressmapping; + public: + DEF_SINGLETON(xmlAddressDecoder); + + DecodedAddress decodeAddress(sc_dt::uint64 addr); + sc_dt::uint64 encodeAddress(DecodedAddress n); + + void setConfiguration(std::string url); + void setConfiguration(tinyxml2::XMLElement* addressMap); + void print(); + std::map amount; }; diff --git a/DRAMSys/simulator/src/controller/Controller.cpp b/DRAMSys/simulator/src/controller/Controller.cpp index 56e27215..8e307173 100644 --- a/DRAMSys/simulator/src/controller/Controller.cpp +++ b/DRAMSys/simulator/src/controller/Controller.cpp @@ -499,6 +499,11 @@ bool Controller::containsPhase(tlm_phase phase, std::vector phases) return false; } +void Controller::end_of_simulation() +{ + terminateSimulation(); +} + void Controller::terminateSimulation() { if(Configuration::getInstance().BankwiseLogic) @@ -512,6 +517,8 @@ void Controller::terminateSimulation() { controllerCore->powerDownManager->wakeUp(0, clkAlign(sc_time_stamp())); } + + endTime = sc_time_stamp(); } void Controller::startBandwidthIdleCollector() diff --git a/DRAMSys/simulator/src/controller/Controller.h b/DRAMSys/simulator/src/controller/Controller.h index 77de4bf3..682a29b0 100644 --- a/DRAMSys/simulator/src/controller/Controller.h +++ b/DRAMSys/simulator/src/controller/Controller.h @@ -86,7 +86,7 @@ public: tSocket.register_transport_dbg(this, &Controller::transport_dbg); } - ~Controller() + virtual ~Controller() { delete controllerCore; delete scheduler; @@ -154,6 +154,9 @@ private: void startBandwidthIdleCollector(); void endBandwidthIdleCollector(); + // SystemC related: + virtual void end_of_simulation() override; + }; #endif /* CONTROLLERWRAPPER_H_ */ diff --git a/DRAMSys/simulator/src/controller/core/ControllerCore.h b/DRAMSys/simulator/src/controller/core/ControllerCore.h index 7f32e805..821c2944 100644 --- a/DRAMSys/simulator/src/controller/core/ControllerCore.h +++ b/DRAMSys/simulator/src/controller/core/ControllerCore.h @@ -55,7 +55,7 @@ class ControllerCore : public sc_module { public: ControllerCore(sc_module_name /*name*/, IController& controller, std::map& numberOfPayloads); - virtual ~ControllerCore() ; + virtual ~ControllerCore(); void scheduleRequest(Command command, tlm::tlm_generic_payload& payload); void triggerRefresh(tlm::tlm_generic_payload& payload); diff --git a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp index f3698179..e410f639 100644 --- a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp +++ b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp @@ -40,7 +40,6 @@ #include "Configuration.h" #include "ConfigurationLoader.h" -#include "boost/lexical_cast.hpp" #include "../../../common/xmlAddressdecoder.h" using namespace std; @@ -52,24 +51,44 @@ Configuration::Configuration() { } -int string2bool(string s) +bool string2bool(string s) { - try { - bool x = boost::lexical_cast( s ); - return x; - } catch( boost::bad_lexical_cast const& ) { + if(s.compare("0") == 0) + { + return false; + } + else if(s.compare("1") == 0) + { + return true; + } + else + { SC_REPORT_FATAL("Configuration", ("Could not convert to bool: " + s).c_str()); - throw; + return false; } } int string2int(string s) { - try { - int x = boost::lexical_cast( s ); - return x; - } catch( boost::bad_lexical_cast const& ) { - SC_REPORT_FATAL("Configuration", ("Could not convert to int: " + s).c_str()); + return std::stoi(s); +} + +unsigned long long string2ull(string s) +{ + return std::stoull(s); +} + +StorageMode string2StoreMode(string s) +{ + if(s == "NoStorage") + return StorageMode::NoStorage; + else if(s == "Store") + return StorageMode::Store; + else if (s == "ErrorModel") + return StorageMode::ErrorModel; + else + { + SC_REPORT_FATAL("Configuration", ("Unknown StorageMode: " + s).c_str()); throw; } } @@ -143,6 +162,8 @@ void Configuration::setParameter(std::string name, std::string value) ReorderBuffer = string2bool(value); //SimConfig------------------------------------------------ + else if(name == "SimulationName") + SimulationName = value; else if(name == "DatabaseRecording") DatabaseRecording = string2bool(value); else if(name == "PowerAnalysis") @@ -157,8 +178,6 @@ void Configuration::setParameter(std::string name, std::string value) WindowSize = string2int(value); else if(name == "Debug") Debug = string2bool(value); - else if (name == "NumberOfTracePlayers") - NumberOfTracePlayers = string2int(value); else if (name == "NumberOfMemChannels") { NumberOfMemChannels = string2int(value); unsigned int maxNumberofMemChannels = xmlAddressDecoder::getInstance().amount["channel"]; @@ -181,6 +200,15 @@ void Configuration::setParameter(std::string name, std::string value) SC_REPORT_FATAL("Configuration", ("Invalid value for parameter " + name + ". This parameter must be at least one.").c_str()); } else NumberOfDevicesOnDIMM = string2int(value); + else if(name == "AddressOffset") + { +#ifdef DRAMSYS_GEM5 + AddressOffset = string2ull(value); +#else + AddressOffset = 0; +#endif + cout << "Address Offset: " << AddressOffset << endl; + } else if(name == "CheckTLM2Protocol") CheckTLM2Protocol = string2bool(value); // Specification for ErrorChipSeed, ErrorCSVFile path and StoreMode @@ -189,7 +217,7 @@ void Configuration::setParameter(std::string name, std::string value) else if(name == "ErrorCSVFile") ErrorCSVFile = value; else if(name == "StoreMode") - StoreMode = StringToEnum(value); + StoreMode = string2StoreMode(value); // Temperature Simulation related else if (name == "TemperatureScale") { if (value != "Celsius" && value != "Fahrenheit" && value != "Kelvin") { @@ -225,6 +253,17 @@ void Configuration::setParameter(std::string name, std::string value) } } +void Configuration::setPathToResources(std::string path) +{ + pathToResources = path; + temperatureSim.setPathToResources(path); +} + +std::string Configuration::getPathToResources() +{ + return pathToResources; +} + void Configuration::setParameters(std::map parameterMap) { for(auto item : parameterMap) diff --git a/DRAMSys/simulator/src/controller/core/configuration/Configuration.h b/DRAMSys/simulator/src/controller/core/configuration/Configuration.h index 6ca503a7..c52f4655 100644 --- a/DRAMSys/simulator/src/controller/core/configuration/Configuration.h +++ b/DRAMSys/simulator/src/controller/core/configuration/Configuration.h @@ -45,23 +45,19 @@ #include "thermalSimConfig.h" #include "../../../common/Utils.h" -enum class StorageMode; -DEFINE_ENUM_CLASS_WITH_STRING_CONVERSIONS(StorageMode, (NoStorage)(Store)(ErrorModel)) +enum class StorageMode{NoStorage, Store, ErrorModel}; enum class EPowerDownMode{NoPowerDown, Staggered, TimeoutPDN, TimeoutSREF}; -struct Configuration +struct Configuration { static std::string memspecUri; static std::string mcconfigUri; + std::string pathToResources; - static inline Configuration& getInstance() - { - static Configuration configuration; - return configuration; - } + DEF_SINGLETON(Configuration); - //MCConfig + // MCConfig: bool BankwiseLogic = false; bool OpenPagePolicy = true; unsigned int MaxNrOfTransactions = 8; @@ -75,21 +71,22 @@ struct Configuration bool ReadWriteGrouping = false; bool ReorderBuffer = false; - //SimConfig + // SimConfig + std::string SimulationName = "default"; bool DatabaseRecording = true; bool PowerAnalysis = false; bool EnableWindowing = false; unsigned int WindowSize = 1000; bool Debug = false; - unsigned int NumberOfTracePlayers = 1; unsigned int NumberOfMemChannels = 1; bool ControllerCoreDisableRefresh = false; bool ThermalSimulation = false; bool SimulationProgressBar = false; unsigned int NumberOfDevicesOnDIMM = 1; bool CheckTLM2Protocol = false; + unsigned long long int AddressOffset = 0; - //MemSpec(from DRAM-Power XML) + // MemSpec (from DRAM-Power XML) MemSpec memSpec; void setParameter(std::string name, std::string value); @@ -106,6 +103,8 @@ struct Configuration std::uint64_t getSimMemSizeInBytes(); unsigned int getDataBusWidth(); unsigned int getBytesPerBurst(); + void setPathToResources(std::string path); + std::string getPathToResources(); private: Configuration(); diff --git a/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.cpp b/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.cpp index f948c8db..beee8c9d 100644 --- a/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.cpp +++ b/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.cpp @@ -100,6 +100,7 @@ void ConfigurationLoader::loadConfigFromUri(Configuration &config, std::string u void ConfigurationLoader::loadMemSpec(Configuration& config, string memspecUri) { tinyxml2::XMLDocument doc; + config.memspecUri = memspecUri; loadXML(memspecUri, doc); XMLElement* memspec = doc.FirstChildElement("memspec"); loadMemSpec(config, memspec); @@ -107,13 +108,6 @@ void ConfigurationLoader::loadMemSpec(Configuration& config, string memspecUri) void ConfigurationLoader::loadMemSpec(Configuration& config, XMLElement* memspec) { - XMLDocument doc; - - string src(memspec->Attribute("src")); - config.memspecUri = src; - loadXML(src, doc); - memspec = doc.FirstChildElement("memspec"); - config.memSpec.MemoryId = queryStringParameter(memspec, "memoryId"); config.memSpec.MemoryType = queryStringParameter(memspec, "memoryType"); @@ -138,7 +132,7 @@ void ConfigurationLoader::loadMemSpec(Configuration& config, XMLElement* memspec void ConfigurationLoader::loadMCConfig(Configuration& config, string mcconfigUri) { tinyxml2::XMLDocument doc; - + config.mcconfigUri = mcconfigUri; loadXML(mcconfigUri, doc); XMLElement* mcconfig = doc.FirstChildElement("mcconfig"); loadConfig(config, mcconfig); @@ -153,13 +147,12 @@ void ConfigurationLoader::loadMCConfig(Configuration& config, XMLElement* mcconf config.mcconfigUri = src; loadXML(src, doc); loadMCConfig(config, doc.FirstChildElement("mcconfig")); - } else - loadConfig(config, mcconfig); - - // check compatible between Store Mode and PowerDown Mode - if (config.StoreMode == StorageMode::ErrorModel && config.PowerDownMode != EPowerDownMode::NoPowerDown) { - SC_REPORT_FATAL("ConfigurationLoader", "Does not yet support error model and power down modes activated at the same time"); } + else + { + loadConfig(config, mcconfig); + } + } diff --git a/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.h b/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.h index 9c319129..d9cf1bc8 100644 --- a/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.h +++ b/DRAMSys/simulator/src/controller/core/configuration/ConfigurationLoader.h @@ -45,7 +45,8 @@ class ConfigurationLoader { public: - static void loadMCConfig(Configuration& config, std::string mcconfigUri); + + static void loadMCConfig(Configuration& config, std::string amconfigUri); static void loadMCConfig(Configuration& config, tinyxml2::XMLElement* mcconfig); static void loadSimConfig(Configuration& config, std::string simconfigUri); diff --git a/DRAMSys/simulator/src/controller/core/configuration/thermalSimConfig.h b/DRAMSys/simulator/src/controller/core/configuration/thermalSimConfig.h index d5d5a25f..167b0e11 100644 --- a/DRAMSys/simulator/src/controller/core/configuration/thermalSimConfig.h +++ b/DRAMSys/simulator/src/controller/core/configuration/thermalSimConfig.h @@ -49,6 +49,12 @@ struct TemperatureSimConfig { // Temperature Scale std::string TemperatureScale; + std::string pathToResources; + + void setPathToResources(std::string path) + { + pathToResources = path; + } // Static Temperature Simulation parameters int StaticTemperatureDefaultValue; @@ -72,6 +78,10 @@ struct TemperatureSimConfig { { printDebugMessage("Power Info File: " + powerInfoFile); + powerInfoFile = pathToResources + + "/configs/thermalsim/" + + powerInfoFile; + // Load the XML file into memory and parse it tinyxml2::XMLDocument xml; loadXML(powerInfoFile, xml); diff --git a/DRAMSys/simulator/src/controller/scheduler/SMS.cpp b/DRAMSys/simulator/src/controller/scheduler/SMS.cpp index f5054993..82e9f6e0 100644 --- a/DRAMSys/simulator/src/controller/scheduler/SMS.cpp +++ b/DRAMSys/simulator/src/controller/scheduler/SMS.cpp @@ -5,8 +5,19 @@ using namespace std; void SMS::schedule(gp *payload) { - buffer[DramExtension::getExtension(payload).getThread()].emplace_back(payload); - inFlightMemRequestCounter[DramExtension::getExtension(payload).getThread()]++; + Thread thread = DramExtension::getExtension(payload).getThread(); + + buffer[thread].emplace_back(payload); + + if (inFlightMemRequestCounter.find(thread) == inFlightMemRequestCounter.end()) { + inFlightMemRequestCounter[thread] = 0; + } + inFlightMemRequestCounter[thread]++; + + if (readybatches.find(thread) == readybatches.end()) { + readybatches[thread] = new ReadyBatch(); + } + newRequest.notify(SC_ZERO_TIME); } diff --git a/DRAMSys/simulator/src/controller/scheduler/SMS.h b/DRAMSys/simulator/src/controller/scheduler/SMS.h index 1ca75c70..c3727120 100644 --- a/DRAMSys/simulator/src/controller/scheduler/SMS.h +++ b/DRAMSys/simulator/src/controller/scheduler/SMS.h @@ -20,26 +20,17 @@ class SMS: public sc_module, public IScheduler public: SMS(sc_module_name /*_name*/, ControllerCore &controllerCore, unsigned int SJFprobability) : IScheduler(controllerCore), SJFprobability(SJFprobability), debugManager(DebugManager::getInstance()) { - // initialize memory request counter & memory request intensity for each thread - unsigned int totalNumThreads = Configuration::getInstance().NumberOfTracePlayers; - for (unsigned int threadID = 1; threadID <= totalNumThreads; threadID++) - { - inFlightMemRequestCounter.emplace(Thread(threadID), 0); - readybatches[Thread(threadID)] = new ReadyBatch(); - } - // initialize selected thread iterator selectedThread = readybatches.end(); SC_THREAD(batchScheduler); } SC_HAS_PROCESS(SMS); - ~SMS() + virtual ~SMS() { - unsigned int totalNumThreads = Configuration::getInstance().NumberOfTracePlayers; - for (unsigned int threadID = 1; threadID <= totalNumThreads; threadID++) + for (auto& thread_readybatch : readybatches) { - delete readybatches[Thread(threadID)]; + delete thread_readybatch.second; } } diff --git a/DRAMSys/simulator/src/simulation/Arbiter.h b/DRAMSys/simulator/src/simulation/Arbiter.h index 47fb5a1e..114e3d03 100644 --- a/DRAMSys/simulator/src/simulation/Arbiter.h +++ b/DRAMSys/simulator/src/simulation/Arbiter.h @@ -76,10 +76,6 @@ public: tSocket.register_nb_transport_fw(this, &Arbiter::nb_transport_fw); tSocket.register_transport_dbg(this, &Arbiter::transport_dbg); - - for (size_t i = 0; i < Configuration::getInstance().NumberOfTracePlayers; ++i) { - receivedResponses.push_back(queue()); - } } void setTlmRecorders(std::vector recorders) @@ -97,7 +93,7 @@ private: vector> pendingRequests; //used to account for the response_accept_delay in the initiators (traceplayer,core etc.) // This is a queue of responses comming from the memory side. The phase of these transactions is BEGIN_RESP. - vector> receivedResponses; + std::map> receivedResponses; std::vector tlmRecorders; @@ -109,7 +105,6 @@ private: tlm_sync_enum nb_transport_bw(int channelId, tlm_generic_payload &payload, tlm_phase &phase, sc_time &bwDelay) { // Check channel ID - assert((unsigned int)channelId < iSocket.size()); if ((unsigned int)channelId != DramExtension::getExtension(payload).getChannel().ID()) { SC_REPORT_FATAL("Arbiter", "Payload extension was corrupted"); } @@ -127,15 +122,21 @@ private: // This function is called when an arbiter's target socket receives a transaction from a device tlm_sync_enum nb_transport_fw(int id, tlm_generic_payload& payload, tlm_phase& phase, sc_time& fwDelay) { - assert ((unsigned int)id < tSocket.size()); - if (phase == BEGIN_REQ) { + if (phase == BEGIN_REQ) + { + // adjust address offset: + payload.set_address(payload.get_address() - Configuration::getInstance().AddressOffset); + // Map the payload with socket id. routeMap[&payload] = id; + // 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); payload.acquire(); - } else if (phase == END_RESP) { + } + else if (phase == END_RESP) + { // Erase before the payload is released. routeMap.erase(&payload); payload.release(); @@ -147,9 +148,11 @@ private: virtual unsigned int transport_dbg(int /*id*/, tlm::tlm_generic_payload &trans) { + // adjust address offset: + trans.set_address(trans.get_address() - Configuration::getInstance().AddressOffset); + DecodedAddress decodedAddress = xmlAddressDecoder::getInstance().decodeAddress(trans.get_address()); return iSocket[decodedAddress.channel]->transport_dbg(trans); - } void peqCallback(tlm_generic_payload& payload, const tlm_phase& phase) @@ -158,7 +161,6 @@ private: unsigned int channelId = DramExtension::getExtension(payload).getChannel().ID(); // Check the valid range of initiatorSocket ID and channel Id - assert(initiatorSocket < Configuration::getInstance().NumberOfTracePlayers); assert(channelId < Configuration::getInstance().NumberOfMemChannels); // Phases initiated by the intiator side from arbiter's point of view (devices performing memory requests to the arbiter) @@ -210,10 +212,15 @@ private: if ((int)initiatorSocket != routeMap[&payload]) { SC_REPORT_FATAL("Arbiter", "Payload extension was corrupted"); } - // The arbiter receives a transaction in BEGIN_RESP phase (that came from the memory side) and forwards it to the requester device + // The arbiter receives a transaction in BEGIN_RESP phase + // (that came from the memory side) and forwards it to the requester + // device if (receivedResponses[initiatorSocket].empty()) + { sendToInitiator(initiatorSocket, payload, phase, SC_ZERO_TIME); - // Enqueue the transaction in BEGIN_RESP phase until the initiator device acknowledge it (phase changes to END_RESP). + } + // Enqueue the transaction in BEGIN_RESP phase until the initiator + // device acknowledge it (phase changes to END_RESP). receivedResponses[initiatorSocket].push(&payload); } else { SC_REPORT_FATAL(0, "Payload event queue in arbiter was triggered with unknown phase"); diff --git a/DRAMSys/simulator/src/simulation/DRAMSys.cpp b/DRAMSys/simulator/src/simulation/DRAMSys.cpp new file mode 100644 index 00000000..41b80d42 --- /dev/null +++ b/DRAMSys/simulator/src/simulation/DRAMSys.cpp @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2015, 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: + * Janik Schlemminger + * Matthias Jung + * Eder F. Zulian + * Felipe S. Prado + */ + +#include +#include +#include +#include + +#include "DRAMSys.h" +#include "Setup.h" +#include "../common/TlmRecorder.h" +#include "../common/DebugManager.h" +#include "../common/xmlAddressdecoder.h" +#include "../controller/core/ControllerCore.h" +#include "../controller/core/configuration/ConfigurationLoader.h" +#include "../common/Utils.h" +#include "../simulation/TemperatureController.h" +#include "../controller/Controller.h" + +using namespace std; + +DRAMSys::DRAMSys(sc_module_name __attribute__((unused)) name, + string simulationToRun, + string pathToResources) : tSocket("DRAMSys_tSocket") +{ + logo(); + + // Read Configuration Setup: + string memspec; + string mcconfig; + string amconfig; + string simconfig; + string thermalconfig; + + Setup setup(simulationToRun, + memspec, + mcconfig, + amconfig, + simconfig, + thermalconfig); + + Configuration::getInstance().setPathToResources(pathToResources); + + // The xmlAddressDecoder MUST be initialized before calling the + // ConfigurationLoader because some information from the xmlAddressDecoder + // is needed to assure the coherence of the configuration. + xmlAddressDecoder::getInstance().setConfiguration(pathToResources + + "configs/amconfigs/" + + amconfig); + xmlAddressDecoder::getInstance().print(); + + // Setup the memory controller with the propriate xml file + ConfigurationLoader::loadMCConfig(Configuration::getInstance(), + pathToResources + + "configs/mcconfigs/" + + mcconfig); + + ConfigurationLoader::loadMemSpec(Configuration::getInstance(), + pathToResources + + "configs/memspecs/" + + memspec); + + ConfigurationLoader::loadSimConfig(Configuration::getInstance(), + pathToResources + + "configs/simulator/" + + simconfig); + + ConfigurationLoader::loadTemperatureSimConfig(Configuration::getInstance(), + pathToResources + + "configs/thermalsim/" + + thermalconfig); + + // Instantiate all internal DRAMSys modules: + instantiateModules(Configuration::getInstance().SimulationName, + pathToResources); + // Connect all internal DRAMSys modules: + bindSockets(); + + // Setup the debug manager: + setupDebugManager(Configuration::getInstance().SimulationName); +} + +void DRAMSys::logo() +{ + #define REDTXT(s) string(("\033[0;31m"+string((s))+"\033[0m")) + #define BOLDBLUETXT(s) string(("\033[1;34m"+string((s))+"\033[0m")) + cout << endl; + cout << REDTXT(" |||") << endl; + cout << REDTXT(" +---+ Microelectronic Systems") << endl; + cout << REDTXT("=| |= Design Research Group") << endl; + cout << REDTXT("=| |= ") << BOLDBLUETXT("University of Kaiserslautern") + << endl; + cout << REDTXT(" +---+ ") << endl; + cout << REDTXT(" ||| ") << "DRAMSys v3.0" << endl; + cout << endl; + #undef REDTXT + #undef BOLDBLUETXT +} + +void DRAMSys::setupDebugManager(const string& traceName) +{ + auto& dbg = DebugManager::getInstance(); + dbg.writeToConsole = true; + dbg.writeToFile = true; + if(dbg.writeToFile) + dbg.openDebugFile(traceName + ".txt"); +} + +void DRAMSys::setupTlmRecorders(const string &traceName, + const string &pathToResources) +{ + // Create TLM Recorders, one per channel. + for (size_t i = 0; + i < Configuration::getInstance().NumberOfMemChannels; + i++) + { + std::string sqlScriptURI = pathToResources + + string("scripts/createTraceDB.sql"); + + std::string dbName = traceName + + string("_channel") + + std::to_string(i) + + ".tdb"; + + std::string recorderName = "tlmRecorder" + std::to_string(i); + + TlmRecorder *tlmRecorder = + new TlmRecorder(recorderName.c_str(), + sqlScriptURI.c_str(), + dbName.c_str(), + Configuration::getInstance().DatabaseRecording); + tlmRecorder->recordMCconfig(Configuration::getInstance().mcconfigUri); + tlmRecorder->recordMemspec(Configuration::getInstance().memspecUri); + + std::string traceNames = Configuration::getInstance().SimulationName; + tlmRecorder->recordTracenames(traceNames); + + tlmRecorders.push_back(tlmRecorder); + } +} + +void DRAMSys::instantiateModules(const string &traceName, + const string &pathToResources) +{ + // The first call to getInstance() creates the Temperature Controller. + // The same instance will be accessed by all other modules. + TemperatureController::getInstance(); + + // Create and properly initialize TLM recorders. + // They need to be ready before creating some modules. + setupTlmRecorders(traceName, pathToResources); + + arbiter = new Arbiter("arbiter"); + arbiter->setTlmRecorders(tlmRecorders); + + for (size_t i = 0; + i < Configuration::getInstance().NumberOfMemChannels; + i++) + { + std::string str = "controller" + std::to_string(i); + Controller *controller = new Controller(str.c_str(), tlmRecorders[i]); + controllers.push_back(controller); + + str = "dram" + std::to_string(i); + Dram *dram = new Dram(str.c_str()); + 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 DRAMSys::bindSockets() +{ + tSocket.bind(arbiter->tSocket); + + if(Configuration::getInstance().CheckTLM2Protocol) + { + 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 (size_t i = 0; + i < Configuration::getInstance().NumberOfMemChannels; + i++) + { + arbiter->iSocket.bind(controllers[i]->tSocket); + controllers[i]->iSocket.bind(drams[i]->tSocket); + } + } +} + +DRAMSys::~DRAMSys() +{ + + delete arbiter; + + for (auto controller : controllers) + { + delete controller; + } + + for (auto dram : drams) + { + delete dram; + } + + for (auto rec : tlmRecorders) + { + delete rec; + } + + for (auto tlmChecker : controllersTlmCheckers) + { + delete tlmChecker; + } +} + +void DRAMSys::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/DRAMSys.h similarity index 60% rename from DRAMSys/simulator/src/simulation/Simulation.h rename to DRAMSys/simulator/src/simulation/DRAMSys.h index 45890b47..3f1aeca9 100644 --- a/DRAMSys/simulator/src/simulation/Simulation.h +++ b/DRAMSys/simulator/src/simulation/DRAMSys.h @@ -36,8 +36,8 @@ * Felipe S. Prado */ -#ifndef SIMULATION_H_ -#define SIMULATION_H_ +#ifndef DRAMSYS_H_ +#define DRAMSYS_H_ #include #include @@ -46,70 +46,59 @@ #include "Arbiter.h" #include "TraceGenerator.h" #include "ReorderBuffer.h" +#include +#include #include "../controller/Controller.h" #include "../common/third_party/tinyxml2/tinyxml2.h" #include "../common/tlm2_base_protocol_checker.h" - -struct DramSetup -{ - DramSetup():memspec(NULL),mcconfig(NULL),simconfig(NULL),addressmapping(NULL), thermalsimconfig(NULL) {} - DramSetup(tinyxml2::XMLElement* memspec, tinyxml2::XMLElement* mcconfig, tinyxml2::XMLElement* simconfig, tinyxml2::XMLElement* addressmapping, tinyxml2::XMLElement *tsc) - : memspec(memspec), mcconfig(mcconfig), simconfig(simconfig), addressmapping(addressmapping), thermalsimconfig(tsc) {} - tinyxml2::XMLElement* memspec; - tinyxml2::XMLElement* mcconfig; - tinyxml2::XMLElement* simconfig; - tinyxml2::XMLElement* addressmapping; - tinyxml2::XMLElement* thermalsimconfig; -}; - -struct Device -{ - Device():trace("empty.stl"), burstLength(0){} - Device(std::string trace, unsigned int clkMhz, unsigned int burstLength = 8) : trace(trace), clkMhz (clkMhz), burstLength(burstLength) - { - } - std::string trace; - unsigned int clkMhz; - unsigned int burstLength; -}; - -class Simulation: public sc_module +class DRAMSys: public sc_module { public: - tlm_utils::multi_passthrough_target_socket tSocket; + tlm_utils::multi_passthrough_target_socket tSocket; sc_event terminateSimulation; - SC_HAS_PROCESS(Simulation); - Simulation(sc_module_name name, string pathToResources, string traceName, DramSetup setup, - std::vector devices); - ~Simulation(); + SC_HAS_PROCESS(DRAMSys); + DRAMSys(sc_module_name name, + string simulationToRun, + string pathToResources); - void stop(); + ~DRAMSys(); + + void logo(); private: + std::string traceName; - DramSetup dramSetup; + //DramSetup setup; //TLM 2.0 Protocol Checkers - std::vector*> controllersTlmCheckers; + std::vector*> + controllersTlmCheckers; // All transactions pass through the same arbiter Arbiter *arbiter; + // Each DRAM unit has a controller std::vector controllers; + // TODO: Each DRAM has a reorder buffer (check this!) ReorderBuffer *reorder; + // DRAM units std::vector drams; - // Transaction Recorders (one per channel). They generate the output databases. + + // Transaction Recorders (one per channel). + // They generate the output databases. std::vector tlmRecorders; void report(std::string message); - void setupTlmRecorders(const string &traceName, const string &pathToResources, const std::vector &devices); - void instantiateModules(const string &traceName, const string &pathToResources, const std::vector &devices); + void setupTlmRecorders(const string &traceName, + const string &pathToResources); + void instantiateModules(const string &traceName, + const string &pathToResources); void bindSockets(); void setupDebugManager(const string &traceName); }; diff --git a/DRAMSys/simulator/src/simulation/Dram.h b/DRAMSys/simulator/src/simulation/Dram.h index b9f74722..a5254d97 100644 --- a/DRAMSys/simulator/src/simulation/Dram.h +++ b/DRAMSys/simulator/src/simulation/Dram.h @@ -41,8 +41,8 @@ #define DRAM_H_ #include -#include -#include +#include +#include #include #include #include @@ -92,6 +92,9 @@ struct Dram : sc_module SC_CTOR(Dram) : tSocket("socket") { + dramController = NULL; + tlmRecorder = NULL; + std::uint64_t memorySize = Configuration::getInstance().getSimMemSizeInBytes(); // allocate and model storage of one DRAM channel using memory map memory = (unsigned char *)mmap(NULL, memorySize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, -1, 0); @@ -194,8 +197,6 @@ struct Dram : sc_module firstAccess = SC_ZERO_TIME; lastAccess = SC_ZERO_TIME; - printDebugMessage(string("StorageMode: ") + EnumToString(StoreMode)); - // For each bank in a channel a error Model is created: if(StoreMode == StorageMode::ErrorModel) { @@ -212,39 +213,85 @@ struct Dram : sc_module } } + virtual void end_of_simulation() + { + } + ~Dram() { - if (powerAnalysis == true) { - // Obtain the residual energy which was not covered by previous windows + if (powerAnalysis == true) + { + // Obtain the residual energy which was not covered by + // previous windows DRAMPower->calcEnergy(); - tlmRecorder->recordPower(sc_time_stamp().to_seconds(), DRAMPower->getPower().window_average_power * Configuration::getInstance().NumberOfDevicesOnDIMM); + tlmRecorder->recordPower(sc_time_stamp().to_seconds(), + DRAMPower->getPower().window_average_power + * Configuration::getInstance().NumberOfDevicesOnDIMM); - // Print the final total energy and the average power for the simulation - cout << name() << string("\tTotal Energy: \t") << fixed <getEnergy().total_energy * Configuration::getInstance().NumberOfDevicesOnDIMM << string(" pJ") << endl; - cout << name() << string("\tAverage Power: \t") << fixed <getPower().average_power * Configuration::getInstance().NumberOfDevicesOnDIMM<< string(" mW") << endl; + // Print the final total energy and the average power for + // the simulation: + cout << name() << string(" Total Energy: ") + << fixed <getEnergy().total_energy + * Configuration::getInstance().NumberOfDevicesOnDIMM + << string(" pJ") + << endl; + + cout << name() << string(" Average Power: ") + << fixed <getPower().average_power + * Configuration::getInstance().NumberOfDevicesOnDIMM + << string(" mW") << endl; } // Bandwidth: - sc_time activeTime = numberOfTransactionsServed * Configuration::getInstance().memSpec.BurstLength / Configuration::getInstance().memSpec.DataRate * Configuration::getInstance().memSpec.clk; + sc_time activeTime = numberOfTransactionsServed + * Configuration::getInstance().memSpec.BurstLength + / Configuration::getInstance().memSpec.DataRate + * Configuration::getInstance().memSpec.clk; + sc_time idleTime = dramController->getIdleTime(); sc_time endTime = dramController->getEndTime(); sc_time startTime = dramController->getStartTime(); + double bandwidth = (activeTime/(endTime-startTime)*100); double bandwidth_IDLE = ((activeTime)/(endTime-startTime-idleTime)*100); - // | clk in Mhz e.g. 800 [MHz] | * | DataRate e.g. 2 | * | BusWidth e.g. 8 | * | Number of devices on a DIMM e.g. 8 | / | 1024 | - double maxBandwidth = ( (1000000/Configuration::getInstance().memSpec.clk.to_double()) * Configuration::getInstance().memSpec.DataRate * Configuration::getInstance().memSpec.bitWidth * Configuration::getInstance().NumberOfDevicesOnDIMM ) / ( 1024 ); - cout << name() << string("\tTotal Time: \t") <<(endTime-startTime).to_string() << endl; - //cout << name() << string("\tTotal IDLE: \t") <closeConnection(); } // When working with floats, we have to decide ourselves what is an @@ -346,8 +393,9 @@ struct Dram : sc_module } else if (phase == BEGIN_WR) { - +#if !defined (DRAMSYS_PCT) && !defined (DRAMSYS_GEM5) assert(payload.get_data_length() == bytesPerBurst); +#endif if(powerAnalysis == true){DRAMPower->doCommand(MemCommand::WR, bank, cycle);} numberOfTransactionsServed++; @@ -370,7 +418,9 @@ struct Dram : sc_module } else if (phase == BEGIN_RD) { +#if !defined (DRAMSYS_PCT) && !defined (DRAMSYS_GEM5) assert(payload.get_data_length() == bytesPerBurst); +#endif numberOfTransactionsServed++; if(powerAnalysis == true){DRAMPower->doCommand(MemCommand::RD, bank, cycle);} @@ -400,7 +450,6 @@ struct Dram : sc_module } else if (StoreMode == StorageMode::Store) // Use Storage { - unsigned char *phyAddr = memory + payload.get_address(); memcpy(phyAddr, payload.get_data_ptr(), payload.get_data_length()); } @@ -505,12 +554,8 @@ struct Dram : sc_module virtual unsigned int transport_dbg(tlm::tlm_generic_payload& trans) { - printDebugMessage("transport_dgb"); - // FIXME: maybe the initiator wants to write more than burst size at once - assert(trans.get_data_length() == bytesPerBurst); - // TODO: This part is not tested yet, neither with traceplayers neither with GEM5 coupling if (StoreMode == StorageMode::NoStorage) { @@ -524,7 +569,7 @@ struct Dram : sc_module unsigned int len = trans.get_data_length(); //unsigned int bank = DramExtension::getExtension(trans).getBank().ID(); - cout << "cmd " << (cmd ? "write" : "read") << " adr " << hex << adr << " len " << len << endl; + //cout << "cmd " << (cmd ? "write" : "read") << " adr " << hex << adr << " len " << len << endl; if ( cmd == tlm::TLM_READ_COMMAND ) { diff --git a/DRAMSys/simulator/src/simulation/Setup.cpp b/DRAMSys/simulator/src/simulation/Setup.cpp new file mode 100644 index 00000000..53d0eb8d --- /dev/null +++ b/DRAMSys/simulator/src/simulation/Setup.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2017, 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: + * Matthias Jung + */ + +#include "Setup.h" + +Setup::Setup(std::string uri, + std::string & memspec, + std::string & mcconfig, + std::string & amconfig, + std::string & simconfig, + std::string & thermalconfig) +{ + // Load Simulation: + tinyxml2::XMLDocument simulationdoc; + loadXML(uri, simulationdoc); + + tinyxml2::XMLElement* simulation = + simulationdoc.FirstChildElement("simulation"); + + std::string xmlNodeName(simulation->Name()); + if( xmlNodeName != "simulation") + reportFatal("SimulationManager", + "Cannot load simulation: simulation node expected"); + + // Load all sub-configuration XML files: + tinyxml2::XMLElement* s; + + s = simulation->FirstChildElement("memspec"); + memspec = s->Attribute("src"); + + s = simulation->FirstChildElement("mcconfig"); + mcconfig = s->Attribute("src"); + + s = simulation->FirstChildElement("addressmapping"); + amconfig = s->Attribute("src"); + + s = simulation->FirstChildElement("simconfig"); + simconfig = s->Attribute("src"); + + s = simulation->FirstChildElement("thermalconfig"); + thermalconfig = s->Attribute("src"); + +} diff --git a/DRAMSys/simulator/src/simulation/Setup.h b/DRAMSys/simulator/src/simulation/Setup.h new file mode 100644 index 00000000..88ca5c41 --- /dev/null +++ b/DRAMSys/simulator/src/simulation/Setup.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017, 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: + * Matthias Jung + */ + +#ifndef SETUP_H +#define SETUP_H + +#include +#include + +#include "../common/Utils.h" +#include "TracePlayer.h" +#include "StlPlayer.h" + + +class Setup +{ +public: + Setup(std::string uri, + std::string & memspec, + std::string & mcconfig, + std::string & amconfig, + std::string & simconfig, + std::string & thermalconfig); +}; + +#endif // SETUP_H diff --git a/DRAMSys/simulator/src/simulation/Simulation.cpp b/DRAMSys/simulator/src/simulation/Simulation.cpp deleted file mode 100644 index eae30c9a..00000000 --- a/DRAMSys/simulator/src/simulation/Simulation.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) 2015, 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: - * Janik Schlemminger - * Matthias Jung - * Eder F. Zulian - * Felipe S. Prado - */ - -#include -#include -#include -#include - -#include "Simulation.h" -#include "../common/TlmRecorder.h" -#include "../common/DebugManager.h" -#include "../common/xmlAddressdecoder.h" -#include "../controller/core/ControllerCore.h" -#include "../controller/core/configuration/ConfigurationLoader.h" -#include "../common/Utils.h" -#include "../simulation/TemperatureController.h" -#include "../controller/Controller.h" - -using namespace std; - -Simulation::Simulation(sc_module_name __attribute__((unused)) name, string pathToResources, string traceName, DramSetup setup, - std::vector devices) : traceName(traceName), dramSetup(setup) -{ - SC_THREAD(stop); - - // XXX: The xmlAddressDecoder MUST be initialized before calling the - // ConfigurationLoader because some information from the xmlAddressDecoder - // is needed to assure the coherence of the configuration. - xmlAddressDecoder::Initialize(setup.addressmapping); - xmlAddressDecoder::getInstance().print(); - - ConfigurationLoader::loadMCConfig(Configuration::getInstance(), setup.mcconfig); - ConfigurationLoader::loadMemSpec(Configuration::getInstance(), setup.memspec); - ConfigurationLoader::loadSimConfig(Configuration::getInstance(), setup.simconfig); - ConfigurationLoader::loadTemperatureSimConfig(Configuration::getInstance(), setup.thermalsimconfig); - - instantiateModules(traceName, pathToResources, devices); - bindSockets(); - setupDebugManager(traceName); -} - -void Simulation::setupDebugManager(const string& traceName) -{ - auto& dbg = DebugManager::getInstance(); - dbg.writeToConsole = true; - dbg.writeToFile = true; - if(dbg.writeToFile) - dbg.openDebugFile(traceName + ".txt"); -} - -void Simulation::setupTlmRecorders(const string &traceName, const string &pathToResources, const std::vector &devices) -{ - // Create TLM Recorders, one per channel. - for (size_t i = 0; i < Configuration::getInstance().NumberOfMemChannels; i++) { - std::string sqlScriptURI = pathToResources + string("scripts/createTraceDB.sql"); - std::string dbName = traceName + string("_channel") + std::to_string(i) + ".tdb"; - std::string recorderName = "tlmRecorder" + std::to_string(i); - TlmRecorder *tlmRecorder = new TlmRecorder(recorderName.c_str(), sqlScriptURI.c_str(), dbName.c_str(), Configuration::getInstance().DatabaseRecording); - - tlmRecorder->recordMCconfig(Configuration::getInstance().mcconfigUri); - tlmRecorder->recordMemspec(Configuration::getInstance().memspecUri); - - tlmRecorders.push_back(tlmRecorder); - - std::string traceNames; - for (size_t i = 0; i < devices.size(); i++) { - traceNames.append(devices[i].trace); - if (i == devices.size() - 1) - continue; - traceNames.append(","); - } - tlmRecorder->recordTracenames(traceNames); - } -} - -void Simulation::instantiateModules(const string &traceName, const string &pathToResources, const std::vector &devices) -{ - // The first call to getInstance() creates the Temperature Controller. - // The same instance will be accessed by all other modules. - TemperatureController::getInstance(); - - // Create and properly initialize TLM recorders. They need to be ready before creating some modules. - setupTlmRecorders(traceName, pathToResources, devices); - - arbiter = new Arbiter("arbiter"); - arbiter->setTlmRecorders(tlmRecorders); - - - for (size_t i = 0; i < Configuration::getInstance().NumberOfMemChannels; i++) { - std::string str = "controller" + std::to_string(i); - Controller *controller = new Controller(str.c_str(), tlmRecorders[i]); - controllers.push_back(controller); - - str = "dram" + std::to_string(i); - Dram *dram = new Dram(str.c_str()); - 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() -{ - tSocket.bind(arbiter->tSocket); - if(Configuration::getInstance().CheckTLM2Protocol) { - - 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 (size_t i = 0; i < Configuration::getInstance().NumberOfMemChannels; i++) { - arbiter->iSocket.bind(controllers[i]->tSocket); - controllers[i]->iSocket.bind(drams[i]->tSocket); - } - } -} - -Simulation::~Simulation() -{ - - delete arbiter; - - for (auto controller : controllers) { - delete controller; - } - - for (auto dram : drams) { - delete dram; - } - - for (auto rec : tlmRecorders) { - delete rec; - } - - for (auto tlmChecker : controllersTlmCheckers) { - delete tlmChecker; - } -} - - -void Simulation::stop() -{ - wait(terminateSimulation); - - unsigned int pending_payloads = 0; - do { - pending_payloads = 0; - for (auto controller : controllers) { - pending_payloads += controller->getTotalNumberOfPayloadsInSystem(); - } - wait(sc_time(200, SC_NS)); - } while(pending_payloads != 0); - - for (auto controller : controllers) { - controller->terminateSimulation(); - } - wait(sc_time(200, SC_NS)); - for (auto rec : tlmRecorders) { - rec->closeConnection(); - } - sc_stop(); -} - - -void Simulation::report(string message) -{ - DebugManager::getInstance().printDebugMessage(this->name(), message); - cout << message << endl; -} diff --git a/DRAMSys/simulator/src/simulation/SimulationManager.cpp b/DRAMSys/simulator/src/simulation/SimulationManager.cpp deleted file mode 100644 index a3494667..00000000 --- a/DRAMSys/simulator/src/simulation/SimulationManager.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright (c) 2015, 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: - * Janik Schlemminger - * Matthias Jung - * Eder F. Zulian - */ - -#include -#include - -#include "SimulationManager.h" -#include "../common/Utils.h" - -using namespace std; -using namespace tinyxml2; - -SimulationManager::SimulationManager(string resources) : resources(resources) -{ -} - -SimulationManager::~SimulationManager() -{ - for (auto player : players) { - delete player; - } -#if USE_EXAMPLE_INITIATOR - delete init; - delete exampleInitiatorTlmChecker; -#endif - - for (auto tlmChecker : playersTlmCheckers) { - delete tlmChecker; - } -} - -void SimulationManager::loadSimulationsFromXML(string uri) -{ - cout << "\n\nload simulation-batch:" << endl; - cout << headline << endl; - - exportPath = getFileName(uri); - loadXML(uri, simulationdoc); - - cout << "\t-> parsing simulation objects .." << endl; - - XMLElement* simulation = simulationdoc.FirstChildElement("simulation"); - string xmlNodeName(simulation->Name()); - if( xmlNodeName != "simulation") - reportFatal("SimulationManager", "simulation node expected"); - parseSimulationBatch(simulation); - - cout << "\t-> simulation batches loaded successfully!\n" << endl; - - for (auto batch : simulationBatches) - { - batch.print(); - } -} - -void SimulationManager::runSimulations() -{ - for (auto& batch : simulationBatches) - { - boost::filesystem::path dir(exportPath); - boost::filesystem::create_directories(dir); - - for (auto& dramSetup : batch.dramSetups) - { - for (auto& traceSetup : batch.traceSetups) - { - string exportname = exportPath + "/" + traceSetup.first; - instantiateModules(exportname, dramSetup, traceSetup.second); - bindSockets(); - runSimulation(exportname); - } - } - } -} - -void SimulationManager::parseSimulationBatch(XMLElement* simulation) -{ - SimulationBatch batch; - - XMLElement* simconfig = simulation->FirstChildElement("simconfig"); - - XMLElement *thermalsimconfig = simulation->FirstChildElement("thermalsimconfig"); - - XMLElement* memspecs = simulation->FirstChildElement("memspecs"); - if(memspecs == NULL) memspecs = simulation; - - XMLElement* addressmappings = simulation->FirstChildElement("addressmappings"); - if(addressmappings == NULL) addressmappings = simulation; - - XMLElement* mcconfigs = simulation->FirstChildElement("mcconfigs"); - if(mcconfigs == NULL) mcconfigs = simulation; - - for (XMLElement* memspec = memspecs->FirstChildElement("memspec"); memspec != NULL; - memspec = memspec->NextSiblingElement("memspec")) - { - - for (XMLElement* addressmapping = addressmappings->FirstChildElement("addressmapping"); addressmapping != NULL; - addressmapping = addressmapping->NextSiblingElement("addressmapping")) - { - - for (XMLElement* mcconfig = mcconfigs->FirstChildElement("mcconfig"); - mcconfig != NULL; mcconfig = mcconfig->NextSiblingElement("mcconfig")) - { - batch.dramSetups.push_back(DramSetup(memspec, mcconfig, simconfig, addressmapping, thermalsimconfig)); - } - } - } - - addTraceSetups(batch, simulation); - - simulationBatches.push_back(batch); -} - -void SimulationManager::instantiateModules(string traceName, DramSetup dramSetup, vector traceSetup) -{ - - simulation = new Simulation("sim", resources, traceName, dramSetup, traceSetup); - -#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); - TracePlayer *player; - sc_time playerClk; - - // The clock frequency for the player can be specified in the - // configuration file like in the example below (200 MHz): - // - // - // - // chstone-adpcm_32.stl - // - // - // - // If it is not specified in the configuration, the player will be - // configured to use the memory clock frequency got from the memory - // specs. - if (traceSetup[i].clkMhz == 0) - playerClk = Configuration::getInstance().memSpec.clk; - else - playerClk = FrequencyToClk(traceSetup[i].clkMhz); - const string pathToResources = resources; - player = new StlPlayer(playerStr.c_str(), pathToResources + string("traces/") + traceSetup[i].trace, playerClk, this); - if(Configuration::getInstance().SimulationProgressBar) - { - totalTransactions += player->getNumberOfLines(pathToResources + string("traces/") + traceSetup[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 */ -} - -void SimulationManager::bindSockets() -{ -#if USE_EXAMPLE_INITIATOR - if(Configuration::getInstance().CheckTLM2Protocol) { - init->socket.bind(exampleInitiatorTlmChecker->target_socket); - exampleInitiatorTlmChecker->initiator_socket.bind(simulation->tSocket); - - } - else { - init->socket.bind(simulation->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(simulation->tSocket); - } - - } - else { - for (auto player : players) { - player->iSocket.bind(simulation->tSocket); - } - -#endif - } -} - -void SimulationManager::runSimulation(string traceName) -{ - report("\n\nStarting simulation:"); - report(headline); - report(" -> setup: \t\t" + getFileName(traceName)); - report(" -> memspec: \t\t" + Configuration::getInstance().memSpec.MemoryId); - cout << endl; - simStartTime = clock(); - - for (auto player : players) { - player->nextPayload(); - } - - sc_set_stop_mode(SC_STOP_FINISH_DELTA); - sc_start(); - double elapsed_secs = double(clock() - simStartTime) / CLOCKS_PER_SEC; - report("\nSimulation took " + to_string(elapsed_secs) + " seconds\n"); - delete simulation; -} - -void SimulationManager::startTraceAnalyzer() -{ - string p = getenv("trace"); - string run_tpr = p + " -f "; - run_tpr += "&"; - system(run_tpr.c_str()); -} - -void SimulationManager::addTraceSetups(SimulationBatch &batch, tinyxml2::XMLElement *simulation) -{ - vector devices; - XMLElement *tracesetups = simulation->FirstChildElement("tracesetups"); - XMLElement *simconfig = simulation->FirstChildElement("simconfig"); - unsigned int numberOfTracePlayers = 1; - XMLElement *ntp = simconfig->FirstChildElement("NumberOfTracePlayers"); - if (ntp != NULL) - ntp->QueryUnsignedAttribute("value", &numberOfTracePlayers); - - for (XMLElement *tracesetup = tracesetups->FirstChildElement("tracesetup"); tracesetup != NULL; tracesetup = tracesetup->NextSiblingElement("tracesetup")) { - for (XMLElement *device = tracesetup->FirstChildElement("device"); device != NULL; device = device->NextSiblingElement("device")) { - devices.push_back(Device(device->GetText(), device->IntAttribute("clkMhz"), device->IntAttribute("bl"))); - } - - // This step is done here to add a default device in case the user haven't specified a trace file to be executed by one or more trace players. - while (devices.size() < numberOfTracePlayers) { - devices.push_back(Device()); - } - - batch.traceSetups.emplace(tracesetup->Attribute("id"), devices); - devices.clear(); - } -} - -void inline SimulationManager::tracePlayerTerminates() -{ - static unsigned int finishedTracePlayers = 0; - finishedTracePlayers++; - - if (finishedTracePlayers == Configuration::getInstance().NumberOfTracePlayers) - simulation->terminateSimulation.notify(); -} -void inline SimulationManager::transactionFinished() -{ - remainingTransactions--; - loadbar(totalTransactions - remainingTransactions, totalTransactions); - if (remainingTransactions == 0) - { - cout << endl; - } -} -void SimulationManager::report(string message) -{ - cout << message << endl; -} - -void SimulationBatch::print() -{ - for (auto& s : traceSetups) - { - cout << "trace-setup " + s.first + ":\n"; - for (Device d : s.second) - cout << "\t(" << d.burstLength << ") " << d.trace << ";" << endl; - cout << endl; - } -} diff --git a/DRAMSys/simulator/src/simulation/StlPlayer.cpp b/DRAMSys/simulator/src/simulation/StlPlayer.cpp index 2ed2dd5f..75817aba 100644 --- a/DRAMSys/simulator/src/simulation/StlPlayer.cpp +++ b/DRAMSys/simulator/src/simulation/StlPlayer.cpp @@ -39,7 +39,12 @@ #include "StlPlayer.h" -StlPlayer::StlPlayer(sc_module_name, string pathToTrace, sc_time playerClk, TracePlayerListener *listener) : TracePlayer(listener), file(pathToTrace) +StlPlayer::StlPlayer(sc_module_name, + string pathToTrace, + sc_time playerClk, + TracePlayerListener *listener) : + TracePlayer(listener), + file(pathToTrace) { if (!file.is_open()) SC_REPORT_FATAL(0, (string("Could not open trace ") + pathToTrace).c_str()); @@ -62,11 +67,16 @@ void StlPlayer::nextPayload() line.clear(); } - if (!file) { + if (!file) + { // The file is empty. Nothing more to do. - this->terminate(); + this->finish(); return; } + else + { + numberOfTransactions++; + } // Allocate a generic payload for this request. gp *payload = this->allocatePayload(); diff --git a/DRAMSys/simulator/src/simulation/StlPlayer.h b/DRAMSys/simulator/src/simulation/StlPlayer.h index b27463bc..a3b12ec4 100644 --- a/DRAMSys/simulator/src/simulation/StlPlayer.h +++ b/DRAMSys/simulator/src/simulation/StlPlayer.h @@ -49,7 +49,10 @@ using namespace tlm; struct StlPlayer: public TracePlayer { public: - StlPlayer(sc_module_name /*name*/, string pathToTrace, sc_time playerClk, TracePlayerListener *listener); + StlPlayer(sc_module_name /*name*/, + string pathToTrace, + sc_time playerClk, + TracePlayerListener *listener); void nextPayload(); diff --git a/DRAMSys/simulator/src/simulation/TraceGenerator.h b/DRAMSys/simulator/src/simulation/TraceGenerator.h index 4e727713..13c2ed72 100644 --- a/DRAMSys/simulator/src/simulation/TraceGenerator.h +++ b/DRAMSys/simulator/src/simulation/TraceGenerator.h @@ -60,25 +60,25 @@ public: virtual void nextPayload() override { - if(transCounter >= 1000) // TODO set limit! - { - this->terminate(); - } + if(transCounter >= 1000) // TODO set limit! + { + this->terminate(); + } - gp* payload = this->allocatePayload(); + gp* payload = this->allocatePayload(); - unsigned char * dataElement = new unsigned char[16]; // TODO: column / burst breite + unsigned char * dataElement = new unsigned char[16]; // TODO: column / burst breite - payload->set_address(0x0); - payload->set_response_status(TLM_INCOMPLETE_RESPONSE); - payload->set_dmi_allowed(false); - payload->set_byte_enable_length(0); - payload->set_streaming_width(this->burstlenght); - payload->set_data_ptr(dataElement); - payload->set_data_length(16); - payload->set_command(TLM_READ_COMMAND); - transCounter++; - this->payloadEventQueue.notify(*payload, BEGIN_REQ, SC_ZERO_TIME); + payload->set_address(0x0); + payload->set_response_status(TLM_INCOMPLETE_RESPONSE); + payload->set_dmi_allowed(false); + payload->set_byte_enable_length(0); + payload->set_streaming_width(this->burstlenght); + payload->set_data_ptr(dataElement); + payload->set_data_length(16); + payload->set_command(TLM_READ_COMMAND); + transCounter++; + this->payloadEventQueue.notify(*payload, BEGIN_REQ, SC_ZERO_TIME); } private: diff --git a/DRAMSys/simulator/src/simulation/TracePlayer.cpp b/DRAMSys/simulator/src/simulation/TracePlayer.cpp index 8965f4a0..d9dfc008 100644 --- a/DRAMSys/simulator/src/simulation/TracePlayer.cpp +++ b/DRAMSys/simulator/src/simulation/TracePlayer.cpp @@ -39,7 +39,12 @@ #include "TracePlayer.h" TracePlayer::TracePlayer(TracePlayerListener* listener) : - payloadEventQueue(this, &TracePlayer::peqCallback), transactionsSent(0), listener(listener) + payloadEventQueue(this, &TracePlayer::peqCallback), + transactionsSent(0), + transactionsReceived(0), + listener(listener), + numberOfTransactions(0), + finished(false) { iSocket.register_nb_transport_bw(this, &TracePlayer::nb_transport_bw); } @@ -49,6 +54,11 @@ gp *TracePlayer::allocatePayload() return memoryManager.allocate(); } +void TracePlayer::finish() +{ + finished = true; +} + void TracePlayer::terminate() { cout << sc_time_stamp() << " " << this->name() << " terminated " << std::endl; @@ -87,6 +97,14 @@ void TracePlayer::peqCallback(tlm_generic_payload &payload, const tlm_phase &pha payload.release(); if(Configuration::getInstance().SimulationProgressBar) listener->transactionFinished(); + + transactionsReceived++; + + // If all answers were received: + if(finished == true && numberOfTransactions == transactionsReceived) + { + this->terminate(); + } } else if (phase == END_RESP) { @@ -97,6 +115,11 @@ void TracePlayer::peqCallback(tlm_generic_payload &payload, const tlm_phase &pha } } +void TracePlayer::setNumberOfTransactions(unsigned int n) +{ + numberOfTransactions = n; +} + unsigned int TracePlayer::getNumberOfLines(string pathToTrace) { ifstream newFile; diff --git a/DRAMSys/simulator/src/simulation/TracePlayer.h b/DRAMSys/simulator/src/simulation/TracePlayer.h index 6d5fccd9..6a022f5e 100644 --- a/DRAMSys/simulator/src/simulation/TracePlayer.h +++ b/DRAMSys/simulator/src/simulation/TracePlayer.h @@ -67,8 +67,11 @@ public: protected: gp* allocatePayload(); tlm_utils::peq_with_cb_and_phase payloadEventQueue; + void finish(); void terminate(); void printDebugMessage(std::string message); + void setNumberOfTransactions(unsigned int n); + unsigned int numberOfTransactions; private: tlm_sync_enum nb_transport_bw(tlm_generic_payload& payload, tlm_phase& phase, sc_time& bwDelay); @@ -81,7 +84,9 @@ private: } MemoryManager memoryManager; unsigned int transactionsSent; + unsigned int transactionsReceived; TracePlayerListener* listener; + bool finished; }; #endif /* TRACEPLAYER_H_ */ diff --git a/DRAMSys/simulator/src/simulation/TraceSetup.cpp b/DRAMSys/simulator/src/simulation/TraceSetup.cpp new file mode 100644 index 00000000..951b6360 --- /dev/null +++ b/DRAMSys/simulator/src/simulation/TraceSetup.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2017, 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: + * Matthias Jung + */ + +#include "TraceSetup.h" + +traceSetup::traceSetup(std::string uri, + std::string pathToResources, + std::vector * devices) +{ + // Load Simulation: + tinyxml2::XMLDocument simulationdoc; + loadXML(uri, simulationdoc); + + tinyxml2::XMLElement* simulation = + simulationdoc.FirstChildElement("simulation"); + + std::string xmlNodeName(simulation->Name()); + if( xmlNodeName != "simulation") + reportFatal("traceSetup", + "Cannot load simulation: simulation node expected"); + + // Load TracePlayers: + tinyxml2::XMLElement *tracesetup = + simulation->FirstChildElement("tracesetup"); + + for (tinyxml2::XMLElement *device = + tracesetup->FirstChildElement("device"); + device != NULL; + device = device->NextSiblingElement("device")) + { + sc_time playerClk; + unsigned int frequency = device->IntAttribute("clkMhz"); + + if (frequency == 0) + { + reportFatal("traceSetup","No Frequency Defined"); + } + else + { + playerClk = FrequencyToClk(frequency); + } + + std::string name = device->GetText(); + std::string stlFile = pathToResources + string("traces/") + name; + std::string moduleName = name; + + // replace all '.' to '_' + std::replace( moduleName.begin(), moduleName.end(), '.', '_'); + + StlPlayer * player = new StlPlayer(moduleName.c_str(), + stlFile, + playerClk, + this); + + devices->push_back(player); + + if(Configuration::getInstance().SimulationProgressBar) + { + totalTransactions += player->getNumberOfLines(stlFile); + } + } + + remainingTransactions = totalTransactions; + NumberOfTracePlayers = devices->size(); +} + +void traceSetup::tracePlayerTerminates() +{ + finishedTracePlayers++; + + if (finishedTracePlayers == NumberOfTracePlayers) + { + sc_stop(); + } +} +void traceSetup::transactionFinished() +{ + remainingTransactions--; + + loadbar(totalTransactions - remainingTransactions, totalTransactions); + + if (remainingTransactions == 0) + { + cout << endl; + } +} diff --git a/DRAMSys/simulator/src/simulation/SimulationManager.h b/DRAMSys/simulator/src/simulation/TraceSetup.h similarity index 50% rename from DRAMSys/simulator/src/simulation/SimulationManager.h rename to DRAMSys/simulator/src/simulation/TraceSetup.h index 54f564e6..a9f0b8e5 100644 --- a/DRAMSys/simulator/src/simulation/SimulationManager.h +++ b/DRAMSys/simulator/src/simulation/TraceSetup.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, University of Kaiserslautern + * Copyright (c) 2017, University of Kaiserslautern * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,80 +30,35 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: - * Janik Schlemminger * Matthias Jung - * Eder F. Zulian */ -#ifndef SIMULATIONMANAGER_H_ -#define SIMULATIONMANAGER_H_ +#ifndef TRACESETUP_H +#define TRACESETUP_H #include #include -#include -#include "Simulation.h" + +#include "../common/Utils.h" #include "TracePlayer.h" #include "StlPlayer.h" -#include "../controller/core/configuration/ConfigurationLoader.h" -#include "../common/third_party/tinyxml2/tinyxml2.h" -#include "ExampleInitiator.h" -#include "../common/tlm2_base_protocol_checker.h" -#define USE_EXAMPLE_INITIATOR 0 -struct SimulationBatch -{ - std::vector dramSetups; - std::map> traceSetups; - void print(); -}; - -class SimulationManager: public TracePlayerListener +class traceSetup : public TracePlayerListener { public: - SimulationManager(std::string resources); - ~SimulationManager(); - - void loadSimulationsFromXML(std::string uri); - - void runSimulations(); - void startTraceAnalyzer(); + traceSetup(std::string uri, + std::string pathToResources, + std::vector * devices); virtual void tracePlayerTerminates() override; virtual void transactionFinished() override; private: - std::string resources; - std::string exportPath; - std::string basePath; - - tinyxml2::XMLDocument simulationdoc; - - std::vector simulationBatches; - - // A vector of pointers to all trace player (devices which acquire the bus - // and initiate transactions targeting the memory) - std::vector players; - Simulation* simulation; - clock_t simStartTime; - //TLM 2.0 Protocol Checkers - std::vector*> playersTlmCheckers; - + unsigned int NumberOfTracePlayers; unsigned int totalTransactions = 0; unsigned int remainingTransactions; - -#if USE_EXAMPLE_INITIATOR - ExampleInitiator *init; - tlm_utils::tlm2_base_protocol_checker<>* exampleInitiatorTlmChecker; -#endif - void instantiateModules(std::string traceName, DramSetup dramSetup, std::vector traceSetup); - void bindSockets(); - void runSimulation(string traceName); - void parseSimulationBatch(tinyxml2::XMLElement* simulation); - void addTraceSetups(SimulationBatch &batch, tinyxml2::XMLElement *element); - - void report(std::string message); - + unsigned int finishedTracePlayers = 0; }; -#endif /* SIMULATIONMANAGER_H_ */ +#endif // TRACESETUP_H diff --git a/DRAMSys/simulator/src/simulation/main.cpp b/DRAMSys/simulator/src/simulation/main.cpp index 87a8d27a..18e00f77 100644 --- a/DRAMSys/simulator/src/simulation/main.cpp +++ b/DRAMSys/simulator/src/simulation/main.cpp @@ -40,7 +40,8 @@ #include #include -#include "SimulationManager.h" +#include "DRAMSys.h" +#include "TraceSetup.h" using namespace std; @@ -56,43 +57,53 @@ int main(int argc, char **argv) return sc_main(argc, argv); } - -void logo() -{ -#define REDTXT(s) string(("\033[0;31m"+string((s))+"\033[0m")) -#define BOLDBLUETXT(s) string(("\033[1;34m"+string((s))+"\033[0m")) - cout << endl; - cout << REDTXT(" |||") << endl; - cout << REDTXT(" +---+ Microelectronic Systems") << endl; - cout << REDTXT("=| |= Design Research Group") << endl; - cout << REDTXT("=| |= ") << BOLDBLUETXT("University of Kaiserslautern") << endl; - cout << REDTXT(" +---+ ") << endl; - cout << REDTXT(" ||| ") << "DRAMSys - Approximately-Timed TLM Models for DDR and Wide I/0 DRAM -" << endl; - cout << endl; -#undef REDTXT -#undef BOLDBLUETXT -} - int sc_main(int argc, char **argv) { sc_set_time_resolution(1, SC_PS); - resources = pathOfFile(argv[0]) + string("/../../DRAMSys/simulator/resources/"); - cout << "Resources directory is " << resources << endl; - string simulationToRun; + // Get path of resources: + resources = pathOfFile(argv[0]) + + string("/../../DRAMSys/simulator/resources/"); + + string SimulationXML; if(argc > 1) - simulationToRun = argv[1]; + { + SimulationXML = argv[1]; + } else - simulationToRun = resources + "simulations/sms-example.xml"; - cout << "Simulation file is " << simulationToRun << endl; + { + SimulationXML = resources + "simulations/ddr3-example.xml"; + } - SimulationManager manager(resources); + std::vector players; - logo(); - cout << "Simulation file: \"" << simulationToRun << "\""; - manager.loadSimulationsFromXML(simulationToRun); - manager.runSimulations(); + // Instantiate DRAMSys: + DRAMSys dramSys("DRAMSys", SimulationXML, resources); + + // Instantiate STL Players: + traceSetup(SimulationXML, resources, &players); + + // Bind STL Players with DRAMSys: + for(auto& p : players) + { + p->iSocket.bind(dramSys.tSocket); + } + + // Store the starting of the simulation in wallclock time: + clock_t simStartTime = clock(); + + // Kickstart the players: + for (auto& p : players) + { + p->nextPayload(); + } + + // Start SystemC Simulation: + sc_set_stop_mode(SC_STOP_FINISH_DELTA); + sc_start(); + + double elapsed_secs = double(clock() - simStartTime) / CLOCKS_PER_SEC; + cout << "Simulation took " + to_string(elapsed_secs) + " seconds" << endl; return 0; } - diff --git a/DRAMSys/tests/TLM_compliance/test.pl b/DRAMSys/tests/TLM_compliance/test.pl index ac6a4d73..6aafa38f 100644 --- a/DRAMSys/tests/TLM_compliance/test.pl +++ b/DRAMSys/tests/TLM_compliance/test.pl @@ -64,7 +64,7 @@ chomp $storeModeLine; system("sed -i.bu '" . $storeModeLine . "s^.*^ ^' ../../DRAMSys/tests/TLM_compliance/fifoStrict.xml"); -`./dramSys ../../DRAMSys/tests/TLM_compliance/sim-batch.xml &> ../../DRAMSys/tests/TLM_compliance/output.txt`; +`./DRAMSys ../../DRAMSys/tests/TLM_compliance/sim-batch.xml &> ../../DRAMSys/tests/TLM_compliance/output.txt`; if("" ne `grep "Error: tlm2_protocol_checker" ../../DRAMSys/tests/TLM_compliance/output.txt`) { @@ -80,7 +80,7 @@ system("sed -i.bu '" . $storeModeLine . "s^.*^ ../../DRAMSys/tests/TLM_compliance/output.txt`; +`./DRAMSys ../../DRAMSys/tests/TLM_compliance/sim-batch.xml &> ../../DRAMSys/tests/TLM_compliance/output.txt`; if("" ne `grep "Error: tlm2_protocol_checker" ../../DRAMSys/tests/TLM_compliance/output.txt`) { diff --git a/DRAMSys/tests/error/generateErrorTest_4ch.pl b/DRAMSys/tests/error/generateErrorTest_4ch.pl new file mode 100644 index 00000000..1bad5d65 --- /dev/null +++ b/DRAMSys/tests/error/generateErrorTest_4ch.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w +use warnings; +use strict; + +# Assuming this address mapping: +# +# +# +# +# +# +# + +# This is how it should look like later: +# 31: write 0x0 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +my $numberOfRows = 8192; +my $numberOfColumnsPerRow = 128; +my $bytesPerColumn = 16; +my $burstLength = 4; # burst length of 4 columns --> 4 columns written or read per access +my $dataLength = $bytesPerColumn * $burstLength; + +my $rowOffset = 0x4000; +my $colOffset = 0x80; + +# Generate Data Pattern: +my $dataPatternByte = "ff"; + +my $dataPattern = ""; +for(my $i = 0; $i < $dataLength; $i++) +{ + $dataPattern .= $dataPatternByte; +} + +my $clkCounter = 0; +my $addr = 0; + +# Generate Trace file (writes): + +for(my $ch = 0; $ch < 4; $ch++) { + $addr = 0; + $addr |= $ch << 27; + for(my $row = 0; $row < ($numberOfRows * $rowOffset); $row = $row + $rowOffset) + { + for(my $col = 0; $col < ($numberOfColumnsPerRow * $colOffset); $col = $col + ($colOffset * $burstLength)) + { + my $addrHex = sprintf("0x%x", $addr); + print "$clkCounter:\twrite\t$addrHex\t$dataPattern\n"; + $clkCounter++; + $addr += $colOffset * $burstLength; + } + } +} + +$clkCounter = 350000000; +$addr = 0; + +# Generate Trace file (reads): +for(my $ch = 0; $ch < 4; $ch++) { + $addr = 0; + $addr |= $ch << 27; + for(my $row = 0; $row < ($numberOfRows * $rowOffset); $row = $row + $rowOffset) + { + for(my $col = 0; $col < ($numberOfColumnsPerRow * $colOffset); $col = $col + ($colOffset * $burstLength)) + { + my $addrHex = sprintf("0x%x", $addr); + print "$clkCounter:\tread\t$addrHex\t$dataPattern\n"; + $clkCounter++; + $addr += $colOffset * $burstLength; + } + } +} diff --git a/DRAMSys/tests/error/test.pl b/DRAMSys/tests/error/test.pl index 14fd35fb..20c0ff54 100644 --- a/DRAMSys/tests/error/test.pl +++ b/DRAMSys/tests/error/test.pl @@ -53,7 +53,7 @@ if (! -e $trace_file) { # Run Simulation: chdir("../../../build/simulator/"); -`./dramSys ../../DRAMSys/tests/error/sim-batch.xml > ../../DRAMSys/tests/error/output.txt`; +`./DRAMSys ../../DRAMSys/tests/error/sim-batch.xml > ../../DRAMSys/tests/error/output.txt`; chdir("../../DRAMSys/tests/error"); diff --git a/DRAMSys/tests/simple/test.pl b/DRAMSys/tests/simple/test.pl index 20a977f2..8c801c86 100644 --- a/DRAMSys/tests/simple/test.pl +++ b/DRAMSys/tests/simple/test.pl @@ -40,7 +40,7 @@ use File::Compare; # Run Simulation: chdir("../../../build/simulator/"); -`./dramSys ../../DRAMSys/tests/simple/sim-batch.xml > ../../DRAMSys/tests/simple/output.txt`; +`./DRAMSys ../../DRAMSys/tests/simple/sim-batch.xml > ../../DRAMSys/tests/simple/output.txt`; chdir("../../DRAMSys/tests/simple"); diff --git a/DRAMSys/tests/start.pl b/DRAMSys/tests/start.pl index 2d699ffb..501853c0 100755 --- a/DRAMSys/tests/start.pl +++ b/DRAMSys/tests/start.pl @@ -76,12 +76,12 @@ chdir("build/") || die("chdir"); # Build the Project: my $starttime = time(); print "\n", color($timestamp_color), timestamp(), color("reset"),"Build Project\t"; -`qmake ../DRAMSys/dram.vp.system.pro >/dev/null 2>&1`; +`qmake ../DRAMSys/DRAMSys.pro >/dev/null 2>&1`; `make -j$numberOfCores > /dev/null 2>&1`; my $took = time() - $starttime; # Check if Build was sucessful: -if( -e "./simulator/dramSys" ) +if( -e "./simulator/DRAMSys" ) { print color("reset"),"[ ", color("green"), "done", color("reset"), " ]\t", "(", $took, " seconds)\n"; } diff --git a/DRAMSys/tests/timing_compliance/test.pl b/DRAMSys/tests/timing_compliance/test.pl index 00c256fb..3406ad0e 100644 --- a/DRAMSys/tests/timing_compliance/test.pl +++ b/DRAMSys/tests/timing_compliance/test.pl @@ -57,7 +57,7 @@ foreach (@powerDownModes) system("sed -i.bu '" . $bankwiseLogicLine . "s^.*^ ^' ../../DRAMSys/tests/timing_compliance/fifoStrict.xml"); system("sed -i.bu '" . $powerDownModeLine . "s^.*^ ^' ../../DRAMSys/tests/timing_compliance/fifoStrict.xml"); - `./dramSys ../../DRAMSys/tests/timing_compliance/sim-batch.xml`; + `./DRAMSys ../../DRAMSys/tests/timing_compliance/sim-batch.xml`; @files = `ls sim-batch/timing_compliance_test_fifoStrict_channel*.tdb`; chomp @files; @@ -76,7 +76,7 @@ foreach (@powerDownModes) system("sed -i.bu '" . $powerAnalysisLine . "s^.*^ ^' ../../DRAMSys/tests/timing_compliance/sim-batch.xml"); system("sed -i.bu '" . $bankwiseLogicLine . "s^.*^ ^' ../../DRAMSys/tests/timing_compliance/fifoStrict.xml"); - `./dramSys ../../DRAMSys/tests/timing_compliance/sim-batch.xml`; + `./DRAMSys ../../DRAMSys/tests/timing_compliance/sim-batch.xml`; foreach (@files) { diff --git a/README.md b/README.md index 5a4ac2a5..eb3e5f75 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ They are: For further information refer to [this](http://qwt.sourceforge.net/) -- python3.5 +- python3.5 or 3.6 In Debian like distros: @@ -96,14 +96,6 @@ They are: $ sudo apt-get install python3.5-dev ``` -- libboost_filesystem and libboost_system - - In Debian like distros: - - ```bash - $ sudo apt-get install libboost-all-dev - ``` - - Others Some basic libraries may be already installed in your system. If not you can @@ -135,8 +127,6 @@ export PYTHON_HOME= export PYTHON_HEADERS= export LIBQWT_HOME= export LIBQWT_HEADERS= -export LIBBOOST_HOME= -export LIBBOOST_HEADERS= ``` Users interested in thermal simulation can also add some extra environment @@ -157,7 +147,7 @@ $ qtcreator & Use the menu bar and open the DRAMSys project. -**File -> Open Project -> dram.vp.system/DRAMSys/dram.vp.system.pro** +**File -> Open Project -> dram.vp.system/DRAMSys/DRAMSys.pro** When you open the project for the first time a configuration window pops-up. Then click in **Configure Project** and after that **Build** the project. @@ -183,7 +173,7 @@ use **qmake** to generate a Makefile and then compile the project. ``` bash $ mkdir build $ cd build -$ qmake ../DRAMSys/dram.vp.system.pro +$ qmake ../DRAMSys/DRAMSys.pro $ make ``` @@ -276,26 +266,6 @@ export PATH $ cd /Library/Frameworks $ sudo ln -s /opt/qwt-6.1.2/lib/qwt.framework/ . ``` - -- The boost library can be installed manually or through homebrew: - -Manually: Install boost lib (filesystem & system) in /opt/boost - -``` bash -$ ./bootstrap.sh --prefix=/opt/boost --with-libraries=filesystem,system -$ sudo ./b2 install -``` - -Homebrew: Install boost lib (all, which consumes large storage) in -``` -/usr/local/Cellar -``` - -``` bash -$ brew install boost -``` - - - Export correct Environment Variables in your terminal's profile, e.g: ``` bash @@ -317,12 +287,6 @@ export PYTHON_HEADERS=/Library/Frameworks/Python.framework/Versions/3.5/Headers export LIBQWT_HOME=/opt/qwt-6.1.4/lib export LIBQWT_HEADERS=/opt/qwt-6.1.4/lib/qwt.framework/Headers -export LIBBOOST_HOME=/opt/boost/lib -export LIBBOOST_HEADERS=/opt/boost/include - -# Add Boost Lib into Dynamic Lib Path -DYLD_LIBRARY_PATH="/opt/boost/lib:${DYLD_LIBRARY_PATH}" -export DYLD_LIBRARY_PATH ``` - For the trace analyzer the file: @@ -337,7 +301,7 @@ has to be changed like [this](https://trac.macports.org/attachment/ticket/44288/ ``` bash $ mkdir build -$ qmake ../DRAMSys/dram.vp.system.pro +$ qmake ../DRAMSys/DRAMSys.pro $ make -j ``` @@ -454,7 +418,7 @@ or $ mkdir build $ cd build $ export THERMALSIM=true -$ qmake ../DRAMSys/dram.vp.system.pro +$ qmake ../DRAMSys/DRAMSys.pro $ make ``` @@ -474,105 +438,6 @@ The IP address and the port number related to the server shall be informed in DRAMSys' configuration to subsequent use by DRAMSys to access the thermal simulation server. -#### Usage Example - -The DRAMSys' main configuration file is presented below. - -``` xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ../../../tests/error/test_error.stl - - - - -``` - -Enable the error model in fr_fcfs.xml. - -``` xml - - - - - - - - - - - - - - -``` - -Generate the input trace file for DRAMSys. - -``` bash -$ cd DRAMSys/tests/error/ -$ ./generateErrorTest.pl > test_error.stl -``` - -Start the 3D-ICE server providing the stack file and the port number. - -``` bash -$ cd DRAMSys/simulator/resources/configs/thermalsim -$ 3D-ICE-Server stack.stk 11880 -``` - -In another terminal or terminal tab start DRAMSys. Here the program's output -is redirected to a file. - -``` bash -$ cd build/simulator/ -$ ./dramSys > output -``` - ### DRAMSys Configuration The **dramSys** executable supports one argument which is a XML file that @@ -583,72 +448,32 @@ The XML code below shows a typic configuration: ``` xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - voco2.stl - voco2.stl - voco2.stl - - - + + + + + + + + + + + + + + ddr3_example.stl + ddr3_example.stl + ``` - Some configuration fields reference other XML files which contain more specialized chunks of the configuration like memory specification, address mapping and memory configurations. @@ -668,18 +493,25 @@ each of the simulation setups. A single **trace setup** is composed of an id string and one or more **devices**. -The **device** configuration consists of two configuration fields - clkMhz -(operation frequency for this device) and bl (burst length) - and a -**trace file**. +The **device** configuration consists of two parameters - clkMhz +(operation frequency for this device) - and a **trace file**. A **trace file** is a pre-recorded file containing memory transactions. Each memory transaction has a timestamp that tells the simulator when it shall happen, a transaction type (e.g. read, write) and a memory address. -A **trace player** is **equivalent** to a bus master **device** (i.e. a device -that locks a bus and generates memory transactions). By adding device elements -into the trace setup section one can specify the operation frequency, the -burst length and the trace file to be used by trace players. +Here is an example syntax: +``` +31: read 0x400140 +33: read 0x400160 +56: read 0x7fff8000 +81: read 0x400180 +``` + +A **trace player** is **equivalent** to a bus master **device** +(e.g. a processor). By adding device elements into the trace setup section +one can specify the operation frequency, the burst length and the trace file +to be used by trace players. Trace players without a corresponding device configuration do not generate transactions. @@ -689,13 +521,34 @@ providing **flexibility** for **exhaustive explorations.** #### Configuration File Sections -The main configuration file is divided into self-contained sections, each of -these sections is a set of logically related configuration aspects for the -simulation. +The main configuration file is divided into self-contained sections. Each of +these sections refers to sub-configuration files. -Below are listed the configuration sections and configuration fields. +Below, the sub-configurations are listed and explained. - **Simulator Configuration** + + The content of + [ddr3.xml](DRAMSys/simulator/resources/configs/simulator/ddr3.xml) is + presented below as an example. + + ```xml + + + + + + + + + + + + + ``` + + - *SimulationName* (boolean) + - Give the name of the simulation for distingushing from other simulations. - *Debug* (boolean) - "1": enables debug output on console - "0": disables debug output @@ -714,9 +567,6 @@ Below are listed the configuration sections and configuration fields. - Number of trace players - *NumberOfMemChannels* (unsigned int) - Number of memory channels - - *ControllerCoreDisableRefresh* (boolean) - - "1": disables refreshes - - "0": normal operation (refreshes enabled) - *ThermalSimulation* (boolean) - "1": enables thermal simulation - "0": static temperature during simulation @@ -730,6 +580,27 @@ Below are listed the configuration sections and configuration fields. - "0": disables the TLM 2.0 Protocol Checking - **Temperature Simulator Configuration** + + The content of + [config.xml](DRAMSys/simulator/resources/configs/thermalsim/config.xml) is + presented below as an example. + + ```xml + + + + + + + + + + + + + + ``` + - *TemperatureScale* (string) - "Celsius" - "Fahrenheit" @@ -764,8 +635,8 @@ Below are listed the configuration sections and configuration fields. - **Memory Specification** - A file with memory specifications. This information comes from datasheet and - usually does not change. + A file with memory specifications. This information comes from datasheets and + measurements, and usually does not change. - **Address Mapping** @@ -808,19 +679,26 @@ Below are listed the configuration sections and configuration fields. presented below as an example. ``` xml - - - - - - - - - - - - - + + + + + + + + + + + + + + + + ``` - *BankwiseLogic* (boolean) @@ -856,17 +734,13 @@ Below are listed the configuration sections and configuration fields. - "NoStorage": no storage - "Store": store data without error model - "ErrorModel": store data with error model [6] + - *ControllerCoreDisableRefresh* (boolean) + - "1": disables refreshes + - "0": normal operation (refreshes enabled) - **Trace Setups** - - *id* (string) - - Trace setup id. Two kinds of output files are generated by DRAMSys: - SQLite databases containing transactions related to each memory channel - (.tdb) and a text file (.txt) with the program output. The base name for - these files comes from this field. - *clkMhz* (unsigned int) - Speed of the trace player - - *bl* (unsigned int) - - Burst length - *trace file* - A pre-recorded file containing memory transactions to be executed by a trace player. @@ -894,6 +768,77 @@ A description of the content each directory follows. - **traces**: trace files for simulations. They contain accesses to memory in certain known scenarios. +#### Usage Example with Thermal Simulation + +The DRAMSys' main configuration file is presented below. + +``` xml + + + + + + + + + + + + + + + test_error.stl + + +``` + +Enable the error model in fr_fcfs.xml. + +``` xml + + + + + + + + + + + + + + +``` + +Generate the input trace file for DRAMSys. + +``` bash +$ cd DRAMSys/tests/error/ +$ ./generateErrorTest.pl > test_error.stl +``` + +Start the 3D-ICE server providing the stack file and the port number. + +``` bash +$ cd DRAMSys/simulator/resources/configs/thermalsim +$ 3D-ICE-Server stack.stk 11880 +``` + +In another terminal or terminal tab start DRAMSys. Here the program's output +is redirected to a file. + +``` bash +$ cd build/simulator/ +$ ./dramSys > output +``` + #### DRAMsys Diagrams - **Payload Extension information**