sim_control.cc revision 12047
112047Schristian.menard@tu-dresden.de/*
212047Schristian.menard@tu-dresden.de * Copyright (c) 2015, University of Kaiserslautern
312047Schristian.menard@tu-dresden.de * Copyright (c) 2016, Dresden University of Technology (TU Dresden)
412047Schristian.menard@tu-dresden.de * All rights reserved.
512047Schristian.menard@tu-dresden.de *
612047Schristian.menard@tu-dresden.de * Redistribution and use in source and binary forms, with or without
712047Schristian.menard@tu-dresden.de * modification, are permitted provided that the following conditions are
812047Schristian.menard@tu-dresden.de * met:
912047Schristian.menard@tu-dresden.de *
1012047Schristian.menard@tu-dresden.de * 1. Redistributions of source code must retain the above copyright notice,
1112047Schristian.menard@tu-dresden.de *    this list of conditions and the following disclaimer.
1212047Schristian.menard@tu-dresden.de *
1312047Schristian.menard@tu-dresden.de * 2. Redistributions in binary form must reproduce the above copyright
1412047Schristian.menard@tu-dresden.de *    notice, this list of conditions and the following disclaimer in the
1512047Schristian.menard@tu-dresden.de *    documentation and/or other materials provided with the distribution.
1612047Schristian.menard@tu-dresden.de *
1712047Schristian.menard@tu-dresden.de * 3. Neither the name of the copyright holder nor the names of its
1812047Schristian.menard@tu-dresden.de *    contributors may be used to endorse or promote products derived from
1912047Schristian.menard@tu-dresden.de *    this software without specific prior written permission.
2012047Schristian.menard@tu-dresden.de *
2112047Schristian.menard@tu-dresden.de * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2212047Schristian.menard@tu-dresden.de * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2312047Schristian.menard@tu-dresden.de * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2412047Schristian.menard@tu-dresden.de * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
2512047Schristian.menard@tu-dresden.de * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2612047Schristian.menard@tu-dresden.de * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2712047Schristian.menard@tu-dresden.de * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2812047Schristian.menard@tu-dresden.de * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2912047Schristian.menard@tu-dresden.de * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3012047Schristian.menard@tu-dresden.de * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3112047Schristian.menard@tu-dresden.de * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3212047Schristian.menard@tu-dresden.de *
3312047Schristian.menard@tu-dresden.de * Authors: Matthias Jung
3412047Schristian.menard@tu-dresden.de *          Abdul Mutaal Ahmad
3512047Schristian.menard@tu-dresden.de *          Christian Menard
3612047Schristian.menard@tu-dresden.de */
3712047Schristian.menard@tu-dresden.de
3812047Schristian.menard@tu-dresden.de/**
3912047Schristian.menard@tu-dresden.de * @file
4012047Schristian.menard@tu-dresden.de *
4112047Schristian.menard@tu-dresden.de *  Example top level file for SystemC-TLM integration with C++-only
4212047Schristian.menard@tu-dresden.de *  instantiation.
4312047Schristian.menard@tu-dresden.de *
4412047Schristian.menard@tu-dresden.de */
4512047Schristian.menard@tu-dresden.de
4612047Schristian.menard@tu-dresden.de#include <systemc>
4712047Schristian.menard@tu-dresden.de#include <tlm>
4812047Schristian.menard@tu-dresden.de
4912047Schristian.menard@tu-dresden.de#include "sc_master_port.hh"
5012047Schristian.menard@tu-dresden.de#include "sc_slave_port.hh"
5112047Schristian.menard@tu-dresden.de#include "sim/cxx_config_ini.hh"
5212047Schristian.menard@tu-dresden.de#include "sim/init_signals.hh"
5312047Schristian.menard@tu-dresden.de#include "sim/stat_control.hh"
5412047Schristian.menard@tu-dresden.de#include "sim_control.hh"
5512047Schristian.menard@tu-dresden.de#include "stats.hh"
5612047Schristian.menard@tu-dresden.de
5712047Schristian.menard@tu-dresden.de// Define global string variable decalred in stats.hh
5812047Schristian.menard@tu-dresden.destd::string filename = "m5out/stats-systemc.txt";
5912047Schristian.menard@tu-dresden.de
6012047Schristian.menard@tu-dresden.denamespace Gem5SystemC
6112047Schristian.menard@tu-dresden.de{
6212047Schristian.menard@tu-dresden.de
6312047Schristian.menard@tu-dresden.deGem5SimControl* Gem5SimControl::instance = nullptr;
6412047Schristian.menard@tu-dresden.de
6512047Schristian.menard@tu-dresden.deGem5SimControl::Gem5SimControl(sc_core::sc_module_name name,
6612047Schristian.menard@tu-dresden.de                               const std::string& configFile,
6712047Schristian.menard@tu-dresden.de                               uint64_t simulationEnd,
6812047Schristian.menard@tu-dresden.de                               const std::string& gem5DebugFlags)
6912047Schristian.menard@tu-dresden.de  : Gem5SystemC::Module(name),
7012047Schristian.menard@tu-dresden.de    simulationEnd(simulationEnd)
7112047Schristian.menard@tu-dresden.de{
7212047Schristian.menard@tu-dresden.de    SC_THREAD(run);
7312047Schristian.menard@tu-dresden.de
7412047Schristian.menard@tu-dresden.de    if (instance != nullptr) {
7512047Schristian.menard@tu-dresden.de        panic("Tried to instantiate Gem5SimControl more than once!\n");
7612047Schristian.menard@tu-dresden.de    }
7712047Schristian.menard@tu-dresden.de    instance = this;
7812047Schristian.menard@tu-dresden.de
7912047Schristian.menard@tu-dresden.de    cxxConfigInit();
8012047Schristian.menard@tu-dresden.de
8112047Schristian.menard@tu-dresden.de    // register the systemc slave and master port handler
8212047Schristian.menard@tu-dresden.de    ExternalSlave::registerHandler("tlm_slave", new SCSlavePortHandler(*this));
8312047Schristian.menard@tu-dresden.de    ExternalMaster::registerHandler("tlm_master",
8412047Schristian.menard@tu-dresden.de                                    new SCMasterPortHandler(*this));
8512047Schristian.menard@tu-dresden.de
8612047Schristian.menard@tu-dresden.de    Trace::setDebugLogger(&logger);
8712047Schristian.menard@tu-dresden.de
8812047Schristian.menard@tu-dresden.de    Gem5SystemC::setTickFrequency();
8912047Schristian.menard@tu-dresden.de    sc_core::sc_set_time_resolution(1, sc_core::SC_PS);
9012047Schristian.menard@tu-dresden.de
9112047Schristian.menard@tu-dresden.de    Gem5SystemC::Module::setupEventQueues(*this);
9212047Schristian.menard@tu-dresden.de    initSignals();
9312047Schristian.menard@tu-dresden.de
9412047Schristian.menard@tu-dresden.de    Stats::initSimStats();
9512047Schristian.menard@tu-dresden.de    Stats::registerHandlers(CxxConfig::statsReset, CxxConfig::statsDump);
9612047Schristian.menard@tu-dresden.de
9712047Schristian.menard@tu-dresden.de    Trace::enable();
9812047Schristian.menard@tu-dresden.de
9912047Schristian.menard@tu-dresden.de    CxxConfigFileBase* conf = new CxxIniFile();
10012047Schristian.menard@tu-dresden.de
10112047Schristian.menard@tu-dresden.de    if (configFile.empty()) {
10212047Schristian.menard@tu-dresden.de        std::cerr << "No gem5 config file specified!\n";
10312047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
10412047Schristian.menard@tu-dresden.de    }
10512047Schristian.menard@tu-dresden.de
10612047Schristian.menard@tu-dresden.de    if (!conf->load(configFile.c_str())) {
10712047Schristian.menard@tu-dresden.de        std::cerr << "Can't open config file: " << configFile << '\n';
10812047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
10912047Schristian.menard@tu-dresden.de    }
11012047Schristian.menard@tu-dresden.de
11112047Schristian.menard@tu-dresden.de    config_manager = new CxxConfigManager(*conf);
11212047Schristian.menard@tu-dresden.de
11312047Schristian.menard@tu-dresden.de    // parse debug flags string and clear/set flags accordingly
11412047Schristian.menard@tu-dresden.de    std::stringstream ss;
11512047Schristian.menard@tu-dresden.de    ss.str(gem5DebugFlags);
11612047Schristian.menard@tu-dresden.de    std::string flag;
11712047Schristian.menard@tu-dresden.de    while (std::getline(ss, flag, ' ')) {
11812047Schristian.menard@tu-dresden.de        if (flag.at(0) == '-') {
11912047Schristian.menard@tu-dresden.de            flag.erase(0, 1); // remove the '-'
12012047Schristian.menard@tu-dresden.de            clearDebugFlag(flag.c_str());
12112047Schristian.menard@tu-dresden.de        }
12212047Schristian.menard@tu-dresden.de        else {
12312047Schristian.menard@tu-dresden.de            setDebugFlag(flag.c_str());
12412047Schristian.menard@tu-dresden.de        }
12512047Schristian.menard@tu-dresden.de    }
12612047Schristian.menard@tu-dresden.de
12712047Schristian.menard@tu-dresden.de    CxxConfig::statsEnable();
12812047Schristian.menard@tu-dresden.de    getEventQueue(0)->dump();
12912047Schristian.menard@tu-dresden.de
13012047Schristian.menard@tu-dresden.de    try {
13112047Schristian.menard@tu-dresden.de        config_manager->instantiate();
13212047Schristian.menard@tu-dresden.de    } catch (CxxConfigManager::Exception &e) {
13312047Schristian.menard@tu-dresden.de        std::cerr << "Config problem in sim object "
13412047Schristian.menard@tu-dresden.de                  << e.name << ": " << e.message << "\n";
13512047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
13612047Schristian.menard@tu-dresden.de    }
13712047Schristian.menard@tu-dresden.de}
13812047Schristian.menard@tu-dresden.de
13912047Schristian.menard@tu-dresden.devoid
14012047Schristian.menard@tu-dresden.deGem5SimControl::end_of_elaboration()
14112047Schristian.menard@tu-dresden.de{
14212047Schristian.menard@tu-dresden.de    try {
14312047Schristian.menard@tu-dresden.de        config_manager->initState();
14412047Schristian.menard@tu-dresden.de        config_manager->startup();
14512047Schristian.menard@tu-dresden.de    } catch (CxxConfigManager::Exception &e) {
14612047Schristian.menard@tu-dresden.de        std::cerr << "Config problem in sim object "
14712047Schristian.menard@tu-dresden.de            << e.name << ": " << e.message << "\n";
14812047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
14912047Schristian.menard@tu-dresden.de    }
15012047Schristian.menard@tu-dresden.de}
15112047Schristian.menard@tu-dresden.de
15212047Schristian.menard@tu-dresden.devoid
15312047Schristian.menard@tu-dresden.deGem5SimControl::run()
15412047Schristian.menard@tu-dresden.de{
15512047Schristian.menard@tu-dresden.de    // notify callback
15612047Schristian.menard@tu-dresden.de    beforeSimulate();
15712047Schristian.menard@tu-dresden.de
15812047Schristian.menard@tu-dresden.de    GlobalSimLoopExitEvent *exit_event = NULL;
15912047Schristian.menard@tu-dresden.de
16012047Schristian.menard@tu-dresden.de    if (simulationEnd == 0) {
16112047Schristian.menard@tu-dresden.de        exit_event = simulate();
16212047Schristian.menard@tu-dresden.de    } else {
16312047Schristian.menard@tu-dresden.de        exit_event = simulate(simulationEnd);
16412047Schristian.menard@tu-dresden.de    }
16512047Schristian.menard@tu-dresden.de
16612047Schristian.menard@tu-dresden.de    std::cerr << "Exit at tick " << curTick()
16712047Schristian.menard@tu-dresden.de              << ", cause: " << exit_event->getCause() << '\n';
16812047Schristian.menard@tu-dresden.de
16912047Schristian.menard@tu-dresden.de    getEventQueue(0)->dump();
17012047Schristian.menard@tu-dresden.de
17112047Schristian.menard@tu-dresden.de    // notify callback
17212047Schristian.menard@tu-dresden.de    afterSimulate();
17312047Schristian.menard@tu-dresden.de
17412047Schristian.menard@tu-dresden.de#if TRY_CLEAN_DELETE
17512047Schristian.menard@tu-dresden.de    config_manager->deleteObjects();
17612047Schristian.menard@tu-dresden.de#endif
17712047Schristian.menard@tu-dresden.de}
17812047Schristian.menard@tu-dresden.de
17912047Schristian.menard@tu-dresden.devoid
18012047Schristian.menard@tu-dresden.deGem5SimControl::registerSlavePort(const std::string& name, SCSlavePort* port)
18112047Schristian.menard@tu-dresden.de{
18212047Schristian.menard@tu-dresden.de    if (slavePorts.find(name) == slavePorts.end()) {
18312047Schristian.menard@tu-dresden.de        slavePorts[name] = port;
18412047Schristian.menard@tu-dresden.de    } else {
18512047Schristian.menard@tu-dresden.de        std::cerr << "Slave Port " << name << " is already registered!\n";
18612047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
18712047Schristian.menard@tu-dresden.de    }
18812047Schristian.menard@tu-dresden.de}
18912047Schristian.menard@tu-dresden.de
19012047Schristian.menard@tu-dresden.devoid
19112047Schristian.menard@tu-dresden.deGem5SimControl::registerMasterPort(const std::string& name, SCMasterPort* port)
19212047Schristian.menard@tu-dresden.de{
19312047Schristian.menard@tu-dresden.de    if (masterPorts.find(name) == masterPorts.end()) {
19412047Schristian.menard@tu-dresden.de        masterPorts[name] = port;
19512047Schristian.menard@tu-dresden.de    } else {
19612047Schristian.menard@tu-dresden.de        std::cerr << "Master Port " << name << " is already registered!\n";
19712047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
19812047Schristian.menard@tu-dresden.de    }
19912047Schristian.menard@tu-dresden.de}
20012047Schristian.menard@tu-dresden.de
20112047Schristian.menard@tu-dresden.deSCSlavePort*
20212047Schristian.menard@tu-dresden.deGem5SimControl::getSlavePort(const std::string& name)
20312047Schristian.menard@tu-dresden.de{
20412047Schristian.menard@tu-dresden.de    if (slavePorts.find(name) == slavePorts.end()) {
20512047Schristian.menard@tu-dresden.de        std::cerr << "Slave Port " << name << " was not found!\n";
20612047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
20712047Schristian.menard@tu-dresden.de    }
20812047Schristian.menard@tu-dresden.de
20912047Schristian.menard@tu-dresden.de    return slavePorts.at(name);
21012047Schristian.menard@tu-dresden.de}
21112047Schristian.menard@tu-dresden.de
21212047Schristian.menard@tu-dresden.deSCMasterPort*
21312047Schristian.menard@tu-dresden.deGem5SimControl::getMasterPort(const std::string& name)
21412047Schristian.menard@tu-dresden.de{
21512047Schristian.menard@tu-dresden.de    if (masterPorts.find(name) == masterPorts.end()) {
21612047Schristian.menard@tu-dresden.de        std::cerr << "Master Port " << name << " was not found!\n";
21712047Schristian.menard@tu-dresden.de        std::exit(EXIT_FAILURE);
21812047Schristian.menard@tu-dresden.de    }
21912047Schristian.menard@tu-dresden.de
22012047Schristian.menard@tu-dresden.de    return masterPorts.at(name);
22112047Schristian.menard@tu-dresden.de}
22212047Schristian.menard@tu-dresden.de
22312047Schristian.menard@tu-dresden.de}
224