110066Sandreas.hansson@arm.com/* 210066Sandreas.hansson@arm.com * Copyright (c) 2013 ARM Limited 310066Sandreas.hansson@arm.com * All rights reserved 410066Sandreas.hansson@arm.com * 510066Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 610066Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 710066Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 810066Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 910066Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 1010066Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 1110066Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 1210066Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 1310066Sandreas.hansson@arm.com * 1410066Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 1510066Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 1610066Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 1710066Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 1810066Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1910066Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 2010066Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 2110066Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 2210066Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 2310066Sandreas.hansson@arm.com * this software without specific prior written permission. 2410066Sandreas.hansson@arm.com * 2510066Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610066Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710066Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810066Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910066Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010066Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110066Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210066Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310066Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410066Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510066Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610066Sandreas.hansson@arm.com * 3710066Sandreas.hansson@arm.com * Authors: Andreas Hansson 3810066Sandreas.hansson@arm.com */ 3910066Sandreas.hansson@arm.com 4010066Sandreas.hansson@arm.com/** 4110066Sandreas.hansson@arm.com * @file 4210066Sandreas.hansson@arm.com * DRAMSim2Wrapper declaration 4310066Sandreas.hansson@arm.com */ 4410066Sandreas.hansson@arm.com 4510066Sandreas.hansson@arm.com#ifndef __MEM_DRAMSIM2_WRAPPER_HH__ 4610066Sandreas.hansson@arm.com#define __MEM_DRAMSIM2_WRAPPER_HH__ 4710066Sandreas.hansson@arm.com 4810066Sandreas.hansson@arm.com#include <string> 4910066Sandreas.hansson@arm.com 5010066Sandreas.hansson@arm.com#include "DRAMSim2/Callback.h" 5110066Sandreas.hansson@arm.com 5210066Sandreas.hansson@arm.com/** 5310066Sandreas.hansson@arm.com * Forward declaration to avoid includes 5410066Sandreas.hansson@arm.com */ 5510066Sandreas.hansson@arm.comnamespace DRAMSim { 5610066Sandreas.hansson@arm.com 5710066Sandreas.hansson@arm.comclass MultiChannelMemorySystem; 5810066Sandreas.hansson@arm.com 5910066Sandreas.hansson@arm.com} 6010066Sandreas.hansson@arm.com 6110066Sandreas.hansson@arm.com/** 6210066Sandreas.hansson@arm.com * Wrapper class to avoid having DRAMSim2 names like ClockDomain etc 6310066Sandreas.hansson@arm.com * clashing with the normal gem5 world. Many of the DRAMSim2 headers 6410066Sandreas.hansson@arm.com * do not make use of namespaces, and quite a few also open up 6510066Sandreas.hansson@arm.com * std. The only thing that needs to be exposed externally are the 6610066Sandreas.hansson@arm.com * callbacks. This wrapper effectively avoids clashes by not including 6710066Sandreas.hansson@arm.com * any of the conventional gem5 headers (e.g. Packet or SimObject). 6810066Sandreas.hansson@arm.com */ 6910066Sandreas.hansson@arm.comclass DRAMSim2Wrapper 7010066Sandreas.hansson@arm.com{ 7110066Sandreas.hansson@arm.com 7210066Sandreas.hansson@arm.com private: 7310066Sandreas.hansson@arm.com 7410066Sandreas.hansson@arm.com DRAMSim::MultiChannelMemorySystem* dramsim; 7510066Sandreas.hansson@arm.com 7610066Sandreas.hansson@arm.com double _clockPeriod; 7710066Sandreas.hansson@arm.com 7810066Sandreas.hansson@arm.com unsigned int _queueSize; 7910066Sandreas.hansson@arm.com 8010066Sandreas.hansson@arm.com unsigned int _burstSize; 8110066Sandreas.hansson@arm.com 8210066Sandreas.hansson@arm.com template <typename T> 8310066Sandreas.hansson@arm.com T extractConfig(const std::string& field_name, 8410066Sandreas.hansson@arm.com const std::string& file_name) const; 8510066Sandreas.hansson@arm.com 8610066Sandreas.hansson@arm.com public: 8710066Sandreas.hansson@arm.com 8810066Sandreas.hansson@arm.com /** 8910066Sandreas.hansson@arm.com * Create an instance of the DRAMSim2 multi-channel memory 9010066Sandreas.hansson@arm.com * controller using a specific config and system description. 9110066Sandreas.hansson@arm.com * 9210066Sandreas.hansson@arm.com * @param config_file Memory config file 9310066Sandreas.hansson@arm.com * @param system_file Controller config file 9410066Sandreas.hansson@arm.com * @param working_dir Path pre-pended to config files 9510066Sandreas.hansson@arm.com * @param trace_file Output trace file 9610066Sandreas.hansson@arm.com * @param memory_size_mb Total memory size in MByte 9710066Sandreas.hansson@arm.com * @param enable_debug Enable debug output 9810066Sandreas.hansson@arm.com */ 9910066Sandreas.hansson@arm.com DRAMSim2Wrapper(const std::string& config_file, 10010066Sandreas.hansson@arm.com const std::string& system_file, 10110066Sandreas.hansson@arm.com const std::string& working_dir, 10210066Sandreas.hansson@arm.com const std::string& trace_file, 10310066Sandreas.hansson@arm.com unsigned int memory_size_mb, 10410066Sandreas.hansson@arm.com bool enable_debug); 10510066Sandreas.hansson@arm.com ~DRAMSim2Wrapper(); 10610066Sandreas.hansson@arm.com 10710066Sandreas.hansson@arm.com /** 10810066Sandreas.hansson@arm.com * Print the stats gathered in DRAMsim2. 10910066Sandreas.hansson@arm.com */ 11010066Sandreas.hansson@arm.com void printStats(); 11110066Sandreas.hansson@arm.com 11210066Sandreas.hansson@arm.com /** 11310066Sandreas.hansson@arm.com * Set the callbacks to use for read and write completion. 11410066Sandreas.hansson@arm.com * 11510066Sandreas.hansson@arm.com * @param read_callback Callback used for read completions 11610066Sandreas.hansson@arm.com * @param write_callback Callback used for write completions 11710066Sandreas.hansson@arm.com */ 11810066Sandreas.hansson@arm.com void setCallbacks(DRAMSim::TransactionCompleteCB* read_callback, 11910066Sandreas.hansson@arm.com DRAMSim::TransactionCompleteCB* write_callback); 12010066Sandreas.hansson@arm.com 12110066Sandreas.hansson@arm.com /** 12210066Sandreas.hansson@arm.com * Determine if the controller can accept a new packet or not. 12310066Sandreas.hansson@arm.com * 12410066Sandreas.hansson@arm.com * @return true if the controller can accept transactions 12510066Sandreas.hansson@arm.com */ 12610066Sandreas.hansson@arm.com bool canAccept() const; 12710066Sandreas.hansson@arm.com 12810066Sandreas.hansson@arm.com /** 12910066Sandreas.hansson@arm.com * Enqueue a packet. This assumes that canAccept has returned true. 13010066Sandreas.hansson@arm.com * 13110066Sandreas.hansson@arm.com * @param pkt Packet to turn into a DRAMSim2 transaction 13210066Sandreas.hansson@arm.com */ 13310066Sandreas.hansson@arm.com void enqueue(bool is_write, uint64_t addr); 13410066Sandreas.hansson@arm.com 13510066Sandreas.hansson@arm.com /** 13610066Sandreas.hansson@arm.com * Get the internal clock period used by DRAMSim2, specified in 13710066Sandreas.hansson@arm.com * ns. 13810066Sandreas.hansson@arm.com * 13910066Sandreas.hansson@arm.com * @return The clock period of the DRAM interface in ns 14010066Sandreas.hansson@arm.com */ 14110066Sandreas.hansson@arm.com double clockPeriod() const; 14210066Sandreas.hansson@arm.com 14310066Sandreas.hansson@arm.com /** 14410066Sandreas.hansson@arm.com * Get the transaction queue size used by DRAMSim2. 14510066Sandreas.hansson@arm.com * 14610066Sandreas.hansson@arm.com * @return The queue size counted in number of transactions 14710066Sandreas.hansson@arm.com */ 14810066Sandreas.hansson@arm.com unsigned int queueSize() const; 14910066Sandreas.hansson@arm.com 15010066Sandreas.hansson@arm.com /** 15110066Sandreas.hansson@arm.com * Get the burst size in bytes used by DRAMSim2. 15210066Sandreas.hansson@arm.com * 15310066Sandreas.hansson@arm.com * @return The burst size in bytes (data width * burst length) 15410066Sandreas.hansson@arm.com */ 15510066Sandreas.hansson@arm.com unsigned int burstSize() const; 15610066Sandreas.hansson@arm.com 15710066Sandreas.hansson@arm.com /** 15810066Sandreas.hansson@arm.com * Progress the memory controller one cycle 15910066Sandreas.hansson@arm.com */ 16010066Sandreas.hansson@arm.com void tick(); 16110066Sandreas.hansson@arm.com}; 16210066Sandreas.hansson@arm.com 16310066Sandreas.hansson@arm.com#endif //__MEM_DRAMSIM2_WRAPPER_HH__ 164