blob: e4429e74b2b9e3fade75923a732922d29b0f5f42 [file] [log] [blame]
/*****************************************************************************
* McPAT
* SOFTWARE LICENSE AGREEMENT
* Copyright (c) 2010-2013 Advanced Micro Devices, Inc.
* All Rights Reserved
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* 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;
* neither the name of the copyright holders 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
* OWNER 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: Joel Hestness
* Yasuko Eckert
*
***************************************************************************/
#ifndef CACHEUNIT_H_
#define CACHEUNIT_H_
#include "area.h"
#include "array.h"
#include "basic_components.h"
#include "logic.h"
#include "parameter.h"
class CacheParameters {
public:
enum Dir_type dir_ty;
double clockRate;
double capacity;
double blockW;
double assoc;
double nbanks;
double throughput;
double latency;
int missb_size;
int fu_size;
int prefetchb_size;
int wbb_size;
int missb_assoc;
int fu_assoc;
int prefetchb_assoc;
int wbb_assoc;
int missb_banks;
int fu_banks;
int prefetchb_banks;
int wbb_banks;
enum Access_mode cache_access_mode;
enum Access_mode miss_buff_access_mode;
enum Access_mode fetch_buff_access_mode;
enum Access_mode prefetch_buff_access_mode;
enum Access_mode writeback_buff_access_mode;
int cache_rw_ports;
int cache_rd_ports;
int cache_wr_ports;
int cache_se_rd_ports;
int cache_search_ports;
int miss_buff_rw_ports;
int miss_buff_rd_ports;
int miss_buff_wr_ports;
int miss_buff_se_rd_ports;
int miss_buff_search_ports;
int fetch_buff_rw_ports;
int fetch_buff_rd_ports;
int fetch_buff_wr_ports;
int fetch_buff_se_rd_ports;
int fetch_buff_search_ports;
int pf_buff_rw_ports;
int pf_buff_rd_ports;
int pf_buff_wr_ports;
int pf_buff_se_rd_ports;
int pf_buff_search_ports;
int wb_buff_rw_ports;
int wb_buff_rd_ports;
int wb_buff_wr_ports;
int wb_buff_se_rd_ports;
int wb_buff_search_ports;
bool pure_ram;
enum CacheLevel cache_level;
enum Device_ty device_ty;
enum Core_type core_ty;
int num_cores;
};
class CacheStatistics {
public:
// Duty cycle is used for estimating TDP. It should reflect the highest
// sustainable rate of access to the cache unit in execution of a benchmark
// Default should be 1.0: one access per cycle
double duty_cycle;
// This duty cycle is only used for SBT directory types
double dir_duty_cycle;
// The following two stats are also used for estimating TDP.
double tdp_read_access_scalar;
double tdp_write_access_scalar;
// There are 2 ways to calculate dynamic power from activity statistics:
// Default is false
bool use_detailed_stats;
// 1) Count the number and type of accesses to each cache array
// splitting data and tag arrays (use_detailed_stats = true).
// These are extremely detailed statistics.
// read_misses and write_misses are still required for this method for
// various buffers associated with this cache.
double num_data_array_reads;
double num_data_array_writes;
double num_tag_array_reads;
double num_tag_array_writes;
// 2) Count the number and type of access to the cache unit and
// use them to extrapolate the number of accesses to the other
// subcomponents (cache arrays and buffers)
double read_accesses;
double write_accesses;
double read_misses;
double write_misses;
double conflicts;
// The following is only used for SBT directory types
int homenode_read_accesses;
int homenode_write_accesses;
int homenode_read_misses;
int homenode_write_misses;
double homenode_access_scalar;
double tdp_sbt_write_access_scalar;
};
class CacheUnit : public McPATComponent {
public:
static bool is_cache;
static bool pure_cam;
// This is used for CacheArray objects
static bool opt_local;
static bool force_cache_config;
int ithCache;
CacheParameters cache_params;
CacheStatistics cache_stats;
Cache_type cacheType;
bool calculate_runtime_data_and_tag;
double dir_overhead;
double scktRatio;
// TODO: REMOVE _interface_ip... It promotes a mess. Find a better way...
CacheUnit(XMLNode* _xml_data, InputParameter* _interface_ip);
void set_cache_param_from_xml_data();
void computeEnergy();
~CacheUnit() {};
};
#endif /* CACHEUNIT_H_ */