summaryrefslogtreecommitdiff
path: root/src/gpuwattch/core.cc
diff options
context:
space:
mode:
authorNick <[email protected]>2019-09-13 07:48:05 -0400
committerNick <[email protected]>2019-09-13 07:48:05 -0400
commit9cafb850bdc8ba404add817f90c25faef6ecf9e3 (patch)
tree4b3d011d2e7fc4a8c2973e969cd8914d7b02b31b /src/gpuwattch/core.cc
parent96a0ebfc2583e6f92d8287ecd128eb7c634be017 (diff)
Revert "add /src/gpuwattch formatting"
This reverts commit b7776785a18d3f4e6229cd625f92c11b55894b75.
Diffstat (limited to 'src/gpuwattch/core.cc')
-rw-r--r--src/gpuwattch/core.cc11242
1 files changed, 4858 insertions, 6384 deletions
diff --git a/src/gpuwattch/core.cc b/src/gpuwattch/core.cc
index 9e9f1ab..a5c3bf3 100644
--- a/src/gpuwattch/core.cc
+++ b/src/gpuwattch/core.cc
@@ -29,6835 +29,5309 @@
*
***************************************************************************/
/********************************************************************
-* Modified by:
-**
+* Modified by: *
* Jingwen Leng, Univeristy of Texas, Austin *
* Syed Gilani, University of Wisconsin–Madison *
* Tayler Hetherington, University of British Columbia *
* Ahmed ElTantawy, University of British Columbia *
********************************************************************/
-#include "core.h"
-#include <assert.h>
-#include <algorithm>
-#include <cmath>
-#include <iostream>
-#include <string>
-#include "XML_Parse.h"
-#include "cacti/basic_circuit.h"
-#include "const.h"
#include "io.h"
#include "parameter.h"
+#include "const.h"
+#include "cacti/basic_circuit.h"
+#include <iostream>
+#include <algorithm>
+#include "XML_Parse.h"
+#include <string>
+#include <cmath>
+#include <assert.h>
+#include "core.h"
//#include "globalvar.h"
-// double exClockRate;
+//double exClockRate;
//*********************
-// Operand collector (OC) modelling (Syed Gilani)
+//Operand collector (OC) modelling (Syed Gilani)
//*********************
-// The OCs are modelled similar to the GPGPU-Sim v3.x documentation and
-// nVIDIA patents.
-// the OC need the following GPGPU-Sim config options:
-//-gpgpu_num_reg_banks 8 # Number of register banks (default
-//= 8)
-//-gpgpu_reg_bank_use_warp_id 0 # Use warp ID in mapping
-//registers to banks (default = off)
-//-gpgpu_operand_collector_num_units_sp 6 # number of
-//collector units (default = 4)
-//-gpgpu_operand_collector_num_units_sfu 8 # number of
-//collector units (default = 4)
-//-gpgpu_operand_collector_num_units_mem 2 # number of
-//collector units (default = 2)
-//-gpgpu_operand_collector_num_units_gen 0 # number of
-//collector units (default = 0)
-//-gpgpu_operand_collector_num_in_ports_sp 1 # number of
-//collector unit in ports (default = 1)
-//-gpgpu_operand_collector_num_in_ports_sfu 1 # number of
-//collector unit in ports (default = 1)
-//-gpgpu_operand_collector_num_in_ports_mem 1 # number of
-//collector unit in ports (default = 1)
-//-gpgpu_operand_collector_num_in_ports_gen 0 # number of
-//collector unit in ports (default = 0)
-//-gpgpu_operand_collector_num_out_ports_sp 1 # number of
-//collector unit in ports (default = 1)
-//-gpgpu_operand_collector_num_out_ports_sfu 1 # number of
-//collector unit in ports (default = 1)
-//-gpgpu_operand_collector_num_out_ports_mem 1 # number of
-//collector unit in ports (default = 1)
-//-gpgpu_operand_collector_num_out_ports_gen 0 # number of
-//collector unit in ports (default = 0)
+//The OCs are modelled similar to the GPGPU-Sim v3.x documentation and
+//nVIDIA patents.
+//the OC need the following GPGPU-Sim config options:
+//-gpgpu_num_reg_banks 8 # Number of register banks (default = 8)
+//-gpgpu_reg_bank_use_warp_id 0 # Use warp ID in mapping registers to banks (default = off)
+//-gpgpu_operand_collector_num_units_sp 6 # number of collector units (default = 4)
+//-gpgpu_operand_collector_num_units_sfu 8 # number of collector units (default = 4)
+//-gpgpu_operand_collector_num_units_mem 2 # number of collector units (default = 2)
+//-gpgpu_operand_collector_num_units_gen 0 # number of collector units (default = 0)
+//-gpgpu_operand_collector_num_in_ports_sp 1 # number of collector unit in ports (default = 1)
+//-gpgpu_operand_collector_num_in_ports_sfu 1 # number of collector unit in ports (default = 1)
+//-gpgpu_operand_collector_num_in_ports_mem 1 # number of collector unit in ports (default = 1)
+//-gpgpu_operand_collector_num_in_ports_gen 0 # number of collector unit in ports (default = 0)
+//-gpgpu_operand_collector_num_out_ports_sp 1 # number of collector unit in ports (default = 1)
+//-gpgpu_operand_collector_num_out_ports_sfu 1 # number of collector unit in ports (default = 1)
+//-gpgpu_operand_collector_num_out_ports_mem 1 # number of collector unit in ports (default = 1)
+//-gpgpu_operand_collector_num_out_ports_gen 0 # number of collector unit in ports (default = 0)
-// The total number of collector units and their input ports, and the number of
-// register file banks
-// determine the crossbar size.
+//The total number of collector units and their input ports, and the number of register file banks
+//determine the crossbar size.
-InstFetchU::InstFetchU(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_,
- const CoreDynParam& dyn_p_, bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- coredynp(dyn_p_),
- IB(0),
- BTB(0),
- ID_inst(0),
- ID_operand(0),
- ID_misc(0),
- exist(exist_) {
- if (!exist) return;
- int idx, tag, data, size, line, assoc, banks;
- bool debug = false, is_default = true;
+InstFetchU::InstFetchU(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_, bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ coredynp(dyn_p_),
+ IB (0),
+ BTB (0),
+ ID_inst (0),
+ ID_operand (0),
+ ID_misc (0),
+ exist(exist_)
+{
+ if (!exist) return;
+ int idx, tag, data, size, line, assoc, banks;
+ bool debug= false, is_default = true;
- clockRate = coredynp.clockRate;
- executionTime = coredynp.executionTime;
+ clockRate = coredynp.clockRate;
+ executionTime = coredynp.executionTime;
- cache_p = (Cache_policy)XML->sys.core[ithCore].icache.icache_config[7];
- // Assuming all L1 caches are virtually idxed physically tagged.
- // cache
+ cache_p = (Cache_policy)XML->sys.core[ithCore].icache.icache_config[7];
+ //Assuming all L1 caches are virtually idxed physically tagged.
+ //cache
- size = (int)XML->sys.core[ithCore].icache.icache_config[0];
- line = (int)XML->sys.core[ithCore].icache.icache_config[1];
- assoc = (int)XML->sys.core[ithCore].icache.icache_config[2];
- banks = (int)XML->sys.core[ithCore].icache.icache_config[3];
- idx = debug ? 9 : int(ceil(log2(size / line / assoc)));
- tag = debug ? 51 : (int)XML->sys.physical_address_width - idx -
- int(ceil(log2(line))) + EXTRA_TAG_BITS;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz =
- debug ? 32768 : (int)XML->sys.core[ithCore].icache.icache_config[0];
- interface_ip.line_sz =
- debug ? 64 : (int)XML->sys.core[ithCore].icache.icache_config[1];
- interface_ip.assoc =
- debug ? 8 : (int)XML->sys.core[ithCore].icache.icache_config[2];
- interface_ip.nbanks =
- debug ? 1 : (int)XML->sys.core[ithCore].icache.icache_config[3];
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode =
- 0; // debug?0:XML->sys.core[ithCore].icache.icache_config[5];
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 3.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[5] / clockRate;
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- // interface_ip.obj_func_dyn_energy = 0;
- // interface_ip.obj_func_dyn_power = 0;
- // interface_ip.obj_func_leak_power = 0;
- // interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].number_instruction_fetch_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- icache.caches = new ArrayST(&interface_ip, "icache", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- scktRatio = g_tp.sckt_co_eff;
- chip_PR_overhead = g_tp.chip_layout_overhead;
- macro_PR_overhead = g_tp.macro_layout_overhead;
- icache.area.set_area(icache.area.get_area() +
- icache.caches->local_result.area);
- area.set_area(area.get_area() + icache.caches->local_result.area);
- // output_data_csv(icache.caches.local_result);
+ size = (int)XML->sys.core[ithCore].icache.icache_config[0];
+ line = (int)XML->sys.core[ithCore].icache.icache_config[1];
+ assoc = (int)XML->sys.core[ithCore].icache.icache_config[2];
+ banks = (int)XML->sys.core[ithCore].icache.icache_config[3];
+ idx = debug?9:int(ceil(log2(size/line/assoc)));
+ tag = debug?51:(int)XML->sys.physical_address_width-idx-int(ceil(log2(line))) + EXTRA_TAG_BITS;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = debug?32768:(int)XML->sys.core[ithCore].icache.icache_config[0];
+ interface_ip.line_sz = debug?64:(int)XML->sys.core[ithCore].icache.icache_config[1];
+ interface_ip.assoc = debug?8:(int)XML->sys.core[ithCore].icache.icache_config[2];
+ interface_ip.nbanks = debug?1:(int)XML->sys.core[ithCore].icache.icache_config[3];
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;//debug?0:XML->sys.core[ithCore].icache.icache_config[5];
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[4]/clockRate;
+ interface_ip.latency = debug?3.0/clockRate:XML->sys.core[ithCore].icache.icache_config[5]/clockRate;
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ // interface_ip.obj_func_dyn_energy = 0;
+ // interface_ip.obj_func_dyn_power = 0;
+ // interface_ip.obj_func_leak_power = 0;
+ // interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ icache.caches = new ArrayST(&interface_ip, "icache", Core_device, coredynp.opt_local, coredynp.core_ty);
+ scktRatio = g_tp.sckt_co_eff;
+ chip_PR_overhead = g_tp.chip_layout_overhead;
+ macro_PR_overhead = g_tp.macro_layout_overhead;
+ icache.area.set_area(icache.area.get_area()+ icache.caches->local_result.area);
+ area.set_area(area.get_area()+ icache.caches->local_result.area);
+ //output_data_csv(icache.caches.local_result);
- /*
- *iCache controllers
- *miss buffer Each MSHR contains enough state
- *to handle one or more accesses of any type to a single memory line.
- *Due to the generality of the MSHR mechanism,
- *the amount of state involved is non-trivial:
- *including the address, pointers to the cache entry and destination register,
- *written data, and various other pieces of state.
- */
- interface_ip.num_search_ports =
- debug ? 1 : XML->sys.core[ithCore].number_instruction_fetch_ports;
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = (XML->sys.physical_address_width) + int(ceil(log2(size / line))) +
- icache.caches->l_ip.line_sz * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz =
- int(ceil(data / 8.0)); // int(ceil(pow(2.0,ceil(log2(data)))/8.0));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].icache.buffer_sizes[0] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 0;
- interface_ip.throughput =
- debug ? 1.0 / clockRate : XML->sys.core[ithCore].icache.icache_config[4] /
- clockRate; // means cycle time
- interface_ip.latency =
- debug ? 1.0 / clockRate : XML->sys.core[ithCore].icache.icache_config[5] /
- clockRate; // means access time
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].number_instruction_fetch_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports =
- XML->sys.core[ithCore].number_instruction_fetch_ports;
- icache.missb = new ArrayST(&interface_ip, "icacheMissBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- icache.area.set_area(icache.area.get_area() +
- icache.missb->local_result.area);
- area.set_area(area.get_area() + icache.missb->local_result.area);
- // output_data_csv(icache.missb.local_result);
- // fill buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = icache.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz = data * XML->sys.core[ithCore].icache.buffer_sizes[1];
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 0;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].number_instruction_fetch_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports =
- XML->sys.core[ithCore].number_instruction_fetch_ports;
- icache.ifb = new ArrayST(&interface_ip, "icacheFillBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- icache.area.set_area(icache.area.get_area() + icache.ifb->local_result.area);
- area.set_area(area.get_area() + icache.ifb->local_result.area);
- // output_data_csv(icache.ifb.local_result);
+ /*
+ *iCache controllers
+ *miss buffer Each MSHR contains enough state
+ *to handle one or more accesses of any type to a single memory line.
+ *Due to the generality of the MSHR mechanism,
+ *the amount of state involved is non-trivial:
+ *including the address, pointers to the cache entry and destination register,
+ *written data, and various other pieces of state.
+ */
+ interface_ip.num_search_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = (XML->sys.physical_address_width) + int(ceil(log2(size/line))) + icache.caches->l_ip.line_sz*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = int(ceil(data/8.0));//int(ceil(pow(2.0,ceil(log2(data)))/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].icache.buffer_sizes[0]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[4]/clockRate;//means cycle time
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[5]/clockRate;//means access time
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = XML->sys.core[ithCore].number_instruction_fetch_ports;
+ icache.missb = new ArrayST(&interface_ip, "icacheMissBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ icache.area.set_area(icache.area.get_area()+ icache.missb->local_result.area);
+ area.set_area(area.get_area()+ icache.missb->local_result.area);
+ //output_data_csv(icache.missb.local_result);
- // prefetch buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS; // check with
- // previous entries
- // to decide wthether
- // to merge.
- data = icache.caches->l_ip
- .line_sz; // separate queue to prevent from cache polution.
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].icache.buffer_sizes[2] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 0;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].number_instruction_fetch_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports =
- XML->sys.core[ithCore].number_instruction_fetch_ports;
- icache.prefetchb =
- new ArrayST(&interface_ip, "icacheprefetchBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- icache.area.set_area(icache.area.get_area() +
- icache.prefetchb->local_result.area);
- area.set_area(area.get_area() + icache.prefetchb->local_result.area);
- // output_data_csv(icache.prefetchb.local_result);
+ //fill buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = icache.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].icache.buffer_sizes[1];
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = XML->sys.core[ithCore].number_instruction_fetch_ports;
+ icache.ifb = new ArrayST(&interface_ip, "icacheFillBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ icache.area.set_area(icache.area.get_area()+ icache.ifb->local_result.area);
+ area.set_area(area.get_area()+ icache.ifb->local_result.area);
+ //output_data_csv(icache.ifb.local_result);
- // Instruction buffer
- data =
- XML->sys.core[ithCore].instruction_length *
- XML->sys.core[ithCore].peak_issue_width; // icache.caches.l_ip.line_sz;
- // //multiple threads timing
- // sharing the instruction
- // buffer.
- interface_ip.is_cache = false;
- interface_ip.pure_ram = true;
- interface_ip.pure_cam = false;
- interface_ip.line_sz = int(ceil(data / 8.0));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].number_hardware_threads *
- XML->sys.core[ithCore].instruction_buffer_size *
- interface_ip.line_sz >
- 64
- ? XML->sys.core[ithCore].number_hardware_threads *
- XML->sys.core[ithCore].instruction_buffer_size *
- interface_ip.line_sz
- : 64;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 0;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- // NOTE: Assuming IB is time slice shared among threads, every fetch op will
- // at least fetch "fetch width" instructions.
- interface_ip.num_rw_ports =
- debug
- ? 1
- : XML->sys.core[ithCore]
- .number_instruction_fetch_ports; // XML->sys.core[ithCore].fetch_width;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- IB = new ArrayST(&interface_ip, "InstBuffer", Core_device, coredynp.opt_local,
- coredynp.core_ty);
- IB->area.set_area(IB->area.get_area() + IB->local_result.area);
- area.set_area(area.get_area() + IB->local_result.area);
- // output_data_csv(IB.IB.local_result);
+ //prefetch buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;//check with previous entries to decide wthether to merge.
+ data = icache.caches->l_ip.line_sz;//separate queue to prevent from cache polution.
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = XML->sys.core[ithCore].icache.buffer_sizes[2]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = XML->sys.core[ithCore].number_instruction_fetch_ports;
+ icache.prefetchb = new ArrayST(&interface_ip, "icacheprefetchBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ icache.area.set_area(icache.area.get_area()+ icache.prefetchb->local_result.area);
+ area.set_area(area.get_area()+ icache.prefetchb->local_result.area);
+ //output_data_csv(icache.prefetchb.local_result);
- // inst_decoder.opcode_length = XML->sys.core[ithCore].opcode_width;
- // inst_decoder.init_decoder(is_default, &interface_ip);
- // inst_decoder.full_decoder_power();
+ //Instruction buffer
+ data = XML->sys.core[ithCore].instruction_length*XML->sys.core[ithCore].peak_issue_width;//icache.caches.l_ip.line_sz; //multiple threads timing sharing the instruction buffer.
+ interface_ip.is_cache = false;
+ interface_ip.pure_ram = true;
+ interface_ip.pure_cam = false;
+ interface_ip.line_sz = int(ceil(data/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].number_hardware_threads*XML->sys.core[ithCore].instruction_buffer_size*interface_ip.line_sz>64?
+ XML->sys.core[ithCore].number_hardware_threads*XML->sys.core[ithCore].instruction_buffer_size*interface_ip.line_sz:64;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ //NOTE: Assuming IB is time slice shared among threads, every fetch op will at least fetch "fetch width" instructions.
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;//XML->sys.core[ithCore].fetch_width;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ IB = new ArrayST(&interface_ip, "InstBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ IB->area.set_area(IB->area.get_area()+ IB->local_result.area);
+ area.set_area(area.get_area()+ IB->local_result.area);
+ //output_data_csv(IB.IB.local_result);
- if (coredynp.predictionW > 0) {
- /*
- * BTB branch target buffer, accessed during IF stage. Virtually indexed and
- * virtually tagged
- * It is only a cache without all the buffers in the cache controller since
- * it is more like a
- * look up table than a cache with cache controller. When access miss, no
- * load from other places
- * such as main memory (not actively fill the misses), it is passively
- * updated under two circumstances:
- * 1) when BPT@ID stage finds out current is a taken branch while BTB
- * missed
- * 2) When BPT@ID stage predicts differently than BTB
- * 3) When ID stage finds out current instruction is not a branch while BTB
- * had a hit.(mark as invalid)
- * 4) when EXEU find out wrong target has been provided from BTB.
- *
- */
- size = XML->sys.core[ithCore].BTB.BTB_config[0];
- line = XML->sys.core[ithCore].BTB.BTB_config[1];
- assoc = XML->sys.core[ithCore].BTB.BTB_config[2];
- banks = XML->sys.core[ithCore].BTB.BTB_config[3];
- idx = debug ? 9 : int(ceil(log2(size / line / assoc)));
- // tag =
- // debug?51:XML->sys.virtual_address_width-idx-int(ceil(log2(line))) +
- // int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads)))
- // +EXTRA_TAG_BITS;
- tag =
- debug ? 51 : XML->sys.virtual_address_width +
- int(ceil(log2(
- XML->sys.core[ithCore].number_hardware_threads))) +
- EXTRA_TAG_BITS;
- interface_ip.is_cache = true;
- interface_ip.pure_ram = false;
- interface_ip.pure_cam = false;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz = debug ? 32768 : size;
- interface_ip.line_sz = debug ? 64 : line;
- interface_ip.assoc = debug ? 8 : assoc;
- interface_ip.nbanks = debug ? 1 : banks;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode =
- 0; // debug?0:XML->sys.core[ithCore].dcache.dcache_config[5];
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].BTB.BTB_config[4] / clockRate;
- interface_ip.latency =
- debug ? 3.0 / clockRate
- : XML->sys.core[ithCore].BTB.BTB_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1;
- interface_ip.num_rd_ports = coredynp.predictionW;
- interface_ip.num_wr_ports = coredynp.predictionW;
- interface_ip.num_se_rd_ports = 0;
- BTB = new ArrayST(&interface_ip, "Branch Target Buffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- BTB->area.set_area(BTB->area.get_area() + BTB->local_result.area);
- area.set_area(area.get_area() + BTB->local_result.area);
- /// cout<<"area="<<area<<endl;
+ // inst_decoder.opcode_length = XML->sys.core[ithCore].opcode_width;
+ // inst_decoder.init_decoder(is_default, &interface_ip);
+ // inst_decoder.full_decoder_power();
- BPT = new BranchPredictor(XML, ithCore, &interface_ip, coredynp);
- area.set_area(area.get_area() + BPT->area.get_area());
- }
+ if (coredynp.predictionW>0)
+ {
+ /*
+ * BTB branch target buffer, accessed during IF stage. Virtually indexed and virtually tagged
+ * It is only a cache without all the buffers in the cache controller since it is more like a
+ * look up table than a cache with cache controller. When access miss, no load from other places
+ * such as main memory (not actively fill the misses), it is passively updated under two circumstances:
+ * 1) when BPT@ID stage finds out current is a taken branch while BTB missed
+ * 2) When BPT@ID stage predicts differently than BTB
+ * 3) When ID stage finds out current instruction is not a branch while BTB had a hit.(mark as invalid)
+ * 4) when EXEU find out wrong target has been provided from BTB.
+ *
+ */
+ size = XML->sys.core[ithCore].BTB.BTB_config[0];
+ line = XML->sys.core[ithCore].BTB.BTB_config[1];
+ assoc = XML->sys.core[ithCore].BTB.BTB_config[2];
+ banks = XML->sys.core[ithCore].BTB.BTB_config[3];
+ idx = debug?9:int(ceil(log2(size/line/assoc)));
+// tag = debug?51:XML->sys.virtual_address_width-idx-int(ceil(log2(line))) + int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads))) +EXTRA_TAG_BITS;
+ tag = debug?51:XML->sys.virtual_address_width + int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads))) +EXTRA_TAG_BITS;
+ interface_ip.is_cache = true;
+ interface_ip.pure_ram = false;
+ interface_ip.pure_cam = false;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = debug?32768:size;
+ interface_ip.line_sz = debug?64:line;
+ interface_ip.assoc = debug?8:assoc;
+ interface_ip.nbanks = debug?1:banks;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;//debug?0:XML->sys.core[ithCore].dcache.dcache_config[5];
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].BTB.BTB_config[4]/clockRate;
+ interface_ip.latency = debug?3.0/clockRate:XML->sys.core[ithCore].BTB.BTB_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;
+ interface_ip.num_rd_ports = coredynp.predictionW;
+ interface_ip.num_wr_ports = coredynp.predictionW;
+ interface_ip.num_se_rd_ports = 0;
+ BTB = new ArrayST(&interface_ip, "Branch Target Buffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ BTB->area.set_area(BTB->area.get_area()+ BTB->local_result.area);
+ area.set_area(area.get_area()+ BTB->local_result.area);
+ ///cout<<"area="<<area<<endl;
- ID_inst = new inst_decoder(is_default, &interface_ip, coredynp.opcode_length,
- 1 /*Decoder should not know how many by itself*/,
- coredynp.x86, Core_device, coredynp.core_ty);
+ BPT = new BranchPredictor(XML, ithCore, &interface_ip,coredynp);
+ area.set_area(area.get_area()+ BPT->area.get_area());
+ }
+
+ ID_inst = new inst_decoder(is_default, &interface_ip,
+ coredynp.opcode_length, 1/*Decoder should not know how many by itself*/,
+ coredynp.x86,
+ Core_device, coredynp.core_ty);
- ID_operand =
- new inst_decoder(is_default, &interface_ip, coredynp.arch_ireg_width, 1,
- coredynp.x86, Core_device, coredynp.core_ty);
+ ID_operand = new inst_decoder(is_default, &interface_ip,
+ coredynp.arch_ireg_width, 1,
+ coredynp.x86,
+ Core_device, coredynp.core_ty);
+
+ ID_misc = new inst_decoder(is_default, &interface_ip,
+ 8/* Prefix field etc upto 14B*/, 1,
+ coredynp.x86,
+ Core_device, coredynp.core_ty);
+ //TODO: X86 decoder should decode the inst in cyclic mode under the control of squencer.
+ //So the dynamic power should be multiplied by a few times.
+ area.set_area(area.get_area()+ (ID_inst->area.get_area()
+ +ID_operand->area.get_area()
+ +ID_misc->area.get_area())*coredynp.decodeW);
- ID_misc = new inst_decoder(is_default, &interface_ip,
- 8 /* Prefix field etc upto 14B*/, 1, coredynp.x86,
- Core_device, coredynp.core_ty);
- // TODO: X86 decoder should decode the inst in cyclic mode under the control
- // of squencer.
- // So the dynamic power should be multiplied by a few times.
- area.set_area(area.get_area() +
- (ID_inst->area.get_area() + ID_operand->area.get_area() +
- ID_misc->area.get_area()) *
- coredynp.decodeW);
}
-BranchPredictor::BranchPredictor(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_,
- const CoreDynParam& dyn_p_, bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- coredynp(dyn_p_),
- globalBPT(0),
- localBPT(0),
- L1_localBPT(0),
- L2_localBPT(0),
- chooser(0),
- RAS(0),
- exist(exist_) {
- /*
- * Branch Predictor, accessed during ID stage.
- * McPAT's branch predictor model is the tournament branch predictor used in
- * Alpha 21264,
- * including global predictor, local two level predictor, and Chooser.
- * The Branch predictor also includes a RAS (return address stack) for
- * function calls
- * Branch predictors are tagged by thread ID and modeled as 1-way associative
- * $
- * However RAS return address stacks are duplicated for each thread.
- * TODO:Data Width need to be computed more precisely *
- */
- if (!exist) return;
- int tag, data;
- clockRate = coredynp.clockRate;
- executionTime = coredynp.executionTime;
- interface_ip.assoc = 1;
- interface_ip.pure_cam = false;
- if (coredynp.multithreaded) {
- tag = int(log2(coredynp.num_hthreads) + EXTRA_TAG_BITS);
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
+BranchPredictor::BranchPredictor(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_, bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ coredynp(dyn_p_),
+ globalBPT(0),
+ localBPT(0),
+ L1_localBPT(0),
+ L2_localBPT(0),
+ chooser(0),
+ RAS(0),
+ exist(exist_)
+{
+ /*
+ * Branch Predictor, accessed during ID stage.
+ * McPAT's branch predictor model is the tournament branch predictor used in Alpha 21264,
+ * including global predictor, local two level predictor, and Chooser.
+ * The Branch predictor also includes a RAS (return address stack) for function calls
+ * Branch predictors are tagged by thread ID and modeled as 1-way associative $
+ * However RAS return address stacks are duplicated for each thread.
+ * TODO:Data Width need to be computed more precisely *
+ */
+ if (!exist) return;
+ int tag, data;
- interface_ip.is_cache = true;
- interface_ip.pure_ram = false;
- } else {
- interface_ip.is_cache = false;
- interface_ip.pure_ram = true;
- }
- // Global predictor
- data =
- int(ceil(XML->sys.core[ithCore].predictor.global_predictor_bits / 8.0));
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].predictor.global_predictor_entries;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.predictionW;
- interface_ip.num_wr_ports = coredynp.predictionW;
- interface_ip.num_se_rd_ports = 0;
- globalBPT = new ArrayST(&interface_ip, "Global Predictor", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- globalBPT->area.set_area(globalBPT->area.get_area() +
- globalBPT->local_result.area);
- area.set_area(area.get_area() + globalBPT->local_result.area);
+ clockRate = coredynp.clockRate;
+ executionTime = coredynp.executionTime;
+ interface_ip.assoc = 1;
+ interface_ip.pure_cam = false;
+ if (coredynp.multithreaded)
+ {
- // Local BPT (Level 1)
- data =
- int(ceil(XML->sys.core[ithCore].predictor.local_predictor_size[0] / 8.0));
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].predictor.local_predictor_entries;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.predictionW;
- interface_ip.num_wr_ports = coredynp.predictionW;
- interface_ip.num_se_rd_ports = 0;
- L1_localBPT = new ArrayST(&interface_ip, "L1 local Predictor", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- L1_localBPT->area.set_area(L1_localBPT->area.get_area() +
- L1_localBPT->local_result.area);
- area.set_area(area.get_area() + L1_localBPT->local_result.area);
+ tag = int(log2(coredynp.num_hthreads)+ EXTRA_TAG_BITS);
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
- // Local BPT (Level 2)
- data =
- int(ceil(XML->sys.core[ithCore].predictor.local_predictor_size[1] / 8.0));
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].predictor.local_predictor_entries;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.predictionW;
- interface_ip.num_wr_ports = coredynp.predictionW;
- interface_ip.num_se_rd_ports = 0;
- L2_localBPT = new ArrayST(&interface_ip, "L2 local Predictor", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- L2_localBPT->area.set_area(L2_localBPT->area.get_area() +
- L2_localBPT->local_result.area);
- area.set_area(area.get_area() + L2_localBPT->local_result.area);
+ interface_ip.is_cache = true;
+ interface_ip.pure_ram = false;
+ }
+ else
+ {
+ interface_ip.is_cache = false;
+ interface_ip.pure_ram = true;
- // Chooser
- data =
- int(ceil(XML->sys.core[ithCore].predictor.chooser_predictor_bits / 8.0));
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].predictor.chooser_predictor_entries;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.predictionW;
- interface_ip.num_wr_ports = coredynp.predictionW;
- interface_ip.num_se_rd_ports = 0;
- chooser = new ArrayST(&interface_ip, "Predictor Chooser", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- chooser->area.set_area(chooser->area.get_area() + chooser->local_result.area);
- area.set_area(area.get_area() + chooser->local_result.area);
+ }
+ //Global predictor
+ data = int(ceil(XML->sys.core[ithCore].predictor.global_predictor_bits/8.0));
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].predictor.global_predictor_entries;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.predictionW;
+ interface_ip.num_wr_ports = coredynp.predictionW;
+ interface_ip.num_se_rd_ports = 0;
+ globalBPT = new ArrayST(&interface_ip, "Global Predictor", Core_device, coredynp.opt_local, coredynp.core_ty);
+ globalBPT->area.set_area(globalBPT->area.get_area()+ globalBPT->local_result.area);
+ area.set_area(area.get_area()+ globalBPT->local_result.area);
+
+ //Local BPT (Level 1)
+ data = int(ceil(XML->sys.core[ithCore].predictor.local_predictor_size[0]/8.0));
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].predictor.local_predictor_entries;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.predictionW;
+ interface_ip.num_wr_ports = coredynp.predictionW;
+ interface_ip.num_se_rd_ports = 0;
+ L1_localBPT = new ArrayST(&interface_ip, "L1 local Predictor", Core_device, coredynp.opt_local, coredynp.core_ty);
+ L1_localBPT->area.set_area(L1_localBPT->area.get_area()+ L1_localBPT->local_result.area);
+ area.set_area(area.get_area()+ L1_localBPT->local_result.area);
+
+ //Local BPT (Level 2)
+ data = int(ceil(XML->sys.core[ithCore].predictor.local_predictor_size[1]/8.0));
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].predictor.local_predictor_entries;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.predictionW;
+ interface_ip.num_wr_ports = coredynp.predictionW;
+ interface_ip.num_se_rd_ports = 0;
+ L2_localBPT = new ArrayST(&interface_ip, "L2 local Predictor", Core_device, coredynp.opt_local, coredynp.core_ty);
+ L2_localBPT->area.set_area(L2_localBPT->area.get_area()+ L2_localBPT->local_result.area);
+ area.set_area(area.get_area()+ L2_localBPT->local_result.area);
+
+ //Chooser
+ data = int(ceil(XML->sys.core[ithCore].predictor.chooser_predictor_bits/8.0));
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].predictor.chooser_predictor_entries;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.predictionW;
+ interface_ip.num_wr_ports = coredynp.predictionW;
+ interface_ip.num_se_rd_ports = 0;
+ chooser = new ArrayST(&interface_ip, "Predictor Chooser", Core_device, coredynp.opt_local, coredynp.core_ty);
+ chooser->area.set_area(chooser->area.get_area()+ chooser->local_result.area);
+ area.set_area(area.get_area()+ chooser->local_result.area);
+
+ //RAS return address stacks are Duplicated for each thread.
+ interface_ip.is_cache = false;
+ interface_ip.pure_ram = true;
+ data = int(ceil(coredynp.pc_width/8.0));
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].RAS_size;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.predictionW;
+ interface_ip.num_wr_ports = coredynp.predictionW;
+ interface_ip.num_se_rd_ports = 0;
+ RAS = new ArrayST(&interface_ip, "RAS", Core_device, coredynp.opt_local, coredynp.core_ty);
+ RAS->area.set_area(RAS->area.get_area()+ RAS->local_result.area*coredynp.num_hthreads);
+ area.set_area(area.get_area()+ RAS->local_result.area*coredynp.num_hthreads);
- // RAS return address stacks are Duplicated for each thread.
- interface_ip.is_cache = false;
- interface_ip.pure_ram = true;
- data = int(ceil(coredynp.pc_width / 8.0));
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * XML->sys.core[ithCore].RAS_size;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.predictionW;
- interface_ip.num_wr_ports = coredynp.predictionW;
- interface_ip.num_se_rd_ports = 0;
- RAS = new ArrayST(&interface_ip, "RAS", Core_device, coredynp.opt_local,
- coredynp.core_ty);
- RAS->area.set_area(RAS->area.get_area() +
- RAS->local_result.area * coredynp.num_hthreads);
- area.set_area(area.get_area() +
- RAS->local_result.area * coredynp.num_hthreads);
}
-SchedulerU::SchedulerU(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_,
- const CoreDynParam& dyn_p_, bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- coredynp(dyn_p_),
- int_inst_window(0),
- fp_inst_window(0),
- ROB(0),
- instruction_selection(0),
- exist(exist_) {
- if (!exist) return;
- int tag, data;
- bool is_default = true;
- string tmp_name;
+SchedulerU::SchedulerU(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_, bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ coredynp(dyn_p_),
+ int_inst_window(0),
+ fp_inst_window(0),
+ ROB(0),
+ instruction_selection(0),
+ exist(exist_)
+ {
+ if (!exist) return;
+ int tag, data;
+ bool is_default=true;
+ string tmp_name;
- clockRate = coredynp.clockRate;
- executionTime = coredynp.executionTime;
- if ((coredynp.core_ty == Inorder && coredynp.multithreaded)) {
- // Instruction issue queue, in-order multi-issue or multithreaded processor
- // also has this structure. Unified window for Inorder processors
- tag = int(log2(XML->sys.core[ithCore].number_hardware_threads) *
- coredynp.perThreadState); // This is the normal thread state bits
- // based on Niagara Design
- data = XML->sys.core[ithCore].instruction_length;
- // NOTE: x86 inst can be very lengthy, up to 15B. Source: Intel® 64 and
- // IA-32 Architectures
- // Software Developer’s Manual
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = int(ceil(data / 8.0));
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz =
- XML->sys.core[ithCore].instruction_window_size * interface_ip.line_sz >
- 64
- ? XML->sys.core[ithCore].instruction_window_size *
- interface_ip.line_sz
- : 64;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.peak_issueW;
- interface_ip.num_wr_ports = coredynp.peak_issueW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = coredynp.peak_issueW;
- int_inst_window = new ArrayST(&interface_ip, "InstFetchQueue", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- int_inst_window->area.set_area(int_inst_window->area.get_area() +
- int_inst_window->local_result.area *
- coredynp.num_pipelines);
- area.set_area(area.get_area() +
- int_inst_window->local_result.area * coredynp.num_pipelines);
- // output_data_csv(iRS.RS.local_result);
- Iw_height = int_inst_window->local_result.cache_ht;
+ clockRate = coredynp.clockRate;
+ executionTime = coredynp.executionTime;
+ if ((coredynp.core_ty==Inorder && coredynp.multithreaded))
+ {
+ //Instruction issue queue, in-order multi-issue or multithreaded processor also has this structure. Unified window for Inorder processors
+ tag = int(log2(XML->sys.core[ithCore].number_hardware_threads)*coredynp.perThreadState);//This is the normal thread state bits based on Niagara Design
+ data = XML->sys.core[ithCore].instruction_length;
+ //NOTE: x86 inst can be very lengthy, up to 15B. Source: Intel® 64 and IA-32 Architectures
+ //Software Developer’s Manual
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = int(ceil(data/8.0));
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = XML->sys.core[ithCore].instruction_window_size*interface_ip.line_sz>64?XML->sys.core[ithCore].instruction_window_size*interface_ip.line_sz:64;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.peak_issueW;
+ interface_ip.num_wr_ports = coredynp.peak_issueW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = coredynp.peak_issueW;
+ int_inst_window = new ArrayST(&interface_ip, "InstFetchQueue", Core_device, coredynp.opt_local, coredynp.core_ty);
+ int_inst_window->area.set_area(int_inst_window->area.get_area()+ int_inst_window->local_result.area*coredynp.num_pipelines);
+ area.set_area(area.get_area()+ int_inst_window->local_result.area*coredynp.num_pipelines);
+ //output_data_csv(iRS.RS.local_result);
+ Iw_height =int_inst_window->local_result.cache_ht;
- /*
- * selection logic
- * In a single-issue Inorder multithreaded processor like Niagara, issue
- * width=1*number_of_threads since the processor does need to pick up
- * instructions from multiple ready ones(although these ready ones are from
- * different threads).While SMT processors do not distinguish which thread
- * belongs to who
- * at the issue stage.
- */
+ /*
+ * selection logic
+ * In a single-issue Inorder multithreaded processor like Niagara, issue width=1*number_of_threads since the processor does need to pick up
+ * instructions from multiple ready ones(although these ready ones are from different threads).While SMT processors do not distinguish which thread belongs to who
+ * at the issue stage.
+ */
- instruction_selection = new selection_logic(
- is_default, XML->sys.core[ithCore].instruction_window_size,
- coredynp.peak_issueW * XML->sys.core[ithCore].number_hardware_threads,
- &interface_ip, Core_device, coredynp.core_ty);
- }
+ instruction_selection = new selection_logic(is_default, XML->sys.core[ithCore].instruction_window_size,
+ coredynp.peak_issueW*XML->sys.core[ithCore].number_hardware_threads,
+ &interface_ip, Core_device, coredynp.core_ty);
+ }
- if (coredynp.core_ty == OOO) {
- /*
- * CAM based instruction window
- * For physicalRegFilebased OOO it is the instruction issue queue, where
- * only tags of phy regs are stored
- * For RS based OOO it is the Reservation station, where both tags and
- * values of phy regs are stored
- * It is written once and read twice(two operands) before an instruction can
- * be issued.
- * X86 instruction can be very long up to 15B. add instruction length in XML
- */
- if (coredynp.scheu_ty == PhysicalRegFile) {
- tag = coredynp.phy_ireg_width;
- // Each time only half of the tag is compared, but two tag should be
- // stored.
- // This underestimate the search power
- data =
- int((ceil((coredynp.instruction_length +
- 2 * (coredynp.phy_ireg_width - coredynp.arch_ireg_width)) /
- 2.0) /
- 8.0));
- // Data width being divided by 2 means only after both operands available
- // the whole data will be read out.
- // This is modeled using two equivalent readouts with half of the data
- // width
- tmp_name = "InstIssueQueue";
- } else {
- tag = coredynp.phy_ireg_width;
- // Each time only half of the tag is compared, but two tag should be
- // stored.
- // This underestimate the search power
- data =
- int(ceil(((coredynp.instruction_length +
- 2 * (coredynp.phy_ireg_width - coredynp.arch_ireg_width) +
- 2 * coredynp.int_data_width) /
- 2.0) /
- 8.0));
- // Data width being divided by 2 means only after both operands available
- // the whole data will be read out.
- // This is modeled using two equivalent readouts with half of the data
- // width
+ if (coredynp.core_ty==OOO)
+ {
+ /*
+ * CAM based instruction window
+ * For physicalRegFilebased OOO it is the instruction issue queue, where only tags of phy regs are stored
+ * For RS based OOO it is the Reservation station, where both tags and values of phy regs are stored
+ * It is written once and read twice(two operands) before an instruction can be issued.
+ * X86 instruction can be very long up to 15B. add instruction length in XML
+ */
+ if(coredynp.scheu_ty==PhysicalRegFile)
+ {
+ tag = coredynp.phy_ireg_width;
+ // Each time only half of the tag is compared, but two tag should be stored.
+ // This underestimate the search power
+ data = int((ceil((coredynp.instruction_length+2*(coredynp.phy_ireg_width - coredynp.arch_ireg_width))/2.0)/8.0));
+ //Data width being divided by 2 means only after both operands available the whole data will be read out.
+ //This is modeled using two equivalent readouts with half of the data width
+ tmp_name = "InstIssueQueue";
+ }
+ else
+ {
+ tag = coredynp.phy_ireg_width;
+ // Each time only half of the tag is compared, but two tag should be stored.
+ // This underestimate the search power
+ data = int(ceil(((coredynp.instruction_length+2*(coredynp.phy_ireg_width - coredynp.arch_ireg_width)+
+ 2*coredynp.int_data_width)/2.0)/8.0));
+ //Data width being divided by 2 means only after both operands available the whole data will be read out.
+ //This is modeled using two equivalent readouts with half of the data width
- tmp_name = "IntReservationStation";
- }
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].instruction_window_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.access_mode = 0;
- interface_ip.throughput = 2 * 1.0 / clockRate;
- interface_ip.latency = 2 * 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.peak_issueW;
- interface_ip.num_wr_ports = coredynp.peak_issueW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = coredynp.peak_issueW;
- int_inst_window = new ArrayST(&interface_ip, tmp_name, Core_device,
- coredynp.opt_local, coredynp.core_ty);
- int_inst_window->area.set_area(int_inst_window->area.get_area() +
- int_inst_window->local_result.area *
- coredynp.num_pipelines);
- area.set_area(area.get_area() +
- int_inst_window->local_result.area * coredynp.num_pipelines);
- Iw_height = int_inst_window->local_result.cache_ht;
- // FU inst window
- if (coredynp.scheu_ty == PhysicalRegFile) {
- tag = 2 * coredynp.phy_freg_width; // TODO: each time only half of the
- // tag is compared
- data =
- int(ceil((coredynp.instruction_length +
- 2 * (coredynp.phy_freg_width - coredynp.arch_freg_width)) /
- 8.0));
- tmp_name = "FPIssueQueue";
- } else {
- tag = 2 * coredynp.phy_ireg_width;
- data =
- int(ceil((coredynp.instruction_length +
- 2 * (coredynp.phy_freg_width - coredynp.arch_freg_width) +
- 2 * coredynp.fp_data_width) /
- 8.0));
- tmp_name = "FPReservationStation";
- }
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].fp_instruction_window_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.access_mode = 0;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.fp_issueW;
- interface_ip.num_wr_ports = coredynp.fp_issueW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = coredynp.fp_issueW;
- fp_inst_window = new ArrayST(&interface_ip, tmp_name, Core_device,
- coredynp.opt_local, coredynp.core_ty);
- fp_inst_window->area.set_area(fp_inst_window->area.get_area() +
- fp_inst_window->local_result.area *
- coredynp.num_fp_pipelines);
- area.set_area(area.get_area() +
- fp_inst_window->local_result.area *
- coredynp.num_fp_pipelines);
- fp_Iw_height = fp_inst_window->local_result.cache_ht;
+ tmp_name = "IntReservationStation";
+ }
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].instruction_window_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = 2*1.0/clockRate;
+ interface_ip.latency = 2*1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.peak_issueW;
+ interface_ip.num_wr_ports = coredynp.peak_issueW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = coredynp.peak_issueW;
+ int_inst_window = new ArrayST(&interface_ip, tmp_name, Core_device, coredynp.opt_local, coredynp.core_ty);
+ int_inst_window->area.set_area(int_inst_window->area.get_area()+ int_inst_window->local_result.area*coredynp.num_pipelines);
+ area.set_area(area.get_area()+ int_inst_window->local_result.area*coredynp.num_pipelines);
+ Iw_height =int_inst_window->local_result.cache_ht;
+ //FU inst window
+ if(coredynp.scheu_ty==PhysicalRegFile)
+ {
+ tag = 2*coredynp.phy_freg_width;// TODO: each time only half of the tag is compared
+ data = int(ceil((coredynp.instruction_length+2*(coredynp.phy_freg_width - coredynp.arch_freg_width))/8.0));
+ tmp_name = "FPIssueQueue";
+ }
+ else
+ {
+ tag = 2*coredynp.phy_ireg_width;
+ data = int(ceil((coredynp.instruction_length+2*(coredynp.phy_freg_width - coredynp.arch_freg_width)+
+ 2*coredynp.fp_data_width)/8.0));
+ tmp_name = "FPReservationStation";
+ }
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].fp_instruction_window_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.fp_issueW;
+ interface_ip.num_wr_ports = coredynp.fp_issueW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = coredynp.fp_issueW;
+ fp_inst_window = new ArrayST(&interface_ip, tmp_name, Core_device, coredynp.opt_local, coredynp.core_ty);
+ fp_inst_window->area.set_area(fp_inst_window->area.get_area()+ fp_inst_window->local_result.area*coredynp.num_fp_pipelines);
+ area.set_area(area.get_area()+ fp_inst_window->local_result.area*coredynp.num_fp_pipelines);
+ fp_Iw_height =fp_inst_window->local_result.cache_ht;
- if (XML->sys.core[ithCore].ROB_size > 0) {
- /*
- * if ROB_size = 0, then the target processor does not support
- *hardware-based
- * speculation, i.e. , the processor allow OOO issue as well as OOO
- *completion, which
- * means branch must be resolved before instruction issued into
- *instruction window, since
- * there is no change to flush miss-predict branch path after
- *instructions are issued in this situation.
- *
- * ROB.ROB size = inflight inst. ROB is unified for int and fp inst.
- * One old approach is to combine the RAT and ROB as a huge CAM structure
- *as in AMD K7.
- * However, this approach is abandoned due to its high power and poor
- *scalablility.
- * McPAT uses current implementation of ROB as circular buffer.
- * ROB is written once when instruction is issued and read once
- *when the instruction is committed. *
- */
- int robExtra = int(ceil(5 + log2(coredynp.num_hthreads)));
- // 5 bits are: busy, Issued, Finished, speculative, valid
- if (coredynp.scheu_ty == PhysicalRegFile) {
- // PC is to id the instruction for recover exception.
- // inst is used to map the renamed dest. registers.so that commit stage
- // can know which reg/RRAT to update
- // data = int(ceil((robExtra+coredynp.pc_width
- //+
- // coredynp.instruction_length +
- //2*coredynp.phy_ireg_width)/8.0));
- data = int(ceil(
- (robExtra + coredynp.pc_width + coredynp.phy_ireg_width) / 8.0));
- } else {
- // in RS based OOO, ROB also contains value of destination reg
- // data = int(ceil((robExtra+coredynp.pc_width
- //+
- // coredynp.instruction_length +
- //2*coredynp.phy_ireg_width + coredynp.fp_data_width)/8.0));
- data = int(ceil((robExtra + coredynp.pc_width +
- coredynp.phy_ireg_width + coredynp.fp_data_width) /
- 8.0));
- }
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data *
- XML->sys.core[ithCore]
- .ROB_size; // The XML ROB size is for all threads
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.peak_commitW;
- interface_ip.num_wr_ports = coredynp.peak_issueW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = 0;
- ROB = new ArrayST(&interface_ip, "ReorderBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ROB->area.set_area(ROB->area.get_area() +
- ROB->local_result.area * coredynp.num_pipelines);
- area.set_area(area.get_area() +
- ROB->local_result.area * coredynp.num_pipelines);
- ROB_height = ROB->local_result.cache_ht;
- }
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+ /*
+ * if ROB_size = 0, then the target processor does not support hardware-based
+ * speculation, i.e. , the processor allow OOO issue as well as OOO completion, which
+ * means branch must be resolved before instruction issued into instruction window, since
+ * there is no change to flush miss-predict branch path after instructions are issued in this situation.
+ *
+ * ROB.ROB size = inflight inst. ROB is unified for int and fp inst.
+ * One old approach is to combine the RAT and ROB as a huge CAM structure as in AMD K7.
+ * However, this approach is abandoned due to its high power and poor scalablility.
+ * McPAT uses current implementation of ROB as circular buffer.
+ * ROB is written once when instruction is issued and read once when the instruction is committed. *
+ */
+ int robExtra = int(ceil(5 + log2(coredynp.num_hthreads)));
+ //5 bits are: busy, Issued, Finished, speculative, valid
+ if(coredynp.scheu_ty==PhysicalRegFile)
+ {
+ //PC is to id the instruction for recover exception.
+ //inst is used to map the renamed dest. registers.so that commit stage can know which reg/RRAT to update
+// data = int(ceil((robExtra+coredynp.pc_width +
+// coredynp.instruction_length + 2*coredynp.phy_ireg_width)/8.0));
+ data = int(ceil((robExtra+coredynp.pc_width +
+ coredynp.phy_ireg_width)/8.0));
+ }
+ else
+ {
+ //in RS based OOO, ROB also contains value of destination reg
+// data = int(ceil((robExtra+coredynp.pc_width +
+// coredynp.instruction_length + 2*coredynp.phy_ireg_width + coredynp.fp_data_width)/8.0));
+ data = int(ceil((robExtra + coredynp.pc_width +
+ coredynp.phy_ireg_width + coredynp.fp_data_width)/8.0));
+ }
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].ROB_size;//The XML ROB size is for all threads
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.peak_commitW;
+ interface_ip.num_wr_ports = coredynp.peak_issueW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = 0;
+ ROB = new ArrayST(&interface_ip, "ReorderBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ROB->area.set_area(ROB->area.get_area()+ ROB->local_result.area*coredynp.num_pipelines);
+ area.set_area(area.get_area()+ ROB->local_result.area*coredynp.num_pipelines);
+ ROB_height =ROB->local_result.cache_ht;
+ }
- instruction_selection = new selection_logic(
- is_default, XML->sys.core[ithCore].instruction_window_size,
- coredynp.peak_issueW, &interface_ip, Core_device, coredynp.core_ty);
- }
+ instruction_selection = new selection_logic(is_default, XML->sys.core[ithCore].instruction_window_size,
+ coredynp.peak_issueW, &interface_ip, Core_device, coredynp.core_ty);
+ }
}
-LoadStoreU::LoadStoreU(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_,
- const CoreDynParam& dyn_p_, bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- coredynp(dyn_p_),
- LSQ(0),
- exist(exist_) {
- if (!exist) return;
- int idx, tag, data, size, line, assoc;
- bool debug = false;
- int ldst_opcode = XML->sys.core[ithCore].opcode_width; // 16;
+LoadStoreU::LoadStoreU(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_,bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ coredynp(dyn_p_),
+ LSQ(0),
+ exist(exist_)
+{
+ if (!exist) return;
+ int idx, tag, data, size, line, assoc;
+ bool debug= false;
+ int ldst_opcode = XML->sys.core[ithCore].opcode_width;//16;
- clockRate = coredynp.clockRate;
- executionTime = coredynp.executionTime;
- cache_p = (Cache_policy)XML->sys.core[ithCore].dcache.dcache_config[7];
+ clockRate = coredynp.clockRate;
+ executionTime = coredynp.executionTime;
+ cache_p = (Cache_policy)XML->sys.core[ithCore].dcache.dcache_config[7];
- interface_ip.num_search_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
+ interface_ip.num_search_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+
- // Crossbar based interconnect for shared memory accesses, added by Syed
- // Crossbar
+ //Crossbar based interconnect for shared memory accesses, added by Syed
+ //Crossbar
- if (XML->sys.architecture == 1) {
- xbar_shared = new Crossbar(
- coredynp.num_fpus, coredynp.num_fpus, 32,
- &(g_tp.peri_global)); // Syed: coredynp.num_fpus is used as simd_width
- } else {
- xbar_shared = new Crossbar(
- coredynp.num_fpus, coredynp.num_fpus, 32,
- &(g_tp.peri_global)); // Syed: coredynp.num_fpus is used as simd_width
- }
+ if(XML->sys.architecture==1){
+ xbar_shared = new Crossbar(coredynp.num_fpus,coredynp.num_fpus,32,&(g_tp.peri_global));//Syed: coredynp.num_fpus is used as simd_width
+ }
+ else{
+ xbar_shared = new Crossbar(coredynp.num_fpus,coredynp.num_fpus,32,&(g_tp.peri_global));//Syed: coredynp.num_fpus is used as simd_width
+ }
- // TODO: Check if this line should be changed to
- // new
- // Crossbar(simd_width,shared_memory_banks,word_length*simd_width,&(g_tp.peri_global));
- // shared memory added by Jingwen
- size = (int)XML->sys.core[ithCore].sharedmemory.dcache_config[0];
- line = (int)XML->sys.core[ithCore].sharedmemory.dcache_config[1];
- assoc = (int)XML->sys.core[ithCore].sharedmemory.dcache_config[2];
- idx = debug ? 9 : int(ceil(log2(size / line / assoc)));
- tag = debug ? 51 : XML->sys.physical_address_width - idx -
- int(ceil(log2(line))) + EXTRA_TAG_BITS;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = 1;
- interface_ip.cache_sz =
- debug ? 32768 : (int)XML->sys.core[ithCore].sharedmemory.dcache_config[0];
- interface_ip.line_sz =
- debug ? 64 : (int)XML->sys.core[ithCore].sharedmemory.dcache_config[1];
- interface_ip.assoc =
- debug ? 8 : (int)XML->sys.core[ithCore].sharedmemory.dcache_config[2];
- interface_ip.nbanks =
- debug ? 1 : (int)XML->sys.core[ithCore].sharedmemory.dcache_config[3];
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode =
- 0; // debug?0:XML->sys.core[ithCore].sharedmemory.dcache_config[5];
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 3.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[5] / clockRate;
- interface_ip.is_cache = true;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].memory_ports; // usually In-order has
- // 1 and OOO has 2 at
- // least.
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- sharedmemory.caches = new ArrayST(&interface_ip, "sharedmemory", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- sharedmemory.area.set_area(sharedmemory.area.get_area() +
- sharedmemory.caches->local_result.area);
- area.set_area(area.get_area() + sharedmemory.caches->local_result.area +
- xbar_shared->area.get_area());
+ //TODO: Check if this line should be changed to
+ //new Crossbar(simd_width,shared_memory_banks,word_length*simd_width,&(g_tp.peri_global));
- // shared memory buffer
- // miss buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = (XML->sys.physical_address_width) + int(ceil(log2(size / line))) +
- sharedmemory.caches->l_ip.line_sz * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = 1;
- interface_ip.line_sz =
- int(ceil(data / 8.0)); // int(ceil(pow(2.0,ceil(log2(data)))/8.0));
- interface_ip.cache_sz = XML->sys.core[ithCore].sharedmemory.buffer_sizes[0] *
- interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- sharedmemory.missb =
- new ArrayST(&interface_ip, "SharedmemoryMissBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- sharedmemory.area.set_area(sharedmemory.area.get_area() +
- sharedmemory.missb->local_result.area);
- area.set_area(area.get_area() + sharedmemory.missb->local_result.area);
+ //shared memory added by Jingwen
+ size = (int)XML->sys.core[ithCore].sharedmemory.dcache_config[0];
+ line = (int)XML->sys.core[ithCore].sharedmemory.dcache_config[1];
+ assoc = (int)XML->sys.core[ithCore].sharedmemory.dcache_config[2];
+ idx = debug?9:int(ceil(log2(size/line/assoc)));
+ tag = debug?51:XML->sys.physical_address_width-idx-int(ceil(log2(line))) + EXTRA_TAG_BITS;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = 1;
+ interface_ip.cache_sz = debug?32768:(int)XML->sys.core[ithCore].sharedmemory.dcache_config[0];
+ interface_ip.line_sz = debug?64:(int)XML->sys.core[ithCore].sharedmemory.dcache_config[1];
+ interface_ip.assoc = debug?8:(int)XML->sys.core[ithCore].sharedmemory.dcache_config[2];
+ interface_ip.nbanks = debug?1:(int)XML->sys.core[ithCore].sharedmemory.dcache_config[3];
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;//debug?0:XML->sys.core[ithCore].sharedmemory.dcache_config[5];
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?3.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[5]/clockRate;
+ interface_ip.is_cache = true;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;//usually In-order has 1 and OOO has 2 at least.
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ sharedmemory.caches = new ArrayST(&interface_ip, "sharedmemory", Core_device, coredynp.opt_local, coredynp.core_ty);
+ sharedmemory.area.set_area(sharedmemory.area.get_area()+ sharedmemory.caches->local_result.area);
+ area.set_area(area.get_area()+ sharedmemory.caches->local_result.area + xbar_shared->area.get_area());
- // sharedmemory fill buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = sharedmemory.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = 1;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].sharedmemory.buffer_sizes[1];
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- sharedmemory.ifb =
- new ArrayST(&interface_ip, "SharedMemoryFillBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- sharedmemory.area.set_area(sharedmemory.area.get_area() +
- sharedmemory.ifb->local_result.area);
- area.set_area(area.get_area() + sharedmemory.ifb->local_result.area);
- // sharedmemory prefetch buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS; // check with
- // previous entries
- // to decide wthether
- // to merge.
- data = sharedmemory.caches->l_ip
- .line_sz; // separate queue to prevent from cache polution.
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = 1;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz = XML->sys.core[ithCore].sharedmemory.buffer_sizes[2] *
- interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- sharedmemory.prefetchb =
- new ArrayST(&interface_ip, "dcacheprefetchBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- sharedmemory.area.set_area(sharedmemory.area.get_area() +
- sharedmemory.prefetchb->local_result.area);
- area.set_area(area.get_area() + sharedmemory.prefetchb->local_result.area);
+ //shared memory buffer
+ //miss buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = (XML->sys.physical_address_width) + int(ceil(log2(size/line))) + sharedmemory.caches->l_ip.line_sz*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = 1;
+ interface_ip.line_sz = int(ceil(data/8.0));//int(ceil(pow(2.0,ceil(log2(data)))/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].sharedmemory.buffer_sizes[0]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ sharedmemory.missb = new ArrayST(&interface_ip, "SharedmemoryMissBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ sharedmemory.area.set_area(sharedmemory.area.get_area()+ sharedmemory.missb->local_result.area);
+ area.set_area(area.get_area()+ sharedmemory.missb->local_result.area);
- // shared memory WBB
- if (cache_p == Write_back) {
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = sharedmemory.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = 1;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- XML->sys.core[ithCore].sharedmemory.buffer_sizes[3] *
- interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug
- ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug
- ? 1.0 / clockRate
- : XML->sys.core[ithCore].sharedmemory.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- sharedmemory.wbb = new ArrayST(&interface_ip, "dcacheWBB", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- sharedmemory.area.set_area(sharedmemory.area.get_area() +
- sharedmemory.wbb->local_result.area);
- area.set_area(area.get_area() + sharedmemory.wbb->local_result.area);
- // output_data_csv(sharedmemory.wbb.local_result);
- }
- /*
- * ccache starts here
- */
- // Constant cache
- size = (int)XML->sys.core[ithCore].ccache.dcache_config[0];
- line = (int)XML->sys.core[ithCore].ccache.dcache_config[1];
- assoc = (int)XML->sys.core[ithCore].ccache.dcache_config[2];
- idx = debug ? 9 : int(ceil(log2(size / line / assoc)));
- tag = debug ? 51 : XML->sys.physical_address_width - idx -
- int(ceil(log2(line))) + EXTRA_TAG_BITS;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz =
- debug ? 32768 : (int)XML->sys.core[ithCore].ccache.dcache_config[0];
- interface_ip.line_sz =
- debug ? 64 : (int)XML->sys.core[ithCore].ccache.dcache_config[1];
- interface_ip.assoc =
- debug ? 8 : (int)XML->sys.core[ithCore].ccache.dcache_config[2];
- interface_ip.nbanks =
- debug ? 1 : (int)XML->sys.core[ithCore].ccache.dcache_config[3];
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode =
- 0; // debug?0:XML->sys.core[ithCore].ccache.dcache_config[5];
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 3.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[5] / clockRate;
- interface_ip.is_cache = true;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].memory_ports; // usually In-order has
- // 1 and OOO has 2 at
- // least.
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- ccache.caches = new ArrayST(&interface_ip, "ccache", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ccache.area.set_area(ccache.area.get_area() +
- ccache.caches->local_result.area);
- area.set_area(area.get_area() + ccache.caches->local_result.area);
- // output_data_csv(ccache.caches.local_result);
+ //sharedmemory fill buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = sharedmemory.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = 1;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].sharedmemory.buffer_sizes[1];
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ sharedmemory.ifb = new ArrayST(&interface_ip, "SharedMemoryFillBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ sharedmemory.area.set_area(sharedmemory.area.get_area()+ sharedmemory.ifb->local_result.area);
+ area.set_area(area.get_area()+ sharedmemory.ifb->local_result.area);
- // cCache controllers
- // miss buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = (XML->sys.physical_address_width) + int(ceil(log2(size / line))) +
- ccache.caches->l_ip.line_sz * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz =
- int(ceil(data / 8.0)); // int(ceil(pow(2.0,ceil(log2(data)))/8.0));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].ccache.buffer_sizes[0] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- ccache.missb = new ArrayST(&interface_ip, "ccacheMissBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ccache.area.set_area(ccache.area.get_area() +
- ccache.missb->local_result.area);
- area.set_area(area.get_area() + ccache.missb->local_result.area);
- // output_data_csv(ccache.missb.local_result);
+ //sharedmemory prefetch buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;//check with previous entries to decide wthether to merge.
+ data = sharedmemory.caches->l_ip.line_sz;//separate queue to prevent from cache polution.
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = 1;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = XML->sys.core[ithCore].sharedmemory.buffer_sizes[2]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ sharedmemory.prefetchb = new ArrayST(&interface_ip, "dcacheprefetchBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ sharedmemory.area.set_area(sharedmemory.area.get_area()+ sharedmemory.prefetchb->local_result.area);
+ area.set_area(area.get_area()+ sharedmemory.prefetchb->local_result.area);
- // fill buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = ccache.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz = data * XML->sys.core[ithCore].ccache.buffer_sizes[1];
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- ccache.ifb = new ArrayST(&interface_ip, "ccacheFillBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ccache.area.set_area(ccache.area.get_area() + ccache.ifb->local_result.area);
- area.set_area(area.get_area() + ccache.ifb->local_result.area);
- // output_data_csv(ccache.ifb.local_result);
+ //shared memory WBB
+ if (cache_p==Write_back)
+ {
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = sharedmemory.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = 1;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = XML->sys.core[ithCore].sharedmemory.buffer_sizes[3]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].sharedmemory.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ sharedmemory.wbb = new ArrayST(&interface_ip, "dcacheWBB", Core_device, coredynp.opt_local, coredynp.core_ty);
+ sharedmemory.area.set_area(sharedmemory.area.get_area()+ sharedmemory.wbb->local_result.area);
+ area.set_area(area.get_area()+ sharedmemory.wbb->local_result.area);
+ //output_data_csv(sharedmemory.wbb.local_result);
+ }
- // prefetch buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS; // check with
- // previous entries
- // to decide wthether
- // to merge.
- data = ccache.caches->l_ip
- .line_sz; // separate queue to prevent from cache polution.
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].ccache.buffer_sizes[2] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- ccache.prefetchb =
- new ArrayST(&interface_ip, "ccacheprefetchBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ccache.area.set_area(ccache.area.get_area() +
- ccache.prefetchb->local_result.area);
- area.set_area(area.get_area() + ccache.prefetchb->local_result.area);
- // output_data_csv(ccache.prefetchb.local_result);
- // WBB
- if (cache_p == Write_back) {
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = ccache.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- XML->sys.core[ithCore].ccache.buffer_sizes[3] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].ccache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- ccache.wbb = new ArrayST(&interface_ip, "ccacheWBB", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ccache.area.set_area(ccache.area.get_area() +
- ccache.wbb->local_result.area);
- area.set_area(area.get_area() + ccache.wbb->local_result.area);
- // output_data_csv(ccache.wbb.local_result);
- }
+ /*
+ * ccache starts here
+ */
+ //Constant cache
+ size = (int)XML->sys.core[ithCore].ccache.dcache_config[0];
+ line = (int)XML->sys.core[ithCore].ccache.dcache_config[1];
+ assoc = (int)XML->sys.core[ithCore].ccache.dcache_config[2];
+ idx = debug?9:int(ceil(log2(size/line/assoc)));
+ tag = debug?51:XML->sys.physical_address_width-idx-int(ceil(log2(line))) + EXTRA_TAG_BITS;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = debug?32768:(int)XML->sys.core[ithCore].ccache.dcache_config[0];
+ interface_ip.line_sz = debug?64:(int)XML->sys.core[ithCore].ccache.dcache_config[1];
+ interface_ip.assoc = debug?8:(int)XML->sys.core[ithCore].ccache.dcache_config[2];
+ interface_ip.nbanks = debug?1:(int)XML->sys.core[ithCore].ccache.dcache_config[3];
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;//debug?0:XML->sys.core[ithCore].ccache.dcache_config[5];
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?3.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[5]/clockRate;
+ interface_ip.is_cache = true;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;//usually In-order has 1 and OOO has 2 at least.
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ ccache.caches = new ArrayST(&interface_ip, "ccache", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ccache.area.set_area(ccache.area.get_area()+ ccache.caches->local_result.area);
+ area.set_area(area.get_area()+ ccache.caches->local_result.area);
+ //output_data_csv(ccache.caches.local_result);
- /*
- * tcache starts here
- */
- // Texture cache
- size = (int)XML->sys.core[ithCore].tcache.dcache_config[0];
- line = (int)XML->sys.core[ithCore].tcache.dcache_config[1];
- assoc = (int)XML->sys.core[ithCore].tcache.dcache_config[2];
- idx = debug ? 9 : int(ceil(log2(size / line / assoc)));
- tag = debug ? 51 : XML->sys.physical_address_width - idx -
- int(ceil(log2(line))) + EXTRA_TAG_BITS;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz =
- debug ? 32768 : (int)XML->sys.core[ithCore].tcache.dcache_config[0];
- interface_ip.line_sz =
- debug ? 64 : (int)XML->sys.core[ithCore].tcache.dcache_config[1];
- interface_ip.assoc =
- debug ? 8 : (int)XML->sys.core[ithCore].tcache.dcache_config[2];
- interface_ip.nbanks =
- debug ? 1 : (int)XML->sys.core[ithCore].tcache.dcache_config[3];
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode =
- 0; // debug?0:XML->sys.core[ithCore].tcache.dcache_config[5];
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 3.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[5] / clockRate;
- interface_ip.is_cache = true;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].memory_ports; // usually In-order has
- // 1 and OOO has 2 at
- // least.
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- tcache.caches = new ArrayST(&interface_ip, "tcache", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- tcache.area.set_area(tcache.area.get_area() +
- tcache.caches->local_result.area);
- area.set_area(area.get_area() + tcache.caches->local_result.area);
- // output_data_csv(tcache.caches.local_result);
- // tCache controllers
- // miss buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = (XML->sys.physical_address_width) + int(ceil(log2(size / line))) +
- tcache.caches->l_ip.line_sz * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz =
- int(ceil(data / 8.0)); // int(ceil(pow(2.0,ceil(log2(data)))/8.0));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].tcache.buffer_sizes[0] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- tcache.missb = new ArrayST(&interface_ip, "tcacheMissBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- tcache.area.set_area(tcache.area.get_area() +
- tcache.missb->local_result.area);
- area.set_area(area.get_area() + tcache.missb->local_result.area);
- // output_data_csv(tcache.missb.local_result);
- // fill buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = tcache.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz = data * XML->sys.core[ithCore].tcache.buffer_sizes[1];
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- tcache.ifb = new ArrayST(&interface_ip, "tcacheFillBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- tcache.area.set_area(tcache.area.get_area() + tcache.ifb->local_result.area);
- area.set_area(area.get_area() + tcache.ifb->local_result.area);
- // output_data_csv(tcache.ifb.local_result);
+ //cCache controllers
+ //miss buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = (XML->sys.physical_address_width) + int(ceil(log2(size/line))) + ccache.caches->l_ip.line_sz*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = int(ceil(data/8.0));//int(ceil(pow(2.0,ceil(log2(data)))/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].ccache.buffer_sizes[0]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ ccache.missb = new ArrayST(&interface_ip, "ccacheMissBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ccache.area.set_area(ccache.area.get_area()+ ccache.missb->local_result.area);
+ area.set_area(area.get_area()+ ccache.missb->local_result.area);
+ //output_data_csv(ccache.missb.local_result);
- // prefetch buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS; // check with
- // previous entries
- // to decide wthether
- // to merge.
- data = tcache.caches->l_ip
- .line_sz; // separate queue to prevent from cache polution.
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].tcache.buffer_sizes[2] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- tcache.prefetchb =
- new ArrayST(&interface_ip, "tcacheprefetchBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- tcache.area.set_area(tcache.area.get_area() +
- tcache.prefetchb->local_result.area);
- area.set_area(area.get_area() + tcache.prefetchb->local_result.area);
- // output_data_csv(tcache.prefetchb.local_result);
+ //fill buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = ccache.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].ccache.buffer_sizes[1];
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ ccache.ifb = new ArrayST(&interface_ip, "ccacheFillBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ccache.area.set_area(ccache.area.get_area()+ ccache.ifb->local_result.area);
+ area.set_area(area.get_area()+ ccache.ifb->local_result.area);
+ //output_data_csv(ccache.ifb.local_result);
- // WBB
- if (cache_p == Write_back) {
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = tcache.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- XML->sys.core[ithCore].tcache.buffer_sizes[3] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].tcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- tcache.wbb = new ArrayST(&interface_ip, "tcacheWBB", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- tcache.area.set_area(tcache.area.get_area() +
- tcache.wbb->local_result.area);
- area.set_area(area.get_area() + tcache.wbb->local_result.area);
- // output_data_csv(tcache.wbb.local_result);
- }
+ //prefetch buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;//check with previous entries to decide wthether to merge.
+ data = ccache.caches->l_ip.line_sz;//separate queue to prevent from cache polution.
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = XML->sys.core[ithCore].ccache.buffer_sizes[2]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ ccache.prefetchb = new ArrayST(&interface_ip, "ccacheprefetchBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ccache.area.set_area(ccache.area.get_area()+ ccache.prefetchb->local_result.area);
+ area.set_area(area.get_area()+ ccache.prefetchb->local_result.area);
+ //output_data_csv(ccache.prefetchb.local_result);
- /*
- * dcache starts here
- */
- // Dcache
- size = (int)XML->sys.core[ithCore].dcache.dcache_config[0];
- line = (int)XML->sys.core[ithCore].dcache.dcache_config[1];
- assoc = (int)XML->sys.core[ithCore].dcache.dcache_config[2];
- idx = debug ? 9 : int(ceil(log2(size / line / assoc)));
- tag = debug ? 51 : XML->sys.physical_address_width - idx -
- int(ceil(log2(line))) + EXTRA_TAG_BITS;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz =
- debug ? 32768 : (int)XML->sys.core[ithCore].dcache.dcache_config[0];
- interface_ip.line_sz =
- debug ? 64 : (int)XML->sys.core[ithCore].dcache.dcache_config[1];
- interface_ip.assoc =
- debug ? 8 : (int)XML->sys.core[ithCore].dcache.dcache_config[2];
- interface_ip.nbanks =
- debug ? 1 : (int)XML->sys.core[ithCore].dcache.dcache_config[3];
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode =
- 0; // debug?0:XML->sys.core[ithCore].dcache.dcache_config[5];
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 3.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[5] / clockRate;
- interface_ip.is_cache = true;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports =
- debug ? 1 : XML->sys.core[ithCore].memory_ports; // usually In-order has
- // 1 and OOO has 2 at
- // least.
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- dcache.caches = new ArrayST(&interface_ip, "dcache", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- dcache.area.set_area(dcache.area.get_area() +
- dcache.caches->local_result.area);
- area.set_area(area.get_area() + dcache.caches->local_result.area);
- // output_data_csv(dcache.caches.local_result);
+ //WBB
+ if (cache_p==Write_back)
+ {
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = ccache.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = XML->sys.core[ithCore].ccache.buffer_sizes[3]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].ccache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ ccache.wbb = new ArrayST(&interface_ip, "ccacheWBB", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ccache.area.set_area(ccache.area.get_area()+ ccache.wbb->local_result.area);
+ area.set_area(area.get_area()+ ccache.wbb->local_result.area);
+ //output_data_csv(ccache.wbb.local_result);
+ }
- // dCache controllers
- // miss buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = (XML->sys.physical_address_width) + int(ceil(log2(size / line))) +
- dcache.caches->l_ip.line_sz * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz =
- int(ceil(data / 8.0)); // int(ceil(pow(2.0,ceil(log2(data)))/8.0));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].dcache.buffer_sizes[0] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- dcache.missb = new ArrayST(&interface_ip, "dcacheMissBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- dcache.area.set_area(dcache.area.get_area() +
- dcache.missb->local_result.area);
- area.set_area(area.get_area() + dcache.missb->local_result.area);
- // output_data_csv(dcache.missb.local_result);
+ /*
+ * tcache starts here
+ */
+ //Texture cache
+ size = (int)XML->sys.core[ithCore].tcache.dcache_config[0];
+ line = (int)XML->sys.core[ithCore].tcache.dcache_config[1];
+ assoc = (int)XML->sys.core[ithCore].tcache.dcache_config[2];
+ idx = debug?9:int(ceil(log2(size/line/assoc)));
+ tag = debug?51:XML->sys.physical_address_width-idx-int(ceil(log2(line))) + EXTRA_TAG_BITS;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = debug?32768:(int)XML->sys.core[ithCore].tcache.dcache_config[0];
+ interface_ip.line_sz = debug?64:(int)XML->sys.core[ithCore].tcache.dcache_config[1];
+ interface_ip.assoc = debug?8:(int)XML->sys.core[ithCore].tcache.dcache_config[2];
+ interface_ip.nbanks = debug?1:(int)XML->sys.core[ithCore].tcache.dcache_config[3];
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;//debug?0:XML->sys.core[ithCore].tcache.dcache_config[5];
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?3.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[5]/clockRate;
+ interface_ip.is_cache = true;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;//usually In-order has 1 and OOO has 2 at least.
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ tcache.caches = new ArrayST(&interface_ip, "tcache", Core_device, coredynp.opt_local, coredynp.core_ty);
+ tcache.area.set_area(tcache.area.get_area()+ tcache.caches->local_result.area);
+ area.set_area(area.get_area()+ tcache.caches->local_result.area);
+ //output_data_csv(tcache.caches.local_result);
- // fill buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = dcache.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz = data * XML->sys.core[ithCore].dcache.buffer_sizes[1];
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- dcache.ifb = new ArrayST(&interface_ip, "dcacheFillBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- dcache.area.set_area(dcache.area.get_area() + dcache.ifb->local_result.area);
- area.set_area(area.get_area() + dcache.ifb->local_result.area);
- // output_data_csv(dcache.ifb.local_result);
- // prefetch buffer
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS; // check with
- // previous entries
- // to decide wthether
- // to merge.
- data = dcache.caches->l_ip
- .line_sz; // separate queue to prevent from cache polution.
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data; // int(pow(2.0,ceil(log2(data))));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].dcache.buffer_sizes[2] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = debug ? 1 : XML->sys.core[ithCore].memory_ports;
- ;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- dcache.prefetchb =
- new ArrayST(&interface_ip, "dcacheprefetchBuffer", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- dcache.area.set_area(dcache.area.get_area() +
- dcache.prefetchb->local_result.area);
- area.set_area(area.get_area() + dcache.prefetchb->local_result.area);
- // output_data_csv(dcache.prefetchb.local_result);
+ //tCache controllers
+ //miss buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = (XML->sys.physical_address_width) + int(ceil(log2(size/line))) + tcache.caches->l_ip.line_sz*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = int(ceil(data/8.0));//int(ceil(pow(2.0,ceil(log2(data)))/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].tcache.buffer_sizes[0]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ tcache.missb = new ArrayST(&interface_ip, "tcacheMissBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ tcache.area.set_area(tcache.area.get_area()+ tcache.missb->local_result.area);
+ area.set_area(area.get_area()+ tcache.missb->local_result.area);
+ //output_data_csv(tcache.missb.local_result);
- // WBB
- if (cache_p == Write_back) {
- tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
- data = dcache.caches->l_ip.line_sz;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- XML->sys.core[ithCore].dcache.buffer_sizes[3] * interface_ip.line_sz;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- dcache.wbb = new ArrayST(&interface_ip, "dcacheWBB", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- dcache.area.set_area(dcache.area.get_area() +
- dcache.wbb->local_result.area);
- area.set_area(area.get_area() + dcache.wbb->local_result.area);
- // output_data_csv(dcache.wbb.local_result);
- }
+ //fill buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = tcache.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].tcache.buffer_sizes[1];
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ tcache.ifb = new ArrayST(&interface_ip, "tcacheFillBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ tcache.area.set_area(tcache.area.get_area()+ tcache.ifb->local_result.area);
+ area.set_area(area.get_area()+ tcache.ifb->local_result.area);
+ //output_data_csv(tcache.ifb.local_result);
- /*
- * LSU--in-order processors do not have separate load queue: unified lsq
- * partitioned among threads
- * it is actually the store queue but for inorder processors it serves as both
- * loadQ and StoreQ
- */
- tag = ldst_opcode + XML->sys.virtual_address_width +
- int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads))) +
- EXTRA_TAG_BITS;
- data = XML->sys.machine_bits;
- interface_ip.is_cache = true;
- interface_ip.line_sz = int(ceil(data / 32.0)) * 4;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz = XML->sys.core[ithCore].store_buffer_size *
- interface_ip.line_sz *
- XML->sys.core[ithCore].number_hardware_threads;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_wr_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = XML->sys.core[ithCore].memory_ports;
- LSQ = new ArrayST(&interface_ip, "Load(Store)Queue", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- LSQ->area.set_area(LSQ->area.get_area() + LSQ->local_result.area);
- area.set_area(area.get_area() + LSQ->local_result.area);
- area.set_area(area.get_area() * cdb_overhead);
- // output_data_csv(LSQ.LSQ.local_result);
- lsq_height =
- LSQ->local_result.cache_ht *
- sqrt(cdb_overhead); /*XML->sys.core[ithCore].number_hardware_threads*/
+ //prefetch buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;//check with previous entries to decide wthether to merge.
+ data = tcache.caches->l_ip.line_sz;//separate queue to prevent from cache polution.
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = XML->sys.core[ithCore].tcache.buffer_sizes[2]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ tcache.prefetchb = new ArrayST(&interface_ip, "tcacheprefetchBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ tcache.area.set_area(tcache.area.get_area()+ tcache.prefetchb->local_result.area);
+ area.set_area(area.get_area()+ tcache.prefetchb->local_result.area);
+ //output_data_csv(tcache.prefetchb.local_result);
+
+ //WBB
+ if (cache_p==Write_back)
+ {
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = tcache.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = XML->sys.core[ithCore].tcache.buffer_sizes[3]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].tcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ tcache.wbb = new ArrayST(&interface_ip, "tcacheWBB", Core_device, coredynp.opt_local, coredynp.core_ty);
+ tcache.area.set_area(tcache.area.get_area()+ tcache.wbb->local_result.area);
+ area.set_area(area.get_area()+ tcache.wbb->local_result.area);
+ //output_data_csv(tcache.wbb.local_result);
+ }
+
+
+
+
+ /*
+ * dcache starts here
+ */
+ //Dcache
+ size = (int)XML->sys.core[ithCore].dcache.dcache_config[0];
+ line = (int)XML->sys.core[ithCore].dcache.dcache_config[1];
+ assoc = (int)XML->sys.core[ithCore].dcache.dcache_config[2];
+ idx = debug?9:int(ceil(log2(size/line/assoc)));
+ tag = debug?51:XML->sys.physical_address_width-idx-int(ceil(log2(line))) + EXTRA_TAG_BITS;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = debug?32768:(int)XML->sys.core[ithCore].dcache.dcache_config[0];
+ interface_ip.line_sz = debug?64:(int)XML->sys.core[ithCore].dcache.dcache_config[1];
+ interface_ip.assoc = debug?8:(int)XML->sys.core[ithCore].dcache.dcache_config[2];
+ interface_ip.nbanks = debug?1:(int)XML->sys.core[ithCore].dcache.dcache_config[3];
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;//debug?0:XML->sys.core[ithCore].dcache.dcache_config[5];
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?3.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[5]/clockRate;
+ interface_ip.is_cache = true;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;//usually In-order has 1 and OOO has 2 at least.
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ dcache.caches = new ArrayST(&interface_ip, "dcache", Core_device, coredynp.opt_local, coredynp.core_ty);
+ dcache.area.set_area(dcache.area.get_area()+ dcache.caches->local_result.area);
+ area.set_area(area.get_area()+ dcache.caches->local_result.area);
+ //output_data_csv(dcache.caches.local_result);
+
+
+ //dCache controllers
+ //miss buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = (XML->sys.physical_address_width) + int(ceil(log2(size/line))) + dcache.caches->l_ip.line_sz*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = int(ceil(data/8.0));//int(ceil(pow(2.0,ceil(log2(data)))/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].dcache.buffer_sizes[0]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ dcache.missb = new ArrayST(&interface_ip, "dcacheMissBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ dcache.area.set_area(dcache.area.get_area()+ dcache.missb->local_result.area);
+ area.set_area(area.get_area()+ dcache.missb->local_result.area);
+ //output_data_csv(dcache.missb.local_result);
+
+ //fill buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = dcache.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].dcache.buffer_sizes[1];
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ dcache.ifb = new ArrayST(&interface_ip, "dcacheFillBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ dcache.area.set_area(dcache.area.get_area()+ dcache.ifb->local_result.area);
+ area.set_area(area.get_area()+ dcache.ifb->local_result.area);
+ //output_data_csv(dcache.ifb.local_result);
+
+ //prefetch buffer
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;//check with previous entries to decide wthether to merge.
+ data = dcache.caches->l_ip.line_sz;//separate queue to prevent from cache polution.
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;//int(pow(2.0,ceil(log2(data))));
+ interface_ip.cache_sz = XML->sys.core[ithCore].dcache.buffer_sizes[2]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = debug?1:XML->sys.core[ithCore].memory_ports;;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ dcache.prefetchb = new ArrayST(&interface_ip, "dcacheprefetchBuffer", Core_device, coredynp.opt_local, coredynp.core_ty);
+ dcache.area.set_area(dcache.area.get_area()+ dcache.prefetchb->local_result.area);
+ area.set_area(area.get_area()+ dcache.prefetchb->local_result.area);
+ //output_data_csv(dcache.prefetchb.local_result);
+
+ //WBB
+ if (cache_p==Write_back)
+ {
+ tag = XML->sys.physical_address_width + EXTRA_TAG_BITS;
+ data = dcache.caches->l_ip.line_sz;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = XML->sys.core[ithCore].dcache.buffer_sizes[3]*interface_ip.line_sz;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ dcache.wbb = new ArrayST(&interface_ip, "dcacheWBB", Core_device, coredynp.opt_local, coredynp.core_ty);
+ dcache.area.set_area(dcache.area.get_area()+ dcache.wbb->local_result.area);
+ area.set_area(area.get_area()+ dcache.wbb->local_result.area);
+ //output_data_csv(dcache.wbb.local_result);
+ }
+
+ /*
+ * LSU--in-order processors do not have separate load queue: unified lsq
+ * partitioned among threads
+ * it is actually the store queue but for inorder processors it serves as both loadQ and StoreQ
+ */
+ tag = ldst_opcode+XML->sys.virtual_address_width +int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads))) + EXTRA_TAG_BITS;
+ data = XML->sys.machine_bits;
+ interface_ip.is_cache = true;
+ interface_ip.line_sz = int(ceil(data/32.0))*4;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = XML->sys.core[ithCore].store_buffer_size*interface_ip.line_sz*XML->sys.core[ithCore].number_hardware_threads;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_wr_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports =XML->sys.core[ithCore].memory_ports;
+ LSQ = new ArrayST(&interface_ip, "Load(Store)Queue", Core_device, coredynp.opt_local, coredynp.core_ty);
+ LSQ->area.set_area(LSQ->area.get_area()+ LSQ->local_result.area);
+ area.set_area(area.get_area()+ LSQ->local_result.area);
+ area.set_area(area.get_area()*cdb_overhead);
+ //output_data_csv(LSQ.LSQ.local_result);
+ lsq_height=LSQ->local_result.cache_ht*sqrt(cdb_overhead);/*XML->sys.core[ithCore].number_hardware_threads*/
+
+ if ((coredynp.core_ty==OOO) && (XML->sys.core[ithCore].load_buffer_size >0))
+ {
+ interface_ip.line_sz = int(ceil(data/32.0))*4;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.cache_sz = XML->sys.core[ithCore].load_buffer_size*interface_ip.line_sz*XML->sys.core[ithCore].number_hardware_threads;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_wr_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports =XML->sys.core[ithCore].memory_ports;
+ LoadQ = new ArrayST(&interface_ip, "LoadQueue", Core_device, coredynp.opt_local, coredynp.core_ty);
+ LoadQ->area.set_area(LoadQ->area.get_area()+ LoadQ->local_result.area);
+ area.set_area(area.get_area()+ LoadQ->local_result.area);
+ area.set_area(area.get_area()*cdb_overhead);
+ //output_data_csv(LoadQ.LoadQ.local_result);
+ lsq_height=(LSQ->local_result.cache_ht + LoadQ->local_result.cache_ht)*sqrt(cdb_overhead);/*XML->sys.core[ithCore].number_hardware_threads*/
+ }
- if ((coredynp.core_ty == OOO) &&
- (XML->sys.core[ithCore].load_buffer_size > 0)) {
- interface_ip.line_sz = int(ceil(data / 32.0)) * 4;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.cache_sz = XML->sys.core[ithCore].load_buffer_size *
- interface_ip.line_sz *
- XML->sys.core[ithCore].number_hardware_threads;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_wr_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = XML->sys.core[ithCore].memory_ports;
- LoadQ = new ArrayST(&interface_ip, "LoadQueue", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- LoadQ->area.set_area(LoadQ->area.get_area() + LoadQ->local_result.area);
- area.set_area(area.get_area() + LoadQ->local_result.area);
- area.set_area(area.get_area() * cdb_overhead);
- // output_data_csv(LoadQ.LoadQ.local_result);
- lsq_height =
- (LSQ->local_result.cache_ht + LoadQ->local_result.cache_ht) *
- sqrt(cdb_overhead); /*XML->sys.core[ithCore].number_hardware_threads*/
- }
}
-MemManU::MemManU(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_, const CoreDynParam& dyn_p_,
- bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- coredynp(dyn_p_),
- itlb(0),
- dtlb(0),
- exist(exist_) {
- if (!exist) return;
- int tag, data;
- bool debug = false;
+MemManU::MemManU(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_,bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ coredynp(dyn_p_),
+ itlb(0),
+ dtlb(0),
+ exist(exist_)
+{
+ if (!exist) return;
+ int tag, data;
+ bool debug= false;
- clockRate = coredynp.clockRate;
- executionTime = coredynp.executionTime;
+ clockRate = coredynp.clockRate;
+ executionTime = coredynp.executionTime;
+
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.specific_tag = 1;
+ //Itlb TLBs are partioned among threads according to Nigara and Nehalem
+ tag = XML->sys.virtual_address_width- int(floor(log2(XML->sys.virtual_memory_page_size))) + int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads)))+ EXTRA_TAG_BITS;
+ data = XML->sys.physical_address_width- int(floor(log2(XML->sys.virtual_memory_page_size)));
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = int(ceil(data/8.0));//int(ceil(pow(2.0,ceil(log2(data)))/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].itlb.number_entries*interface_ip.line_sz;//*XML->sys.core[ithCore].number_hardware_threads;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].icache.icache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = debug?1:XML->sys.core[ithCore].number_instruction_fetch_ports;
+ itlb = new ArrayST(&interface_ip, "ITLB", Core_device, coredynp.opt_local, coredynp.core_ty);
+ itlb->area.set_area(itlb->area.get_area()+ itlb->local_result.area);
+ area.set_area(area.get_area()+ itlb->local_result.area);
+ //output_data_csv(itlb.tlb.local_result);
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.specific_tag = 1;
- // Itlb TLBs are partioned among threads according to Nigara and Nehalem
- tag = XML->sys.virtual_address_width -
- int(floor(log2(XML->sys.virtual_memory_page_size))) +
- int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads))) +
- EXTRA_TAG_BITS;
- data = XML->sys.physical_address_width -
- int(floor(log2(XML->sys.virtual_memory_page_size)));
- interface_ip.tag_w = tag;
- interface_ip.line_sz =
- int(ceil(data / 8.0)); // int(ceil(pow(2.0,ceil(log2(data)))/8.0));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].itlb.number_entries *
- interface_ip.line_sz; //*XML->sys.core[ithCore].number_hardware_threads;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 0;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].icache.icache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports =
- debug ? 1 : XML->sys.core[ithCore].number_instruction_fetch_ports;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports =
- debug ? 1 : XML->sys.core[ithCore].number_instruction_fetch_ports;
- itlb = new ArrayST(&interface_ip, "ITLB", Core_device, coredynp.opt_local,
- coredynp.core_ty);
- itlb->area.set_area(itlb->area.get_area() + itlb->local_result.area);
- area.set_area(area.get_area() + itlb->local_result.area);
- // output_data_csv(itlb.tlb.local_result);
+ //dtlb
+ tag = XML->sys.virtual_address_width- int(floor(log2(XML->sys.virtual_memory_page_size))) +int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads)))+ EXTRA_TAG_BITS;
+ data = XML->sys.physical_address_width- int(floor(log2(XML->sys.virtual_memory_page_size)));
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.line_sz = int(ceil(data/8.0));//int(ceil(pow(2.0,ceil(log2(data)))/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].dtlb.number_entries*interface_ip.line_sz;//*XML->sys.core[ithCore].number_hardware_threads;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 0;
+ interface_ip.throughput = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[4]/clockRate;
+ interface_ip.latency = debug?1.0/clockRate:XML->sys.core[ithCore].dcache.dcache_config[5]/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = XML->sys.core[ithCore].memory_ports;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports = XML->sys.core[ithCore].memory_ports;
+ dtlb = new ArrayST(&interface_ip, "DTLB", Core_device, coredynp.opt_local, coredynp.core_ty);
+ dtlb->area.set_area(dtlb->area.get_area()+ dtlb->local_result.area);
+ area.set_area(area.get_area()+ dtlb->local_result.area);
+ //output_data_csv(dtlb.tlb.local_result);
- // dtlb
- tag = XML->sys.virtual_address_width -
- int(floor(log2(XML->sys.virtual_memory_page_size))) +
- int(ceil(log2(XML->sys.core[ithCore].number_hardware_threads))) +
- EXTRA_TAG_BITS;
- data = XML->sys.physical_address_width -
- int(floor(log2(XML->sys.virtual_memory_page_size)));
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.line_sz =
- int(ceil(data / 8.0)); // int(ceil(pow(2.0,ceil(log2(data)))/8.0));
- interface_ip.cache_sz =
- XML->sys.core[ithCore].dtlb.number_entries *
- interface_ip.line_sz; //*XML->sys.core[ithCore].number_hardware_threads;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 0;
- interface_ip.throughput =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[4] / clockRate;
- interface_ip.latency =
- debug ? 1.0 / clockRate
- : XML->sys.core[ithCore].dcache.dcache_config[5] / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = XML->sys.core[ithCore].memory_ports;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = XML->sys.core[ithCore].memory_ports;
- dtlb = new ArrayST(&interface_ip, "DTLB", Core_device, coredynp.opt_local,
- coredynp.core_ty);
- dtlb->area.set_area(dtlb->area.get_area() + dtlb->local_result.area);
- area.set_area(area.get_area() + dtlb->local_result.area);
- // output_data_csv(dtlb.tlb.local_result);
}
//#define FERMI
-RegFU::RegFU(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_, const CoreDynParam& dyn_p_,
- double exClockRate, bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- coredynp(dyn_p_),
- IRF(0),
- FRF(0),
- RFWIN(0),
- exist(exist_) {
- /*
- * processors have separate architectural register files for each thread.
- * therefore, the bypass buses need to travel across all the register files.
- */
- if (!exist) return;
- int data;
- clockRate = exClockRate; // coredynp.clockRate;
- executionTime = coredynp.executionTime;
+RegFU::RegFU(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_,double exClockRate,bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ coredynp(dyn_p_),
+ IRF (0),
+ FRF (0),
+ RFWIN (0),
+ exist(exist_)
+ {
+ /*
+ * processors have separate architectural register files for each thread.
+ * therefore, the bypass buses need to travel across all the register files.
+ */
+ if (!exist) return;
+ int data;
+ clockRate = exClockRate;//coredynp.clockRate;
+ executionTime = coredynp.executionTime;
/*********************************************************************************
- * OC stage modelling (Syed Gilani)
- *********************************************************************************/
+ * OC stage modelling (Syed Gilani)
+ *********************************************************************************/
+
+ //Crossbar
+
+ if(XML->sys.architecture==1){
+ xbar_rfu = new Crossbar(XML->sys.core[ithCore].rf_banks/2,XML->sys.core[ithCore].collector_units/2
+ ,(128),&(g_tp.peri_global));
+ }else{
+ xbar_rfu = new Crossbar(XML->sys.core[ithCore].rf_banks,XML->sys.core[ithCore].collector_units
+ ,(128),&(g_tp.peri_global));
+ }
- // Crossbar
+ //new Crossbar(simd_width,shared_memory_banks,word_length*simd_width,&(g_tp.peri_global));
- if (XML->sys.architecture == 1) {
- xbar_rfu = new Crossbar(XML->sys.core[ithCore].rf_banks / 2,
- XML->sys.core[ithCore].collector_units / 2, (128),
- &(g_tp.peri_global));
- } else {
- xbar_rfu = new Crossbar(XML->sys.core[ithCore].rf_banks,
- XML->sys.core[ithCore].collector_units, (128),
- &(g_tp.peri_global));
- }
+ //Arbiter
+ arbiter_rfu = new MCPAT_Arbiter(XML->sys.core[ithCore].rf_banks,XML->sys.core[ithCore].collector_units , 1,&(g_tp.peri_global));
- // new
- // Crossbar(simd_width,shared_memory_banks,word_length*simd_width,&(g_tp.peri_global));
- // Arbiter
- arbiter_rfu = new MCPAT_Arbiter(XML->sys.core[ithCore].rf_banks,
- XML->sys.core[ithCore].collector_units, 1,
- &(g_tp.peri_global));
- // RF banks modelled here for GPGPU-Sim (Syed Gilani)
- //
- //**********************************IRF***************************************
- data = coredynp.int_data_width;
- // data *= 8;
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
+ // RF banks modelled here for GPGPU-Sim (Syed Gilani)
+ //
+ //**********************************IRF***************************************
+ data = coredynp.int_data_width;
+ //data *= 8;
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
- interface_ip.line_sz = 16; // int(ceil(data/32.0))*4 *
- // XML->sys.core[ithCore].simd_width/4 ;//2 for
- // Tesla as RF width half of SIMD width
+ interface_ip.line_sz = 16;//int(ceil(data/32.0))*4 * XML->sys.core[ithCore].simd_width/4 ;//2 for Tesla as RF width half of SIMD width
- interface_ip.line_sz = 16; // int(ceil(data/32.0))*4 *
- // XML->sys.core[ithCore].simd_width/2 ;//2 for
- // Tesla as RF width half of SIMD width
+ interface_ip.line_sz = 16;//int(ceil(data/32.0))*4 * XML->sys.core[ithCore].simd_width/2 ;//2 for Tesla as RF width half of SIMD width
- interface_ip.cache_sz = coredynp.num_IRF_entry * 4;
- interface_ip.assoc = 1;
- interface_ip.nbanks = XML->sys.core[ithCore].rf_banks;
+ interface_ip.cache_sz = coredynp.num_IRF_entry*4;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = XML->sys.core[ithCore].rf_banks;
- interface_ip.out_w =
- interface_ip.line_sz *
- 8; // interface_ip.line_sz*XML->sys.core[ithCore].simd_width/4; //2 for
- // Tesla and 4 for Fermi
+ interface_ip.out_w = interface_ip.line_sz*8;//interface_ip.line_sz*XML->sys.core[ithCore].simd_width/4; //2 for Tesla and 4 for Fermi
- interface_ip.out_w =
- interface_ip.line_sz *
- 8; // interface_ip.line_sz*XML->sys.core[ithCore].simd_width/2; //2 for
- // Tesla and 4 for Fermi
+ interface_ip.out_w = interface_ip.line_sz*8;//interface_ip.line_sz*XML->sys.core[ithCore].simd_width/2; //2 for Tesla and 4 for Fermi
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1 / (clockRate);
- interface_ip.latency = 8.0 / (clockRate);
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 1;
- interface_ip.obj_func_cycle_t = 0;
- interface_ip.num_rw_ports = 0; // this is the transfer port for
- // saving/restoring states when exceptions
- // happen.
- interface_ip.num_rd_ports = 1; // 2*coredynp.peak_issueW;
- interface_ip.num_wr_ports = 1; // coredynp.peak_issueW;
- interface_ip.num_se_rd_ports = 0;
- IRF = new ArrayST(&interface_ip, "Integer Register File", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- IRF->area.set_area(IRF->area.get_area() +
- IRF->local_result.area * coredynp.num_pipelines *
- cdb_overhead);
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1/(clockRate);
+ interface_ip.latency = 8.0/(clockRate);
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 1;
+ interface_ip.obj_func_cycle_t = 0;
+ interface_ip.num_rw_ports = 0;//this is the transfer port for saving/restoring states when exceptions happen.
+ interface_ip.num_rd_ports = 1;//2*coredynp.peak_issueW;
+ interface_ip.num_wr_ports = 1;//coredynp.peak_issueW;
+ interface_ip.num_se_rd_ports = 0;
+ IRF = new ArrayST(&interface_ip, "Integer Register File", Core_device, coredynp.opt_local, coredynp.core_ty);
- area.set_area(area.get_area() + IRF->local_result.area +
- xbar_rfu->area.get_area() + arbiter_rfu->area.get_area());
- if (XML->sys.architecture == 1) {
- IRF->local_result.power.readOp.dynamic *= .33;
- IRF->local_result.power.writeOp.dynamic *= .33;
- } else {
- IRF->local_result.power.readOp.dynamic *= .55;
- IRF->local_result.power.writeOp.dynamic *= .55;
- }
+ IRF->area.set_area(IRF->area.get_area()+ IRF->local_result.area*coredynp.num_pipelines*cdb_overhead);
- /**
- * Operand collectors (32-bit wide, 8 entry banks )
- */
- data = 32;
- // data *= 8;
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = 4; // int(ceil(data/32.0))*4 *
- // XML->sys.core[ithCore].simd_width/4 ;//2 for
- // Tesla as RF width half of SIMD width
+ area.set_area(area.get_area()+ IRF->local_result.area
+ + xbar_rfu->area.get_area() + arbiter_rfu->area.get_area());
+ if(XML->sys.architecture==1){
+ IRF->local_result.power.readOp.dynamic *= .33;
+ IRF->local_result.power.writeOp.dynamic *= .33;
+ }
+ else {
+ IRF->local_result.power.readOp.dynamic *= .55;
+ IRF->local_result.power.writeOp.dynamic *= .55;
+ }
- interface_ip.line_sz = 4; // int(ceil(data/32.0))*4 *
- // XML->sys.core[ithCore].simd_width/2 ;//2 for
- // Tesla as RF width half of SIMD width
- interface_ip.cache_sz = 8 * 4;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w =
- interface_ip
- .line_sz; // interface_ip.line_sz*XML->sys.core[ithCore].simd_width/4;
- // //2 for Tesla and 4 for Fermi
- interface_ip.out_w =
- interface_ip
- .line_sz; // interface_ip.line_sz*XML->sys.core[ithCore].simd_width/2;
- // //2 for Tesla and 4 for Fermi
+ /**
+ * Operand collectors (32-bit wide, 8 entry banks )
+ */
+ data = 32;
+ //data *= 8;
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / (clockRate);
- interface_ip.latency = 1.0 / (clockRate);
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 1;
- interface_ip.obj_func_cycle_t = 0;
- interface_ip.num_rw_ports = 0; // this is the transfer port for
- // saving/restoring states when exceptions
- // happen.
- interface_ip.num_rd_ports = 1; // 2*coredynp.peak_issueW;
- interface_ip.num_wr_ports = 1; // coredynp.peak_issueW;
- interface_ip.num_se_rd_ports = 0;
- OPC = new ArrayST(&interface_ip, "Operand collectors", Core_device,
- coredynp.opt_local, coredynp.core_ty);
+ interface_ip.line_sz = 4;//int(ceil(data/32.0))*4 * XML->sys.core[ithCore].simd_width/4 ;//2 for Tesla as RF width half of SIMD width
- OPC->area.set_area(OPC->area.get_area() +
- OPC->local_result.area * coredynp.num_pipelines *
- cdb_overhead);
+ interface_ip.line_sz = 4;//int(ceil(data/32.0))*4 * XML->sys.core[ithCore].simd_width/2 ;//2 for Tesla as RF width half of SIMD width
- area.set_area(area.get_area() + OPC->local_result.area);
+ interface_ip.cache_sz = 8*4;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
- /********
- * For GPGPUSim (Syed Gilani)
- * Do not include FRF in final results for GPU. Only model the IRF
- ********/
+ interface_ip.out_w = interface_ip.line_sz;//interface_ip.line_sz*XML->sys.core[ithCore].simd_width/4; //2 for Tesla and 4 for Fermi
- //**********************************FRF***************************************
- data = coredynp.fp_data_width;
- // data *= 8;
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = int(ceil(data / 32.0)) * 4;
- interface_ip.cache_sz = coredynp.num_FRF_entry * interface_ip.line_sz;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // this is the transfer port for
- // saving/restoring states when exceptions
- // happen.
- interface_ip.num_rd_ports = 2 * XML->sys.core[ithCore].issue_width;
- // interface_ip.num_rd_ports = 1;
- interface_ip.num_wr_ports = XML->sys.core[ithCore].issue_width;
- // interface_ip.num_wr_ports = 1;
- interface_ip.num_se_rd_ports = 0;
- FRF = new ArrayST(&interface_ip, "Floating point Register File", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- // FRF->area.set_area(FRF->area.get_area()+
- // FRF->local_result.area*XML->sys.core[ithCore].number_hardware_threads*coredynp.num_fp_pipelines*cdb_overhead);
- // area.set_area(area.get_area()+
- // FRF->local_result.area*XML->sys.core[ithCore].number_hardware_threads*coredynp.num_fp_pipelines*cdb_overhead);
- // area.set_area(area.get_area()*cdb_overhead);
- // output_data_csv(FRF.RF.local_result);
- int_regfile_height = IRF->local_result.cache_ht *
- XML->sys.core[ithCore].number_hardware_threads *
- sqrt(cdb_overhead);
- fp_regfile_height = 0;
- // fp_regfile_height =
- // FRF->local_result.cache_ht*XML->sys.core[ithCore].number_hardware_threads*sqrt(cdb_overhead);
- // since a EXU is associated with each pipeline, the cdb should not have
- // longer length.
- if (coredynp.regWindowing) {
- //*********************************REG_WIN************************************
- data = coredynp.int_data_width; // ECC, and usually 2 regs are transfered
- // together during window shifting.Niagara
- // Mega cell
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = int(ceil(data / 8.0));
- interface_ip.cache_sz = XML->sys.core[ithCore].register_windows_size *
- IRF->l_ip.cache_sz *
- XML->sys.core[ithCore].number_hardware_threads;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 4.0 / clockRate;
- interface_ip.latency = 4.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // this is the transfer port for
- // saving/restoring states when exceptions
- // happen.
- interface_ip.num_rd_ports = 0;
- interface_ip.num_wr_ports = 0;
- interface_ip.num_se_rd_ports = 0;
- RFWIN = new ArrayST(&interface_ip, "RegWindow", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- RFWIN->area.set_area(RFWIN->area.get_area() +
- RFWIN->local_result.area * coredynp.num_pipelines);
- area.set_area(area.get_area() +
- RFWIN->local_result.area * coredynp.num_pipelines);
- // output_data_csv(RFWIN.RF.local_result);
- }
-}
+ interface_ip.out_w = interface_ip.line_sz;//interface_ip.line_sz*XML->sys.core[ithCore].simd_width/2; //2 for Tesla and 4 for Fermi
-EXECU::EXECU(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_, double lsq_height_,
- const CoreDynParam& dyn_p_, double exClockRate, bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- lsq_height(lsq_height_),
- coredynp(dyn_p_),
- rfu(0),
- scheu(0),
- fp_u(0),
- exeu(0),
- mul(0),
- int_bypass(0),
- intTagBypass(0),
- int_mul_bypass(0),
- intTag_mul_Bypass(0),
- fp_bypass(0),
- fpTagBypass(0),
- exist(exist_),
- rf_fu_clockRate(exClockRate) {
- if (!exist) return;
- double fu_height = 0.0;
- clockRate = coredynp.clockRate;
- // cout <<"EXECU exClockRate: "<<exClockRate<<endl;
- executionTime = coredynp.executionTime;
- rfu = new RegFU(XML, ithCore, &interface_ip, coredynp, exClockRate);
- scheu = new SchedulerU(XML, ithCore, &interface_ip, coredynp);
- exeu = new FunctionalUnit(XML, ithCore, &interface_ip, coredynp, ALU,
- exClockRate);
- area.set_area(area.get_area() + exeu->area.get_area() + rfu->area.get_area() +
- scheu->area.get_area());
- fu_height = exeu->FU_height;
- if (coredynp.num_fpus > 0) {
- fp_u = new FunctionalUnit(XML, ithCore, &interface_ip, coredynp, FPU,
- exClockRate);
- area.set_area(area.get_area() + fp_u->area.get_area());
- }
- if (coredynp.num_muls > 0) {
- mul = new FunctionalUnit(XML, ithCore, &interface_ip, coredynp, MUL,
- exClockRate);
- area.set_area(area.get_area() + mul->area.get_area());
- fu_height += mul->FU_height;
- }
- /*
- * broadcast logic, including int-broadcast; int_tag-broadcast; fp-broadcast;
- * fp_tag-broadcast
- * integer by pass has two paths and fp has 3 paths.
- * on the same bus there are multiple tri-state drivers and muxes that go to
- * different components on the same bus
- */
- if (XML->sys.Embedded) {
- interface_ip.wt = Global_30;
- interface_ip.wire_is_mat_type = 0;
- interface_ip.wire_os_mat_type = 0;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- } else {
- interface_ip.wt = Global;
- interface_ip.wire_is_mat_type =
- 2; // start from semi-global since local wires are already used
- interface_ip.wire_os_mat_type = 2;
- interface_ip.throughput = 10.0 / clockRate; // Do not care
- interface_ip.latency = 10.0 / clockRate;
- }
- if (coredynp.core_ty == Inorder) { //
- int_bypass = new interconnect(
- "Int Bypass Data", Core_device, 1, 1,
- int(ceil(XML->sys.machine_bits / 32.0) * 32),
- rfu->int_regfile_height + exeu->FU_height + lsq_height, &interface_ip,
- 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() + int_bypass->area.get_area());
- intTagBypass = new interconnect(
- "Int Bypass tag", Core_device, 1, 1, coredynp.perThreadState,
- rfu->int_regfile_height + exeu->FU_height + lsq_height +
- scheu->Iw_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- intTagBypass->area.get_area());
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/(clockRate);
+ interface_ip.latency = 1.0/(clockRate);
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 1;
+ interface_ip.obj_func_cycle_t = 0;
+ interface_ip.num_rw_ports = 0;//this is the transfer port for saving/restoring states when exceptions happen.
+ interface_ip.num_rd_ports = 1;//2*coredynp.peak_issueW;
+ interface_ip.num_wr_ports = 1;//coredynp.peak_issueW;
+ interface_ip.num_se_rd_ports = 0;
+ OPC = new ArrayST(&interface_ip, "Operand collectors", Core_device, coredynp.opt_local, coredynp.core_ty);
- if (coredynp.num_muls > 0) {
- int_mul_bypass = new interconnect(
- "Mul Bypass Data", Core_device, 1, 1,
- int(ceil(XML->sys.machine_bits / 32.0) * 32 * 1.5),
- rfu->fp_regfile_height + exeu->FU_height + mul->FU_height +
- lsq_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- int_mul_bypass->area.get_area());
- intTag_mul_Bypass = new interconnect(
- "Mul Bypass tag", Core_device, 1, 1, coredynp.perThreadState,
- rfu->fp_regfile_height + exeu->FU_height + mul->FU_height +
- lsq_height + scheu->Iw_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- intTag_mul_Bypass->area.get_area());
- }
+ OPC->area.set_area(OPC->area.get_area()+ OPC->local_result.area*coredynp.num_pipelines*cdb_overhead);
- /*
- if (coredynp.num_fpus>0)
- {
- fp_bypass = new interconnect("FP Bypass Data" , Core_device, 1,
- 1, int(ceil(XML->sys.machine_bits/32.0)*32*1.5),
- rfu->fp_regfile_height + fp_u->FU_height,
- &interface_ip, 3,
- false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area()
- +fp_bypass->area.get_area());
- fpTagBypass = new interconnect("FP Bypass tag" , Core_device, 1,
- 1, coredynp.perThreadState,
- rfu->fp_regfile_height + fp_u->FU_height +
- lsq_height + scheu->Iw_height, &interface_ip, 3,
- false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area()
- +fpTagBypass->area.get_area());
- }*/
- } /* if (coredynp.core_ty==Inorder) */
- else { // OOO
- if (coredynp.scheu_ty == PhysicalRegFile) {
- /* For physical register based OOO,
- * data broadcast interconnects cover across functional units, lsq, inst
- * windows and register files,
- * while tag broadcast interconnects also cover across ROB
- */
- int_bypass = new interconnect(
- "Int Bypass Data", Core_device, 1, 1,
- int(ceil(coredynp.int_data_width)),
- rfu->int_regfile_height + exeu->FU_height + lsq_height, &interface_ip,
- 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- int_bypass->area.get_area());
- intTagBypass = new interconnect(
- "Int Bypass tag", Core_device, 1, 1, coredynp.phy_ireg_width,
- rfu->int_regfile_height + exeu->FU_height + lsq_height +
- scheu->Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- if (coredynp.num_muls > 0) {
- int_mul_bypass = new interconnect(
- "Mul Bypass Data", Core_device, 1, 1,
- int(ceil(coredynp.int_data_width)),
- rfu->int_regfile_height + exeu->FU_height + mul->FU_height +
- lsq_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- intTag_mul_Bypass = new interconnect(
- "Mul Bypass tag", Core_device, 1, 1, coredynp.phy_ireg_width,
- rfu->int_regfile_height + exeu->FU_height + mul->FU_height +
- lsq_height + scheu->Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- int_mul_bypass->area.get_area());
- bypass.area.set_area(bypass.area.get_area() +
- intTag_mul_Bypass->area.get_area());
- }
+ area.set_area(area.get_area()+ OPC->local_result.area);
- if (coredynp.num_fpus > 0) {
- fp_bypass = new interconnect("FP Bypass Data", Core_device, 1, 1,
- int(ceil(coredynp.fp_data_width)),
- rfu->fp_regfile_height + fp_u->FU_height,
- &interface_ip, 3, false, 1.0,
- coredynp.opt_local, coredynp.core_ty);
- fpTagBypass = new interconnect(
- "FP Bypass tag", Core_device, 1, 1, coredynp.phy_freg_width,
- rfu->fp_regfile_height + fp_u->FU_height + lsq_height +
- scheu->fp_Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- fp_bypass->area.get_area());
- bypass.area.set_area(bypass.area.get_area() +
- fpTagBypass->area.get_area());
- }
- } else {
- /*
- * In RS based processor both data and tag are broadcast together,
- * covering functional units, lsq, nst windows, register files, and ROBs
- */
- int_bypass = new interconnect(
- "Int Bypass Data", Core_device, 1, 1,
- int(ceil(coredynp.int_data_width)),
- rfu->int_regfile_height + exeu->FU_height + lsq_height +
- scheu->Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- intTagBypass = new interconnect(
- "Int Bypass tag", Core_device, 1, 1, coredynp.phy_ireg_width,
- rfu->int_regfile_height + exeu->FU_height + lsq_height +
- scheu->Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- int_bypass->area.get_area());
- bypass.area.set_area(bypass.area.get_area() +
- intTagBypass->area.get_area());
- if (coredynp.num_muls > 0) {
- int_mul_bypass = new interconnect(
- "Mul Bypass Data", Core_device, 1, 1,
- int(ceil(coredynp.int_data_width)),
- rfu->int_regfile_height + exeu->FU_height + mul->FU_height +
- lsq_height + scheu->Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- intTag_mul_Bypass = new interconnect(
- "Mul Bypass tag", Core_device, 1, 1, coredynp.phy_ireg_width,
- rfu->int_regfile_height + exeu->FU_height + mul->FU_height +
- lsq_height + scheu->Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- int_mul_bypass->area.get_area());
- bypass.area.set_area(bypass.area.get_area() +
- intTag_mul_Bypass->area.get_area());
- }
- if (coredynp.num_fpus > 0) {
- fp_bypass = new interconnect(
- "FP Bypass Data", Core_device, 1, 1,
- int(ceil(coredynp.fp_data_width)),
- rfu->fp_regfile_height + fp_u->FU_height + lsq_height +
- scheu->fp_Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- fpTagBypass = new interconnect(
- "FP Bypass tag", Core_device, 1, 1, coredynp.phy_freg_width,
- rfu->fp_regfile_height + fp_u->FU_height + lsq_height +
- scheu->fp_Iw_height + scheu->ROB_height,
- &interface_ip, 3, false, 1.0, coredynp.opt_local, coredynp.core_ty);
- bypass.area.set_area(bypass.area.get_area() +
- fp_bypass->area.get_area());
- bypass.area.set_area(bypass.area.get_area() +
- fpTagBypass->area.get_area());
- }
- } /* else */
- } /* else */
- area.set_area(area.get_area() /*+ bypass.area.get_area()*/);
+
+ /********
+ * For GPGPUSim (Syed Gilani)
+ * Do not include FRF in final results for GPU. Only model the IRF
+ ********/
+
+ //**********************************FRF***************************************
+ data = coredynp.fp_data_width;
+ //data *= 8;
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = int(ceil(data/32.0))*4;
+ interface_ip.cache_sz = coredynp.num_FRF_entry*interface_ip.line_sz;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//this is the transfer port for saving/restoring states when exceptions happen.
+ interface_ip.num_rd_ports = 2*XML->sys.core[ithCore].issue_width;
+ //interface_ip.num_rd_ports = 1;
+ interface_ip.num_wr_ports = XML->sys.core[ithCore].issue_width;
+ //interface_ip.num_wr_ports = 1;
+ interface_ip.num_se_rd_ports = 0;
+ FRF = new ArrayST(&interface_ip, "Floating point Register File", Core_device, coredynp.opt_local, coredynp.core_ty);
+ //FRF->area.set_area(FRF->area.get_area()+ FRF->local_result.area*XML->sys.core[ithCore].number_hardware_threads*coredynp.num_fp_pipelines*cdb_overhead);
+ //area.set_area(area.get_area()+ FRF->local_result.area*XML->sys.core[ithCore].number_hardware_threads*coredynp.num_fp_pipelines*cdb_overhead);
+ //area.set_area(area.get_area()*cdb_overhead);
+ //output_data_csv(FRF.RF.local_result);
+ int_regfile_height= IRF->local_result.cache_ht*XML->sys.core[ithCore].number_hardware_threads*sqrt(cdb_overhead);
+ fp_regfile_height=0;
+ //fp_regfile_height = FRF->local_result.cache_ht*XML->sys.core[ithCore].number_hardware_threads*sqrt(cdb_overhead);
+ //since a EXU is associated with each pipeline, the cdb should not have longer length.
+ if (coredynp.regWindowing)
+ {
+ //*********************************REG_WIN************************************
+ data = coredynp.int_data_width; //ECC, and usually 2 regs are transfered together during window shifting.Niagara Mega cell
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = int(ceil(data/8.0));
+ interface_ip.cache_sz = XML->sys.core[ithCore].register_windows_size*IRF->l_ip.cache_sz*XML->sys.core[ithCore].number_hardware_threads;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 4.0/clockRate;
+ interface_ip.latency = 4.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//this is the transfer port for saving/restoring states when exceptions happen.
+ interface_ip.num_rd_ports = 0;
+ interface_ip.num_wr_ports = 0;
+ interface_ip.num_se_rd_ports = 0;
+ RFWIN = new ArrayST(&interface_ip, "RegWindow", Core_device, coredynp.opt_local, coredynp.core_ty);
+ RFWIN->area.set_area(RFWIN->area.get_area()+ RFWIN->local_result.area*coredynp.num_pipelines);
+ area.set_area(area.get_area()+ RFWIN->local_result.area*coredynp.num_pipelines);
+ //output_data_csv(RFWIN.RF.local_result);
+ }
+
+
+ }
+
+EXECU::EXECU(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, double lsq_height_, const CoreDynParam & dyn_p_, double exClockRate, bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ lsq_height(lsq_height_),
+ coredynp(dyn_p_),
+ rfu(0),
+ scheu(0),
+ fp_u(0),
+ exeu(0),
+ mul(0),
+ int_bypass(0),
+ intTagBypass(0),
+ int_mul_bypass(0),
+ intTag_mul_Bypass(0),
+ fp_bypass(0),
+ fpTagBypass(0),
+ exist(exist_),
+ rf_fu_clockRate(exClockRate)
+{
+ if (!exist) return;
+ double fu_height = 0.0;
+ clockRate = coredynp.clockRate;
+ //cout <<"EXECU exClockRate: "<<exClockRate<<endl;
+ executionTime = coredynp.executionTime;
+ rfu = new RegFU(XML, ithCore, &interface_ip,coredynp,exClockRate);
+ scheu = new SchedulerU(XML, ithCore, &interface_ip,coredynp);
+ exeu = new FunctionalUnit(XML, ithCore,&interface_ip, coredynp, ALU,exClockRate);
+ area.set_area(area.get_area()+ exeu->area.get_area() + rfu->area.get_area() +scheu->area.get_area() );
+ fu_height = exeu->FU_height;
+ if (coredynp.num_fpus >0)
+ {
+ fp_u = new FunctionalUnit(XML, ithCore,&interface_ip, coredynp, FPU, exClockRate);
+ area.set_area(area.get_area()+ fp_u->area.get_area());
+ }
+ if (coredynp.num_muls >0)
+ {
+ mul = new FunctionalUnit(XML, ithCore,&interface_ip, coredynp, MUL, exClockRate);
+ area.set_area(area.get_area()+ mul->area.get_area());
+ fu_height += mul->FU_height;
+ }
+ /*
+ * broadcast logic, including int-broadcast; int_tag-broadcast; fp-broadcast; fp_tag-broadcast
+ * integer by pass has two paths and fp has 3 paths.
+ * on the same bus there are multiple tri-state drivers and muxes that go to different components on the same bus
+ */
+ if (XML->sys.Embedded)
+ {
+ interface_ip.wt =Global_30;
+ interface_ip.wire_is_mat_type = 0;
+ interface_ip.wire_os_mat_type = 0;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ }
+ else
+ {
+ interface_ip.wt =Global;
+ interface_ip.wire_is_mat_type = 2;//start from semi-global since local wires are already used
+ interface_ip.wire_os_mat_type = 2;
+ interface_ip.throughput = 10.0/clockRate; //Do not care
+ interface_ip.latency = 10.0/clockRate;
+ }
+
+ if (coredynp.core_ty==Inorder)
+ {//
+ int_bypass = new interconnect("Int Bypass Data", Core_device, 1, 1, int(ceil(XML->sys.machine_bits/32.0)*32),
+ rfu->int_regfile_height + exeu->FU_height + lsq_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() + int_bypass->area.get_area());
+ intTagBypass = new interconnect("Int Bypass tag" , Core_device, 1, 1, coredynp.perThreadState,
+ rfu->int_regfile_height + exeu->FU_height + lsq_height + scheu->Iw_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +intTagBypass->area.get_area());
+
+ if (coredynp.num_muls>0)
+ {
+ int_mul_bypass = new interconnect("Mul Bypass Data" , Core_device, 1, 1, int(ceil(XML->sys.machine_bits/32.0)*32*1.5),
+ rfu->fp_regfile_height + exeu->FU_height + mul->FU_height + lsq_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +int_mul_bypass->area.get_area());
+ intTag_mul_Bypass = new interconnect("Mul Bypass tag" , Core_device, 1, 1, coredynp.perThreadState,
+ rfu->fp_regfile_height + exeu->FU_height + mul->FU_height + lsq_height + scheu->Iw_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +intTag_mul_Bypass->area.get_area());
+ }
+
+ /*
+ if (coredynp.num_fpus>0)
+ {
+ fp_bypass = new interconnect("FP Bypass Data" , Core_device, 1, 1, int(ceil(XML->sys.machine_bits/32.0)*32*1.5),
+ rfu->fp_regfile_height + fp_u->FU_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +fp_bypass->area.get_area());
+ fpTagBypass = new interconnect("FP Bypass tag" , Core_device, 1, 1, coredynp.perThreadState,
+ rfu->fp_regfile_height + fp_u->FU_height + lsq_height + scheu->Iw_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +fpTagBypass->area.get_area());
+ }*/
+ } /* if (coredynp.core_ty==Inorder) */
+ else
+ {//OOO
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ /* For physical register based OOO,
+ * data broadcast interconnects cover across functional units, lsq, inst windows and register files,
+ * while tag broadcast interconnects also cover across ROB
+ */
+ int_bypass = new interconnect("Int Bypass Data", Core_device, 1, 1, int(ceil(coredynp.int_data_width)),
+ rfu->int_regfile_height + exeu->FU_height + lsq_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +int_bypass->area.get_area());
+ intTagBypass = new interconnect("Int Bypass tag" , Core_device, 1, 1, coredynp.phy_ireg_width,
+ rfu->int_regfile_height + exeu->FU_height + lsq_height + scheu->Iw_height + scheu->ROB_height , &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+
+ if (coredynp.num_muls>0)
+ {
+ int_mul_bypass = new interconnect("Mul Bypass Data", Core_device, 1, 1, int(ceil(coredynp.int_data_width)),
+ rfu->int_regfile_height + exeu->FU_height + mul->FU_height + lsq_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ intTag_mul_Bypass = new interconnect("Mul Bypass tag" , Core_device, 1, 1, coredynp.phy_ireg_width,
+ rfu->int_regfile_height + exeu->FU_height + mul->FU_height + lsq_height + scheu->Iw_height + scheu->ROB_height , &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +int_mul_bypass->area.get_area());
+ bypass.area.set_area(bypass.area.get_area() +intTag_mul_Bypass->area.get_area());
+ }
+
+ if (coredynp.num_fpus>0)
+ {
+ fp_bypass = new interconnect("FP Bypass Data" , Core_device, 1, 1, int(ceil(coredynp.fp_data_width)),
+ rfu->fp_regfile_height + fp_u->FU_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ fpTagBypass = new interconnect("FP Bypass tag" , Core_device, 1, 1, coredynp.phy_freg_width,
+ rfu->fp_regfile_height + fp_u->FU_height + lsq_height + scheu->fp_Iw_height + scheu->ROB_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +fp_bypass->area.get_area());
+ bypass.area.set_area(bypass.area.get_area() +fpTagBypass->area.get_area());
+ }
+ }
+ else
+ {
+ /*
+ * In RS based processor both data and tag are broadcast together,
+ * covering functional units, lsq, nst windows, register files, and ROBs
+ */
+ int_bypass = new interconnect("Int Bypass Data", Core_device, 1, 1, int(ceil(coredynp.int_data_width)),
+ rfu->int_regfile_height + exeu->FU_height + lsq_height + scheu->Iw_height + scheu->ROB_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ intTagBypass = new interconnect("Int Bypass tag" , Core_device, 1, 1, coredynp.phy_ireg_width,
+ rfu->int_regfile_height + exeu->FU_height + lsq_height + scheu->Iw_height + scheu->ROB_height , &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +int_bypass->area.get_area());
+ bypass.area.set_area(bypass.area.get_area() +intTagBypass->area.get_area());
+ if (coredynp.num_muls>0)
+ {
+ int_mul_bypass = new interconnect("Mul Bypass Data", Core_device, 1, 1, int(ceil(coredynp.int_data_width)),
+ rfu->int_regfile_height + exeu->FU_height + mul->FU_height + lsq_height + scheu->Iw_height + scheu->ROB_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ intTag_mul_Bypass = new interconnect("Mul Bypass tag" , Core_device, 1, 1, coredynp.phy_ireg_width,
+ rfu->int_regfile_height + exeu->FU_height + mul->FU_height + lsq_height + scheu->Iw_height + scheu->ROB_height , &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +int_mul_bypass->area.get_area());
+ bypass.area.set_area(bypass.area.get_area() +intTag_mul_Bypass->area.get_area());
+ }
+
+ if (coredynp.num_fpus>0)
+ {
+ fp_bypass = new interconnect("FP Bypass Data" , Core_device, 1, 1, int(ceil(coredynp.fp_data_width)),
+ rfu->fp_regfile_height + fp_u->FU_height + lsq_height + scheu->fp_Iw_height + scheu->ROB_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ fpTagBypass = new interconnect("FP Bypass tag" , Core_device, 1, 1, coredynp.phy_freg_width,
+ rfu->fp_regfile_height + fp_u->FU_height + lsq_height + scheu->fp_Iw_height + scheu->ROB_height, &interface_ip, 3,
+ false, 1.0, coredynp.opt_local, coredynp.core_ty);
+ bypass.area.set_area(bypass.area.get_area() +fp_bypass->area.get_area());
+ bypass.area.set_area(bypass.area.get_area() +fpTagBypass->area.get_area());
+ }
+ } /* else */
+
+
+ } /* else */
+ area.set_area(area.get_area()/*+ bypass.area.get_area()*/);
}
-RENAMINGU::RENAMINGU(ParseXML* XML_interface, int ithCore_,
- InputParameter* interface_ip_, const CoreDynParam& dyn_p_,
- bool exist_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- coredynp(dyn_p_),
- iFRAT(0),
- fFRAT(0),
- iRRAT(0),
- fRRAT(0),
- ifreeL(0),
- ffreeL(0),
- idcl(0),
- fdcl(0),
- RAHT(0),
- exist(exist_) {
- /*
- * Although renaming logic maybe be used in in-order processors,
-*McPAT assumes no renaming logic is used since the performance gain is very
-* limited and
-*the only major inorder processor with renaming logic is Itainium
-*that is a VLIW processor and different from current McPAT's model.
- * physical register base OOO must have Dual-RAT architecture or equivalent
-* structure.FRAT:FrontRAT, RRAT:RetireRAT;
- * i,f prefix mean int and fp
- * RAT for all Renaming logic, random accessible checkpointing is used, but
-* only update when instruction retires.
- * FRAT will be read twice and written once per instruction;
- * RRAT will be write once per instruction when committing and reads out all
-* when context switch
- * checkpointing is implicit
- * Renaming logic is duplicated for each different hardware threads
- *
- * No Dual-RAT is needed in RS-based OOO processors,
- * however, RAT needs to do associative search in RAT, when instruction
-* commits and ROB release the entry,
- * to make sure all the renamings associated with the ROB to be released are
-* updated at the same time.
- * RAM scheme has # ARchi Reg entry with each entry hold phy reg tag,
- * CAM scheme has # Phy Reg entry with each entry hold ARchi reg tag,
- *
- * Both RAM and CAM have same DCL
- */
- if (!exist) return;
- int tag, data, out_w;
- // interface_ip.wire_is_mat_type = 0;
- // interface_ip.wire_os_mat_type = 0;
- // interface_ip.wt = Global_30;
- clockRate = coredynp.clockRate;
- executionTime = coredynp.executionTime;
- if (coredynp.core_ty == OOO) {
- // integer pipeline
- if (coredynp.scheu_ty == PhysicalRegFile) {
- if (coredynp.rm_ty == RAMbased) { // FRAT with global checkpointing (GCs)
- // please see paper tech report for
- // detailed explaintions
- data =
- 33; // int(ceil(coredynp.phy_ireg_width*(1+coredynp.globalCheckpoint)/8.0));
- // data =
- //int(ceil(coredynp.phy_ireg_width/8.0));
- out_w = 1; // int(ceil(coredynp.phy_ireg_width/8.0));
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].archi_Regs_IRF_size;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // the extra one port is for GCs
- interface_ip.num_rd_ports = 2 * coredynp.decodeW;
- interface_ip.num_wr_ports = coredynp.decodeW;
- interface_ip.num_se_rd_ports = 0;
- iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- iFRAT->area.set_area(
- iFRAT->area.get_area() +
- iFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + iFRAT->area.get_area());
+RENAMINGU::RENAMINGU(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_,bool exist_)
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ coredynp(dyn_p_),
+ iFRAT(0),
+ fFRAT(0),
+ iRRAT(0),
+ fRRAT(0),
+ ifreeL(0),
+ ffreeL(0),
+ idcl(0),
+ fdcl(0),
+ RAHT(0),
+ exist(exist_)
+ {
+ /*
+ * Although renaming logic maybe be used in in-order processors,
+ * McPAT assumes no renaming logic is used since the performance gain is very limited and
+ * the only major inorder processor with renaming logic is Itainium
+ * that is a VLIW processor and different from current McPAT's model.
+ * physical register base OOO must have Dual-RAT architecture or equivalent structure.FRAT:FrontRAT, RRAT:RetireRAT;
+ * i,f prefix mean int and fp
+ * RAT for all Renaming logic, random accessible checkpointing is used, but only update when instruction retires.
+ * FRAT will be read twice and written once per instruction;
+ * RRAT will be write once per instruction when committing and reads out all when context switch
+ * checkpointing is implicit
+ * Renaming logic is duplicated for each different hardware threads
+ *
+ * No Dual-RAT is needed in RS-based OOO processors,
+ * however, RAT needs to do associative search in RAT, when instruction commits and ROB release the entry,
+ * to make sure all the renamings associated with the ROB to be released are updated at the same time.
+ * RAM scheme has # ARchi Reg entry with each entry hold phy reg tag,
+ * CAM scheme has # Phy Reg entry with each entry hold ARchi reg tag,
+ *
+ * Both RAM and CAM have same DCL
+ */
+ if (!exist) return;
+ int tag, data, out_w;
+// interface_ip.wire_is_mat_type = 0;
+// interface_ip.wire_os_mat_type = 0;
+// interface_ip.wt = Global_30;
+ clockRate = coredynp.clockRate;
+ executionTime = coredynp.executionTime;
+ if (coredynp.core_ty==OOO)
+ {
+ //integer pipeline
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ if (coredynp.rm_ty ==RAMbased)
+ { //FRAT with global checkpointing (GCs) please see paper tech report for detailed explaintions
+ data = 33;//int(ceil(coredynp.phy_ireg_width*(1+coredynp.globalCheckpoint)/8.0));
+// data = int(ceil(coredynp.phy_ireg_width/8.0));
+ out_w = 1;//int(ceil(coredynp.phy_ireg_width/8.0));
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].archi_Regs_IRF_size;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//the extra one port is for GCs
+ interface_ip.num_rd_ports = 2*coredynp.decodeW;
+ interface_ip.num_wr_ports = coredynp.decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ iFRAT->area.set_area(iFRAT->area.get_area()+ iFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ iFRAT->area.get_area());
- // //RAHT According to Intel, combine GC with FRAT is
- //very costly.
- // data =
- //int(ceil(coredynp.phy_ireg_width/8.0)*coredynp.num_IRF_entry);
- // out_w = data;
- // interface_ip.is_cache =
- //false;
- // interface_ip.pure_cam = false;
- // interface_ip.pure_ram = true;
- // interface_ip.line_sz = data;
- // interface_ip.cache_sz =
- //data*coredynp.globalCheckpoint;
- // interface_ip.assoc = 1;
- // interface_ip.nbanks = 1;
- // interface_ip.out_w = out_w*8;
- // interface_ip.access_mode = 0;
- // interface_ip.throughput =
- //1.0/clockRate;
- // interface_ip.latency =
- //1.0/clockRate;
- // interface_ip.obj_func_dyn_energy = 0;
- // interface_ip.obj_func_dyn_power = 0;
- // interface_ip.obj_func_leak_power = 0;
- // interface_ip.obj_func_cycle_t = 1;
- // interface_ip.num_rw_ports = 1;//the extra one
- //port is for GCs
- // interface_ip.num_rd_ports =
- //2*coredynp.decodeW;
- // interface_ip.num_wr_ports = coredynp.decodeW;
- // interface_ip.num_se_rd_ports = 0;
- // iFRAT = new ArrayST(&interface_ip, "Int
- //FrontRAT");
- // iFRAT->area.set_area(iFRAT->area.get_area()+
- //iFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
- // area.set_area(area.get_area()+
- //iFRAT->area.get_area());
+// //RAHT According to Intel, combine GC with FRAT is very costly.
+// data = int(ceil(coredynp.phy_ireg_width/8.0)*coredynp.num_IRF_entry);
+// out_w = data;
+// interface_ip.is_cache = false;
+// interface_ip.pure_cam = false;
+// interface_ip.pure_ram = true;
+// interface_ip.line_sz = data;
+// interface_ip.cache_sz = data*coredynp.globalCheckpoint;
+// interface_ip.assoc = 1;
+// interface_ip.nbanks = 1;
+// interface_ip.out_w = out_w*8;
+// interface_ip.access_mode = 0;
+// interface_ip.throughput = 1.0/clockRate;
+// interface_ip.latency = 1.0/clockRate;
+// interface_ip.obj_func_dyn_energy = 0;
+// interface_ip.obj_func_dyn_power = 0;
+// interface_ip.obj_func_leak_power = 0;
+// interface_ip.obj_func_cycle_t = 1;
+// interface_ip.num_rw_ports = 1;//the extra one port is for GCs
+// interface_ip.num_rd_ports = 2*coredynp.decodeW;
+// interface_ip.num_wr_ports = coredynp.decodeW;
+// interface_ip.num_se_rd_ports = 0;
+// iFRAT = new ArrayST(&interface_ip, "Int FrontRAT");
+// iFRAT->area.set_area(iFRAT->area.get_area()+ iFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+// area.set_area(area.get_area()+ iFRAT->area.get_area());
- // FRAT floating point
- data = int(ceil(coredynp.phy_freg_width *
- (1 + coredynp.globalCheckpoint) / 8.0));
- out_w = int(ceil(coredynp.phy_freg_width / 8.0));
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].archi_Regs_FRF_size;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // the extra one port is for GCs
- interface_ip.num_rd_ports = 2 * coredynp.fp_decodeW;
- interface_ip.num_wr_ports = coredynp.fp_decodeW;
- interface_ip.num_se_rd_ports = 0;
- fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- fFRAT->area.set_area(
- fFRAT->area.get_area() +
- fFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + fFRAT->area.get_area());
+ //FRAT floating point
+ data = int(ceil(coredynp.phy_freg_width*(1+coredynp.globalCheckpoint)/8.0));
+ out_w = int(ceil(coredynp.phy_freg_width/8.0));
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].archi_Regs_FRF_size;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//the extra one port is for GCs
+ interface_ip.num_rd_ports = 2*coredynp.fp_decodeW;
+ interface_ip.num_wr_ports = coredynp.fp_decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ fFRAT->area.set_area(fFRAT->area.get_area()+ fFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ fFRAT->area.get_area());
- } else if ((coredynp.rm_ty == CAMbased)) {
- // FRAT
- tag = coredynp.arch_ireg_width;
- data = int(
- ceil((coredynp.arch_ireg_width + 1 * coredynp.globalCheckpoint) /
- 8.0)); // the address of CAM needed to be sent out
- out_w = int(ceil(coredynp.arch_ireg_width / 8.0));
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * XML->sys.core[ithCore].phy_Regs_IRF_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // for GCs
- interface_ip.num_rd_ports = coredynp.decodeW;
- interface_ip.num_wr_ports = coredynp.decodeW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = 2 * coredynp.decodeW;
- iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- iFRAT->area.set_area(
- iFRAT->area.get_area() +
- iFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + iFRAT->area.get_area());
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ //FRAT
+ tag = coredynp.arch_ireg_width;
+ data = int(ceil ((coredynp.arch_ireg_width+1*coredynp.globalCheckpoint)/8.0));//the address of CAM needed to be sent out
+ out_w = int(ceil (coredynp.arch_ireg_width/8.0));
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].phy_Regs_IRF_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//for GCs
+ interface_ip.num_rd_ports = coredynp.decodeW;
+ interface_ip.num_wr_ports = coredynp.decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports= 2*coredynp.decodeW;
+ iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ iFRAT->area.set_area(iFRAT->area.get_area()+ iFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ iFRAT->area.get_area());
- // FRAT for FP
- tag = coredynp.arch_freg_width;
- data = int(
- ceil((coredynp.arch_freg_width + 1 * coredynp.globalCheckpoint) /
- 8.0)); // the address of CAM needed to be sent out
- out_w = int(ceil(coredynp.arch_freg_width / 8.0));
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * XML->sys.core[ithCore].phy_Regs_FRF_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // for GCs
- interface_ip.num_rd_ports = coredynp.fp_decodeW;
- interface_ip.num_wr_ports = coredynp.fp_decodeW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = 2 * coredynp.fp_decodeW;
- fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- fFRAT->area.set_area(
- fFRAT->area.get_area() +
- fFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + fFRAT->area.get_area());
- }
+ //FRAT for FP
+ tag = coredynp.arch_freg_width;
+ data = int(ceil ((coredynp.arch_freg_width+1*coredynp.globalCheckpoint)/8.0));//the address of CAM needed to be sent out
+ out_w = int(ceil (coredynp.arch_freg_width/8.0));
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].phy_Regs_FRF_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//for GCs
+ interface_ip.num_rd_ports = coredynp.fp_decodeW;
+ interface_ip.num_wr_ports = coredynp.fp_decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports= 2*coredynp.fp_decodeW;
+ fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ fFRAT->area.set_area(fFRAT->area.get_area()+ fFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ fFRAT->area.get_area());
- // RRAT is always RAM based, does not have GCs, and is used only for
- // record latest non-speculative mapping
- data = int(ceil(coredynp.phy_ireg_width / 8.0));
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data *
- XML->sys.core[ithCore].archi_Regs_IRF_size *
- 2; // HACK to make it as least 64B
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = XML->sys.core[ithCore].commit_width;
- interface_ip.num_wr_ports = XML->sys.core[ithCore].commit_width;
- interface_ip.num_se_rd_ports = 0;
- iRRAT = new ArrayST(&interface_ip, "Int RetireRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- iRRAT->area.set_area(iRRAT->area.get_area() +
- iRRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + iRRAT->area.get_area());
+ }
- // RRAT for FP
- data = int(ceil(coredynp.phy_freg_width / 8.0));
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data *
- XML->sys.core[ithCore].archi_Regs_FRF_size *
- 2; // HACK to make it as least 64B
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 0;
- interface_ip.num_rd_ports = coredynp.fp_decodeW;
- interface_ip.num_wr_ports = coredynp.fp_decodeW;
- interface_ip.num_se_rd_ports = 0;
- fRRAT = new ArrayST(&interface_ip, "Int RetireRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- fRRAT->area.set_area(fRRAT->area.get_area() +
- fRRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + fRRAT->area.get_area());
+ //RRAT is always RAM based, does not have GCs, and is used only for record latest non-speculative mapping
+ data = int(ceil(coredynp.phy_ireg_width/8.0));
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].archi_Regs_IRF_size*2;//HACK to make it as least 64B
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = XML->sys.core[ithCore].commit_width;
+ interface_ip.num_wr_ports = XML->sys.core[ithCore].commit_width;
+ interface_ip.num_se_rd_ports = 0;
+ iRRAT = new ArrayST(&interface_ip, "Int RetireRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ iRRAT->area.set_area(iRRAT->area.get_area()+ iRRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ iRRAT->area.get_area());
- // Freelist of renaming unit always RAM based
- // Recycle happens at two places: 1)when DCL check there are WAW, the
- // Phyregisters/ROB directly recycles into freelist
- // 2)When instruction commits the Phyregisters/ROB needed to be recycled.
- // therefore num_wr port = decode-1(-1 means at least one phy reg will be
- // used for the current renaming group) + commit width
- data = int(ceil(coredynp.phy_ireg_width / 8.0));
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * coredynp.num_ifreelist_entries;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // TODO
- interface_ip.num_rd_ports = coredynp.decodeW;
- interface_ip.num_wr_ports =
- coredynp.decodeW - 1 + XML->sys.core[ithCore].commit_width;
- // every cycle, (coredynp.decodeW -1) inst may need to send back it dest
- // tags, committW insts needs to update freelist buffers
- interface_ip.num_se_rd_ports = 0;
- ifreeL = new ArrayST(&interface_ip, "Int Free List", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ifreeL->area.set_area(ifreeL->area.get_area() +
- ifreeL->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + ifreeL->area.get_area());
+ //RRAT for FP
+ data = int(ceil(coredynp.phy_freg_width/8.0));
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].archi_Regs_FRF_size*2;//HACK to make it as least 64B
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 0;
+ interface_ip.num_rd_ports = coredynp.fp_decodeW;
+ interface_ip.num_wr_ports = coredynp.fp_decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ fRRAT = new ArrayST(&interface_ip, "Int RetireRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ fRRAT->area.set_area(fRRAT->area.get_area()+ fRRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ fRRAT->area.get_area());
- // freelist for FP
- data = int(ceil(coredynp.phy_freg_width / 8.0));
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * coredynp.num_ffreelist_entries;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1;
- interface_ip.num_rd_ports = coredynp.fp_decodeW;
- interface_ip.num_wr_ports =
- coredynp.fp_decodeW - 1 + XML->sys.core[ithCore].commit_width;
- interface_ip.num_se_rd_ports = 0;
- ffreeL = new ArrayST(&interface_ip, "Int Free List", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ffreeL->area.set_area(ffreeL->area.get_area() +
- ffreeL->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + ffreeL->area.get_area());
+ //Freelist of renaming unit always RAM based
+ //Recycle happens at two places: 1)when DCL check there are WAW, the Phyregisters/ROB directly recycles into freelist
+ // 2)When instruction commits the Phyregisters/ROB needed to be recycled.
+ //therefore num_wr port = decode-1(-1 means at least one phy reg will be used for the current renaming group) + commit width
+ data = int(ceil(coredynp.phy_ireg_width/8.0));
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*coredynp.num_ifreelist_entries;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//TODO
+ interface_ip.num_rd_ports = coredynp.decodeW;
+ interface_ip.num_wr_ports = coredynp.decodeW -1 + XML->sys.core[ithCore].commit_width;
+ //every cycle, (coredynp.decodeW -1) inst may need to send back it dest tags, committW insts needs to update freelist buffers
+ interface_ip.num_se_rd_ports = 0;
+ ifreeL = new ArrayST(&interface_ip, "Int Free List", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ifreeL->area.set_area(ifreeL->area.get_area()+ ifreeL->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ ifreeL->area.get_area());
- idcl = new dep_resource_conflict_check(
- &interface_ip, coredynp,
- coredynp.phy_ireg_width); // TODO:Separate 2 sections See TR
- fdcl = new dep_resource_conflict_check(&interface_ip, coredynp,
- coredynp.phy_freg_width);
+ //freelist for FP
+ data = int(ceil(coredynp.phy_freg_width/8.0));
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*coredynp.num_ffreelist_entries;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;
+ interface_ip.num_rd_ports = coredynp.fp_decodeW;
+ interface_ip.num_wr_ports = coredynp.fp_decodeW -1 + XML->sys.core[ithCore].commit_width;
+ interface_ip.num_se_rd_ports = 0;
+ ffreeL = new ArrayST(&interface_ip, "Int Free List", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ffreeL->area.set_area(ffreeL->area.get_area()+ ffreeL->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ ffreeL->area.get_area());
- } else if (coredynp.scheu_ty == ReservationStation) {
- if (coredynp.rm_ty == RAMbased) {
- /*
- * however, RAT needs to do associative search in RAT, when instruction
- * commits and ROB release the entry,
- * to make sure all the renamings associated with the ROB to be released
- * are updated to ARF at the same time.
- * RAM based RAT for RS base OOO does not save the search operations.
- * Its advantage is to have less entries than
- * CAM based RAT so that it is more scalable as number of ROB/physical
- * regs increases.
- */
- tag = coredynp.phy_ireg_width;
- data = int(ceil(coredynp.phy_ireg_width *
- (1 + coredynp.globalCheckpoint) / 8.0));
- out_w = int(ceil(coredynp.phy_ireg_width / 8.0));
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].archi_Regs_IRF_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // the extra one port is for GCs
- interface_ip.num_rd_ports = 2 * coredynp.decodeW;
- interface_ip.num_wr_ports = coredynp.decodeW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = coredynp.commitW; // TODO
- iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- iFRAT->local_result.adjust_area();
- iFRAT->area.set_area(
- iFRAT->area.get_area() +
- iFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + iFRAT->area.get_area());
+ idcl = new dep_resource_conflict_check(&interface_ip,coredynp,coredynp.phy_ireg_width);//TODO:Separate 2 sections See TR
+ fdcl = new dep_resource_conflict_check(&interface_ip,coredynp,coredynp.phy_freg_width);
- // FP
- tag = coredynp.phy_freg_width;
- data = int(ceil(coredynp.phy_freg_width *
- (1 + coredynp.globalCheckpoint) / 8.0));
- out_w = int(ceil(coredynp.phy_freg_width / 8.0));
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz =
- data * XML->sys.core[ithCore].archi_Regs_FRF_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // the extra one port is for GCs
- interface_ip.num_rd_ports = 2 * coredynp.fp_decodeW;
- interface_ip.num_wr_ports = coredynp.fp_decodeW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports =
- coredynp.fp_decodeW; // actually is fp commit width
- fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- fFRAT->local_result.adjust_area();
- fFRAT->area.set_area(
- fFRAT->area.get_area() +
- fFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + fFRAT->area.get_area());
+ }
+ else if (coredynp.scheu_ty==ReservationStation){
+ if (coredynp.rm_ty ==RAMbased){
+ /*
+ * however, RAT needs to do associative search in RAT, when instruction commits and ROB release the entry,
+ * to make sure all the renamings associated with the ROB to be released are updated to ARF at the same time.
+ * RAM based RAT for RS base OOO does not save the search operations. Its advantage is to have less entries than
+ * CAM based RAT so that it is more scalable as number of ROB/physical regs increases.
+ */
+ tag = coredynp.phy_ireg_width;
+ data = int(ceil(coredynp.phy_ireg_width*(1+coredynp.globalCheckpoint)/8.0));
+ out_w = int(ceil(coredynp.phy_ireg_width/8.0));
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].archi_Regs_IRF_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//the extra one port is for GCs
+ interface_ip.num_rd_ports = 2*coredynp.decodeW;
+ interface_ip.num_wr_ports = coredynp.decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports= coredynp.commitW;//TODO
+ iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ iFRAT->local_result.adjust_area();
+ iFRAT->area.set_area(iFRAT->area.get_area()+ iFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ iFRAT->area.get_area());
- } else if ((coredynp.rm_ty == CAMbased)) {
- // FRAT
- tag = coredynp.arch_ireg_width;
- data = int(ceil(coredynp.arch_ireg_width +
- 1 * coredynp.globalCheckpoint /
- 8.0)); // the address of CAM needed to be sent out
- out_w = int(ceil(coredynp.arch_ireg_width / 8.0));
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * XML->sys.core[ithCore].phy_Regs_IRF_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // for GCs
- interface_ip.num_rd_ports =
- XML->sys.core[ithCore].decode_width; // 0;TODO
- interface_ip.num_wr_ports = XML->sys.core[ithCore].decode_width;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = 2 * XML->sys.core[ithCore].decode_width;
- iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- iFRAT->area.set_area(
- iFRAT->area.get_area() +
- iFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + iFRAT->area.get_area());
+ //FP
+ tag = coredynp.phy_freg_width;
+ data = int(ceil(coredynp.phy_freg_width*(1+coredynp.globalCheckpoint)/8.0));
+ out_w = int(ceil(coredynp.phy_freg_width/8.0));
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].archi_Regs_FRF_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//the extra one port is for GCs
+ interface_ip.num_rd_ports = 2*coredynp.fp_decodeW;
+ interface_ip.num_wr_ports = coredynp.fp_decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports= coredynp.fp_decodeW;//actually is fp commit width
+ fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ fFRAT->local_result.adjust_area();
+ fFRAT->area.set_area(fFRAT->area.get_area()+ fFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ fFRAT->area.get_area());
- // FRAT
- tag = coredynp.arch_freg_width;
- data = int(ceil(coredynp.arch_freg_width +
- 1 * coredynp.globalCheckpoint /
- 8.0)); // the address of CAM needed to be sent out
- out_w = int(ceil(coredynp.arch_freg_width / 8.0));
- interface_ip.is_cache = true;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = false;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * XML->sys.core[ithCore].phy_Regs_FRF_size;
- interface_ip.assoc = 0;
- interface_ip.nbanks = 1;
- interface_ip.out_w = out_w * 8;
- interface_ip.specific_tag = 1;
- interface_ip.tag_w = tag;
- interface_ip.access_mode = 2;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // for GCs
- interface_ip.num_rd_ports =
- XML->sys.core[ithCore].decode_width; // 0;TODO;
- interface_ip.num_wr_ports = coredynp.fp_decodeW;
- interface_ip.num_se_rd_ports = 0;
- interface_ip.num_search_ports = 2 * coredynp.fp_decodeW;
- fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- fFRAT->area.set_area(
- fFRAT->area.get_area() +
- fFRAT->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + fFRAT->area.get_area());
- }
- // No RRAT for RS based OOO
- // Freelist of renaming unit of RS based OOO is unifed for both int and fp
- // renaming unit since the ROB is unified
- data = int(ceil(coredynp.phy_ireg_width / 8.0));
- interface_ip.is_cache = false;
- interface_ip.pure_cam = false;
- interface_ip.pure_ram = true;
- interface_ip.line_sz = data;
- interface_ip.cache_sz = data * coredynp.num_ifreelist_entries;
- interface_ip.assoc = 1;
- interface_ip.nbanks = 1;
- interface_ip.out_w = interface_ip.line_sz * 8;
- interface_ip.access_mode = 1;
- interface_ip.throughput = 1.0 / clockRate;
- interface_ip.latency = 1.0 / clockRate;
- interface_ip.obj_func_dyn_energy = 0;
- interface_ip.obj_func_dyn_power = 0;
- interface_ip.obj_func_leak_power = 0;
- interface_ip.obj_func_cycle_t = 1;
- interface_ip.num_rw_ports = 1; // TODO
- interface_ip.num_rd_ports = XML->sys.core[ithCore].decode_width;
- interface_ip.num_wr_ports = XML->sys.core[ithCore].decode_width - 1 +
- XML->sys.core[ithCore].commit_width;
- interface_ip.num_se_rd_ports = 0;
- ifreeL = new ArrayST(&interface_ip, "Unified Free List", Core_device,
- coredynp.opt_local, coredynp.core_ty);
- ifreeL->area.set_area(ifreeL->area.get_area() +
- ifreeL->local_result.area *
- XML->sys.core[ithCore].number_hardware_threads);
- area.set_area(area.get_area() + ifreeL->area.get_area());
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ //FRAT
+ tag = coredynp.arch_ireg_width;
+ data = int(ceil (coredynp.arch_ireg_width+1*coredynp.globalCheckpoint/8.0));//the address of CAM needed to be sent out
+ out_w = int(ceil (coredynp.arch_ireg_width/8.0));
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].phy_Regs_IRF_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//for GCs
+ interface_ip.num_rd_ports = XML->sys.core[ithCore].decode_width;//0;TODO
+ interface_ip.num_wr_ports = XML->sys.core[ithCore].decode_width;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports= 2*XML->sys.core[ithCore].decode_width;
+ iFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ iFRAT->area.set_area(iFRAT->area.get_area()+ iFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ iFRAT->area.get_area());
+
+ //FRAT
+ tag = coredynp.arch_freg_width;
+ data = int(ceil (coredynp.arch_freg_width+1*coredynp.globalCheckpoint/8.0));//the address of CAM needed to be sent out
+ out_w = int(ceil (coredynp.arch_freg_width/8.0));
+ interface_ip.is_cache = true;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = false;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*XML->sys.core[ithCore].phy_Regs_FRF_size;
+ interface_ip.assoc = 0;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = out_w*8;
+ interface_ip.specific_tag = 1;
+ interface_ip.tag_w = tag;
+ interface_ip.access_mode = 2;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//for GCs
+ interface_ip.num_rd_ports = XML->sys.core[ithCore].decode_width;//0;TODO;
+ interface_ip.num_wr_ports = coredynp.fp_decodeW;
+ interface_ip.num_se_rd_ports = 0;
+ interface_ip.num_search_ports= 2*coredynp.fp_decodeW;
+ fFRAT = new ArrayST(&interface_ip, "Int FrontRAT", Core_device, coredynp.opt_local, coredynp.core_ty);
+ fFRAT->area.set_area(fFRAT->area.get_area()+ fFRAT->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ fFRAT->area.get_area());
+
+ }
+ //No RRAT for RS based OOO
+ //Freelist of renaming unit of RS based OOO is unifed for both int and fp renaming unit since the ROB is unified
+ data = int(ceil(coredynp.phy_ireg_width/8.0));
+ interface_ip.is_cache = false;
+ interface_ip.pure_cam = false;
+ interface_ip.pure_ram = true;
+ interface_ip.line_sz = data;
+ interface_ip.cache_sz = data*coredynp.num_ifreelist_entries;
+ interface_ip.assoc = 1;
+ interface_ip.nbanks = 1;
+ interface_ip.out_w = interface_ip.line_sz*8;
+ interface_ip.access_mode = 1;
+ interface_ip.throughput = 1.0/clockRate;
+ interface_ip.latency = 1.0/clockRate;
+ interface_ip.obj_func_dyn_energy = 0;
+ interface_ip.obj_func_dyn_power = 0;
+ interface_ip.obj_func_leak_power = 0;
+ interface_ip.obj_func_cycle_t = 1;
+ interface_ip.num_rw_ports = 1;//TODO
+ interface_ip.num_rd_ports = XML->sys.core[ithCore].decode_width;
+ interface_ip.num_wr_ports = XML->sys.core[ithCore].decode_width -1 + XML->sys.core[ithCore].commit_width;
+ interface_ip.num_se_rd_ports = 0;
+ ifreeL = new ArrayST(&interface_ip, "Unified Free List", Core_device, coredynp.opt_local, coredynp.core_ty);
+ ifreeL->area.set_area(ifreeL->area.get_area()+ ifreeL->local_result.area*XML->sys.core[ithCore].number_hardware_threads);
+ area.set_area(area.get_area()+ ifreeL->area.get_area());
- idcl = new dep_resource_conflict_check(
- &interface_ip, coredynp,
- coredynp.phy_ireg_width); // TODO:Separate 2 sections See TR
- fdcl = new dep_resource_conflict_check(&interface_ip, coredynp,
- coredynp.phy_freg_width);
+ idcl = new dep_resource_conflict_check(&interface_ip,coredynp,coredynp.phy_ireg_width);//TODO:Separate 2 sections See TR
+ fdcl = new dep_resource_conflict_check(&interface_ip,coredynp,coredynp.phy_freg_width);
+ }
+
+}
+ if (coredynp.core_ty==Inorder&& coredynp.issueW>1)
+ {
+ /* Dependency check logic will only present when decode(issue) width>1.
+ * Multiple issue in order processor can do without renaming, but dcl is a must.
+ */
+ idcl = new dep_resource_conflict_check(&interface_ip,coredynp,coredynp.phy_ireg_width);//TODO:Separate 2 sections See TR
+ fdcl = new dep_resource_conflict_check(&interface_ip,coredynp,coredynp.phy_freg_width);
}
- }
- if (coredynp.core_ty == Inorder && coredynp.issueW > 1) {
- /* Dependency check logic will only present when decode(issue) width>1.
- * Multiple issue in order processor can do without renaming, but dcl is a
- * must.
- */
- idcl = new dep_resource_conflict_check(
- &interface_ip, coredynp,
- coredynp.phy_ireg_width); // TODO:Separate 2 sections See TR
- fdcl = new dep_resource_conflict_check(&interface_ip, coredynp,
- coredynp.phy_freg_width);
- }
}
Core::Core(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_)
- : XML(XML_interface),
- ithCore(ithCore_),
- interface_ip(*interface_ip_),
- ifu(0),
- lsu(0),
- mmu(0),
- exu(0),
- rnu(0),
- corepipe(0),
- undiffCore(0),
- l2cache(0) {
- /**
- * Testing: (to be removed) added by syed
- */
- // XML->sys.core[ithCore].simd_width=8;// (8)
- // XML->sys.core[ithCore].collector_units=4;// (4)
- // XML->sys.core[ithCore].core_clock_ratio=2.0;// (2.0)
- // XML->sys.core[ithCore].warp_size=32;// (32)
-
+:XML(XML_interface),
+ ithCore(ithCore_),
+ interface_ip(*interface_ip_),
+ ifu (0),
+ lsu (0),
+ mmu (0),
+ exu (0),
+ rnu (0),
+ corepipe (0),
+ undiffCore (0),
+ l2cache (0)
+{
+ /**
+ * Testing: (to be removed) added by syed
+ */
+ //XML->sys.core[ithCore].simd_width=8;// (8)
+ //XML->sys.core[ithCore].collector_units=4;// (4)
+ //XML->sys.core[ithCore].core_clock_ratio=2.0;// (2.0)
+ //XML->sys.core[ithCore].warp_size=32;// (32)
+
/*
* initialize, compute and optimize individual components.
*/
- IdleCoreEnergy = 0;
- IdlePower_PerCore = 0;
+ IdleCoreEnergy=0;
+ IdlePower_PerCore = 0;
double pipeline_area_per_unit;
- if (XML->sys.Private_L2) {
- l2cache = new SharedCache(XML, ithCore, &interface_ip);
+ if (XML->sys.Private_L2)
+ {
+ l2cache = new SharedCache(XML,ithCore, &interface_ip);
+
}
- // interface_ip.wire_is_mat_type = 2;
- // interface_ip.wire_os_mat_type = 2;
- // interface_ip.wt =Global_30;
+// interface_ip.wire_is_mat_type = 2;
+// interface_ip.wire_os_mat_type = 2;
+// interface_ip.wt =Global_30;
set_core_param();
clockRate = coredynp.clockRate;
- exClockRate = clockRate * XML->sys.core[ithCore].core_clock_ratio;
+ exClockRate = clockRate*XML->sys.core[ithCore].core_clock_ratio;
executionTime = coredynp.executionTime;
- ifu = new InstFetchU(XML, ithCore, &interface_ip, coredynp);
- lsu = new LoadStoreU(XML, ithCore, &interface_ip, coredynp);
- mmu = new MemManU(XML, ithCore, &interface_ip, coredynp);
- exu = new EXECU(XML, ithCore, &interface_ip, lsu->lsq_height, coredynp,
- exClockRate, true);
+ ifu = new InstFetchU(XML, ithCore, &interface_ip,coredynp);
+ lsu = new LoadStoreU(XML, ithCore, &interface_ip,coredynp);
+ mmu = new MemManU (XML, ithCore, &interface_ip,coredynp);
+ exu = new EXECU (XML, ithCore, &interface_ip,lsu->lsq_height, coredynp, exClockRate,true);
+
+
+
+
- undiffCore = new UndiffCore(XML, ithCore, &interface_ip, coredynp);
- if (coredynp.core_ty == OOO) {
- rnu = new RENAMINGU(XML, ithCore, &interface_ip, coredynp);
+ undiffCore = new UndiffCore(XML, ithCore, &interface_ip,coredynp);
+ if (coredynp.core_ty==OOO)
+ {
+ rnu = new RENAMINGU(XML, ithCore, &interface_ip,coredynp);
}
- corepipe = new Pipeline(&interface_ip, coredynp);
+ corepipe = new Pipeline(&interface_ip,coredynp);
- if (coredynp.core_ty == OOO) {
- pipeline_area_per_unit =
- (corepipe->area.get_area() * coredynp.num_pipelines) / 5.0;
- if (rnu->exist) {
- rnu->area.set_area(rnu->area.get_area() + pipeline_area_per_unit);
- }
- } else {
- pipeline_area_per_unit =
- (corepipe->area.get_area() * coredynp.num_pipelines) / 4.0;
+ if (coredynp.core_ty==OOO)
+ {
+ pipeline_area_per_unit = (corepipe->area.get_area()*coredynp.num_pipelines)/5.0;
+ if (rnu->exist)
+ {
+ rnu->area.set_area(rnu->area.get_area() + pipeline_area_per_unit);
+ }
+ }
+ else {
+ pipeline_area_per_unit = (corepipe->area.get_area()*coredynp.num_pipelines)/4.0;
}
- // area.set_area(area.get_area()+ corepipe->area.get_area());
- if (ifu->exist) {
- ifu->area.set_area(ifu->area.get_area() + pipeline_area_per_unit);
- area.set_area(area.get_area() + ifu->area.get_area());
+ //area.set_area(area.get_area()+ corepipe->area.get_area());
+ if (ifu->exist)
+ {
+ ifu->area.set_area(ifu->area.get_area() + pipeline_area_per_unit);
+ area.set_area(area.get_area() + ifu->area.get_area());
}
- if (lsu->exist) {
- lsu->area.set_area(lsu->area.get_area() + pipeline_area_per_unit);
- area.set_area(area.get_area() + lsu->area.get_area());
+ if (lsu->exist)
+ {
+ lsu->area.set_area(lsu->area.get_area() + pipeline_area_per_unit);
+ area.set_area(area.get_area() + lsu->area.get_area());
}
- if (exu->exist) {
- exu->area.set_area(exu->area.get_area() + pipeline_area_per_unit);
- area.set_area(area.get_area() + exu->area.get_area());
+ if (exu->exist)
+ {
+ exu->area.set_area(exu->area.get_area() + pipeline_area_per_unit);
+ area.set_area(area.get_area()+exu->area.get_area());
}
- if (mmu->exist) {
- mmu->area.set_area(mmu->area.get_area() + pipeline_area_per_unit);
- area.set_area(area.get_area() + mmu->area.get_area());
+ if (mmu->exist)
+ {
+ mmu->area.set_area(mmu->area.get_area() + pipeline_area_per_unit);
+ area.set_area(area.get_area()+mmu->area.get_area());
}
- if (coredynp.core_ty == OOO) {
- if (rnu->exist) {
- area.set_area(area.get_area() + rnu->area.get_area());
- }
+ if (coredynp.core_ty==OOO)
+ {
+ if (rnu->exist)
+ {
+
+ area.set_area(area.get_area() + rnu->area.get_area());
+ }
}
- if (undiffCore->exist) {
- area.set_area(area.get_area() + undiffCore->area.get_area());
+ if (undiffCore->exist)
+ {
+ area.set_area(area.get_area() + undiffCore->area.get_area());
}
- if (XML->sys.Private_L2) {
- area.set_area(area.get_area() + l2cache->area.get_area());
+ if (XML->sys.Private_L2)
+ {
+ area.set_area(area.get_area() + l2cache->area.get_area());
+
}
- // //clock power
- // clockNetwork.init_wire_external(is_default, &interface_ip);
- // clockNetwork.clk_area =area*1.1;//10% of placement overhead.
- // rule of thumb
- // clockNetwork.end_wiring_level =5;//toplevel metal
- // clockNetwork.start_wiring_level =5;//toplevel metal
- // clockNetwork.num_regs = corepipe.tot_stage_vector;
- // clockNetwork.optimize_wire();
+// //clock power
+// clockNetwork.init_wire_external(is_default, &interface_ip);
+// clockNetwork.clk_area =area*1.1;//10% of placement overhead. rule of thumb
+// clockNetwork.end_wiring_level =5;//toplevel metal
+// clockNetwork.start_wiring_level =5;//toplevel metal
+// clockNetwork.num_regs = corepipe.tot_stage_vector;
+// clockNetwork.optimize_wire();
}
-void BranchPredictor::computeEnergy(bool is_tdp) {
- if (!exist) return;
- double r_access;
- double w_access;
- if (is_tdp) {
- r_access = coredynp.predictionW * coredynp.BR_duty_cycle;
- w_access = 0 * coredynp.BR_duty_cycle;
- globalBPT->stats_t.readAc.access = r_access;
- globalBPT->stats_t.writeAc.access = w_access;
- globalBPT->tdp_stats = globalBPT->stats_t;
- L1_localBPT->stats_t.readAc.access = r_access;
- L1_localBPT->stats_t.writeAc.access = w_access;
- L1_localBPT->tdp_stats = L1_localBPT->stats_t;
+void BranchPredictor::computeEnergy(bool is_tdp)
+{
+ if (!exist) return;
+ double r_access;
+ double w_access;
+ if (is_tdp)
+ {
+ r_access = coredynp.predictionW*coredynp.BR_duty_cycle;
+ w_access = 0*coredynp.BR_duty_cycle;
+ globalBPT->stats_t.readAc.access = r_access;
+ globalBPT->stats_t.writeAc.access = w_access;
+ globalBPT->tdp_stats = globalBPT->stats_t;
- L2_localBPT->stats_t.readAc.access = r_access;
- L2_localBPT->stats_t.writeAc.access = w_access;
- L2_localBPT->tdp_stats = L2_localBPT->stats_t;
+ L1_localBPT->stats_t.readAc.access = r_access;
+ L1_localBPT->stats_t.writeAc.access = w_access;
+ L1_localBPT->tdp_stats = L1_localBPT->stats_t;
- chooser->stats_t.readAc.access = r_access;
- chooser->stats_t.writeAc.access = w_access;
- chooser->tdp_stats = chooser->stats_t;
+ L2_localBPT->stats_t.readAc.access = r_access;
+ L2_localBPT->stats_t.writeAc.access = w_access;
+ L2_localBPT->tdp_stats = L2_localBPT->stats_t;
- RAS->stats_t.readAc.access = r_access;
- RAS->stats_t.writeAc.access = w_access;
- RAS->tdp_stats = RAS->stats_t;
- } else {
- // The resolution of BPT accesses is coarse, but this is
- // because most simulators cannot track finer grained details
- r_access = XML->sys.core[ithCore].branch_instructions;
- w_access =
- XML->sys.core[ithCore].branch_mispredictions +
- 0.1 *
- XML->sys.core[ithCore]
- .branch_instructions; // 10% of BR will flip internal bits//0
- globalBPT->stats_t.readAc.access = r_access;
- globalBPT->stats_t.writeAc.access = w_access;
- globalBPT->rtp_stats = globalBPT->stats_t;
+ chooser->stats_t.readAc.access = r_access;
+ chooser->stats_t.writeAc.access = w_access;
+ chooser->tdp_stats = chooser->stats_t;
- L1_localBPT->stats_t.readAc.access = r_access;
- L1_localBPT->stats_t.writeAc.access = w_access;
- L1_localBPT->rtp_stats = L1_localBPT->stats_t;
+ RAS->stats_t.readAc.access = r_access;
+ RAS->stats_t.writeAc.access = w_access;
+ RAS->tdp_stats = RAS->stats_t;
+ }
+ else
+ {
+ //The resolution of BPT accesses is coarse, but this is
+ //because most simulators cannot track finer grained details
+ r_access = XML->sys.core[ithCore].branch_instructions;
+ w_access = XML->sys.core[ithCore].branch_mispredictions + 0.1*XML->sys.core[ithCore].branch_instructions;//10% of BR will flip internal bits//0
+ globalBPT->stats_t.readAc.access = r_access;
+ globalBPT->stats_t.writeAc.access = w_access;
+ globalBPT->rtp_stats = globalBPT->stats_t;
- L2_localBPT->stats_t.readAc.access = r_access;
- L2_localBPT->stats_t.writeAc.access = w_access;
- L2_localBPT->rtp_stats = L2_localBPT->stats_t;
+ L1_localBPT->stats_t.readAc.access = r_access;
+ L1_localBPT->stats_t.writeAc.access = w_access;
+ L1_localBPT->rtp_stats = L1_localBPT->stats_t;
- chooser->stats_t.readAc.access = r_access;
- chooser->stats_t.writeAc.access = w_access;
- chooser->rtp_stats = chooser->stats_t;
+ L2_localBPT->stats_t.readAc.access = r_access;
+ L2_localBPT->stats_t.writeAc.access = w_access;
+ L2_localBPT->rtp_stats = L2_localBPT->stats_t;
- RAS->stats_t.readAc.access = XML->sys.core[ithCore].function_calls;
- RAS->stats_t.writeAc.access = XML->sys.core[ithCore].function_calls;
- RAS->rtp_stats = RAS->stats_t;
- }
+ chooser->stats_t.readAc.access = r_access;
+ chooser->stats_t.writeAc.access = w_access;
+ chooser->rtp_stats = chooser->stats_t;
- globalBPT->power_t.reset();
- L1_localBPT->power_t.reset();
- L2_localBPT->power_t.reset();
- chooser->power_t.reset();
- RAS->power_t.reset();
+ RAS->stats_t.readAc.access = XML->sys.core[ithCore].function_calls;
+ RAS->stats_t.writeAc.access = XML->sys.core[ithCore].function_calls;
+ RAS->rtp_stats = RAS->stats_t;
+ }
- globalBPT->power_t.readOp.dynamic +=
- globalBPT->local_result.power.readOp.dynamic *
- globalBPT->stats_t.readAc.access +
- globalBPT->stats_t.writeAc.access *
- globalBPT->local_result.power.writeOp.dynamic;
- L1_localBPT->power_t.readOp.dynamic +=
- L1_localBPT->local_result.power.readOp.dynamic *
- L1_localBPT->stats_t.readAc.access +
- L1_localBPT->stats_t.writeAc.access *
- L1_localBPT->local_result.power.writeOp.dynamic;
+ globalBPT->power_t.reset();
+ L1_localBPT->power_t.reset();
+ L2_localBPT->power_t.reset();
+ chooser->power_t.reset();
+ RAS->power_t.reset();
- L2_localBPT->power_t.readOp.dynamic +=
- L2_localBPT->local_result.power.readOp.dynamic *
- L2_localBPT->stats_t.readAc.access +
- L2_localBPT->stats_t.writeAc.access *
- L2_localBPT->local_result.power.writeOp.dynamic;
+ globalBPT->power_t.readOp.dynamic += globalBPT->local_result.power.readOp.dynamic*globalBPT->stats_t.readAc.access +
+ globalBPT->stats_t.writeAc.access*globalBPT->local_result.power.writeOp.dynamic;
+ L1_localBPT->power_t.readOp.dynamic += L1_localBPT->local_result.power.readOp.dynamic*L1_localBPT->stats_t.readAc.access +
+ L1_localBPT->stats_t.writeAc.access*L1_localBPT->local_result.power.writeOp.dynamic;
- chooser->power_t.readOp.dynamic +=
- chooser->local_result.power.readOp.dynamic *
- chooser->stats_t.readAc.access +
- chooser->stats_t.writeAc.access *
- chooser->local_result.power.writeOp.dynamic;
- RAS->power_t.readOp.dynamic +=
- RAS->local_result.power.readOp.dynamic * RAS->stats_t.readAc.access +
- RAS->stats_t.writeAc.access * RAS->local_result.power.writeOp.dynamic;
+ L2_localBPT->power_t.readOp.dynamic += L2_localBPT->local_result.power.readOp.dynamic*L2_localBPT->stats_t.readAc.access +
+ L2_localBPT->stats_t.writeAc.access*L2_localBPT->local_result.power.writeOp.dynamic;
- if (is_tdp) {
- globalBPT->power =
- globalBPT->power_t + globalBPT->local_result.power * pppm_lkg;
- L1_localBPT->power =
- L1_localBPT->power_t + L1_localBPT->local_result.power * pppm_lkg;
- L2_localBPT->power =
- L2_localBPT->power_t + L2_localBPT->local_result.power * pppm_lkg;
- chooser->power = chooser->power_t + chooser->local_result.power * pppm_lkg;
- RAS->power =
- RAS->power_t + RAS->local_result.power * coredynp.pppm_lkg_multhread;
+ chooser->power_t.readOp.dynamic += chooser->local_result.power.readOp.dynamic*chooser->stats_t.readAc.access +
+ chooser->stats_t.writeAc.access*chooser->local_result.power.writeOp.dynamic;
+ RAS->power_t.readOp.dynamic += RAS->local_result.power.readOp.dynamic*RAS->stats_t.readAc.access +
+ RAS->stats_t.writeAc.access*RAS->local_result.power.writeOp.dynamic;
- power = power + globalBPT->power + L1_localBPT->power + chooser->power +
- RAS->power;
- } else {
- globalBPT->rt_power =
- globalBPT->power_t + globalBPT->local_result.power * pppm_lkg;
- L1_localBPT->rt_power =
- L1_localBPT->power_t + L1_localBPT->local_result.power * pppm_lkg;
- L2_localBPT->rt_power =
- L2_localBPT->power_t + L2_localBPT->local_result.power * pppm_lkg;
- chooser->rt_power =
- chooser->power_t + chooser->local_result.power * pppm_lkg;
- RAS->rt_power =
- RAS->power_t + RAS->local_result.power * coredynp.pppm_lkg_multhread;
- rt_power = rt_power + globalBPT->rt_power + L1_localBPT->rt_power +
- chooser->rt_power + RAS->rt_power;
- }
+ if (is_tdp)
+ {
+ globalBPT->power = globalBPT->power_t + globalBPT->local_result.power*pppm_lkg;
+ L1_localBPT->power = L1_localBPT->power_t + L1_localBPT->local_result.power*pppm_lkg;
+ L2_localBPT->power = L2_localBPT->power_t + L2_localBPT->local_result.power*pppm_lkg;
+ chooser->power = chooser->power_t + chooser->local_result.power*pppm_lkg;
+ RAS->power = RAS->power_t + RAS->local_result.power*coredynp.pppm_lkg_multhread;
+
+ power = power + globalBPT->power + L1_localBPT->power + chooser->power + RAS->power;
+ }
+ else
+ {
+ globalBPT->rt_power = globalBPT->power_t + globalBPT->local_result.power*pppm_lkg;
+ L1_localBPT->rt_power = L1_localBPT->power_t + L1_localBPT->local_result.power*pppm_lkg;
+ L2_localBPT->rt_power = L2_localBPT->power_t + L2_localBPT->local_result.power*pppm_lkg;
+ chooser->rt_power = chooser->power_t + chooser->local_result.power*pppm_lkg;
+ RAS->rt_power = RAS->power_t + RAS->local_result.power*coredynp.pppm_lkg_multhread;
+ rt_power = rt_power + globalBPT->rt_power + L1_localBPT->rt_power + chooser->rt_power + RAS->rt_power;
+ }
}
-void BranchPredictor::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
- if (is_tdp) {
- cout << indent_str << "Global Predictor:" << endl;
- cout << indent_str_next << "Area = " << globalBPT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << globalBPT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? globalBPT->power.readOp.longer_channel_leakage
- : globalBPT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << globalBPT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << globalBPT->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "Local Predictor:" << endl;
- cout << indent_str << "L1_Local Predictor:" << endl;
- cout << indent_str_next << "Area = " << L1_localBPT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << L1_localBPT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? L1_localBPT->power.readOp.longer_channel_leakage
- : L1_localBPT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << L1_localBPT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << L1_localBPT->rt_power.readOp.dynamic / executionTime << " W"
- << endl;
- cout << endl;
- cout << indent_str << "L2_Local Predictor:" << endl;
- cout << indent_str_next << "Area = " << L2_localBPT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << L2_localBPT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? L2_localBPT->power.readOp.longer_channel_leakage
- : L2_localBPT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << L2_localBPT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << L2_localBPT->rt_power.readOp.dynamic / executionTime << " W"
- << endl;
- cout << endl;
+void BranchPredictor::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
+ if (is_tdp)
+ {
+ cout << indent_str<< "Global Predictor:" << endl;
+ cout << indent_str_next << "Area = " << globalBPT->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << globalBPT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? globalBPT->power.readOp.longer_channel_leakage:globalBPT->power.readOp.leakage) <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << globalBPT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << globalBPT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str << "Local Predictor:" << endl;
+ cout << indent_str << "L1_Local Predictor:" << endl;
+ cout << indent_str_next << "Area = " << L1_localBPT->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << L1_localBPT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? L1_localBPT->power.readOp.longer_channel_leakage:L1_localBPT->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << L1_localBPT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << L1_localBPT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str << "L2_Local Predictor:" << endl;
+ cout << indent_str_next << "Area = " << L2_localBPT->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << L2_localBPT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? L2_localBPT->power.readOp.longer_channel_leakage:L2_localBPT->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << L2_localBPT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << L2_localBPT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+
+ cout << indent_str << "Chooser:" << endl;
+ cout << indent_str_next << "Area = " << chooser->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << chooser->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? chooser->power.readOp.longer_channel_leakage:chooser->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << chooser->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << chooser->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str << "RAS:" << endl;
+ cout << indent_str_next << "Area = " << RAS->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << RAS->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? RAS->power.readOp.longer_channel_leakage:RAS->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << RAS->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << RAS->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ else
+ {
+// cout << indent_str_next << "Global Predictor Peak Dynamic = " << globalBPT->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Global Predictor Subthreshold Leakage = " << globalBPT->rt_power.readOp.leakage <<" W" << endl;
+// cout << indent_str_next << "Global Predictor Gate Leakage = " << globalBPT->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Local Predictor Peak Dynamic = " << L1_localBPT->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Local Predictor Subthreshold Leakage = " << L1_localBPT->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Local Predictor Gate Leakage = " << L1_localBPT->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Chooser Peak Dynamic = " << chooser->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Chooser Subthreshold Leakage = " << chooser->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Chooser Gate Leakage = " << chooser->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "RAS Peak Dynamic = " << RAS->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "RAS Subthreshold Leakage = " << RAS->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "RAS Gate Leakage = " << RAS->rt_power.readOp.gate_leakage << " W" << endl;
+ }
- cout << indent_str << "Chooser:" << endl;
- cout << indent_str_next << "Area = " << chooser->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << chooser->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? chooser->power.readOp.longer_channel_leakage
- : chooser->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << chooser->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << chooser->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "RAS:" << endl;
- cout << indent_str_next << "Area = " << RAS->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << RAS->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? RAS->power.readOp.longer_channel_leakage
- : RAS->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << RAS->power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next
- << "Runtime Dynamic = " << RAS->rt_power.readOp.dynamic / executionTime
- << " W" << endl;
- cout << endl;
- } else {
- // cout << indent_str_next << "Global Predictor Peak Dynamic = " <<
- //globalBPT->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Global Predictor Subthreshold Leakage =
- //" << globalBPT->rt_power.readOp.leakage <<" W" << endl;
- // cout << indent_str_next << "Global Predictor Gate Leakage = " <<
- //globalBPT->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Local Predictor Peak Dynamic = " <<
- //L1_localBPT->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Local Predictor Subthreshold Leakage = "
- //<< L1_localBPT->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Local Predictor Gate Leakage = " <<
- //L1_localBPT->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Chooser Peak Dynamic = " <<
- //chooser->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Chooser Subthreshold Leakage = " <<
- //chooser->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Chooser Gate Leakage = " <<
- //chooser->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "RAS Peak Dynamic = " <<
- //RAS->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "RAS Subthreshold Leakage = " <<
- //RAS->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "RAS Gate Leakage = " <<
- //RAS->rt_power.readOp.gate_leakage << " W" << endl;
- }
}
-void InstFetchU::computeEnergy(bool is_tdp) {
- executionTime =
- XML->sys.total_cycles / (XML->sys.target_core_clockrate * 1e6); // Syed
- // cout <<"IFU: execution time:
- // "<<XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6)<<endl;
- // cout <<"IFU: total cycles"<<XML->sys.total_cycles<<endl;
- if (!exist) return;
- if (is_tdp) {
- // init stats for Peak
- icache.caches->stats_t.readAc.access =
- icache.caches->l_ip.num_rw_ports * coredynp.IFU_duty_cycle;
- icache.caches->stats_t.readAc.miss = 0;
- icache.caches->stats_t.readAc.hit = icache.caches->stats_t.readAc.access -
- icache.caches->stats_t.readAc.miss;
- icache.caches->tdp_stats = icache.caches->stats_t;
+void InstFetchU::computeEnergy(bool is_tdp)
+{
+ executionTime=XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6);//Syed
+ //cout <<"IFU: execution time: "<<XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6)<<endl;
+ //cout <<"IFU: total cycles"<<XML->sys.total_cycles<<endl;
+ if (!exist) return;
+ if (is_tdp)
+ {
+ //init stats for Peak
+ icache.caches->stats_t.readAc.access = icache.caches->l_ip.num_rw_ports*coredynp.IFU_duty_cycle;
+ icache.caches->stats_t.readAc.miss = 0;
+ icache.caches->stats_t.readAc.hit = icache.caches->stats_t.readAc.access - icache.caches->stats_t.readAc.miss;
+ icache.caches->tdp_stats = icache.caches->stats_t;
- icache.missb->stats_t.readAc.access = icache.missb->stats_t.readAc.hit =
- icache.missb->l_ip.num_search_ports;
- icache.missb->stats_t.writeAc.access = icache.missb->stats_t.writeAc.hit =
- icache.missb->l_ip.num_search_ports;
- icache.missb->tdp_stats = icache.missb->stats_t;
+ icache.missb->stats_t.readAc.access = icache.missb->stats_t.readAc.hit= icache.missb->l_ip.num_search_ports;
+ icache.missb->stats_t.writeAc.access = icache.missb->stats_t.writeAc.hit= icache.missb->l_ip.num_search_ports;
+ icache.missb->tdp_stats = icache.missb->stats_t;
- icache.ifb->stats_t.readAc.access = icache.ifb->stats_t.readAc.hit =
- icache.ifb->l_ip.num_search_ports;
- icache.ifb->stats_t.writeAc.access = icache.ifb->stats_t.writeAc.hit =
- icache.ifb->l_ip.num_search_ports;
- icache.ifb->tdp_stats = icache.ifb->stats_t;
+ icache.ifb->stats_t.readAc.access = icache.ifb->stats_t.readAc.hit= icache.ifb->l_ip.num_search_ports;
+ icache.ifb->stats_t.writeAc.access = icache.ifb->stats_t.writeAc.hit= icache.ifb->l_ip.num_search_ports;
+ icache.ifb->tdp_stats = icache.ifb->stats_t;
- icache.prefetchb->stats_t.readAc.access =
- icache.prefetchb->stats_t.readAc.hit =
- icache.prefetchb->l_ip.num_search_ports;
- icache.prefetchb->stats_t.writeAc.access = icache.ifb->stats_t.writeAc.hit =
- icache.ifb->l_ip.num_search_ports;
- icache.prefetchb->tdp_stats = icache.prefetchb->stats_t;
+ icache.prefetchb->stats_t.readAc.access = icache.prefetchb->stats_t.readAc.hit= icache.prefetchb->l_ip.num_search_ports;
+ icache.prefetchb->stats_t.writeAc.access = icache.ifb->stats_t.writeAc.hit= icache.ifb->l_ip.num_search_ports;
+ icache.prefetchb->tdp_stats = icache.prefetchb->stats_t;
- IB->stats_t.readAc.access = IB->stats_t.writeAc.access =
- XML->sys.core[ithCore].peak_issue_width;
- IB->tdp_stats = IB->stats_t;
+ IB->stats_t.readAc.access = IB->stats_t.writeAc.access = XML->sys.core[ithCore].peak_issue_width;
+ IB->tdp_stats = IB->stats_t;
- if (coredynp.predictionW > 0) {
- BTB->stats_t.readAc.access =
- coredynp.predictionW; // XML->sys.core[ithCore].BTB.read_accesses;
- BTB->stats_t.writeAc.access =
- 0; // XML->sys.core[ithCore].BTB.write_accesses;
- }
+ if (coredynp.predictionW>0)
+ {
+ BTB->stats_t.readAc.access = coredynp.predictionW;//XML->sys.core[ithCore].BTB.read_accesses;
+ BTB->stats_t.writeAc.access = 0;//XML->sys.core[ithCore].BTB.write_accesses;
+ }
- ID_inst->stats_t.readAc.access = coredynp.decodeW;
- ID_operand->stats_t.readAc.access = coredynp.decodeW;
- ID_misc->stats_t.readAc.access = coredynp.decodeW;
- ID_inst->tdp_stats = ID_inst->stats_t;
- ID_operand->tdp_stats = ID_operand->stats_t;
- ID_misc->tdp_stats = ID_misc->stats_t;
+ ID_inst->stats_t.readAc.access = coredynp.decodeW;
+ ID_operand->stats_t.readAc.access = coredynp.decodeW;
+ ID_misc->stats_t.readAc.access = coredynp.decodeW;
+ ID_inst->tdp_stats = ID_inst->stats_t;
+ ID_operand->tdp_stats = ID_operand->stats_t;
+ ID_misc->tdp_stats = ID_misc->stats_t;
- } /* if (is_tdp) */
- else {
- rt_power.reset();
- icache.rt_power.reset(); // Jingwen
- // init stats for Runtime Dynamic (RTP)
- // cout<< "****>>>>Icache stats:"<<endl;
- // cout<<"Read accesses: "<< XML->sys.core[ithCore].icache.read_accesses <<
- // " Read misses: "<<XML->sys.core[ithCore].icache.read_misses<<endl;
- icache.caches->stats_t.readAc.access =
- XML->sys.core[ithCore].icache.read_accesses;
- icache.caches->stats_t.readAc.miss =
- XML->sys.core[ithCore].icache.read_misses;
- // cout<<endl<<"inside mcpat read access=
- // "<<XML->sys.core[ithCore].icache.read_accesses;
- // cout<<endl<<"inside mcpat read miss=
- // "<<XML->sys.core[ithCore].icache.read_misses;
- icache.caches->stats_t.readAc.hit = icache.caches->stats_t.readAc.access -
- icache.caches->stats_t.readAc.miss;
- icache.caches->rtp_stats = icache.caches->stats_t;
- // cout<<endl<<"inside mcpat read hit=
- // "<<icache.caches->stats_t.readAc.hit<<endl;
- icache.missb->stats_t.readAc.access = icache.caches->stats_t.readAc.miss;
- icache.missb->stats_t.writeAc.access = icache.caches->stats_t.readAc.miss;
- icache.missb->rtp_stats = icache.missb->stats_t;
+
+ } /* if (is_tdp) */
+ else
+ {
+ rt_power.reset();
+ icache.rt_power.reset(); //Jingwen
+ //init stats for Runtime Dynamic (RTP)
+ //cout<< "****>>>>Icache stats:"<<endl;
+ //cout<<"Read accesses: "<< XML->sys.core[ithCore].icache.read_accesses << " Read misses: "<<XML->sys.core[ithCore].icache.read_misses<<endl;
+ icache.caches->stats_t.readAc.access = XML->sys.core[ithCore].icache.read_accesses;
+ icache.caches->stats_t.readAc.miss = XML->sys.core[ithCore].icache.read_misses;
+ //cout<<endl<<"inside mcpat read access= "<<XML->sys.core[ithCore].icache.read_accesses;
+ //cout<<endl<<"inside mcpat read miss= "<<XML->sys.core[ithCore].icache.read_misses;
+
+ icache.caches->stats_t.readAc.hit = icache.caches->stats_t.readAc.access - icache.caches->stats_t.readAc.miss;
+ icache.caches->rtp_stats = icache.caches->stats_t;
+ //cout<<endl<<"inside mcpat read hit= "<<icache.caches->stats_t.readAc.hit<<endl;
+ icache.missb->stats_t.readAc.access = icache.caches->stats_t.readAc.miss;
+ icache.missb->stats_t.writeAc.access = icache.caches->stats_t.readAc.miss;
+ icache.missb->rtp_stats = icache.missb->stats_t;
+
+ icache.ifb->stats_t.readAc.access = icache.caches->stats_t.readAc.miss;
+ icache.ifb->stats_t.writeAc.access = icache.caches->stats_t.readAc.miss;
+ icache.ifb->rtp_stats = icache.ifb->stats_t;
- icache.ifb->stats_t.readAc.access = icache.caches->stats_t.readAc.miss;
- icache.ifb->stats_t.writeAc.access = icache.caches->stats_t.readAc.miss;
- icache.ifb->rtp_stats = icache.ifb->stats_t;
+ icache.prefetchb->stats_t.readAc.access = icache.caches->stats_t.readAc.miss;
+ icache.prefetchb->stats_t.writeAc.access = icache.caches->stats_t.readAc.miss;
+ icache.prefetchb->rtp_stats = icache.prefetchb->stats_t;
- icache.prefetchb->stats_t.readAc.access =
- icache.caches->stats_t.readAc.miss;
- icache.prefetchb->stats_t.writeAc.access =
- icache.caches->stats_t.readAc.miss;
- icache.prefetchb->rtp_stats = icache.prefetchb->stats_t;
+ IB->stats_t.readAc.access = IB->stats_t.writeAc.access = XML->sys.core[ithCore].total_instructions;
+ IB->rtp_stats = IB->stats_t;
+ //cout<<"IB: total instructions: "<<IB->stats_t.readAc.access <<endl;
+ if (coredynp.predictionW>0)
+ {
+ BTB->stats_t.readAc.access = XML->sys.core[ithCore].BTB.read_accesses;//XML->sys.core[ithCore].branch_instructions;
+ BTB->stats_t.writeAc.access = XML->sys.core[ithCore].BTB.write_accesses;//XML->sys.core[ithCore].branch_mispredictions;
+ BTB->rtp_stats = BTB->stats_t;
+ }
+ //cout<<"ID: total instructions: "<< XML->sys.core[ithCore].total_instructions<<endl;
+ ID_inst->stats_t.readAc.access = XML->sys.core[ithCore].total_instructions;
+ ID_operand->stats_t.readAc.access = XML->sys.core[ithCore].total_instructions;
+ ID_misc->stats_t.readAc.access = XML->sys.core[ithCore].total_instructions;
+ ID_inst->rtp_stats = ID_inst->stats_t;
+ ID_operand->rtp_stats = ID_operand->stats_t;
+ ID_misc->rtp_stats = ID_misc->stats_t;
- IB->stats_t.readAc.access = IB->stats_t.writeAc.access =
- XML->sys.core[ithCore].total_instructions;
- IB->rtp_stats = IB->stats_t;
- // cout<<"IB: total instructions: "<<IB->stats_t.readAc.access <<endl;
- if (coredynp.predictionW > 0) {
- BTB->stats_t.readAc.access =
- XML->sys.core[ithCore]
- .BTB
- .read_accesses; // XML->sys.core[ithCore].branch_instructions;
- BTB->stats_t.writeAc.access =
- XML->sys.core[ithCore]
- .BTB
- .write_accesses; // XML->sys.core[ithCore].branch_mispredictions;
- BTB->rtp_stats = BTB->stats_t;
}
- // cout<<"ID: total instructions: "<<
- // XML->sys.core[ithCore].total_instructions<<endl;
- ID_inst->stats_t.readAc.access = XML->sys.core[ithCore].total_instructions;
- ID_operand->stats_t.readAc.access =
- XML->sys.core[ithCore].total_instructions;
- ID_misc->stats_t.readAc.access = XML->sys.core[ithCore].total_instructions;
- ID_inst->rtp_stats = ID_inst->stats_t;
- ID_operand->rtp_stats = ID_operand->stats_t;
- ID_misc->rtp_stats = ID_misc->stats_t;
- }
- icache.power_t.reset();
- IB->power_t.reset();
- // ID_inst->power_t.reset();
- // ID_operand->power_t.reset();
- // ID_misc->power_t.reset();
- if (coredynp.predictionW > 0) {
- BTB->power_t.reset();
- }
+ icache.power_t.reset();
+ IB->power_t.reset();
+// ID_inst->power_t.reset();
+// ID_operand->power_t.reset();
+// ID_misc->power_t.reset();
+ if (coredynp.predictionW>0)
+ {
+ BTB->power_t.reset();
+ }
- icache.power_t.readOp.dynamic +=
- (icache.caches->stats_t.readAc.hit *
- icache.caches->local_result.power.readOp.dynamic +
- // icache.caches->stats_t.readAc.miss*icache.caches->local_result.tag_array2->power.readOp.dynamic+
- icache.caches->stats_t.readAc.miss *
- icache.caches->local_result.power.readOp
- .dynamic + // assume tag data accessed in parallel
- icache.caches->stats_t.readAc.miss *
- icache.caches->local_result.power.writeOp
- .dynamic); // read miss in Icache cause a write to Icache
- icache.power_t.readOp.dynamic +=
- icache.missb->stats_t.readAc.access *
- icache.missb->local_result.power.searchOp.dynamic +
- icache.missb->stats_t.writeAc.access *
- icache.missb->local_result.power.writeOp
- .dynamic; // each access to missb involves a CAM and a write
- icache.power_t.readOp.dynamic +=
- icache.ifb->stats_t.readAc.access *
- icache.ifb->local_result.power.searchOp.dynamic +
- icache.ifb->stats_t.writeAc.access *
- icache.ifb->local_result.power.writeOp.dynamic;
- icache.power_t.readOp.dynamic +=
- icache.prefetchb->stats_t.readAc.access *
- icache.prefetchb->local_result.power.searchOp.dynamic +
- icache.prefetchb->stats_t.writeAc.access *
- icache.prefetchb->local_result.power.writeOp.dynamic;
- // cout<<"Icache power: "<<icache.power_t.readOp.dynamic <<endl;
- IB->power_t.readOp.dynamic +=
- IB->local_result.power.readOp.dynamic * IB->stats_t.readAc.access +
- IB->stats_t.writeAc.access * IB->local_result.power.writeOp.dynamic;
- // cout << "IB power: "<<IB->power_t.readOp.dynamic<<endl;
- if (coredynp.predictionW > 0) {
- BTB->power_t.readOp.dynamic +=
- BTB->local_result.power.readOp.dynamic * BTB->stats_t.readAc.access +
- BTB->stats_t.writeAc.access * BTB->local_result.power.writeOp.dynamic;
+ icache.power_t.readOp.dynamic += (icache.caches->stats_t.readAc.hit*icache.caches->local_result.power.readOp.dynamic+
+ //icache.caches->stats_t.readAc.miss*icache.caches->local_result.tag_array2->power.readOp.dynamic+
+ icache.caches->stats_t.readAc.miss*icache.caches->local_result.power.readOp.dynamic+ //assume tag data accessed in parallel
+ icache.caches->stats_t.readAc.miss*icache.caches->local_result.power.writeOp.dynamic); //read miss in Icache cause a write to Icache
+ icache.power_t.readOp.dynamic += icache.missb->stats_t.readAc.access*icache.missb->local_result.power.searchOp.dynamic +
+ icache.missb->stats_t.writeAc.access*icache.missb->local_result.power.writeOp.dynamic;//each access to missb involves a CAM and a write
+ icache.power_t.readOp.dynamic += icache.ifb->stats_t.readAc.access*icache.ifb->local_result.power.searchOp.dynamic +
+ icache.ifb->stats_t.writeAc.access*icache.ifb->local_result.power.writeOp.dynamic;
+ icache.power_t.readOp.dynamic += icache.prefetchb->stats_t.readAc.access*icache.prefetchb->local_result.power.searchOp.dynamic +
+ icache.prefetchb->stats_t.writeAc.access*icache.prefetchb->local_result.power.writeOp.dynamic;
+ //cout<<"Icache power: "<<icache.power_t.readOp.dynamic <<endl;
+ IB->power_t.readOp.dynamic += IB->local_result.power.readOp.dynamic*IB->stats_t.readAc.access +
+ IB->stats_t.writeAc.access*IB->local_result.power.writeOp.dynamic;
+ //cout << "IB power: "<<IB->power_t.readOp.dynamic<<endl;
+ if (coredynp.predictionW>0)
+ {
+ BTB->power_t.readOp.dynamic += BTB->local_result.power.readOp.dynamic*BTB->stats_t.readAc.access +
+ BTB->stats_t.writeAc.access*BTB->local_result.power.writeOp.dynamic;
- BPT->computeEnergy(is_tdp);
- }
+ BPT->computeEnergy(is_tdp);
+ }
- if (is_tdp) {
- // icache.power = icache.power_t +
- // (icache.caches->local_result.power)*pppm_lkg +
- // (icache.missb->local_result.power +
- // icache.ifb->local_result.power +
- // icache.prefetchb->local_result.power)*pppm_Isub;
- icache.power =
- icache.power_t +
- (icache.caches->local_result.power + icache.missb->local_result.power +
- icache.ifb->local_result.power +
- icache.prefetchb->local_result.power) *
- pppm_lkg;
+ if (is_tdp)
+ {
+// icache.power = icache.power_t +
+// (icache.caches->local_result.power)*pppm_lkg +
+// (icache.missb->local_result.power +
+// icache.ifb->local_result.power +
+// icache.prefetchb->local_result.power)*pppm_Isub;
+ icache.power = icache.power_t +
+ (icache.caches->local_result.power +
+ icache.missb->local_result.power +
+ icache.ifb->local_result.power +
+ icache.prefetchb->local_result.power)*pppm_lkg;
- IB->power = IB->power_t + IB->local_result.power * pppm_lkg;
- power = power + icache.power + IB->power;
- if (coredynp.predictionW > 0) {
- BTB->power = BTB->power_t + BTB->local_result.power * pppm_lkg;
- power = power + BTB->power + BPT->power;
- }
+ IB->power = IB->power_t + IB->local_result.power*pppm_lkg;
+ power = power + icache.power + IB->power;
+ if (coredynp.predictionW>0)
+ {
+ BTB->power = BTB->power_t + BTB->local_result.power*pppm_lkg;
+ power = power + BTB->power + BPT->power;
+ }
- ID_inst->power_t.readOp.dynamic = ID_inst->power.readOp.dynamic;
- ID_operand->power_t.readOp.dynamic = ID_operand->power.readOp.dynamic;
- ID_misc->power_t.readOp.dynamic = ID_misc->power.readOp.dynamic;
+ ID_inst->power_t.readOp.dynamic = ID_inst->power.readOp.dynamic;
+ ID_operand->power_t.readOp.dynamic = ID_operand->power.readOp.dynamic;
+ ID_misc->power_t.readOp.dynamic = ID_misc->power.readOp.dynamic;
- ID_inst->power.readOp.dynamic *= ID_inst->tdp_stats.readAc.access;
- ID_operand->power.readOp.dynamic *= ID_operand->tdp_stats.readAc.access;
- ID_misc->power.readOp.dynamic *= ID_misc->tdp_stats.readAc.access;
+ ID_inst->power.readOp.dynamic *= ID_inst->tdp_stats.readAc.access;
+ ID_operand->power.readOp.dynamic *= ID_operand->tdp_stats.readAc.access;
+ ID_misc->power.readOp.dynamic *= ID_misc->tdp_stats.readAc.access;
- power = power + (ID_inst->power + ID_operand->power + ID_misc->power);
- } /* if (is_tdp) */
- else {
- // icache.rt_power = icache.power_t +
- // (icache.caches->local_result.power)*pppm_lkg +
- // (icache.missb->local_result.power +
- // icache.ifb->local_result.power +
- // icache.prefetchb->local_result.power)*pppm_Isub;
+ power = power + (ID_inst->power +
+ ID_operand->power +
+ ID_misc->power);
+ } /* if (is_tdp) */
+ else
+ {
+// icache.rt_power = icache.power_t +
+// (icache.caches->local_result.power)*pppm_lkg +
+// (icache.missb->local_result.power +
+// icache.ifb->local_result.power +
+// icache.prefetchb->local_result.power)*pppm_Isub;
- icache.rt_power =
- icache.power_t +
- (icache.caches->local_result.power + icache.missb->local_result.power +
- icache.ifb->local_result.power +
- icache.prefetchb->local_result.power) *
- pppm_lkg;
+ icache.rt_power = icache.power_t +
+ (icache.caches->local_result.power +
+ icache.missb->local_result.power +
+ icache.ifb->local_result.power +
+ icache.prefetchb->local_result.power)*pppm_lkg;
- // IB->rt_power = IB->power_t + IB->local_result.power*pppm_lkg;
- IB->rt_power.readOp.dynamic =
- IB->local_result.power.readOp.dynamic * IB->rtp_stats.readAc.access;
- IB->rt_power.readOp.dynamic +=
- IB->local_result.power.writeOp.dynamic * IB->rtp_stats.writeAc.access;
- rt_power = rt_power + icache.rt_power + IB->rt_power;
- if (coredynp.predictionW > 0) {
- BTB->rt_power = BTB->power_t + BTB->local_result.power * pppm_lkg;
- rt_power = rt_power + BTB->rt_power + BPT->rt_power;
- }
+ //IB->rt_power = IB->power_t + IB->local_result.power*pppm_lkg;
+ IB->rt_power.readOp.dynamic = IB->local_result.power.readOp.dynamic * IB->rtp_stats.readAc.access;
+ IB->rt_power.readOp.dynamic += IB->local_result.power.writeOp.dynamic * IB->rtp_stats.writeAc.access;
+ rt_power = rt_power + icache.rt_power + IB->rt_power;
+ if (coredynp.predictionW>0)
+ {
+ BTB->rt_power = BTB->power_t + BTB->local_result.power*pppm_lkg;
+ rt_power = rt_power + BTB->rt_power + BPT->rt_power;
+ }
- ID_inst->rt_power.readOp.dynamic =
- ID_inst->power_t.readOp.dynamic * ID_inst->rtp_stats.readAc.access;
- ID_operand->rt_power.readOp.dynamic = ID_operand->power_t.readOp.dynamic *
- ID_operand->rtp_stats.readAc.access;
- ID_misc->rt_power.readOp.dynamic =
- ID_misc->power_t.readOp.dynamic * ID_misc->rtp_stats.readAc.access;
+ ID_inst->rt_power.readOp.dynamic = ID_inst->power_t.readOp.dynamic*ID_inst->rtp_stats.readAc.access;
+ ID_operand->rt_power.readOp.dynamic = ID_operand->power_t.readOp.dynamic * ID_operand->rtp_stats.readAc.access;
+ ID_misc->rt_power.readOp.dynamic = ID_misc->power_t.readOp.dynamic * ID_misc->rtp_stats.readAc.access;
- rt_power = rt_power +
- (ID_inst->rt_power + ID_operand->rt_power + ID_misc->rt_power);
- // cout<<"ID inst: "<<ID_inst->rt_power.readOp.dynamic << " ID operand:
- // "<<ID_operand->rt_power.readOp.dynamic<<" ID misc:
- // "<<ID_misc->rt_power.readOp.dynamic<<endl;
- }
+ rt_power = rt_power + (ID_inst->rt_power +
+ ID_operand->rt_power +
+ ID_misc->rt_power);
+ //cout<<"ID inst: "<<ID_inst->rt_power.readOp.dynamic << " ID operand: "<<ID_operand->rt_power.readOp.dynamic<<" ID misc: "<<ID_misc->rt_power.readOp.dynamic<<endl;
+ }
}
-void InstFetchU::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
+void InstFetchU::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
+
+
+ if (is_tdp)
+ {
+
+ cout << indent_str<< "Instruction Cache:" << endl;
+ cout << indent_str_next << "Area = " << icache.area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << icache.power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? icache.power.readOp.longer_channel_leakage:icache.power.readOp.leakage) <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << icache.power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << icache.rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (coredynp.predictionW>0)
+ {
+ cout << indent_str<< "Branch Target Buffer:" << endl;
+ cout << indent_str_next << "Area = " << BTB->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << BTB->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? BTB->power.readOp.longer_channel_leakage:BTB->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << BTB->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << BTB->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (BPT->exist)
+ {
+ cout << indent_str<< "Branch Predictor:" << endl;
+ cout << indent_str_next << "Area = " << BPT->area.get_area() *1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << BPT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? BPT->power.readOp.longer_channel_leakage:BPT->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << BPT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << BPT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel>3)
+ {
+ BPT->displayEnergy(indent+4, plevel, is_tdp);
+ }
+ }
+ }
+ cout << indent_str<< "Instruction Buffer:" << endl;
+ cout << indent_str_next << "Area = " << IB->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << IB->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? IB->power.readOp.longer_channel_leakage:IB->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << IB->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << IB->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str<< "Instruction Decoder:" << endl;
+ cout << indent_str_next << "Area = " << (ID_inst->area.get_area() +
+ ID_operand->area.get_area() +
+ ID_misc->area.get_area())*coredynp.decodeW*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << (ID_inst->power.readOp.dynamic +
+ ID_operand->power.readOp.dynamic +
+ ID_misc->power.readOp.dynamic)*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? (ID_inst->power.readOp.longer_channel_leakage +
+ ID_operand->power.readOp.longer_channel_leakage +
+ ID_misc->power.readOp.longer_channel_leakage):
+ (ID_inst->power.readOp.leakage +
+ ID_operand->power.readOp.leakage +
+ ID_misc->power.readOp.leakage)) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << (ID_inst->power.readOp.gate_leakage +
+ ID_operand->power.readOp.gate_leakage +
+ ID_misc->power.readOp.gate_leakage) << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << (ID_inst->rt_power.readOp.dynamic +
+ ID_operand->rt_power.readOp.dynamic +
+ ID_misc->rt_power.readOp.dynamic)/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ else
+ {
+// cout << indent_str_next << "Instruction Cache Peak Dynamic = " << icache.rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Instruction Cache Subthreshold Leakage = " << icache.rt_power.readOp.leakage <<" W" << endl;
+// cout << indent_str_next << "Instruction Cache Gate Leakage = " << icache.rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Instruction Buffer Peak Dynamic = " << IB->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Instruction Buffer Subthreshold Leakage = " << IB->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Instruction Buffer Gate Leakage = " << IB->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Branch Target Buffer Peak Dynamic = " << BTB->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Branch Target Buffer Subthreshold Leakage = " << BTB->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Branch Target Buffer Gate Leakage = " << BTB->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Branch Predictor Peak Dynamic = " << BPT->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Branch Predictor Subthreshold Leakage = " << BPT->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Branch Predictor Gate Leakage = " << BPT->rt_power.readOp.gate_leakage << " W" << endl;
+ }
- if (is_tdp) {
- cout << indent_str << "Instruction Cache:" << endl;
- cout << indent_str_next << "Area = " << icache.area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << icache.power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? icache.power.readOp.longer_channel_leakage
- : icache.power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << icache.power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << icache.rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (coredynp.predictionW > 0) {
- cout << indent_str << "Branch Target Buffer:" << endl;
- cout << indent_str_next << "Area = " << BTB->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << BTB->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? BTB->power.readOp.longer_channel_leakage
- : BTB->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << BTB->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << BTB->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (BPT->exist) {
- cout << indent_str << "Branch Predictor:" << endl;
- cout << indent_str_next << "Area = " << BPT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << BPT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? BPT->power.readOp.longer_channel_leakage
- : BPT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << BPT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << BPT->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (plevel > 3) {
- BPT->displayEnergy(indent + 4, plevel, is_tdp);
- }
- }
- }
- cout << indent_str << "Instruction Buffer:" << endl;
- cout << indent_str_next << "Area = " << IB->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << IB->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? IB->power.readOp.longer_channel_leakage
- : IB->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << IB->power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next
- << "Runtime Dynamic = " << IB->rt_power.readOp.dynamic / executionTime
- << " W" << endl;
- cout << endl;
- cout << indent_str << "Instruction Decoder:" << endl;
- cout << indent_str_next << "Area = "
- << (ID_inst->area.get_area() + ID_operand->area.get_area() +
- ID_misc->area.get_area()) *
- coredynp.decodeW * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next << "Peak Dynamic = "
- << (ID_inst->power.readOp.dynamic + ID_operand->power.readOp.dynamic +
- ID_misc->power.readOp.dynamic) *
- clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? (ID_inst->power.readOp.longer_channel_leakage +
- ID_operand->power.readOp.longer_channel_leakage +
- ID_misc->power.readOp.longer_channel_leakage)
- : (ID_inst->power.readOp.leakage +
- ID_operand->power.readOp.leakage +
- ID_misc->power.readOp.leakage))
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << (ID_inst->power.readOp.gate_leakage +
- ID_operand->power.readOp.gate_leakage +
- ID_misc->power.readOp.gate_leakage)
- << " W" << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << (ID_inst->rt_power.readOp.dynamic +
- ID_operand->rt_power.readOp.dynamic +
- ID_misc->rt_power.readOp.dynamic) /
- executionTime
- << " W" << endl;
- cout << endl;
- } else {
- // cout << indent_str_next << "Instruction Cache Peak Dynamic = " <<
- //icache.rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Instruction Cache Subthreshold Leakage
- //= " << icache.rt_power.readOp.leakage <<" W" << endl;
- // cout << indent_str_next << "Instruction Cache Gate Leakage = " <<
- //icache.rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Instruction Buffer Peak Dynamic = " <<
- //IB->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Instruction Buffer Subthreshold Leakage
- //= " << IB->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Instruction Buffer Gate Leakage = " <<
- //IB->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Branch Target Buffer Peak Dynamic = " <<
- //BTB->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Branch Target Buffer Subthreshold
- //Leakage = " << BTB->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Branch Target Buffer Gate Leakage = " <<
- //BTB->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Branch Predictor Peak Dynamic = " <<
- //BPT->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Branch Predictor Subthreshold Leakage =
- //" << BPT->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Branch Predictor Gate Leakage = " <<
- //BPT->rt_power.readOp.gate_leakage << " W" << endl;
- }
}
-void RENAMINGU::computeEnergy(bool is_tdp) {
- if (!exist) return;
- double pppm_t[4] = {1, 1, 1, 1};
- if (is_tdp) { // init stats for Peak
- if (coredynp.core_ty == OOO) {
- if (coredynp.scheu_ty == PhysicalRegFile) {
- if (coredynp.rm_ty == RAMbased) {
- iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_rd_ports;
- iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
- iFRAT->tdp_stats = iFRAT->stats_t;
+void RENAMINGU::computeEnergy(bool is_tdp)
+{
+ if (!exist) return;
+ double pppm_t[4] = {1,1,1,1};
+ if (is_tdp)
+ {//init stats for Peak
+ if (coredynp.core_ty==OOO){
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ if (coredynp.rm_ty ==RAMbased)
+ {
+ iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_rd_ports;
+ iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
+ iFRAT->tdp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_rd_ports;
- fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
- fFRAT->tdp_stats = fFRAT->stats_t;
+ fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_rd_ports;
+ fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
+ fFRAT->tdp_stats = fFRAT->stats_t;
- } else if ((coredynp.rm_ty == CAMbased)) {
- iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_search_ports;
- iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
- iFRAT->tdp_stats = iFRAT->stats_t;
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_search_ports;
+ iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
+ iFRAT->tdp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_search_ports;
- fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
- fFRAT->tdp_stats = fFRAT->stats_t;
- }
+ fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_search_ports;
+ fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
+ fFRAT->tdp_stats = fFRAT->stats_t;
+ }
- iRRAT->stats_t.readAc.access = iRRAT->l_ip.num_rd_ports;
- iRRAT->stats_t.writeAc.access = iRRAT->l_ip.num_wr_ports;
- iRRAT->tdp_stats = iRRAT->stats_t;
+ iRRAT->stats_t.readAc.access = iRRAT->l_ip.num_rd_ports;
+ iRRAT->stats_t.writeAc.access = iRRAT->l_ip.num_wr_ports;
+ iRRAT->tdp_stats = iRRAT->stats_t;
- fRRAT->stats_t.readAc.access = fRRAT->l_ip.num_rd_ports;
- fRRAT->stats_t.writeAc.access = fRRAT->l_ip.num_wr_ports;
- fRRAT->tdp_stats = fRRAT->stats_t;
+ fRRAT->stats_t.readAc.access = fRRAT->l_ip.num_rd_ports;
+ fRRAT->stats_t.writeAc.access = fRRAT->l_ip.num_wr_ports;
+ fRRAT->tdp_stats = fRRAT->stats_t;
- ifreeL->stats_t.readAc.access =
- coredynp.decodeW; // ifreeL->l_ip.num_rd_ports;;
- ifreeL->stats_t.writeAc.access =
- coredynp.decodeW; // ifreeL->l_ip.num_wr_ports;
- ifreeL->tdp_stats = ifreeL->stats_t;
+ ifreeL->stats_t.readAc.access = coredynp.decodeW;//ifreeL->l_ip.num_rd_ports;;
+ ifreeL->stats_t.writeAc.access = coredynp.decodeW;//ifreeL->l_ip.num_wr_ports;
+ ifreeL->tdp_stats = ifreeL->stats_t;
- ffreeL->stats_t.readAc.access =
- coredynp.decodeW; // ffreeL->l_ip.num_rd_ports;
- ffreeL->stats_t.writeAc.access =
- coredynp.decodeW; // ffreeL->l_ip.num_wr_ports;
- ffreeL->tdp_stats = ffreeL->stats_t;
- } else if (coredynp.scheu_ty == ReservationStation) {
- if (coredynp.rm_ty == RAMbased) {
- iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_rd_ports;
- iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
- iFRAT->stats_t.searchAc.access = iFRAT->l_ip.num_search_ports;
- iFRAT->tdp_stats = iFRAT->stats_t;
+ ffreeL->stats_t.readAc.access = coredynp.decodeW;//ffreeL->l_ip.num_rd_ports;
+ ffreeL->stats_t.writeAc.access = coredynp.decodeW;//ffreeL->l_ip.num_wr_ports;
+ ffreeL->tdp_stats = ffreeL->stats_t;
+ }
+ else if (coredynp.scheu_ty==ReservationStation){
+ if (coredynp.rm_ty ==RAMbased)
+ {
+ iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_rd_ports;
+ iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
+ iFRAT->stats_t.searchAc.access = iFRAT->l_ip.num_search_ports;
+ iFRAT->tdp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_rd_ports;
- fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
- fFRAT->stats_t.searchAc.access = fFRAT->l_ip.num_search_ports;
- fFRAT->tdp_stats = fFRAT->stats_t;
+ fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_rd_ports;
+ fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
+ fFRAT->stats_t.searchAc.access = fFRAT->l_ip.num_search_ports;
+ fFRAT->tdp_stats = fFRAT->stats_t;
- } else if ((coredynp.rm_ty == CAMbased)) {
- iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_search_ports;
- iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
- iFRAT->tdp_stats = iFRAT->stats_t;
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ iFRAT->stats_t.readAc.access = iFRAT->l_ip.num_search_ports;
+ iFRAT->stats_t.writeAc.access = iFRAT->l_ip.num_wr_ports;
+ iFRAT->tdp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_search_ports;
- fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
- fFRAT->tdp_stats = fFRAT->stats_t;
- }
- // Unified free list for both int and fp
- ifreeL->stats_t.readAc.access =
- coredynp.decodeW; // ifreeL->l_ip.num_rd_ports;
- ifreeL->stats_t.writeAc.access =
- coredynp.decodeW; // ifreeL->l_ip.num_wr_ports;
- ifreeL->tdp_stats = ifreeL->stats_t;
- }
- idcl->stats_t.readAc.access = coredynp.decodeW;
- fdcl->stats_t.readAc.access = coredynp.decodeW;
- idcl->tdp_stats = idcl->stats_t;
- fdcl->tdp_stats = fdcl->stats_t;
- } else {
- if (coredynp.issueW > 1) {
- idcl->stats_t.readAc.access = coredynp.decodeW;
- fdcl->stats_t.readAc.access = coredynp.decodeW;
- idcl->tdp_stats = idcl->stats_t;
- fdcl->tdp_stats = fdcl->stats_t;
- }
- }
+ fFRAT->stats_t.readAc.access = fFRAT->l_ip.num_search_ports;
+ fFRAT->stats_t.writeAc.access = fFRAT->l_ip.num_wr_ports;
+ fFRAT->tdp_stats = fFRAT->stats_t;
+ }
+ //Unified free list for both int and fp
+ ifreeL->stats_t.readAc.access = coredynp.decodeW;//ifreeL->l_ip.num_rd_ports;
+ ifreeL->stats_t.writeAc.access = coredynp.decodeW;//ifreeL->l_ip.num_wr_ports;
+ ifreeL->tdp_stats = ifreeL->stats_t;
+ }
+ idcl->stats_t.readAc.access = coredynp.decodeW;
+ fdcl->stats_t.readAc.access = coredynp.decodeW;
+ idcl->tdp_stats = idcl->stats_t;
+ fdcl->tdp_stats = fdcl->stats_t;
+ }
+ else
+ {
+ if (coredynp.issueW>1)
+ {
+ idcl->stats_t.readAc.access = coredynp.decodeW;
+ fdcl->stats_t.readAc.access = coredynp.decodeW;
+ idcl->tdp_stats = idcl->stats_t;
+ fdcl->tdp_stats = fdcl->stats_t;
+ }
+ }
- } else { // init stats for Runtime Dynamic (RTP)
- if (coredynp.core_ty == OOO) {
- if (coredynp.scheu_ty == PhysicalRegFile) {
- if (coredynp.rm_ty == RAMbased) {
- iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
- iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
- iFRAT->rtp_stats = iFRAT->stats_t;
+ }
+ else
+ {//init stats for Runtime Dynamic (RTP)
+ if (coredynp.core_ty==OOO){
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ if (coredynp.rm_ty ==RAMbased)
+ {
+ iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
+ iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
+ iFRAT->rtp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
- fFRAT->stats_t.writeAc.access =
- XML->sys.core[ithCore].fp_rename_writes;
- fFRAT->rtp_stats = fFRAT->stats_t;
- } else if ((coredynp.rm_ty == CAMbased)) {
- iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
- iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
- iFRAT->rtp_stats = iFRAT->stats_t;
+ fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
+ fFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].fp_rename_writes;
+ fFRAT->rtp_stats = fFRAT->stats_t;
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
+ iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
+ iFRAT->rtp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
- fFRAT->stats_t.writeAc.access =
- XML->sys.core[ithCore].fp_rename_writes;
- fFRAT->rtp_stats = fFRAT->stats_t;
- }
+ fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
+ fFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].fp_rename_writes;
+ fFRAT->rtp_stats = fFRAT->stats_t;
+ }
- iRRAT->stats_t.readAc.access =
- XML->sys.core[ithCore].rename_writes; // Hack, should be (context
- // switch + branch
- // mispredictions)*16
- iRRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
- iRRAT->rtp_stats = iRRAT->stats_t;
+ iRRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_writes;//Hack, should be (context switch + branch mispredictions)*16
+ iRRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
+ iRRAT->rtp_stats = iRRAT->stats_t;
- fRRAT->stats_t.readAc.access =
- XML->sys.core[ithCore].fp_rename_writes; // Hack, should be
- // (context switch +
- // branch
- // mispredictions)*16
- fRRAT->stats_t.writeAc.access = XML->sys.core[ithCore].fp_rename_writes;
- fRRAT->rtp_stats = fRRAT->stats_t;
+ fRRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_writes;//Hack, should be (context switch + branch mispredictions)*16
+ fRRAT->stats_t.writeAc.access = XML->sys.core[ithCore].fp_rename_writes;
+ fRRAT->rtp_stats = fRRAT->stats_t;
- ifreeL->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
- ifreeL->stats_t.writeAc.access =
- 2 * XML->sys.core[ithCore].rename_writes;
- ifreeL->rtp_stats = ifreeL->stats_t;
+ ifreeL->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
+ ifreeL->stats_t.writeAc.access = 2*XML->sys.core[ithCore].rename_writes;
+ ifreeL->rtp_stats = ifreeL->stats_t;
- ffreeL->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
- ffreeL->stats_t.writeAc.access =
- 2 * XML->sys.core[ithCore].fp_rename_writes;
- ffreeL->rtp_stats = ffreeL->stats_t;
- } else if (coredynp.scheu_ty == ReservationStation) {
- if (coredynp.rm_ty == RAMbased) {
- iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
- iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
- iFRAT->stats_t.searchAc.access =
- XML->sys.core[ithCore]
- .committed_int_instructions; // hack: not all committed
- // instructions use regs.
- iFRAT->rtp_stats = iFRAT->stats_t;
+ ffreeL->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
+ ffreeL->stats_t.writeAc.access = 2*XML->sys.core[ithCore].fp_rename_writes;
+ ffreeL->rtp_stats = ffreeL->stats_t;
+ }
+ else if (coredynp.scheu_ty==ReservationStation){
+ if (coredynp.rm_ty ==RAMbased)
+ {
+ iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
+ iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
+ iFRAT->stats_t.searchAc.access = XML->sys.core[ithCore].committed_int_instructions;//hack: not all committed instructions use regs.
+ iFRAT->rtp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
- fFRAT->stats_t.writeAc.access =
- XML->sys.core[ithCore].fp_rename_writes;
- fFRAT->stats_t.searchAc.access =
- XML->sys.core[ithCore].committed_fp_instructions;
- fFRAT->rtp_stats = fFRAT->stats_t;
- } else if ((coredynp.rm_ty == CAMbased)) {
- iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
- iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
- iFRAT->rtp_stats = iFRAT->stats_t;
+ fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
+ fFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].fp_rename_writes;
+ fFRAT->stats_t.searchAc.access = XML->sys.core[ithCore].committed_fp_instructions;
+ fFRAT->rtp_stats = fFRAT->stats_t;
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ iFRAT->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads;
+ iFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].rename_writes;
+ iFRAT->rtp_stats = iFRAT->stats_t;
- fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
- fFRAT->stats_t.writeAc.access =
- XML->sys.core[ithCore].fp_rename_writes;
- fFRAT->rtp_stats = fFRAT->stats_t;
- }
- // Unified free list for both int and fp since the ROB act as physcial
- // registers
- ifreeL->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads +
- XML->sys.core[ithCore].fp_rename_reads;
- ifreeL->stats_t.writeAc.access =
- 2 * (XML->sys.core[ithCore].rename_writes +
- XML->sys.core[ithCore].fp_rename_writes); // HACK: 2-> since
- // some of renaming
- // in the same group
- // are terminated early
- ifreeL->rtp_stats = ifreeL->stats_t;
- }
- idcl->stats_t.readAc.access = 3 * coredynp.decodeW * coredynp.decodeW *
- XML->sys.core[ithCore].rename_reads;
- fdcl->stats_t.readAc.access = 3 * coredynp.fp_issueW *
- coredynp.fp_issueW *
- XML->sys.core[ithCore].fp_rename_writes;
- idcl->rtp_stats = idcl->stats_t;
- fdcl->rtp_stats = fdcl->stats_t;
- } else {
- if (coredynp.issueW > 1) {
- idcl->stats_t.readAc.access =
- 2 * XML->sys.core[ithCore].int_instructions;
- fdcl->stats_t.readAc.access = XML->sys.core[ithCore].fp_instructions;
- idcl->rtp_stats = idcl->stats_t;
- fdcl->rtp_stats = fdcl->stats_t;
- }
- }
- }
- /* Compute engine */
- if (coredynp.core_ty == OOO) {
- if (coredynp.scheu_ty == PhysicalRegFile) {
- if (coredynp.rm_ty == RAMbased) {
- iFRAT->power_t.reset();
- fFRAT->power_t.reset();
+ fFRAT->stats_t.readAc.access = XML->sys.core[ithCore].fp_rename_reads;
+ fFRAT->stats_t.writeAc.access = XML->sys.core[ithCore].fp_rename_writes;
+ fFRAT->rtp_stats = fFRAT->stats_t;
+ }
+ //Unified free list for both int and fp since the ROB act as physcial registers
+ ifreeL->stats_t.readAc.access = XML->sys.core[ithCore].rename_reads +
+ XML->sys.core[ithCore].fp_rename_reads;
+ ifreeL->stats_t.writeAc.access = 2*(XML->sys.core[ithCore].rename_writes +
+ XML->sys.core[ithCore].fp_rename_writes);//HACK: 2-> since some of renaming in the same group
+ //are terminated early
+ ifreeL->rtp_stats = ifreeL->stats_t;
+ }
+ idcl->stats_t.readAc.access = 3*coredynp.decodeW*coredynp.decodeW*XML->sys.core[ithCore].rename_reads;
+ fdcl->stats_t.readAc.access = 3*coredynp.fp_issueW*coredynp.fp_issueW*XML->sys.core[ithCore].fp_rename_writes;
+ idcl->rtp_stats = idcl->stats_t;
+ fdcl->rtp_stats = fdcl->stats_t;
+ }
+ else
+ {
+ if (coredynp.issueW>1)
+ {
+ idcl->stats_t.readAc.access = 2*XML->sys.core[ithCore].int_instructions;
+ fdcl->stats_t.readAc.access = XML->sys.core[ithCore].fp_instructions;
+ idcl->rtp_stats = idcl->stats_t;
+ fdcl->rtp_stats = fdcl->stats_t;
+ }
+ }
- iFRAT->power_t.readOp.dynamic +=
- (iFRAT->stats_t.readAc.access *
- (iFRAT->local_result.power.readOp.dynamic +
- idcl->power.readOp.dynamic) +
- iFRAT->stats_t.writeAc.access *
- iFRAT->local_result.power.writeOp.dynamic);
- fFRAT->power_t.readOp.dynamic +=
- (fFRAT->stats_t.readAc.access *
- (fFRAT->local_result.power.readOp.dynamic +
- fdcl->power.readOp.dynamic) +
- fFRAT->stats_t.writeAc.access *
- fFRAT->local_result.power.writeOp.dynamic);
- } else if ((coredynp.rm_ty == CAMbased)) {
- iFRAT->power_t.reset();
- fFRAT->power_t.reset();
- iFRAT->power_t.readOp.dynamic +=
- (iFRAT->stats_t.readAc.access *
- (iFRAT->local_result.power.searchOp.dynamic +
- idcl->power.readOp.dynamic) +
- iFRAT->stats_t.writeAc.access *
- iFRAT->local_result.power.writeOp.dynamic);
- fFRAT->power_t.readOp.dynamic +=
- (fFRAT->stats_t.readAc.access *
- (fFRAT->local_result.power.searchOp.dynamic +
- fdcl->power.readOp.dynamic) +
- fFRAT->stats_t.writeAc.access *
- fFRAT->local_result.power.writeOp.dynamic);
- }
+ }
+ /* Compute engine */
+ if (coredynp.core_ty==OOO)
+ {
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ if (coredynp.rm_ty ==RAMbased)
+ {
+ iFRAT->power_t.reset();
+ fFRAT->power_t.reset();
- iRRAT->power_t.reset();
- fRRAT->power_t.reset();
- ifreeL->power_t.reset();
- ffreeL->power_t.reset();
+ iFRAT->power_t.readOp.dynamic += (iFRAT->stats_t.readAc.access
+ *(iFRAT->local_result.power.readOp.dynamic + idcl->power.readOp.dynamic)
+ +iFRAT->stats_t.writeAc.access*iFRAT->local_result.power.writeOp.dynamic);
+ fFRAT->power_t.readOp.dynamic += (fFRAT->stats_t.readAc.access
+ *(fFRAT->local_result.power.readOp.dynamic + fdcl->power.readOp.dynamic)
+ +fFRAT->stats_t.writeAc.access*fFRAT->local_result.power.writeOp.dynamic);
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ iFRAT->power_t.reset();
+ fFRAT->power_t.reset();
+ iFRAT->power_t.readOp.dynamic += (iFRAT->stats_t.readAc.access
+ *(iFRAT->local_result.power.searchOp.dynamic + idcl->power.readOp.dynamic)
+ +iFRAT->stats_t.writeAc.access*iFRAT->local_result.power.writeOp.dynamic);
+ fFRAT->power_t.readOp.dynamic += (fFRAT->stats_t.readAc.access
+ *(fFRAT->local_result.power.searchOp.dynamic + fdcl->power.readOp.dynamic)
+ +fFRAT->stats_t.writeAc.access*fFRAT->local_result.power.writeOp.dynamic);
+ }
- iRRAT->power_t.readOp.dynamic +=
- (iRRAT->stats_t.readAc.access *
- iRRAT->local_result.power.readOp.dynamic +
- iRRAT->stats_t.writeAc.access *
- iRRAT->local_result.power.writeOp.dynamic);
- fRRAT->power_t.readOp.dynamic +=
- (fRRAT->stats_t.readAc.access *
- fRRAT->local_result.power.readOp.dynamic +
- fRRAT->stats_t.writeAc.access *
- fRRAT->local_result.power.writeOp.dynamic);
- ifreeL->power_t.readOp.dynamic +=
- (ifreeL->stats_t.readAc.access *
- ifreeL->local_result.power.readOp.dynamic +
- ifreeL->stats_t.writeAc.access *
- ifreeL->local_result.power.writeOp.dynamic);
- ffreeL->power_t.readOp.dynamic +=
- (ffreeL->stats_t.readAc.access *
- ffreeL->local_result.power.readOp.dynamic +
- ffreeL->stats_t.writeAc.access *
- ffreeL->local_result.power.writeOp.dynamic);
+ iRRAT->power_t.reset();
+ fRRAT->power_t.reset();
+ ifreeL->power_t.reset();
+ ffreeL->power_t.reset();
- } else if (coredynp.scheu_ty == ReservationStation) {
- if (coredynp.rm_ty == RAMbased) {
- iFRAT->power_t.reset();
- fFRAT->power_t.reset();
+ iRRAT->power_t.readOp.dynamic += (iRRAT->stats_t.readAc.access*iRRAT->local_result.power.readOp.dynamic
+ +iRRAT->stats_t.writeAc.access*iRRAT->local_result.power.writeOp.dynamic);
+ fRRAT->power_t.readOp.dynamic += (fRRAT->stats_t.readAc.access*fRRAT->local_result.power.readOp.dynamic
+ +fRRAT->stats_t.writeAc.access*fRRAT->local_result.power.writeOp.dynamic);
+ ifreeL->power_t.readOp.dynamic += (ifreeL->stats_t.readAc.access*ifreeL->local_result.power.readOp.dynamic
+ +ifreeL->stats_t.writeAc.access*ifreeL->local_result.power.writeOp.dynamic);
+ ffreeL->power_t.readOp.dynamic += (ffreeL->stats_t.readAc.access*ffreeL->local_result.power.readOp.dynamic
+ +ffreeL->stats_t.writeAc.access*ffreeL->local_result.power.writeOp.dynamic);
- iFRAT->power_t.readOp.dynamic +=
- (iFRAT->stats_t.readAc.access *
- (iFRAT->local_result.power.readOp.dynamic +
- idcl->power.readOp.dynamic) +
- iFRAT->stats_t.writeAc.access *
- iFRAT->local_result.power.writeOp.dynamic +
- iFRAT->stats_t.searchAc.access *
- iFRAT->local_result.power.searchOp.dynamic);
- fFRAT->power_t.readOp.dynamic +=
- (fFRAT->stats_t.readAc.access *
- (fFRAT->local_result.power.readOp.dynamic +
- fdcl->power.readOp.dynamic) +
- fFRAT->stats_t.writeAc.access *
- fFRAT->local_result.power.writeOp.dynamic +
- fFRAT->stats_t.searchAc.access *
- fFRAT->local_result.power.searchOp.dynamic);
- } else if ((coredynp.rm_ty == CAMbased)) {
- iFRAT->power_t.reset();
- fFRAT->power_t.reset();
- iFRAT->power_t.readOp.dynamic +=
- (iFRAT->stats_t.readAc.access *
- (iFRAT->local_result.power.searchOp.dynamic +
- idcl->power.readOp.dynamic) +
- iFRAT->stats_t.writeAc.access *
- iFRAT->local_result.power.writeOp.dynamic);
- fFRAT->power_t.readOp.dynamic +=
- (fFRAT->stats_t.readAc.access *
- (fFRAT->local_result.power.searchOp.dynamic +
- fdcl->power.readOp.dynamic) +
- fFRAT->stats_t.writeAc.access *
- fFRAT->local_result.power.writeOp.dynamic);
- }
- ifreeL->power_t.reset();
- ifreeL->power_t.readOp.dynamic +=
- (ifreeL->stats_t.readAc.access *
- ifreeL->local_result.power.readOp.dynamic +
- ifreeL->stats_t.writeAc.access *
- ifreeL->local_result.power.writeOp.dynamic);
- }
+ }
+ else if (coredynp.scheu_ty==ReservationStation)
+ {
+ if (coredynp.rm_ty ==RAMbased)
+ {
+ iFRAT->power_t.reset();
+ fFRAT->power_t.reset();
- } else {
- if (coredynp.issueW > 1) {
- idcl->power_t.reset();
- fdcl->power_t.reset();
- set_pppm(pppm_t, idcl->stats_t.readAc.access, coredynp.num_hthreads,
- coredynp.num_hthreads, idcl->stats_t.readAc.access);
- idcl->power_t = idcl->power * pppm_t;
- set_pppm(pppm_t, fdcl->stats_t.readAc.access, coredynp.num_hthreads,
- coredynp.num_hthreads, idcl->stats_t.readAc.access);
- fdcl->power_t = fdcl->power * pppm_t;
- }
- }
+ iFRAT->power_t.readOp.dynamic += (iFRAT->stats_t.readAc.access
+ *(iFRAT->local_result.power.readOp.dynamic + idcl->power.readOp.dynamic)
+ +iFRAT->stats_t.writeAc.access*iFRAT->local_result.power.writeOp.dynamic
+ +iFRAT->stats_t.searchAc.access*iFRAT->local_result.power.searchOp.dynamic);
+ fFRAT->power_t.readOp.dynamic += (fFRAT->stats_t.readAc.access
+ *(fFRAT->local_result.power.readOp.dynamic + fdcl->power.readOp.dynamic)
+ +fFRAT->stats_t.writeAc.access*fFRAT->local_result.power.writeOp.dynamic
+ +fFRAT->stats_t.searchAc.access*fFRAT->local_result.power.searchOp.dynamic);
+ }
+ else if ((coredynp.rm_ty ==CAMbased))
+ {
+ iFRAT->power_t.reset();
+ fFRAT->power_t.reset();
+ iFRAT->power_t.readOp.dynamic += (iFRAT->stats_t.readAc.access
+ *(iFRAT->local_result.power.searchOp.dynamic + idcl->power.readOp.dynamic)
+ +iFRAT->stats_t.writeAc.access*iFRAT->local_result.power.writeOp.dynamic);
+ fFRAT->power_t.readOp.dynamic += (fFRAT->stats_t.readAc.access
+ *(fFRAT->local_result.power.searchOp.dynamic + fdcl->power.readOp.dynamic)
+ +fFRAT->stats_t.writeAc.access*fFRAT->local_result.power.writeOp.dynamic);
+ }
+ ifreeL->power_t.reset();
+ ifreeL->power_t.readOp.dynamic += (ifreeL->stats_t.readAc.access*ifreeL->local_result.power.readOp.dynamic
+ +ifreeL->stats_t.writeAc.access*ifreeL->local_result.power.writeOp.dynamic);
+ }
- // assign value to tpd and rtp
- if (is_tdp) {
- if (coredynp.core_ty == OOO) {
- if (coredynp.scheu_ty == PhysicalRegFile) {
- iFRAT->power =
- iFRAT->power_t +
- (iFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- idcl->power_t;
- fFRAT->power =
- fFRAT->power_t +
- (fFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- fdcl->power_t;
- iRRAT->power = iRRAT->power_t +
- iRRAT->local_result.power * coredynp.pppm_lkg_multhread;
- fRRAT->power = fRRAT->power_t +
- fRRAT->local_result.power * coredynp.pppm_lkg_multhread;
- ifreeL->power =
- ifreeL->power_t +
- ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
- ffreeL->power =
- ffreeL->power_t +
- ffreeL->local_result.power * coredynp.pppm_lkg_multhread;
- power = power + (iFRAT->power + fFRAT->power) +
- (iRRAT->power + fRRAT->power) + (ifreeL->power + ffreeL->power);
- } else if (coredynp.scheu_ty == ReservationStation) {
- iFRAT->power =
- iFRAT->power_t +
- (iFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- idcl->power_t;
- fFRAT->power =
- fFRAT->power_t +
- (fFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- fdcl->power_t;
- ifreeL->power =
- ifreeL->power_t +
- ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
- power = power + (iFRAT->power + fFRAT->power) + ifreeL->power;
- }
- } else {
- power = power + idcl->power_t + fdcl->power_t;
- }
+ }
+ else
+ {
+ if (coredynp.issueW>1)
+ {
+ idcl->power_t.reset();
+ fdcl->power_t.reset();
+ set_pppm(pppm_t, idcl->stats_t.readAc.access, coredynp.num_hthreads, coredynp.num_hthreads, idcl->stats_t.readAc.access);
+ idcl->power_t = idcl->power * pppm_t;
+ set_pppm(pppm_t, fdcl->stats_t.readAc.access, coredynp.num_hthreads, coredynp.num_hthreads, idcl->stats_t.readAc.access);
+ fdcl->power_t = fdcl->power * pppm_t;
+ }
- } else {
- if (coredynp.core_ty == OOO) {
- if (coredynp.scheu_ty == PhysicalRegFile) {
- iFRAT->rt_power =
- iFRAT->power_t +
- (iFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- idcl->power_t;
- fFRAT->rt_power =
- fFRAT->power_t +
- (fFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- fdcl->power_t;
- iRRAT->rt_power =
- iRRAT->power_t +
- iRRAT->local_result.power * coredynp.pppm_lkg_multhread;
- fRRAT->rt_power =
- fRRAT->power_t +
- fRRAT->local_result.power * coredynp.pppm_lkg_multhread;
- ifreeL->rt_power =
- ifreeL->power_t +
- ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
- ffreeL->rt_power =
- ffreeL->power_t +
- ffreeL->local_result.power * coredynp.pppm_lkg_multhread;
- rt_power = rt_power + (iFRAT->rt_power + fFRAT->rt_power) +
- (iRRAT->rt_power + fRRAT->rt_power) +
- (ifreeL->rt_power + ffreeL->rt_power);
- } else if (coredynp.scheu_ty == ReservationStation) {
- iFRAT->rt_power =
- iFRAT->power_t +
- (iFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- idcl->power_t;
- fFRAT->rt_power =
- fFRAT->power_t +
- (fFRAT->local_result.power) * coredynp.pppm_lkg_multhread +
- fdcl->power_t;
- ifreeL->rt_power =
- ifreeL->power_t +
- ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
- rt_power =
- rt_power + (iFRAT->rt_power + fFRAT->rt_power) + ifreeL->rt_power;
- }
- } else {
- rt_power = rt_power + idcl->power_t + fdcl->power_t;
- }
- }
+ }
+
+ //assign value to tpd and rtp
+ if (is_tdp)
+ {
+ if (coredynp.core_ty==OOO)
+ {
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ iFRAT->power = iFRAT->power_t + (iFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + idcl->power_t;
+ fFRAT->power = fFRAT->power_t + (fFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + fdcl->power_t;
+ iRRAT->power = iRRAT->power_t + iRRAT->local_result.power * coredynp.pppm_lkg_multhread;
+ fRRAT->power = fRRAT->power_t + fRRAT->local_result.power * coredynp.pppm_lkg_multhread;
+ ifreeL->power = ifreeL->power_t + ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
+ ffreeL->power = ffreeL->power_t + ffreeL->local_result.power * coredynp.pppm_lkg_multhread;
+ power = power + (iFRAT->power + fFRAT->power)
+ + (iRRAT->power + fRRAT->power)
+ + (ifreeL->power + ffreeL->power);
+ }
+ else if (coredynp.scheu_ty==ReservationStation)
+ {
+ iFRAT->power = iFRAT->power_t + (iFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + idcl->power_t;
+ fFRAT->power = fFRAT->power_t + (fFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + fdcl->power_t;
+ ifreeL->power = ifreeL->power_t + ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
+ power = power + (iFRAT->power + fFRAT->power)
+ + ifreeL->power;
+ }
+ }
+ else
+ {
+ power = power + idcl->power_t + fdcl->power_t;
+ }
+
+ }
+ else
+ {
+ if (coredynp.core_ty==OOO)
+ {
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ iFRAT->rt_power = iFRAT->power_t + (iFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + idcl->power_t;
+ fFRAT->rt_power = fFRAT->power_t + (fFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + fdcl->power_t;
+ iRRAT->rt_power = iRRAT->power_t + iRRAT->local_result.power * coredynp.pppm_lkg_multhread;
+ fRRAT->rt_power = fRRAT->power_t + fRRAT->local_result.power * coredynp.pppm_lkg_multhread;
+ ifreeL->rt_power = ifreeL->power_t + ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
+ ffreeL->rt_power = ffreeL->power_t + ffreeL->local_result.power * coredynp.pppm_lkg_multhread;
+ rt_power = rt_power + (iFRAT->rt_power + fFRAT->rt_power)
+ + (iRRAT->rt_power + fRRAT->rt_power)
+ + (ifreeL->rt_power + ffreeL->rt_power);
+ }
+ else if (coredynp.scheu_ty==ReservationStation)
+ {
+ iFRAT->rt_power = iFRAT->power_t + (iFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + idcl->power_t;
+ fFRAT->rt_power = fFRAT->power_t + (fFRAT->local_result.power ) * coredynp.pppm_lkg_multhread + fdcl->power_t;
+ ifreeL->rt_power = ifreeL->power_t + ifreeL->local_result.power * coredynp.pppm_lkg_multhread;
+ rt_power = rt_power + (iFRAT->rt_power + fFRAT->rt_power)
+ + ifreeL->rt_power;
+ }
+ }
+ else
+ {
+ rt_power = rt_power + idcl->power_t + fdcl->power_t;
+ }
+
+ }
}
-void RENAMINGU::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
+void RENAMINGU::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
- if (is_tdp) {
- if (coredynp.core_ty == OOO) {
- cout << indent_str << "Int Front End RAT:" << endl;
- cout << indent_str_next << "Area = " << iFRAT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << iFRAT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? iFRAT->power.readOp.longer_channel_leakage
- : iFRAT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << iFRAT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << iFRAT->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "FP Front End RAT:" << endl;
- cout << indent_str_next << "Area = " << fFRAT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << fFRAT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? fFRAT->power.readOp.longer_channel_leakage
- : fFRAT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << fFRAT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << fFRAT->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "Free List:" << endl;
- cout << indent_str_next << "Area = " << ifreeL->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << ifreeL->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? ifreeL->power.readOp.longer_channel_leakage
- : ifreeL->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << ifreeL->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << ifreeL->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (coredynp.scheu_ty == PhysicalRegFile) {
- cout << indent_str << "Int Retire RAT: " << endl;
- cout << indent_str_next << "Area = " << iRRAT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << iRRAT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? iRRAT->power.readOp.longer_channel_leakage
- : iRRAT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << iRRAT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << iRRAT->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "FP Retire RAT:" << endl;
- cout << indent_str_next << "Area = " << fRRAT->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << fRRAT->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? fRRAT->power.readOp.longer_channel_leakage
- : fRRAT->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << fRRAT->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << fRRAT->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "FP Free List:" << endl;
- cout << indent_str_next << "Area = " << ffreeL->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << ffreeL->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? ffreeL->power.readOp.longer_channel_leakage
- : ffreeL->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << ffreeL->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << ffreeL->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- }
- } else {
- cout << indent_str << "Int DCL:" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << idcl->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? idcl->power.readOp.longer_channel_leakage
- : idcl->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << idcl->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << idcl->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << indent_str << "FP DCL:" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << fdcl->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? fdcl->power.readOp.longer_channel_leakage
- : fdcl->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << fdcl->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << fdcl->rt_power.readOp.dynamic / executionTime << " W" << endl;
- }
- } else {
- if (coredynp.core_ty == OOO) {
- cout << indent_str_next << "Int Front End RAT Peak Dynamic = "
- << iFRAT->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Int Front End RAT Subthreshold Leakage = "
- << iFRAT->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Int Front End RAT Gate Leakage = "
- << iFRAT->rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "FP Front End RAT Peak Dynamic = "
- << fFRAT->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "FP Front End RAT Subthreshold Leakage = "
- << fFRAT->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "FP Front End RAT Gate Leakage = "
- << fFRAT->rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "Free List Peak Dynamic = "
- << ifreeL->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Free List Subthreshold Leakage = "
- << ifreeL->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Free List Gate Leakage = "
- << fFRAT->rt_power.readOp.gate_leakage << " W" << endl;
- if (coredynp.scheu_ty == PhysicalRegFile) {
- cout << indent_str_next << "Int Retire RAT Peak Dynamic = "
- << iRRAT->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Int Retire RAT Subthreshold Leakage = "
- << iRRAT->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Int Retire RAT Gate Leakage = "
- << iRRAT->rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "FP Retire RAT Peak Dynamic = "
- << fRRAT->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "FP Retire RAT Subthreshold Leakage = "
- << fRRAT->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "FP Retire RAT Gate Leakage = "
- << fRRAT->rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "FP Free List Peak Dynamic = "
- << ffreeL->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "FP Free List Subthreshold Leakage = "
- << ffreeL->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "FP Free List Gate Leakage = "
- << fFRAT->rt_power.readOp.gate_leakage << " W" << endl;
- }
- } else {
- cout << indent_str_next << "Int DCL Peak Dynamic = "
- << idcl->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Int DCL Subthreshold Leakage = "
- << idcl->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next
- << "Int DCL Gate Leakage = " << idcl->rt_power.readOp.gate_leakage
- << " W" << endl;
- cout << indent_str_next << "FP DCL Peak Dynamic = "
- << fdcl->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "FP DCL Subthreshold Leakage = "
- << fdcl->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next
- << "FP DCL Gate Leakage = " << fdcl->rt_power.readOp.gate_leakage
- << " W" << endl;
- }
- }
+ if (is_tdp)
+ {
+
+ if (coredynp.core_ty==OOO)
+ {
+ cout << indent_str<< "Int Front End RAT:" << endl;
+ cout << indent_str_next << "Area = " << iFRAT->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << iFRAT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? iFRAT->power.readOp.longer_channel_leakage:iFRAT->power.readOp.leakage) <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << iFRAT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << iFRAT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str<< "FP Front End RAT:" << endl;
+ cout << indent_str_next << "Area = " << fFRAT->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << fFRAT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? fFRAT->power.readOp.longer_channel_leakage:fFRAT->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << fFRAT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << fFRAT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str<<"Free List:" << endl;
+ cout << indent_str_next << "Area = " << ifreeL->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << ifreeL->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? ifreeL->power.readOp.longer_channel_leakage:ifreeL->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << ifreeL->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << ifreeL->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ cout << indent_str<< "Int Retire RAT: " << endl;
+ cout << indent_str_next << "Area = " << iRRAT->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << iRRAT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? iRRAT->power.readOp.longer_channel_leakage:iRRAT->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << iRRAT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << iRRAT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str<< "FP Retire RAT:" << endl;
+ cout << indent_str_next << "Area = " << fRRAT->area.get_area() *1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << fRRAT->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? fRRAT->power.readOp.longer_channel_leakage:fRRAT->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << fRRAT->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << fRRAT->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str<< "FP Free List:" << endl;
+ cout << indent_str_next << "Area = " << ffreeL->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << ffreeL->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? ffreeL->power.readOp.longer_channel_leakage:ffreeL->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << ffreeL->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << ffreeL->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ }
+ else
+ {
+ cout << indent_str<< "Int DCL:" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << idcl->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? idcl->power.readOp.longer_channel_leakage:idcl->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << idcl->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << idcl->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout << indent_str<<"FP DCL:" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << fdcl->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? fdcl->power.readOp.longer_channel_leakage:fdcl->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << fdcl->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << fdcl->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ }
+ }
+ else
+ {
+ if (coredynp.core_ty==OOO)
+ {
+ cout << indent_str_next << "Int Front End RAT Peak Dynamic = " << iFRAT->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Int Front End RAT Subthreshold Leakage = " << iFRAT->rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Int Front End RAT Gate Leakage = " << iFRAT->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "FP Front End RAT Peak Dynamic = " << fFRAT->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "FP Front End RAT Subthreshold Leakage = " << fFRAT->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "FP Front End RAT Gate Leakage = " << fFRAT->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Free List Peak Dynamic = " << ifreeL->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Free List Subthreshold Leakage = " << ifreeL->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Free List Gate Leakage = " << fFRAT->rt_power.readOp.gate_leakage << " W" << endl;
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ cout << indent_str_next << "Int Retire RAT Peak Dynamic = " << iRRAT->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Int Retire RAT Subthreshold Leakage = " << iRRAT->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Int Retire RAT Gate Leakage = " << iRRAT->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "FP Retire RAT Peak Dynamic = " << fRRAT->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "FP Retire RAT Subthreshold Leakage = " << fRRAT->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "FP Retire RAT Gate Leakage = " << fRRAT->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "FP Free List Peak Dynamic = " << ffreeL->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "FP Free List Subthreshold Leakage = " << ffreeL->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "FP Free List Gate Leakage = " << fFRAT->rt_power.readOp.gate_leakage << " W" << endl;
+ }
+ }
+ else
+ {
+ cout << indent_str_next << "Int DCL Peak Dynamic = " << idcl->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Int DCL Subthreshold Leakage = " << idcl->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Int DCL Gate Leakage = " << idcl->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "FP DCL Peak Dynamic = " << fdcl->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "FP DCL Subthreshold Leakage = " << fdcl->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "FP DCL Gate Leakage = " << fdcl->rt_power.readOp.gate_leakage << " W" << endl;
+ }
+ }
+
}
-void SchedulerU::computeEnergy(bool is_tdp) {
- if (!exist) return;
- double ROB_duty_cycle;
- // ROB_duty_cycle = ((coredynp.ALU_duty_cycle +
- //coredynp.num_muls>0?coredynp.MUL_duty_cycle:0
- // + coredynp.num_fpus>0?coredynp.FPU_duty_cycle:0))*1.1<1 ?
- //(coredynp.ALU_duty_cycle + coredynp.num_muls>0?coredynp.MUL_duty_cycle:0
- // +
- //coredynp.num_fpus>0?coredynp.FPU_duty_cycle:0)*1.1:1;
- ROB_duty_cycle = 1;
- // init stats
- if (is_tdp) {
- if (coredynp.core_ty == OOO) {
- int_inst_window->stats_t.readAc.access =
- coredynp.issueW *
- coredynp.num_pipelines; // int_inst_window->l_ip.num_search_ports;
- int_inst_window->stats_t.writeAc.access =
- coredynp.issueW *
- coredynp.num_pipelines; // int_inst_window->l_ip.num_wr_ports;
- int_inst_window->stats_t.searchAc.access =
- coredynp.issueW * coredynp.num_pipelines;
- int_inst_window->tdp_stats = int_inst_window->stats_t;
- fp_inst_window->stats_t.readAc.access =
- fp_inst_window->l_ip.num_rd_ports * coredynp.num_fp_pipelines;
- fp_inst_window->stats_t.writeAc.access =
- fp_inst_window->l_ip.num_wr_ports * coredynp.num_fp_pipelines;
- fp_inst_window->stats_t.searchAc.access =
- fp_inst_window->l_ip.num_search_ports * coredynp.num_fp_pipelines;
- fp_inst_window->tdp_stats = fp_inst_window->stats_t;
- if (XML->sys.core[ithCore].ROB_size > 0) {
- ROB->stats_t.readAc.access =
- coredynp.commitW * coredynp.num_pipelines * ROB_duty_cycle;
- ROB->stats_t.writeAc.access =
- coredynp.issueW * coredynp.num_pipelines * ROB_duty_cycle;
- ROB->tdp_stats = ROB->stats_t;
+void SchedulerU::computeEnergy(bool is_tdp)
+{
+ if (!exist) return;
+ double ROB_duty_cycle;
+// ROB_duty_cycle = ((coredynp.ALU_duty_cycle + coredynp.num_muls>0?coredynp.MUL_duty_cycle:0
+// + coredynp.num_fpus>0?coredynp.FPU_duty_cycle:0))*1.1<1 ? (coredynp.ALU_duty_cycle + coredynp.num_muls>0?coredynp.MUL_duty_cycle:0
+// + coredynp.num_fpus>0?coredynp.FPU_duty_cycle:0)*1.1:1;
+ ROB_duty_cycle = 1;
+ //init stats
+ if (is_tdp)
+ {
+ if (coredynp.core_ty==OOO)
+ {
+ int_inst_window->stats_t.readAc.access = coredynp.issueW*coredynp.num_pipelines;//int_inst_window->l_ip.num_search_ports;
+ int_inst_window->stats_t.writeAc.access = coredynp.issueW*coredynp.num_pipelines;//int_inst_window->l_ip.num_wr_ports;
+ int_inst_window->stats_t.searchAc.access = coredynp.issueW*coredynp.num_pipelines;
+ int_inst_window->tdp_stats = int_inst_window->stats_t;
+ fp_inst_window->stats_t.readAc.access = fp_inst_window->l_ip.num_rd_ports*coredynp.num_fp_pipelines;
+ fp_inst_window->stats_t.writeAc.access = fp_inst_window->l_ip.num_wr_ports*coredynp.num_fp_pipelines;
+ fp_inst_window->stats_t.searchAc.access = fp_inst_window->l_ip.num_search_ports*coredynp.num_fp_pipelines;
+ fp_inst_window->tdp_stats = fp_inst_window->stats_t;
- /*
- * When inst commits, ROB must be read.
- * Because for Physcial register based cores, physical register tag in
- * ROB
- * need to be read out and write into RRAT/CAM based RAT.
- * For RS based cores, register content that stored in ROB must be
- * read out and stored in architectural registers.
- *
- * if no-register is involved, the ROB read out operation when
- * instruction commits can be ignored.
- * assuming 20% insts. belong this type.
- * TODO: ROB duty_cycle need to be revisited
- */
- }
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+ ROB->stats_t.readAc.access = coredynp.commitW*coredynp.num_pipelines*ROB_duty_cycle;
+ ROB->stats_t.writeAc.access = coredynp.issueW*coredynp.num_pipelines*ROB_duty_cycle;
+ ROB->tdp_stats = ROB->stats_t;
- } else if (coredynp.multithreaded) {
- int_inst_window->stats_t.readAc.access =
- coredynp.issueW *
- coredynp.num_pipelines; // int_inst_window->l_ip.num_search_ports;
- int_inst_window->stats_t.writeAc.access =
- coredynp.issueW *
- coredynp.num_pipelines; // int_inst_window->l_ip.num_wr_ports;
- int_inst_window->stats_t.searchAc.access =
- coredynp.issueW * coredynp.num_pipelines;
- int_inst_window->tdp_stats = int_inst_window->stats_t;
- }
+ /*
+ * When inst commits, ROB must be read.
+ * Because for Physcial register based cores, physical register tag in ROB
+ * need to be read out and write into RRAT/CAM based RAT.
+ * For RS based cores, register content that stored in ROB must be
+ * read out and stored in architectural registers.
+ *
+ * if no-register is involved, the ROB read out operation when instruction commits can be ignored.
+ * assuming 20% insts. belong this type.
+ * TODO: ROB duty_cycle need to be revisited
+ */
+ }
- } else { // rtp
- if (coredynp.core_ty == OOO) {
- int_inst_window->stats_t.readAc.access =
- XML->sys.core[ithCore].inst_window_reads;
- int_inst_window->stats_t.writeAc.access =
- XML->sys.core[ithCore].inst_window_writes;
- int_inst_window->stats_t.searchAc.access =
- XML->sys.core[ithCore].inst_window_wakeup_accesses;
- int_inst_window->rtp_stats = int_inst_window->stats_t;
- fp_inst_window->stats_t.readAc.access =
- XML->sys.core[ithCore].fp_inst_window_reads;
- fp_inst_window->stats_t.writeAc.access =
- XML->sys.core[ithCore].fp_inst_window_writes;
- fp_inst_window->stats_t.searchAc.access =
- XML->sys.core[ithCore].fp_inst_window_wakeup_accesses;
- fp_inst_window->rtp_stats = fp_inst_window->stats_t;
+ }
+ else if (coredynp.multithreaded)
+ {
+ int_inst_window->stats_t.readAc.access = coredynp.issueW*coredynp.num_pipelines;//int_inst_window->l_ip.num_search_ports;
+ int_inst_window->stats_t.writeAc.access = coredynp.issueW*coredynp.num_pipelines;//int_inst_window->l_ip.num_wr_ports;
+ int_inst_window->stats_t.searchAc.access = coredynp.issueW*coredynp.num_pipelines;
+ int_inst_window->tdp_stats = int_inst_window->stats_t;
+ }
- if (XML->sys.core[ithCore].ROB_size > 0) {
- ROB->stats_t.readAc.access = XML->sys.core[ithCore].ROB_reads;
- ROB->stats_t.writeAc.access = XML->sys.core[ithCore].ROB_writes;
- /* ROB need to be updated in RS based OOO when new values are produced,
- * this update may happen before the commit stage when ROB entry is
- * released
- * 1. ROB write at instruction inserted in
- * 2. ROB write as results produced (for RS based OOO only)
- * 3. ROB read as instruction committed. For RS based OOO, data values
- * are read out and sent to ARF
- * For Physical reg based OOO, no data stored in ROB, but register tags
- * need to be
- * read out and used to set the RRAT and to recycle the register tag to
- * free list buffer
- */
- ROB->rtp_stats = ROB->stats_t;
- }
+ }
+ else
+ {//rtp
+ if (coredynp.core_ty==OOO)
+ {
+ int_inst_window->stats_t.readAc.access = XML->sys.core[ithCore].inst_window_reads;
+ int_inst_window->stats_t.writeAc.access = XML->sys.core[ithCore].inst_window_writes;
+ int_inst_window->stats_t.searchAc.access = XML->sys.core[ithCore].inst_window_wakeup_accesses;
+ int_inst_window->rtp_stats = int_inst_window->stats_t;
+ fp_inst_window->stats_t.readAc.access = XML->sys.core[ithCore].fp_inst_window_reads;
+ fp_inst_window->stats_t.writeAc.access = XML->sys.core[ithCore].fp_inst_window_writes;
+ fp_inst_window->stats_t.searchAc.access = XML->sys.core[ithCore].fp_inst_window_wakeup_accesses;
+ fp_inst_window->rtp_stats = fp_inst_window->stats_t;
+
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+
+ ROB->stats_t.readAc.access = XML->sys.core[ithCore].ROB_reads;
+ ROB->stats_t.writeAc.access = XML->sys.core[ithCore].ROB_writes;
+ /* ROB need to be updated in RS based OOO when new values are produced,
+ * this update may happen before the commit stage when ROB entry is released
+ * 1. ROB write at instruction inserted in
+ * 2. ROB write as results produced (for RS based OOO only)
+ * 3. ROB read as instruction committed. For RS based OOO, data values are read out and sent to ARF
+ * For Physical reg based OOO, no data stored in ROB, but register tags need to be
+ * read out and used to set the RRAT and to recycle the register tag to free list buffer
+ */
+ ROB->rtp_stats = ROB->stats_t;
+ }
- } else if (coredynp.multithreaded) {
- int_inst_window->stats_t.readAc.access =
- XML->sys.core[ithCore].int_instructions +
- XML->sys.core[ithCore].fp_instructions;
- int_inst_window->stats_t.writeAc.access =
- XML->sys.core[ithCore].int_instructions +
- XML->sys.core[ithCore].fp_instructions;
- int_inst_window->stats_t.searchAc.access =
- 2 * (XML->sys.core[ithCore].int_instructions +
- XML->sys.core[ithCore].fp_instructions);
- int_inst_window->rtp_stats = int_inst_window->stats_t;
+ }
+ else if (coredynp.multithreaded)
+ {
+ int_inst_window->stats_t.readAc.access = XML->sys.core[ithCore].int_instructions + XML->sys.core[ithCore].fp_instructions;
+ int_inst_window->stats_t.writeAc.access = XML->sys.core[ithCore].int_instructions + XML->sys.core[ithCore].fp_instructions;
+ int_inst_window->stats_t.searchAc.access = 2*(XML->sys.core[ithCore].int_instructions + XML->sys.core[ithCore].fp_instructions);
+ int_inst_window->rtp_stats = int_inst_window->stats_t;
+ }
}
- }
- // computation engine
- if (coredynp.core_ty == OOO) {
- int_inst_window->power_t.reset();
- fp_inst_window->power_t.reset();
+ //computation engine
+ if (coredynp.core_ty==OOO)
+ {
+ int_inst_window->power_t.reset();
+ fp_inst_window->power_t.reset();
- /* each instruction needs to write to scheduler, read out when all resources
- * and source operands are ready
- * two search ops with one for each source operand
- *
- */
- int_inst_window->power_t.readOp.dynamic +=
- int_inst_window->local_result.power.readOp.dynamic *
- int_inst_window->stats_t.readAc.access +
- int_inst_window->local_result.power.searchOp.dynamic *
- int_inst_window->stats_t.searchAc.access +
- int_inst_window->local_result.power.writeOp.dynamic *
- int_inst_window->stats_t.writeAc.access +
- int_inst_window->stats_t.readAc.access *
- instruction_selection->power.readOp.dynamic;
+ /* each instruction needs to write to scheduler, read out when all resources and source operands are ready
+ * two search ops with one for each source operand
+ *
+ */
+ int_inst_window->power_t.readOp.dynamic += int_inst_window->local_result.power.readOp.dynamic * int_inst_window->stats_t.readAc.access
+ + int_inst_window->local_result.power.searchOp.dynamic * int_inst_window->stats_t.searchAc.access
+ + int_inst_window->local_result.power.writeOp.dynamic * int_inst_window->stats_t.writeAc.access
+ + int_inst_window->stats_t.readAc.access * instruction_selection->power.readOp.dynamic;
- fp_inst_window->power_t.readOp.dynamic +=
- fp_inst_window->local_result.power.readOp.dynamic *
- fp_inst_window->stats_t.readAc.access +
- fp_inst_window->local_result.power.searchOp.dynamic *
- fp_inst_window->stats_t.searchAc.access +
- fp_inst_window->local_result.power.writeOp.dynamic *
- fp_inst_window->stats_t.writeAc.access +
- fp_inst_window->stats_t.writeAc.access *
- instruction_selection->power.readOp.dynamic;
+ fp_inst_window->power_t.readOp.dynamic += fp_inst_window->local_result.power.readOp.dynamic * fp_inst_window->stats_t.readAc.access
+ + fp_inst_window->local_result.power.searchOp.dynamic * fp_inst_window->stats_t.searchAc.access
+ + fp_inst_window->local_result.power.writeOp.dynamic * fp_inst_window->stats_t.writeAc.access
+ + fp_inst_window->stats_t.writeAc.access * instruction_selection->power.readOp.dynamic;
- if (XML->sys.core[ithCore].ROB_size > 0) {
- ROB->power_t.reset();
- ROB->power_t.readOp.dynamic +=
- ROB->local_result.power.readOp.dynamic * ROB->stats_t.readAc.access +
- ROB->stats_t.writeAc.access * ROB->local_result.power.writeOp.dynamic;
- }
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+ ROB->power_t.reset();
+ ROB->power_t.readOp.dynamic += ROB->local_result.power.readOp.dynamic*ROB->stats_t.readAc.access +
+ ROB->stats_t.writeAc.access*ROB->local_result.power.writeOp.dynamic;
+ }
- } else if (coredynp.multithreaded) {
- int_inst_window->power_t.reset();
- int_inst_window->power_t.readOp.dynamic +=
- int_inst_window->local_result.power.readOp.dynamic *
- int_inst_window->stats_t.readAc.access +
- int_inst_window->local_result.power.searchOp.dynamic *
- int_inst_window->stats_t.searchAc.access +
- int_inst_window->local_result.power.writeOp.dynamic *
- int_inst_window->stats_t.writeAc.access +
- int_inst_window->stats_t.writeAc.access *
- instruction_selection->power.readOp.dynamic;
- }
- // assign values
- if (is_tdp) {
- if (coredynp.core_ty == OOO) {
- int_inst_window->power =
- int_inst_window->power_t +
- (int_inst_window->local_result.power + instruction_selection->power) *
- pppm_lkg;
- fp_inst_window->power =
- fp_inst_window->power_t +
- (fp_inst_window->local_result.power + instruction_selection->power) *
- pppm_lkg;
- power = power + int_inst_window->power + fp_inst_window->power;
- if (XML->sys.core[ithCore].ROB_size > 0) {
- ROB->power = ROB->power_t + ROB->local_result.power * pppm_lkg;
- power = power + ROB->power;
- }
- } else if (coredynp.multithreaded) {
- // set_pppm(pppm_t,
- //XML->sys.core[ithCore].issue_width,1, 1, 1);
- int_inst_window->power =
- int_inst_window->power_t +
- (int_inst_window->local_result.power + instruction_selection->power) *
- pppm_lkg;
- power = power + int_inst_window->power;
- }
- } else { // rtp
- if (coredynp.core_ty == OOO) {
- int_inst_window->rt_power =
- int_inst_window->power_t +
- (int_inst_window->local_result.power + instruction_selection->power) *
- pppm_lkg;
- fp_inst_window->rt_power =
- fp_inst_window->power_t +
- (fp_inst_window->local_result.power + instruction_selection->power) *
- pppm_lkg;
- rt_power =
- rt_power + int_inst_window->rt_power + fp_inst_window->rt_power;
- if (XML->sys.core[ithCore].ROB_size > 0) {
- ROB->rt_power = ROB->power_t + ROB->local_result.power * pppm_lkg;
- rt_power = rt_power + ROB->rt_power;
- }
+ }
+ else if (coredynp.multithreaded)
+ {
+ int_inst_window->power_t.reset();
+ int_inst_window->power_t.readOp.dynamic += int_inst_window->local_result.power.readOp.dynamic * int_inst_window->stats_t.readAc.access
+ + int_inst_window->local_result.power.searchOp.dynamic * int_inst_window->stats_t.searchAc.access
+ + int_inst_window->local_result.power.writeOp.dynamic * int_inst_window->stats_t.writeAc.access
+ + int_inst_window->stats_t.writeAc.access * instruction_selection->power.readOp.dynamic;
+ }
+
+ //assign values
+ if (is_tdp)
+ {
+ if (coredynp.core_ty==OOO)
+ {
+ int_inst_window->power = int_inst_window->power_t + (int_inst_window->local_result.power +instruction_selection->power) *pppm_lkg;
+ fp_inst_window->power = fp_inst_window->power_t + (fp_inst_window->local_result.power +instruction_selection->power) *pppm_lkg;
+ power = power + int_inst_window->power + fp_inst_window->power;
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+ ROB->power = ROB->power_t + ROB->local_result.power*pppm_lkg;
+ power = power + ROB->power;
+ }
- } else if (coredynp.multithreaded) {
- // set_pppm(pppm_t,
- //XML->sys.core[ithCore].issue_width,1, 1, 1);
- int_inst_window->rt_power =
- int_inst_window->power_t +
- (int_inst_window->local_result.power + instruction_selection->power) *
- pppm_lkg;
- rt_power = rt_power + int_inst_window->rt_power;
+ }
+ else if (coredynp.multithreaded)
+ {
+ // set_pppm(pppm_t, XML->sys.core[ithCore].issue_width,1, 1, 1);
+ int_inst_window->power = int_inst_window->power_t + (int_inst_window->local_result.power +instruction_selection->power) *pppm_lkg;
+ power = power + int_inst_window->power;
+ }
+
+ }
+ else
+ {//rtp
+ if (coredynp.core_ty==OOO)
+ {
+ int_inst_window->rt_power = int_inst_window->power_t + (int_inst_window->local_result.power +instruction_selection->power) *pppm_lkg;
+ fp_inst_window->rt_power = fp_inst_window->power_t + (fp_inst_window->local_result.power +instruction_selection->power) *pppm_lkg;
+ rt_power = rt_power + int_inst_window->rt_power + fp_inst_window->rt_power;
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+ ROB->rt_power = ROB->power_t + ROB->local_result.power*pppm_lkg;
+ rt_power = rt_power + ROB->rt_power;
+ }
+
+ }
+ else if (coredynp.multithreaded)
+ {
+ // set_pppm(pppm_t, XML->sys.core[ithCore].issue_width,1, 1, 1);
+ int_inst_window->rt_power = int_inst_window->power_t + (int_inst_window->local_result.power +instruction_selection->power) *pppm_lkg;
+ rt_power = rt_power + int_inst_window->rt_power;
+ }
}
- }
- // set_pppm(pppm_t, XML->sys.core[ithCore].issue_width,1, 1, 1);
- // cout<<"Scheduler
- //power="<<power.readOp.dynamic<<"leakage="<<power.readOp.leakage<<endl;
- // cout<<"IW="<<int_inst_window->local_result.power.searchOp.dynamic *
- //int_inst_window->stats_t.readAc.access +
- // + int_inst_window->local_result.power.writeOp.dynamic *
- // int_inst_window->stats_t.writeAc.access<<"leakage="<<int_inst_window->local_result.power.readOp.leakage<<endl;
- // cout<<"selection"<<instruction_selection->power.readOp.dynamic<<"leakage"<<instruction_selection->power.readOp.leakage<<endl;
+// set_pppm(pppm_t, XML->sys.core[ithCore].issue_width,1, 1, 1);
+// cout<<"Scheduler power="<<power.readOp.dynamic<<"leakage="<<power.readOp.leakage<<endl;
+// cout<<"IW="<<int_inst_window->local_result.power.searchOp.dynamic * int_inst_window->stats_t.readAc.access +
+// + int_inst_window->local_result.power.writeOp.dynamic * int_inst_window->stats_t.writeAc.access<<"leakage="<<int_inst_window->local_result.power.readOp.leakage<<endl;
+// cout<<"selection"<<instruction_selection->power.readOp.dynamic<<"leakage"<<instruction_selection->power.readOp.leakage<<endl;
}
-void SchedulerU::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
+void SchedulerU::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
+
+
+ if (is_tdp)
+ {
+ if (coredynp.core_ty==OOO)
+ {
+ cout << indent_str << "Instruction Window:" << endl;
+ cout << indent_str_next << "Area = " << int_inst_window->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << int_inst_window->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? int_inst_window->power.readOp.longer_channel_leakage:int_inst_window->power.readOp.leakage) <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << int_inst_window->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << int_inst_window->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str << "FP Instruction Window:" << endl;
+ cout << indent_str_next << "Area = " << fp_inst_window->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << fp_inst_window->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? fp_inst_window->power.readOp.longer_channel_leakage:fp_inst_window->power.readOp.leakage ) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << fp_inst_window->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << fp_inst_window->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+ cout << indent_str<<"ROB:" << endl;
+ cout << indent_str_next << "Area = " << ROB->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << ROB->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? ROB->power.readOp.longer_channel_leakage:ROB->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << ROB->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << ROB->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ }
+ else if (coredynp.multithreaded)
+ {
+ cout << indent_str << "Instruction Window:" << endl;
+ cout << indent_str_next << "Area = " << int_inst_window->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << int_inst_window->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? int_inst_window->power.readOp.longer_channel_leakage:int_inst_window->power.readOp.leakage) <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << int_inst_window->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << int_inst_window->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ }
+ else
+ {
+ if (coredynp.core_ty==OOO)
+ {
+ cout << indent_str_next << "Instruction Window Peak Dynamic = " << int_inst_window->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Instruction Window Subthreshold Leakage = " << int_inst_window->rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Instruction Window Gate Leakage = " << int_inst_window->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "FP Instruction Window Peak Dynamic = " << fp_inst_window->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "FP Instruction Window Subthreshold Leakage = " << fp_inst_window->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "FP Instruction Window Gate Leakage = " << fp_inst_window->rt_power.readOp.gate_leakage << " W" << endl;
+ if (XML->sys.core[ithCore].ROB_size >0)
+ {
+ cout << indent_str_next << "ROB Peak Dynamic = " << ROB->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "ROB Subthreshold Leakage = " << ROB->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "ROB Gate Leakage = " << ROB->rt_power.readOp.gate_leakage << " W" << endl;
+ }
+ }
+ else if (coredynp.multithreaded)
+ {
+ cout << indent_str_next << "Instruction Window Peak Dynamic = " << int_inst_window->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Instruction Window Subthreshold Leakage = " << int_inst_window->rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Instruction Window Gate Leakage = " << int_inst_window->rt_power.readOp.gate_leakage << " W" << endl;
+ }
+ }
- if (is_tdp) {
- if (coredynp.core_ty == OOO) {
- cout << indent_str << "Instruction Window:" << endl;
- cout << indent_str_next
- << "Area = " << int_inst_window->area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str_next << "Peak Dynamic = "
- << int_inst_window->power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel
- ? int_inst_window->power.readOp.longer_channel_leakage
- : int_inst_window->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << int_inst_window->power.readOp.gate_leakage
- << " W" << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << int_inst_window->rt_power.readOp.dynamic / executionTime << " W"
- << endl;
- cout << endl;
- cout << indent_str << "FP Instruction Window:" << endl;
- cout << indent_str_next
- << "Area = " << fp_inst_window->area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str_next << "Peak Dynamic = "
- << fp_inst_window->power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel
- ? fp_inst_window->power.readOp.longer_channel_leakage
- : fp_inst_window->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << fp_inst_window->power.readOp.gate_leakage
- << " W" << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << fp_inst_window->rt_power.readOp.dynamic / executionTime << " W"
- << endl;
- cout << endl;
- if (XML->sys.core[ithCore].ROB_size > 0) {
- cout << indent_str << "ROB:" << endl;
- cout << indent_str_next << "Area = " << ROB->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << ROB->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? ROB->power.readOp.longer_channel_leakage
- : ROB->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << ROB->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << ROB->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- }
- } else if (coredynp.multithreaded) {
- cout << indent_str << "Instruction Window:" << endl;
- cout << indent_str_next
- << "Area = " << int_inst_window->area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str_next << "Peak Dynamic = "
- << int_inst_window->power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel
- ? int_inst_window->power.readOp.longer_channel_leakage
- : int_inst_window->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << int_inst_window->power.readOp.gate_leakage
- << " W" << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << int_inst_window->rt_power.readOp.dynamic / executionTime << " W"
- << endl;
- cout << endl;
- }
- } else {
- if (coredynp.core_ty == OOO) {
- cout << indent_str_next << "Instruction Window Peak Dynamic = "
- << int_inst_window->rt_power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Instruction Window Subthreshold Leakage = "
- << int_inst_window->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Instruction Window Gate Leakage = "
- << int_inst_window->rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "FP Instruction Window Peak Dynamic = "
- << fp_inst_window->rt_power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next
- << "FP Instruction Window Subthreshold Leakage = "
- << fp_inst_window->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "FP Instruction Window Gate Leakage = "
- << fp_inst_window->rt_power.readOp.gate_leakage << " W" << endl;
- if (XML->sys.core[ithCore].ROB_size > 0) {
- cout << indent_str_next << "ROB Peak Dynamic = "
- << ROB->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next
- << "ROB Subthreshold Leakage = " << ROB->rt_power.readOp.leakage
- << " W" << endl;
- cout << indent_str_next
- << "ROB Gate Leakage = " << ROB->rt_power.readOp.gate_leakage
- << " W" << endl;
- }
- } else if (coredynp.multithreaded) {
- cout << indent_str_next << "Instruction Window Peak Dynamic = "
- << int_inst_window->rt_power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Instruction Window Subthreshold Leakage = "
- << int_inst_window->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Instruction Window Gate Leakage = "
- << int_inst_window->rt_power.readOp.gate_leakage << " W" << endl;
- }
- }
}
-void LoadStoreU::computeEnergy(bool is_tdp) {
- if (!exist) return;
+void LoadStoreU::computeEnergy(bool is_tdp)
+{
+ if (!exist) return;
- executionTime =
- XML->sys.total_cycles / (XML->sys.target_core_clockrate * 1e6); // Syed
+ executionTime=XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6);//Syed
- // RF crossbar power (Syed)
- xbar_shared->compute_power();
+ //RF crossbar power (Syed)
+ xbar_shared->compute_power();
+
+ if (is_tdp)
+ {
- if (is_tdp) {
- // init stats for Peak
- // added by Jingwen
- sharedmemory.caches->stats_t.readAc.access =
- 0.67 * sharedmemory.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- sharedmemory.caches->stats_t.readAc.miss = 0;
- sharedmemory.caches->stats_t.readAc.hit =
- sharedmemory.caches->stats_t.readAc.access -
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.caches->stats_t.writeAc.access =
- 0.33 * sharedmemory.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- sharedmemory.caches->stats_t.writeAc.miss = 0;
- sharedmemory.caches->stats_t.writeAc.hit =
- sharedmemory.caches->stats_t.writeAc.access -
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.caches->tdp_stats = sharedmemory.caches->stats_t;
+ //init stats for Peak
+ // added by Jingwen
+ sharedmemory.caches->stats_t.readAc.access = 0.67*sharedmemory.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ sharedmemory.caches->stats_t.readAc.miss = 0;
+ sharedmemory.caches->stats_t.readAc.hit = sharedmemory.caches->stats_t.readAc.access - sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.caches->stats_t.writeAc.access = 0.33*sharedmemory.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ sharedmemory.caches->stats_t.writeAc.miss = 0;
+ sharedmemory.caches->stats_t.writeAc.hit = sharedmemory.caches->stats_t.writeAc.access - sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.caches->tdp_stats = sharedmemory.caches->stats_t;
- sharedmemory.missb->stats_t.readAc.access =
- sharedmemory.missb->l_ip.num_search_ports;
- sharedmemory.missb->stats_t.writeAc.access =
- sharedmemory.missb->l_ip.num_search_ports;
- sharedmemory.missb->tdp_stats = sharedmemory.missb->stats_t;
+ sharedmemory.missb->stats_t.readAc.access = sharedmemory.missb->l_ip.num_search_ports;
+ sharedmemory.missb->stats_t.writeAc.access = sharedmemory.missb->l_ip.num_search_ports;
+ sharedmemory.missb->tdp_stats = sharedmemory.missb->stats_t;
- sharedmemory.ifb->stats_t.readAc.access =
- sharedmemory.ifb->l_ip.num_search_ports;
- sharedmemory.ifb->stats_t.writeAc.access =
- sharedmemory.ifb->l_ip.num_search_ports;
- sharedmemory.ifb->tdp_stats = sharedmemory.ifb->stats_t;
+ sharedmemory.ifb->stats_t.readAc.access = sharedmemory.ifb->l_ip.num_search_ports;
+ sharedmemory.ifb->stats_t.writeAc.access = sharedmemory.ifb->l_ip.num_search_ports;
+ sharedmemory.ifb->tdp_stats = sharedmemory.ifb->stats_t;
- sharedmemory.prefetchb->stats_t.readAc.access =
- sharedmemory.prefetchb->l_ip.num_search_ports;
- sharedmemory.prefetchb->stats_t.writeAc.access =
- sharedmemory.ifb->l_ip.num_search_ports;
- sharedmemory.prefetchb->tdp_stats = sharedmemory.prefetchb->stats_t;
- if (cache_p == Write_back) {
- sharedmemory.wbb->stats_t.readAc.access =
- sharedmemory.wbb->l_ip.num_search_ports;
- sharedmemory.wbb->stats_t.writeAc.access =
- sharedmemory.wbb->l_ip.num_search_ports;
- sharedmemory.wbb->tdp_stats = sharedmemory.wbb->stats_t;
- }
+ sharedmemory.prefetchb->stats_t.readAc.access = sharedmemory.prefetchb->l_ip.num_search_ports;
+ sharedmemory.prefetchb->stats_t.writeAc.access = sharedmemory.ifb->l_ip.num_search_ports;
+ sharedmemory.prefetchb->tdp_stats = sharedmemory.prefetchb->stats_t;
+ if (cache_p==Write_back)
+ {
+ sharedmemory.wbb->stats_t.readAc.access = sharedmemory.wbb->l_ip.num_search_ports;
+ sharedmemory.wbb->stats_t.writeAc.access = sharedmemory.wbb->l_ip.num_search_ports;
+ sharedmemory.wbb->tdp_stats = sharedmemory.wbb->stats_t;
+ }
- // init stats for Peak
- dcache.caches->stats_t.readAc.access =
- 0.67 * dcache.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- dcache.caches->stats_t.readAc.miss = 0;
- dcache.caches->stats_t.readAc.hit = dcache.caches->stats_t.readAc.access -
- dcache.caches->stats_t.readAc.miss;
- dcache.caches->stats_t.writeAc.access =
- 0.33 * dcache.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- dcache.caches->stats_t.writeAc.miss = 0;
- dcache.caches->stats_t.writeAc.hit = dcache.caches->stats_t.writeAc.access -
- dcache.caches->stats_t.writeAc.miss;
- dcache.caches->tdp_stats = dcache.caches->stats_t;
- dcache.missb->stats_t.readAc.access = dcache.missb->l_ip.num_search_ports;
- dcache.missb->stats_t.writeAc.access = dcache.missb->l_ip.num_search_ports;
- dcache.missb->tdp_stats = dcache.missb->stats_t;
- dcache.ifb->stats_t.readAc.access = dcache.ifb->l_ip.num_search_ports;
- dcache.ifb->stats_t.writeAc.access = dcache.ifb->l_ip.num_search_ports;
- dcache.ifb->tdp_stats = dcache.ifb->stats_t;
+ //init stats for Peak
+ dcache.caches->stats_t.readAc.access = 0.67*dcache.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ dcache.caches->stats_t.readAc.miss = 0;
+ dcache.caches->stats_t.readAc.hit = dcache.caches->stats_t.readAc.access - dcache.caches->stats_t.readAc.miss;
+ dcache.caches->stats_t.writeAc.access = 0.33*dcache.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ dcache.caches->stats_t.writeAc.miss = 0;
+ dcache.caches->stats_t.writeAc.hit = dcache.caches->stats_t.writeAc.access - dcache.caches->stats_t.writeAc.miss;
+ dcache.caches->tdp_stats = dcache.caches->stats_t;
- dcache.prefetchb->stats_t.readAc.access =
- dcache.prefetchb->l_ip.num_search_ports;
- dcache.prefetchb->stats_t.writeAc.access =
- dcache.ifb->l_ip.num_search_ports;
- dcache.prefetchb->tdp_stats = dcache.prefetchb->stats_t;
- if (cache_p == Write_back) {
- dcache.wbb->stats_t.readAc.access = dcache.wbb->l_ip.num_search_ports;
- dcache.wbb->stats_t.writeAc.access = dcache.wbb->l_ip.num_search_ports;
- dcache.wbb->tdp_stats = dcache.wbb->stats_t;
- }
+ dcache.missb->stats_t.readAc.access = dcache.missb->l_ip.num_search_ports;
+ dcache.missb->stats_t.writeAc.access = dcache.missb->l_ip.num_search_ports;
+ dcache.missb->tdp_stats = dcache.missb->stats_t;
- // init stats for Peak - ccache
- ccache.caches->stats_t.readAc.access =
- 0.67 * ccache.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- ccache.caches->stats_t.readAc.miss = 0;
- ccache.caches->stats_t.readAc.hit = ccache.caches->stats_t.readAc.access -
- ccache.caches->stats_t.readAc.miss;
- ccache.caches->stats_t.writeAc.access =
- 0.33 * ccache.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- ccache.caches->stats_t.writeAc.miss = 0;
- ccache.caches->stats_t.writeAc.hit = ccache.caches->stats_t.writeAc.access -
- ccache.caches->stats_t.writeAc.miss;
- ccache.caches->tdp_stats = ccache.caches->stats_t;
+ dcache.ifb->stats_t.readAc.access = dcache.ifb->l_ip.num_search_ports;
+ dcache.ifb->stats_t.writeAc.access = dcache.ifb->l_ip.num_search_ports;
+ dcache.ifb->tdp_stats = dcache.ifb->stats_t;
- ccache.missb->stats_t.readAc.access = ccache.missb->l_ip.num_search_ports;
- ccache.missb->stats_t.writeAc.access = ccache.missb->l_ip.num_search_ports;
- ccache.missb->tdp_stats = ccache.missb->stats_t;
+ dcache.prefetchb->stats_t.readAc.access = dcache.prefetchb->l_ip.num_search_ports;
+ dcache.prefetchb->stats_t.writeAc.access = dcache.ifb->l_ip.num_search_ports;
+ dcache.prefetchb->tdp_stats = dcache.prefetchb->stats_t;
+ if (cache_p==Write_back)
+ {
+ dcache.wbb->stats_t.readAc.access = dcache.wbb->l_ip.num_search_ports;
+ dcache.wbb->stats_t.writeAc.access = dcache.wbb->l_ip.num_search_ports;
+ dcache.wbb->tdp_stats = dcache.wbb->stats_t;
+ }
- ccache.ifb->stats_t.readAc.access = ccache.ifb->l_ip.num_search_ports;
- ccache.ifb->stats_t.writeAc.access = ccache.ifb->l_ip.num_search_ports;
- ccache.ifb->tdp_stats = ccache.ifb->stats_t;
- ccache.prefetchb->stats_t.readAc.access =
- ccache.prefetchb->l_ip.num_search_ports;
- ccache.prefetchb->stats_t.writeAc.access =
- ccache.ifb->l_ip.num_search_ports;
- ccache.prefetchb->tdp_stats = ccache.prefetchb->stats_t;
- if (cache_p == Write_back) {
- ccache.wbb->stats_t.readAc.access = ccache.wbb->l_ip.num_search_ports;
- ccache.wbb->stats_t.writeAc.access = ccache.wbb->l_ip.num_search_ports;
- ccache.wbb->tdp_stats = ccache.wbb->stats_t;
- }
+ //init stats for Peak - ccache
+ ccache.caches->stats_t.readAc.access = 0.67*ccache.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ ccache.caches->stats_t.readAc.miss = 0;
+ ccache.caches->stats_t.readAc.hit = ccache.caches->stats_t.readAc.access - ccache.caches->stats_t.readAc.miss;
+ ccache.caches->stats_t.writeAc.access = 0.33*ccache.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ ccache.caches->stats_t.writeAc.miss = 0;
+ ccache.caches->stats_t.writeAc.hit = ccache.caches->stats_t.writeAc.access - ccache.caches->stats_t.writeAc.miss;
+ ccache.caches->tdp_stats = ccache.caches->stats_t;
- // init stats for Peak - tcache
- tcache.caches->stats_t.readAc.access =
- 0.67 * tcache.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- tcache.caches->stats_t.readAc.miss = 0;
- tcache.caches->stats_t.readAc.hit = tcache.caches->stats_t.readAc.access -
- tcache.caches->stats_t.readAc.miss;
- tcache.caches->stats_t.writeAc.access =
- 0.33 * tcache.caches->l_ip.num_rw_ports * coredynp.LSU_duty_cycle;
- tcache.caches->stats_t.writeAc.miss = 0;
- tcache.caches->stats_t.writeAc.hit = tcache.caches->stats_t.writeAc.access -
- tcache.caches->stats_t.writeAc.miss;
- tcache.caches->tdp_stats = tcache.caches->stats_t;
+ ccache.missb->stats_t.readAc.access = ccache.missb->l_ip.num_search_ports;
+ ccache.missb->stats_t.writeAc.access = ccache.missb->l_ip.num_search_ports;
+ ccache.missb->tdp_stats = ccache.missb->stats_t;
- tcache.missb->stats_t.readAc.access = tcache.missb->l_ip.num_search_ports;
- tcache.missb->stats_t.writeAc.access = tcache.missb->l_ip.num_search_ports;
- tcache.missb->tdp_stats = tcache.missb->stats_t;
+ ccache.ifb->stats_t.readAc.access = ccache.ifb->l_ip.num_search_ports;
+ ccache.ifb->stats_t.writeAc.access = ccache.ifb->l_ip.num_search_ports;
+ ccache.ifb->tdp_stats = ccache.ifb->stats_t;
- tcache.ifb->stats_t.readAc.access = tcache.ifb->l_ip.num_search_ports;
- tcache.ifb->stats_t.writeAc.access = tcache.ifb->l_ip.num_search_ports;
- tcache.ifb->tdp_stats = tcache.ifb->stats_t;
+ ccache.prefetchb->stats_t.readAc.access = ccache.prefetchb->l_ip.num_search_ports;
+ ccache.prefetchb->stats_t.writeAc.access = ccache.ifb->l_ip.num_search_ports;
+ ccache.prefetchb->tdp_stats = ccache.prefetchb->stats_t;
+ if (cache_p==Write_back)
+ {
+ ccache.wbb->stats_t.readAc.access = ccache.wbb->l_ip.num_search_ports;
+ ccache.wbb->stats_t.writeAc.access = ccache.wbb->l_ip.num_search_ports;
+ ccache.wbb->tdp_stats = ccache.wbb->stats_t;
+ }
- tcache.prefetchb->stats_t.readAc.access =
- tcache.prefetchb->l_ip.num_search_ports;
- tcache.prefetchb->stats_t.writeAc.access =
- tcache.ifb->l_ip.num_search_ports;
- tcache.prefetchb->tdp_stats = tcache.prefetchb->stats_t;
- if (cache_p == Write_back) {
- tcache.wbb->stats_t.readAc.access = tcache.wbb->l_ip.num_search_ports;
- tcache.wbb->stats_t.writeAc.access = tcache.wbb->l_ip.num_search_ports;
- tcache.wbb->tdp_stats = tcache.wbb->stats_t;
- }
- LSQ->stats_t.readAc.access = LSQ->stats_t.writeAc.access =
- LSQ->l_ip.num_search_ports * coredynp.LSU_duty_cycle;
- LSQ->tdp_stats = LSQ->stats_t;
- if ((coredynp.core_ty == OOO) &&
- (XML->sys.core[ithCore].load_buffer_size > 0)) {
- LoadQ->stats_t.readAc.access = LoadQ->stats_t.writeAc.access =
- LoadQ->l_ip.num_search_ports * coredynp.LSU_duty_cycle;
- LoadQ->tdp_stats = LoadQ->stats_t;
- }
- } else {
- // init stats for Runtime Dynamic (RTP)
+ //init stats for Peak - tcache
+ tcache.caches->stats_t.readAc.access = 0.67*tcache.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ tcache.caches->stats_t.readAc.miss = 0;
+ tcache.caches->stats_t.readAc.hit = tcache.caches->stats_t.readAc.access - tcache.caches->stats_t.readAc.miss;
+ tcache.caches->stats_t.writeAc.access = 0.33*tcache.caches->l_ip.num_rw_ports*coredynp.LSU_duty_cycle;
+ tcache.caches->stats_t.writeAc.miss = 0;
+ tcache.caches->stats_t.writeAc.hit = tcache.caches->stats_t.writeAc.access - tcache.caches->stats_t.writeAc.miss;
+ tcache.caches->tdp_stats = tcache.caches->stats_t;
- sharedmemory.caches->stats_t.readAc.access =
- XML->sys.core[ithCore].sharedmemory.read_accesses;
- sharedmemory.caches->stats_t.readAc.miss =
- XML->sys.core[ithCore].sharedmemory.read_misses;
- sharedmemory.caches->stats_t.readAc.hit =
- sharedmemory.caches->stats_t.readAc.access -
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.caches->stats_t.writeAc.access =
- XML->sys.core[ithCore].sharedmemory.write_accesses;
- sharedmemory.caches->stats_t.writeAc.miss =
- XML->sys.core[ithCore].sharedmemory.write_misses;
- sharedmemory.caches->stats_t.writeAc.hit =
- sharedmemory.caches->stats_t.writeAc.access -
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.caches->rtp_stats = sharedmemory.caches->stats_t;
+ tcache.missb->stats_t.readAc.access = tcache.missb->l_ip.num_search_ports;
+ tcache.missb->stats_t.writeAc.access = tcache.missb->l_ip.num_search_ports;
+ tcache.missb->tdp_stats = tcache.missb->stats_t;
- dcache.caches->stats_t.readAc.access =
- XML->sys.core[ithCore].dcache.read_accesses;
- dcache.caches->stats_t.readAc.miss =
- XML->sys.core[ithCore].dcache.read_misses;
- dcache.caches->stats_t.readAc.hit = dcache.caches->stats_t.readAc.access -
- dcache.caches->stats_t.readAc.miss;
- dcache.caches->stats_t.writeAc.access =
- XML->sys.core[ithCore].dcache.write_accesses;
- dcache.caches->stats_t.writeAc.miss =
- XML->sys.core[ithCore].dcache.write_misses;
- dcache.caches->stats_t.writeAc.hit = dcache.caches->stats_t.writeAc.access -
- dcache.caches->stats_t.writeAc.miss;
- dcache.caches->rtp_stats = dcache.caches->stats_t;
+ tcache.ifb->stats_t.readAc.access = tcache.ifb->l_ip.num_search_ports;
+ tcache.ifb->stats_t.writeAc.access = tcache.ifb->l_ip.num_search_ports;
+ tcache.ifb->tdp_stats = tcache.ifb->stats_t;
- ccache.caches->stats_t.readAc.access =
- XML->sys.core[ithCore].ccache.read_accesses;
- ccache.caches->stats_t.readAc.miss =
- XML->sys.core[ithCore].ccache.read_misses;
- ccache.caches->stats_t.readAc.hit = ccache.caches->stats_t.readAc.access -
- ccache.caches->stats_t.readAc.miss;
- ccache.caches->stats_t.writeAc.access =
- XML->sys.core[ithCore].ccache.write_accesses;
- ccache.caches->stats_t.writeAc.miss =
- XML->sys.core[ithCore].ccache.write_misses;
- ccache.caches->stats_t.writeAc.hit = ccache.caches->stats_t.writeAc.access -
- ccache.caches->stats_t.writeAc.miss;
- ccache.caches->rtp_stats = ccache.caches->stats_t;
+ tcache.prefetchb->stats_t.readAc.access = tcache.prefetchb->l_ip.num_search_ports;
+ tcache.prefetchb->stats_t.writeAc.access = tcache.ifb->l_ip.num_search_ports;
+ tcache.prefetchb->tdp_stats = tcache.prefetchb->stats_t;
+ if (cache_p==Write_back)
+ {
+ tcache.wbb->stats_t.readAc.access = tcache.wbb->l_ip.num_search_ports;
+ tcache.wbb->stats_t.writeAc.access = tcache.wbb->l_ip.num_search_ports;
+ tcache.wbb->tdp_stats = tcache.wbb->stats_t;
+ }
- tcache.caches->stats_t.readAc.access =
- XML->sys.core[ithCore].tcache.read_accesses;
- tcache.caches->stats_t.readAc.miss =
- XML->sys.core[ithCore].tcache.read_misses;
- tcache.caches->stats_t.readAc.hit = tcache.caches->stats_t.readAc.access -
- tcache.caches->stats_t.readAc.miss;
- tcache.caches->stats_t.writeAc.access =
- XML->sys.core[ithCore].tcache.write_accesses;
- tcache.caches->stats_t.writeAc.miss =
- XML->sys.core[ithCore].tcache.write_misses;
- tcache.caches->stats_t.writeAc.hit = tcache.caches->stats_t.writeAc.access -
- tcache.caches->stats_t.writeAc.miss;
- tcache.caches->rtp_stats = tcache.caches->stats_t;
- if (cache_p == Write_back) {
- sharedmemory.missb->stats_t.readAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.missb->stats_t.writeAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.missb->rtp_stats = sharedmemory.missb->stats_t;
- sharedmemory.ifb->stats_t.readAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.ifb->stats_t.writeAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.ifb->rtp_stats = sharedmemory.ifb->stats_t;
- sharedmemory.prefetchb->stats_t.readAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.prefetchb->stats_t.writeAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.prefetchb->rtp_stats = sharedmemory.prefetchb->stats_t;
- sharedmemory.wbb->stats_t.readAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.wbb->stats_t.writeAc.access =
- sharedmemory.caches->stats_t.writeAc.miss;
- sharedmemory.wbb->rtp_stats = sharedmemory.wbb->stats_t;
- dcache.missb->stats_t.readAc.access = dcache.caches->stats_t.writeAc.miss;
- dcache.missb->stats_t.writeAc.access =
- dcache.caches->stats_t.writeAc.miss;
- dcache.missb->rtp_stats = dcache.missb->stats_t;
- dcache.ifb->stats_t.readAc.access = dcache.caches->stats_t.writeAc.miss;
- dcache.ifb->stats_t.writeAc.access = dcache.caches->stats_t.writeAc.miss;
- dcache.ifb->rtp_stats = dcache.ifb->stats_t;
- dcache.prefetchb->stats_t.readAc.access =
- dcache.caches->stats_t.writeAc.miss;
- dcache.prefetchb->stats_t.writeAc.access =
- dcache.caches->stats_t.writeAc.miss;
- dcache.prefetchb->rtp_stats = dcache.prefetchb->stats_t;
- dcache.wbb->stats_t.readAc.access = dcache.caches->stats_t.writeAc.miss;
- dcache.wbb->stats_t.writeAc.access = dcache.caches->stats_t.writeAc.miss;
- dcache.wbb->rtp_stats = dcache.wbb->stats_t;
+ LSQ->stats_t.readAc.access = LSQ->stats_t.writeAc.access = LSQ->l_ip.num_search_ports*coredynp.LSU_duty_cycle;
+ LSQ->tdp_stats = LSQ->stats_t;
+ if ((coredynp.core_ty==OOO) && (XML->sys.core[ithCore].load_buffer_size >0))
+ {
+ LoadQ->stats_t.readAc.access = LoadQ->stats_t.writeAc.access = LoadQ->l_ip.num_search_ports*coredynp.LSU_duty_cycle;
+ LoadQ->tdp_stats = LoadQ->stats_t;
+ }
+ }
+ else
+ {
+ //init stats for Runtime Dynamic (RTP)
- ccache.missb->stats_t.readAc.access = ccache.caches->stats_t.writeAc.miss;
- ccache.missb->stats_t.writeAc.access =
- ccache.caches->stats_t.writeAc.miss;
- ccache.missb->rtp_stats = ccache.missb->stats_t;
- ccache.ifb->stats_t.readAc.access = ccache.caches->stats_t.writeAc.miss;
- ccache.ifb->stats_t.writeAc.access = ccache.caches->stats_t.writeAc.miss;
- ccache.ifb->rtp_stats = ccache.ifb->stats_t;
- ccache.prefetchb->stats_t.readAc.access =
- ccache.caches->stats_t.writeAc.miss;
- ccache.prefetchb->stats_t.writeAc.access =
- ccache.caches->stats_t.writeAc.miss;
- ccache.prefetchb->rtp_stats = ccache.prefetchb->stats_t;
- ccache.wbb->stats_t.readAc.access = ccache.caches->stats_t.writeAc.miss;
- ccache.wbb->stats_t.writeAc.access = ccache.caches->stats_t.writeAc.miss;
- ccache.wbb->rtp_stats = ccache.wbb->stats_t;
+ sharedmemory.caches->stats_t.readAc.access = XML->sys.core[ithCore].sharedmemory.read_accesses;
+ sharedmemory.caches->stats_t.readAc.miss = XML->sys.core[ithCore].sharedmemory.read_misses;
+ sharedmemory.caches->stats_t.readAc.hit = sharedmemory.caches->stats_t.readAc.access - sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.caches->stats_t.writeAc.access = XML->sys.core[ithCore].sharedmemory.write_accesses;
+ sharedmemory.caches->stats_t.writeAc.miss = XML->sys.core[ithCore].sharedmemory.write_misses;
+ sharedmemory.caches->stats_t.writeAc.hit = sharedmemory.caches->stats_t.writeAc.access - sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.caches->rtp_stats = sharedmemory.caches->stats_t;
- tcache.missb->stats_t.readAc.access = tcache.caches->stats_t.writeAc.miss;
- tcache.missb->stats_t.writeAc.access =
- tcache.caches->stats_t.writeAc.miss;
- tcache.missb->rtp_stats = tcache.missb->stats_t;
- tcache.ifb->stats_t.readAc.access = tcache.caches->stats_t.writeAc.miss;
- tcache.ifb->stats_t.writeAc.access = tcache.caches->stats_t.writeAc.miss;
- tcache.ifb->rtp_stats = tcache.ifb->stats_t;
- tcache.prefetchb->stats_t.readAc.access =
- tcache.caches->stats_t.writeAc.miss;
- tcache.prefetchb->stats_t.writeAc.access =
- tcache.caches->stats_t.writeAc.miss;
- tcache.prefetchb->rtp_stats = tcache.prefetchb->stats_t;
- tcache.wbb->stats_t.readAc.access = tcache.caches->stats_t.writeAc.miss;
- tcache.wbb->stats_t.writeAc.access = tcache.caches->stats_t.writeAc.miss;
- tcache.wbb->rtp_stats = tcache.wbb->stats_t;
- } else {
- sharedmemory.missb->stats_t.readAc.access =
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.missb->stats_t.writeAc.access =
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.missb->rtp_stats = sharedmemory.missb->stats_t;
- sharedmemory.ifb->stats_t.readAc.access =
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.ifb->stats_t.writeAc.access =
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.ifb->rtp_stats = sharedmemory.ifb->stats_t;
- sharedmemory.prefetchb->stats_t.readAc.access =
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.prefetchb->stats_t.writeAc.access =
- sharedmemory.caches->stats_t.readAc.miss;
- sharedmemory.prefetchb->rtp_stats = sharedmemory.prefetchb->stats_t;
- dcache.missb->stats_t.readAc.access = dcache.caches->stats_t.readAc.miss;
- dcache.missb->stats_t.writeAc.access = dcache.caches->stats_t.readAc.miss;
- dcache.missb->rtp_stats = dcache.missb->stats_t;
- dcache.ifb->stats_t.readAc.access = dcache.caches->stats_t.readAc.miss;
- dcache.ifb->stats_t.writeAc.access = dcache.caches->stats_t.readAc.miss;
- dcache.ifb->rtp_stats = dcache.ifb->stats_t;
- dcache.prefetchb->stats_t.readAc.access =
- dcache.caches->stats_t.readAc.miss;
- dcache.prefetchb->stats_t.writeAc.access =
- dcache.caches->stats_t.readAc.miss;
- dcache.prefetchb->rtp_stats = dcache.prefetchb->stats_t;
- ccache.missb->stats_t.readAc.access = ccache.caches->stats_t.readAc.miss;
- ccache.missb->stats_t.writeAc.access = ccache.caches->stats_t.readAc.miss;
- ccache.missb->rtp_stats = ccache.missb->stats_t;
- ccache.ifb->stats_t.readAc.access = ccache.caches->stats_t.readAc.miss;
- ccache.ifb->stats_t.writeAc.access = ccache.caches->stats_t.readAc.miss;
- ccache.ifb->rtp_stats = ccache.ifb->stats_t;
- ccache.prefetchb->stats_t.readAc.access =
- ccache.caches->stats_t.readAc.miss;
- ccache.prefetchb->stats_t.writeAc.access =
- ccache.caches->stats_t.readAc.miss;
- ccache.prefetchb->rtp_stats = ccache.prefetchb->stats_t;
+ dcache.caches->stats_t.readAc.access = XML->sys.core[ithCore].dcache.read_accesses;
+ dcache.caches->stats_t.readAc.miss = XML->sys.core[ithCore].dcache.read_misses;
+ dcache.caches->stats_t.readAc.hit = dcache.caches->stats_t.readAc.access - dcache.caches->stats_t.readAc.miss;
+ dcache.caches->stats_t.writeAc.access = XML->sys.core[ithCore].dcache.write_accesses;
+ dcache.caches->stats_t.writeAc.miss = XML->sys.core[ithCore].dcache.write_misses;
+ dcache.caches->stats_t.writeAc.hit = dcache.caches->stats_t.writeAc.access - dcache.caches->stats_t.writeAc.miss;
+ dcache.caches->rtp_stats = dcache.caches->stats_t;
- tcache.missb->stats_t.readAc.access = tcache.caches->stats_t.readAc.miss;
- tcache.missb->stats_t.writeAc.access = tcache.caches->stats_t.readAc.miss;
- tcache.missb->rtp_stats = tcache.missb->stats_t;
- tcache.ifb->stats_t.readAc.access = tcache.caches->stats_t.readAc.miss;
- tcache.ifb->stats_t.writeAc.access = tcache.caches->stats_t.readAc.miss;
- tcache.ifb->rtp_stats = tcache.ifb->stats_t;
- tcache.prefetchb->stats_t.readAc.access =
- tcache.caches->stats_t.readAc.miss;
- tcache.prefetchb->stats_t.writeAc.access =
- tcache.caches->stats_t.readAc.miss;
- tcache.prefetchb->rtp_stats = tcache.prefetchb->stats_t;
- }
+ ccache.caches->stats_t.readAc.access = XML->sys.core[ithCore].ccache.read_accesses;
+ ccache.caches->stats_t.readAc.miss = XML->sys.core[ithCore].ccache.read_misses;
+ ccache.caches->stats_t.readAc.hit = ccache.caches->stats_t.readAc.access - ccache.caches->stats_t.readAc.miss;
+ ccache.caches->stats_t.writeAc.access = XML->sys.core[ithCore].ccache.write_accesses;
+ ccache.caches->stats_t.writeAc.miss = XML->sys.core[ithCore].ccache.write_misses;
+ ccache.caches->stats_t.writeAc.hit = ccache.caches->stats_t.writeAc.access - ccache.caches->stats_t.writeAc.miss;
+ ccache.caches->rtp_stats = ccache.caches->stats_t;
- LSQ->stats_t.readAc.access = (XML->sys.core[ithCore].load_instructions +
- XML->sys.core[ithCore].store_instructions) *
- 2; // flush overhead considered
- LSQ->stats_t.writeAc.access = (XML->sys.core[ithCore].load_instructions +
- XML->sys.core[ithCore].store_instructions) *
- 2;
- LSQ->rtp_stats = LSQ->stats_t;
+ tcache.caches->stats_t.readAc.access = XML->sys.core[ithCore].tcache.read_accesses;
+ tcache.caches->stats_t.readAc.miss = XML->sys.core[ithCore].tcache.read_misses;
+ tcache.caches->stats_t.readAc.hit = tcache.caches->stats_t.readAc.access - tcache.caches->stats_t.readAc.miss;
+ tcache.caches->stats_t.writeAc.access = XML->sys.core[ithCore].tcache.write_accesses;
+ tcache.caches->stats_t.writeAc.miss = XML->sys.core[ithCore].tcache.write_misses;
+ tcache.caches->stats_t.writeAc.hit = tcache.caches->stats_t.writeAc.access - tcache.caches->stats_t.writeAc.miss;
+ tcache.caches->rtp_stats = tcache.caches->stats_t;
- if ((coredynp.core_ty == OOO) &&
- (XML->sys.core[ithCore].load_buffer_size > 0)) {
- LoadQ->stats_t.readAc.access = XML->sys.core[ithCore].load_instructions +
- XML->sys.core[ithCore].store_instructions;
- LoadQ->stats_t.writeAc.access = XML->sys.core[ithCore].load_instructions +
- XML->sys.core[ithCore].store_instructions;
- LoadQ->rtp_stats = LoadQ->stats_t;
- }
- }
+ if (cache_p==Write_back)
+ {
- sharedmemory.power_t.reset();
- dcache.power_t.reset();
- ccache.power_t.reset();
- tcache.power_t.reset();
- LSQ->power_t.reset();
+ sharedmemory.missb->stats_t.readAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.missb->stats_t.writeAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.missb->rtp_stats = sharedmemory.missb->stats_t;
+ sharedmemory.ifb->stats_t.readAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.ifb->stats_t.writeAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.ifb->rtp_stats = sharedmemory.ifb->stats_t;
+ sharedmemory.prefetchb->stats_t.readAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.prefetchb->stats_t.writeAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.prefetchb->rtp_stats = sharedmemory.prefetchb->stats_t;
+ sharedmemory.wbb->stats_t.readAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.wbb->stats_t.writeAc.access = sharedmemory.caches->stats_t.writeAc.miss;
+ sharedmemory.wbb->rtp_stats = sharedmemory.wbb->stats_t;
- sharedmemory.power_t.readOp.dynamic +=
- (sharedmemory.caches->stats_t.readAc.hit *
- sharedmemory.caches->local_result.power.readOp.dynamic +
- sharedmemory.caches->stats_t.readAc.miss *
- sharedmemory.caches->local_result.power.readOp.dynamic +
- sharedmemory.caches->stats_t.writeAc.miss *
- sharedmemory.caches->local_result.tag_array2->power.readOp.dynamic +
- sharedmemory.caches->stats_t.writeAc.access *
- sharedmemory.caches->local_result.power.writeOp.dynamic +
- xbar_shared->power.readOp.dynamic *
- (sharedmemory.caches->stats_t.readAc.hit +
- sharedmemory.caches->stats_t.writeAc.hit));
- dcache.power_t.readOp.dynamic +=
- (dcache.caches->stats_t.readAc.hit *
- dcache.caches->local_result.power.readOp.dynamic +
- dcache.caches->stats_t.readAc.miss *
- dcache.caches->local_result.power.readOp.dynamic +
- dcache.caches->stats_t.writeAc.miss *
- dcache.caches->local_result.tag_array2->power.readOp.dynamic +
- dcache.caches->stats_t.writeAc.access *
- dcache.caches->local_result.power.writeOp.dynamic +
- xbar_shared->power.readOp.dynamic *
- (dcache.caches->stats_t.readAc.hit +
- dcache.caches->stats_t.writeAc.hit));
- ccache.power_t.readOp.dynamic +=
- (ccache.caches->stats_t.readAc.hit *
- ccache.caches->local_result.power.readOp.dynamic +
- ccache.caches->stats_t.readAc.miss *
- ccache.caches->local_result.power.readOp.dynamic +
- ccache.caches->stats_t.writeAc.miss *
- ccache.caches->local_result.tag_array2->power.readOp.dynamic +
- ccache.caches->stats_t.writeAc.access *
- ccache.caches->local_result.power.writeOp.dynamic +
- xbar_shared->power.readOp.dynamic * (ccache.caches->stats_t.readAc.hit));
+ dcache.missb->stats_t.readAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.missb->stats_t.writeAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.missb->rtp_stats = dcache.missb->stats_t;
+ dcache.ifb->stats_t.readAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.ifb->stats_t.writeAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.ifb->rtp_stats = dcache.ifb->stats_t;
+ dcache.prefetchb->stats_t.readAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.prefetchb->stats_t.writeAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.prefetchb->rtp_stats = dcache.prefetchb->stats_t;
+ dcache.wbb->stats_t.readAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.wbb->stats_t.writeAc.access = dcache.caches->stats_t.writeAc.miss;
+ dcache.wbb->rtp_stats = dcache.wbb->stats_t;
- tcache.power_t.readOp.dynamic +=
- (tcache.caches->stats_t.readAc.hit *
- tcache.caches->local_result.power.readOp.dynamic +
- tcache.caches->stats_t.readAc.miss *
- tcache.caches->local_result.power.readOp.dynamic +
- tcache.caches->stats_t.writeAc.miss *
- tcache.caches->local_result.tag_array2->power.readOp.dynamic +
- tcache.caches->stats_t.writeAc.access *
- tcache.caches->local_result.power.writeOp.dynamic +
- xbar_shared->power.readOp.dynamic *
- (tcache.caches->stats_t.readAc.hit +
- tcache.caches->stats_t.writeAc.hit));
+ ccache.missb->stats_t.readAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.missb->stats_t.writeAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.missb->rtp_stats = ccache.missb->stats_t;
+ ccache.ifb->stats_t.readAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.ifb->stats_t.writeAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.ifb->rtp_stats = ccache.ifb->stats_t;
+ ccache.prefetchb->stats_t.readAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.prefetchb->stats_t.writeAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.prefetchb->rtp_stats = ccache.prefetchb->stats_t;
+ ccache.wbb->stats_t.readAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.wbb->stats_t.writeAc.access = ccache.caches->stats_t.writeAc.miss;
+ ccache.wbb->rtp_stats = ccache.wbb->stats_t;
- if (cache_p == Write_back) { // write miss will generate a write later
- dcache.power_t.readOp.dynamic +=
- dcache.caches->stats_t.writeAc.miss *
- dcache.caches->local_result.power.writeOp.dynamic;
- ccache.power_t.readOp.dynamic +=
- ccache.caches->stats_t.writeAc.miss *
- ccache.caches->local_result.power.writeOp.dynamic;
- tcache.power_t.readOp.dynamic +=
- tcache.caches->stats_t.writeAc.miss *
- tcache.caches->local_result.power.writeOp.dynamic;
- sharedmemory.power_t.readOp.dynamic +=
- sharedmemory.caches->stats_t.writeAc.miss *
- sharedmemory.caches->local_result.power.writeOp.dynamic;
- }
+ tcache.missb->stats_t.readAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.missb->stats_t.writeAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.missb->rtp_stats = tcache.missb->stats_t;
+ tcache.ifb->stats_t.readAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.ifb->stats_t.writeAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.ifb->rtp_stats = tcache.ifb->stats_t;
+ tcache.prefetchb->stats_t.readAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.prefetchb->stats_t.writeAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.prefetchb->rtp_stats = tcache.prefetchb->stats_t;
+ tcache.wbb->stats_t.readAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.wbb->stats_t.writeAc.access = tcache.caches->stats_t.writeAc.miss;
+ tcache.wbb->rtp_stats = tcache.wbb->stats_t;
+ }
+ else
+ {
+ sharedmemory.missb->stats_t.readAc.access = sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.missb->stats_t.writeAc.access = sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.missb->rtp_stats = sharedmemory.missb->stats_t;
+ sharedmemory.ifb->stats_t.readAc.access = sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.ifb->stats_t.writeAc.access = sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.ifb->rtp_stats = sharedmemory.ifb->stats_t;
+ sharedmemory.prefetchb->stats_t.readAc.access = sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.prefetchb->stats_t.writeAc.access = sharedmemory.caches->stats_t.readAc.miss;
+ sharedmemory.prefetchb->rtp_stats = sharedmemory.prefetchb->stats_t;
- sharedmemory.power_t.readOp.dynamic +=
- sharedmemory.missb->stats_t.readAc.access *
- sharedmemory.missb->local_result.power.searchOp.dynamic +
- sharedmemory.missb->stats_t.writeAc.access *
- sharedmemory.missb->local_result.power.writeOp
- .dynamic; // each access to missb involves a CAM and a write
- sharedmemory.power_t.readOp.dynamic +=
- sharedmemory.ifb->stats_t.readAc.access *
- sharedmemory.ifb->local_result.power.searchOp.dynamic +
- sharedmemory.ifb->stats_t.writeAc.access *
- sharedmemory.ifb->local_result.power.writeOp.dynamic;
- sharedmemory.power_t.readOp.dynamic +=
- sharedmemory.prefetchb->stats_t.readAc.access *
- sharedmemory.prefetchb->local_result.power.searchOp.dynamic +
- sharedmemory.prefetchb->stats_t.writeAc.access *
- sharedmemory.prefetchb->local_result.power.writeOp.dynamic;
- if (cache_p == Write_back) {
- sharedmemory.power_t.readOp.dynamic +=
- sharedmemory.wbb->stats_t.readAc.access *
- sharedmemory.wbb->local_result.power.searchOp.dynamic +
- sharedmemory.wbb->stats_t.writeAc.access *
- sharedmemory.wbb->local_result.power.writeOp.dynamic;
- }
- dcache.power_t.readOp.dynamic +=
- dcache.missb->stats_t.readAc.access *
- dcache.missb->local_result.power.searchOp.dynamic +
- dcache.missb->stats_t.writeAc.access *
- dcache.missb->local_result.power.writeOp
- .dynamic; // each access to missb involves a CAM and a write
- dcache.power_t.readOp.dynamic +=
- dcache.ifb->stats_t.readAc.access *
- dcache.ifb->local_result.power.searchOp.dynamic +
- dcache.ifb->stats_t.writeAc.access *
- dcache.ifb->local_result.power.writeOp.dynamic;
- dcache.power_t.readOp.dynamic +=
- dcache.prefetchb->stats_t.readAc.access *
- dcache.prefetchb->local_result.power.searchOp.dynamic +
- dcache.prefetchb->stats_t.writeAc.access *
- dcache.prefetchb->local_result.power.writeOp.dynamic;
- if (cache_p == Write_back) {
- dcache.power_t.readOp.dynamic +=
- dcache.wbb->stats_t.readAc.access *
- dcache.wbb->local_result.power.searchOp.dynamic +
- dcache.wbb->stats_t.writeAc.access *
- dcache.wbb->local_result.power.writeOp.dynamic;
- }
+ dcache.missb->stats_t.readAc.access = dcache.caches->stats_t.readAc.miss;
+ dcache.missb->stats_t.writeAc.access = dcache.caches->stats_t.readAc.miss;
+ dcache.missb->rtp_stats = dcache.missb->stats_t;
+ dcache.ifb->stats_t.readAc.access = dcache.caches->stats_t.readAc.miss;
+ dcache.ifb->stats_t.writeAc.access = dcache.caches->stats_t.readAc.miss;
+ dcache.ifb->rtp_stats = dcache.ifb->stats_t;
+ dcache.prefetchb->stats_t.readAc.access = dcache.caches->stats_t.readAc.miss;
+ dcache.prefetchb->stats_t.writeAc.access = dcache.caches->stats_t.readAc.miss;
+ dcache.prefetchb->rtp_stats = dcache.prefetchb->stats_t;
- ccache.power_t.readOp.dynamic +=
- ccache.missb->stats_t.readAc.access *
- ccache.missb->local_result.power.searchOp.dynamic +
- ccache.missb->stats_t.writeAc.access *
- ccache.missb->local_result.power.writeOp
- .dynamic; // each access to missb involves a CAM and a write
- ccache.power_t.readOp.dynamic +=
- ccache.ifb->stats_t.readAc.access *
- ccache.ifb->local_result.power.searchOp.dynamic +
- ccache.ifb->stats_t.writeAc.access *
- ccache.ifb->local_result.power.writeOp.dynamic;
- ccache.power_t.readOp.dynamic +=
- ccache.prefetchb->stats_t.readAc.access *
- ccache.prefetchb->local_result.power.searchOp.dynamic +
- ccache.prefetchb->stats_t.writeAc.access *
- ccache.prefetchb->local_result.power.writeOp.dynamic;
- if (cache_p == Write_back) {
- ccache.power_t.readOp.dynamic +=
- ccache.wbb->stats_t.readAc.access *
- ccache.wbb->local_result.power.searchOp.dynamic +
- ccache.wbb->stats_t.writeAc.access *
- ccache.wbb->local_result.power.writeOp.dynamic;
- }
- tcache.power_t.readOp.dynamic +=
- tcache.missb->stats_t.readAc.access *
- tcache.missb->local_result.power.searchOp.dynamic +
- tcache.missb->stats_t.writeAc.access *
- tcache.missb->local_result.power.writeOp
- .dynamic; // each access to missb involves a CAM and a write
- tcache.power_t.readOp.dynamic +=
- tcache.ifb->stats_t.readAc.access *
- tcache.ifb->local_result.power.searchOp.dynamic +
- tcache.ifb->stats_t.writeAc.access *
- tcache.ifb->local_result.power.writeOp.dynamic;
- tcache.power_t.readOp.dynamic +=
- tcache.prefetchb->stats_t.readAc.access *
- tcache.prefetchb->local_result.power.searchOp.dynamic +
- tcache.prefetchb->stats_t.writeAc.access *
- tcache.prefetchb->local_result.power.writeOp.dynamic;
- if (cache_p == Write_back) {
- tcache.power_t.readOp.dynamic +=
- tcache.wbb->stats_t.readAc.access *
- tcache.wbb->local_result.power.searchOp.dynamic +
- tcache.wbb->stats_t.writeAc.access *
- tcache.wbb->local_result.power.writeOp.dynamic;
- }
+ ccache.missb->stats_t.readAc.access = ccache.caches->stats_t.readAc.miss;
+ ccache.missb->stats_t.writeAc.access = ccache.caches->stats_t.readAc.miss;
+ ccache.missb->rtp_stats = ccache.missb->stats_t;
+ ccache.ifb->stats_t.readAc.access = ccache.caches->stats_t.readAc.miss;
+ ccache.ifb->stats_t.writeAc.access = ccache.caches->stats_t.readAc.miss;
+ ccache.ifb->rtp_stats = ccache.ifb->stats_t;
+ ccache.prefetchb->stats_t.readAc.access = ccache.caches->stats_t.readAc.miss;
+ ccache.prefetchb->stats_t.writeAc.access = ccache.caches->stats_t.readAc.miss;
+ ccache.prefetchb->rtp_stats = ccache.prefetchb->stats_t;
- if ((coredynp.core_ty == OOO) &&
- (XML->sys.core[ithCore].load_buffer_size > 0)) {
- LoadQ->power_t.reset();
- LoadQ->power_t.readOp.dynamic +=
- LoadQ->stats_t.readAc.access *
- (LoadQ->local_result.power.searchOp.dynamic +
- LoadQ->local_result.power.readOp.dynamic) +
- LoadQ->stats_t.writeAc.access *
- LoadQ->local_result.power.writeOp.dynamic; // every memory access
- // invloves at least two
- // operations on LoadQ
+ tcache.missb->stats_t.readAc.access = tcache.caches->stats_t.readAc.miss;
+ tcache.missb->stats_t.writeAc.access = tcache.caches->stats_t.readAc.miss;
+ tcache.missb->rtp_stats = tcache.missb->stats_t;
+ tcache.ifb->stats_t.readAc.access = tcache.caches->stats_t.readAc.miss;
+ tcache.ifb->stats_t.writeAc.access = tcache.caches->stats_t.readAc.miss;
+ tcache.ifb->rtp_stats = tcache.ifb->stats_t;
+ tcache.prefetchb->stats_t.readAc.access = tcache.caches->stats_t.readAc.miss;
+ tcache.prefetchb->stats_t.writeAc.access = tcache.caches->stats_t.readAc.miss;
+ tcache.prefetchb->rtp_stats = tcache.prefetchb->stats_t;
- LSQ->power_t.readOp.dynamic +=
- LSQ->stats_t.readAc.access * (LSQ->local_result.power.searchOp.dynamic +
- LSQ->local_result.power.readOp.dynamic) +
- LSQ->stats_t.writeAc.access *
- LSQ->local_result.power.writeOp.dynamic; // every memory access
- // invloves at least two
- // operations on LSQ
+ }
- } else {
- // LSQ->power_t.readOp.dynamic +=
- //LSQ->stats_t.readAc.access*(LSQ->local_result.power.searchOp.dynamic +
- //LSQ->local_result.power.readOp.dynamic)
- // +
- //LSQ->stats_t.writeAc.access*LSQ->local_result.power.writeOp.dynamic;//every
- //memory access invloves at least two operations on LSQ
- // No LSQ in GPUs (Syed)
- }
+ LSQ->stats_t.readAc.access = (XML->sys.core[ithCore].load_instructions + XML->sys.core[ithCore].store_instructions)*2;//flush overhead considered
+ LSQ->stats_t.writeAc.access = (XML->sys.core[ithCore].load_instructions + XML->sys.core[ithCore].store_instructions)*2;
+ LSQ->rtp_stats = LSQ->stats_t;
- if (is_tdp) {
- // dcache.power = dcache.power_t +
- // (dcache.caches->local_result.power)*pppm_lkg +
- // (dcache.missb->local_result.power +
- // dcache.ifb->local_result.power +
- // dcache.prefetchb->local_result.power +
- // dcache.wbb->local_result.power)*pppm_Isub;
+ if ((coredynp.core_ty==OOO) && (XML->sys.core[ithCore].load_buffer_size >0))
+ {
+ LoadQ->stats_t.readAc.access = XML->sys.core[ithCore].load_instructions + XML->sys.core[ithCore].store_instructions;
+ LoadQ->stats_t.writeAc.access = XML->sys.core[ithCore].load_instructions + XML->sys.core[ithCore].store_instructions;
+ LoadQ->rtp_stats = LoadQ->stats_t;
+ }
- sharedmemory.power =
- sharedmemory.power_t +
- (sharedmemory.caches->local_result.power +
- sharedmemory.missb->local_result.power +
- sharedmemory.ifb->local_result.power +
- sharedmemory.prefetchb->local_result.power + xbar_shared->power) *
- pppm_lkg;
- if (cache_p == Write_back) {
- sharedmemory.power =
- sharedmemory.power + sharedmemory.wbb->local_result.power * pppm_lkg;
- }
+ }
- dcache.power =
- dcache.power_t +
- (dcache.caches->local_result.power + dcache.missb->local_result.power +
- dcache.ifb->local_result.power +
- dcache.prefetchb->local_result.power) *
- pppm_lkg;
- if (cache_p == Write_back) {
- dcache.power = dcache.power + dcache.wbb->local_result.power * pppm_lkg;
- }
+ sharedmemory.power_t.reset();
+ dcache.power_t.reset();
+ ccache.power_t.reset();
+ tcache.power_t.reset();
+ LSQ->power_t.reset();
+
+ sharedmemory.power_t.readOp.dynamic += (sharedmemory.caches->stats_t.readAc.hit*sharedmemory.caches->local_result.power.readOp.dynamic+
+ sharedmemory.caches->stats_t.readAc.miss*sharedmemory.caches->local_result.power.readOp.dynamic+
+ sharedmemory.caches->stats_t.writeAc.miss*sharedmemory.caches->local_result.tag_array2->power.readOp.dynamic+
+ sharedmemory.caches->stats_t.writeAc.access*sharedmemory.caches->local_result.power.writeOp.dynamic +
+ xbar_shared->power.readOp.dynamic*(sharedmemory.caches->stats_t.readAc.hit+ sharedmemory.caches->stats_t.writeAc.hit));
+
+
+ dcache.power_t.readOp.dynamic += (dcache.caches->stats_t.readAc.hit*dcache.caches->local_result.power.readOp.dynamic+
+ dcache.caches->stats_t.readAc.miss*dcache.caches->local_result.power.readOp.dynamic+
+ dcache.caches->stats_t.writeAc.miss*dcache.caches->local_result.tag_array2->power.readOp.dynamic+
+ dcache.caches->stats_t.writeAc.access*dcache.caches->local_result.power.writeOp.dynamic +
+ xbar_shared->power.readOp.dynamic*(dcache.caches->stats_t.readAc.hit+ dcache.caches->stats_t.writeAc.hit));
+ ccache.power_t.readOp.dynamic += (ccache.caches->stats_t.readAc.hit*ccache.caches->local_result.power.readOp.dynamic+
+ ccache.caches->stats_t.readAc.miss*ccache.caches->local_result.power.readOp.dynamic+
+ ccache.caches->stats_t.writeAc.miss*ccache.caches->local_result.tag_array2->power.readOp.dynamic+
+ ccache.caches->stats_t.writeAc.access*ccache.caches->local_result.power.writeOp.dynamic +
+ xbar_shared->power.readOp.dynamic*(ccache.caches->stats_t.readAc.hit));
- ccache.power =
- ccache.power_t +
- (ccache.caches->local_result.power + ccache.missb->local_result.power +
- ccache.ifb->local_result.power +
- ccache.prefetchb->local_result.power) *
- pppm_lkg;
- if (cache_p == Write_back) {
- ccache.power = ccache.power + ccache.wbb->local_result.power * pppm_lkg;
+ tcache.power_t.readOp.dynamic += (tcache.caches->stats_t.readAc.hit*tcache.caches->local_result.power.readOp.dynamic+
+ tcache.caches->stats_t.readAc.miss*tcache.caches->local_result.power.readOp.dynamic+
+ tcache.caches->stats_t.writeAc.miss*tcache.caches->local_result.tag_array2->power.readOp.dynamic+
+ tcache.caches->stats_t.writeAc.access*tcache.caches->local_result.power.writeOp.dynamic+
+ xbar_shared->power.readOp.dynamic*(tcache.caches->stats_t.readAc.hit+ tcache.caches->stats_t.writeAc.hit));
+
+ if (cache_p==Write_back)
+ {//write miss will generate a write later
+ dcache.power_t.readOp.dynamic += dcache.caches->stats_t.writeAc.miss*dcache.caches->local_result.power.writeOp.dynamic;
+ ccache.power_t.readOp.dynamic += ccache.caches->stats_t.writeAc.miss*ccache.caches->local_result.power.writeOp.dynamic;
+ tcache.power_t.readOp.dynamic += tcache.caches->stats_t.writeAc.miss*tcache.caches->local_result.power.writeOp.dynamic;
+ sharedmemory.power_t.readOp.dynamic += sharedmemory.caches->stats_t.writeAc.miss*sharedmemory.caches->local_result.power.writeOp.dynamic;
}
- tcache.power =
- tcache.power_t +
- (tcache.caches->local_result.power + tcache.missb->local_result.power +
- tcache.ifb->local_result.power +
- tcache.prefetchb->local_result.power) *
- pppm_lkg;
- if (cache_p == Write_back) {
- tcache.power = tcache.power + tcache.wbb->local_result.power * pppm_lkg;
+
+ sharedmemory.power_t.readOp.dynamic += sharedmemory.missb->stats_t.readAc.access*sharedmemory.missb->local_result.power.searchOp.dynamic +
+ sharedmemory.missb->stats_t.writeAc.access*sharedmemory.missb->local_result.power.writeOp.dynamic;//each access to missb involves a CAM and a write
+ sharedmemory.power_t.readOp.dynamic += sharedmemory.ifb->stats_t.readAc.access*sharedmemory.ifb->local_result.power.searchOp.dynamic +
+ sharedmemory.ifb->stats_t.writeAc.access*sharedmemory.ifb->local_result.power.writeOp.dynamic;
+ sharedmemory.power_t.readOp.dynamic += sharedmemory.prefetchb->stats_t.readAc.access*sharedmemory.prefetchb->local_result.power.searchOp.dynamic +
+ sharedmemory.prefetchb->stats_t.writeAc.access*sharedmemory.prefetchb->local_result.power.writeOp.dynamic;
+ if (cache_p==Write_back)
+ {
+ sharedmemory.power_t.readOp.dynamic += sharedmemory.wbb->stats_t.readAc.access*sharedmemory.wbb->local_result.power.searchOp.dynamic
+ + sharedmemory.wbb->stats_t.writeAc.access*sharedmemory.wbb->local_result.power.writeOp.dynamic;
}
- LSQ->power = LSQ->power_t + LSQ->local_result.power * pppm_lkg;
- // No LSQ in GPUs (Syed)
- LSQ->power.reset();
- power = power + dcache.power + LSQ->power + sharedmemory.power +
- ccache.power + tcache.power;
- if ((coredynp.core_ty == OOO) &&
- (XML->sys.core[ithCore].load_buffer_size > 0)) {
- LoadQ->power = LoadQ->power_t + LoadQ->local_result.power * pppm_lkg;
- power = power + LoadQ->power;
+ dcache.power_t.readOp.dynamic += dcache.missb->stats_t.readAc.access*dcache.missb->local_result.power.searchOp.dynamic +
+ dcache.missb->stats_t.writeAc.access*dcache.missb->local_result.power.writeOp.dynamic;//each access to missb involves a CAM and a write
+ dcache.power_t.readOp.dynamic += dcache.ifb->stats_t.readAc.access*dcache.ifb->local_result.power.searchOp.dynamic +
+ dcache.ifb->stats_t.writeAc.access*dcache.ifb->local_result.power.writeOp.dynamic;
+ dcache.power_t.readOp.dynamic += dcache.prefetchb->stats_t.readAc.access*dcache.prefetchb->local_result.power.searchOp.dynamic +
+ dcache.prefetchb->stats_t.writeAc.access*dcache.prefetchb->local_result.power.writeOp.dynamic;
+ if (cache_p==Write_back)
+ {
+ dcache.power_t.readOp.dynamic += dcache.wbb->stats_t.readAc.access*dcache.wbb->local_result.power.searchOp.dynamic
+ + dcache.wbb->stats_t.writeAc.access*dcache.wbb->local_result.power.writeOp.dynamic;
}
- } else {
- // dcache.rt_power = dcache.power_t +
- // (dcache.caches->local_result.power +
- // dcache.missb->local_result.power +
- // dcache.ifb->local_result.power +
- // dcache.prefetchb->local_result.power +
- // dcache.wbb->local_result.power)*pppm_lkg;
- rt_power.reset();
- sharedmemory.rt_power.reset(); // Jingwen
- tcache.rt_power.reset();
- ccache.rt_power.reset();
- dcache.rt_power.reset();
- LSQ->rt_power.reset();
- sharedmemory.rt_power = sharedmemory.power_t +
- (sharedmemory.caches->local_result.power +
- sharedmemory.missb->local_result.power +
- sharedmemory.ifb->local_result.power +
- sharedmemory.prefetchb->local_result.power) *
- pppm_lkg;
+ ccache.power_t.readOp.dynamic += ccache.missb->stats_t.readAc.access*ccache.missb->local_result.power.searchOp.dynamic +
+ ccache.missb->stats_t.writeAc.access*ccache.missb->local_result.power.writeOp.dynamic;//each access to missb involves a CAM and a write
+ ccache.power_t.readOp.dynamic += ccache.ifb->stats_t.readAc.access*ccache.ifb->local_result.power.searchOp.dynamic +
+ ccache.ifb->stats_t.writeAc.access*ccache.ifb->local_result.power.writeOp.dynamic;
+ ccache.power_t.readOp.dynamic += ccache.prefetchb->stats_t.readAc.access*ccache.prefetchb->local_result.power.searchOp.dynamic +
+ ccache.prefetchb->stats_t.writeAc.access*ccache.prefetchb->local_result.power.writeOp.dynamic;
+ if (cache_p==Write_back)
+ {
+ ccache.power_t.readOp.dynamic += ccache.wbb->stats_t.readAc.access*ccache.wbb->local_result.power.searchOp.dynamic
+ + ccache.wbb->stats_t.writeAc.access*ccache.wbb->local_result.power.writeOp.dynamic;
+ }
- if (cache_p == Write_back) {
- sharedmemory.rt_power = sharedmemory.rt_power +
- sharedmemory.wbb->local_result.power * pppm_lkg;
+ tcache.power_t.readOp.dynamic += tcache.missb->stats_t.readAc.access*tcache.missb->local_result.power.searchOp.dynamic +
+ tcache.missb->stats_t.writeAc.access*tcache.missb->local_result.power.writeOp.dynamic;//each access to missb involves a CAM and a write
+ tcache.power_t.readOp.dynamic += tcache.ifb->stats_t.readAc.access*tcache.ifb->local_result.power.searchOp.dynamic +
+ tcache.ifb->stats_t.writeAc.access*tcache.ifb->local_result.power.writeOp.dynamic;
+ tcache.power_t.readOp.dynamic += tcache.prefetchb->stats_t.readAc.access*tcache.prefetchb->local_result.power.searchOp.dynamic +
+ tcache.prefetchb->stats_t.writeAc.access*tcache.prefetchb->local_result.power.writeOp.dynamic;
+ if (cache_p==Write_back)
+ {
+ tcache.power_t.readOp.dynamic += tcache.wbb->stats_t.readAc.access*tcache.wbb->local_result.power.searchOp.dynamic
+ + tcache.wbb->stats_t.writeAc.access*tcache.wbb->local_result.power.writeOp.dynamic;
}
- dcache.rt_power =
- dcache.power_t +
- (dcache.caches->local_result.power + dcache.missb->local_result.power +
- dcache.ifb->local_result.power +
- dcache.prefetchb->local_result.power) *
- pppm_lkg;
- if (cache_p == Write_back) {
- dcache.rt_power =
- dcache.rt_power + dcache.wbb->local_result.power * pppm_lkg;
+
+ if ((coredynp.core_ty==OOO) && (XML->sys.core[ithCore].load_buffer_size >0))
+ {
+ LoadQ->power_t.reset();
+ LoadQ->power_t.readOp.dynamic += LoadQ->stats_t.readAc.access*(LoadQ->local_result.power.searchOp.dynamic+ LoadQ->local_result.power.readOp.dynamic)+
+ LoadQ->stats_t.writeAc.access*LoadQ->local_result.power.writeOp.dynamic;//every memory access invloves at least two operations on LoadQ
+
+ LSQ->power_t.readOp.dynamic += LSQ->stats_t.readAc.access*(LSQ->local_result.power.searchOp.dynamic + LSQ->local_result.power.readOp.dynamic)
+ + LSQ->stats_t.writeAc.access*LSQ->local_result.power.writeOp.dynamic;//every memory access invloves at least two operations on LSQ
+
}
+ else
+ {
+ // LSQ->power_t.readOp.dynamic += LSQ->stats_t.readAc.access*(LSQ->local_result.power.searchOp.dynamic + LSQ->local_result.power.readOp.dynamic)
+ // + LSQ->stats_t.writeAc.access*LSQ->local_result.power.writeOp.dynamic;//every memory access invloves at least two operations on LSQ
+ // No LSQ in GPUs (Syed)
- ccache.rt_power =
- ccache.power_t +
- (ccache.caches->local_result.power + ccache.missb->local_result.power +
- ccache.ifb->local_result.power +
- ccache.prefetchb->local_result.power) *
- pppm_lkg;
- if (cache_p == Write_back) {
- ccache.rt_power =
- ccache.rt_power + ccache.wbb->local_result.power * pppm_lkg;
}
- tcache.rt_power =
- tcache.power_t +
- (tcache.caches->local_result.power + tcache.missb->local_result.power +
- tcache.ifb->local_result.power +
- tcache.prefetchb->local_result.power) *
- pppm_lkg;
- if (cache_p == Write_back) {
- tcache.rt_power =
- tcache.rt_power + tcache.wbb->local_result.power * pppm_lkg;
+ if (is_tdp)
+ {
+// dcache.power = dcache.power_t + (dcache.caches->local_result.power)*pppm_lkg +
+// (dcache.missb->local_result.power +
+// dcache.ifb->local_result.power +
+// dcache.prefetchb->local_result.power +
+// dcache.wbb->local_result.power)*pppm_Isub;
+
+
+ sharedmemory.power = sharedmemory.power_t + (sharedmemory.caches->local_result.power +
+ sharedmemory.missb->local_result.power +
+ sharedmemory.ifb->local_result.power +
+ sharedmemory.prefetchb->local_result.power + xbar_shared->power) *pppm_lkg;
+ if (cache_p==Write_back)
+ {
+ sharedmemory.power = sharedmemory.power + sharedmemory.wbb->local_result.power*pppm_lkg;
+ }
+
+
+ dcache.power = dcache.power_t + (dcache.caches->local_result.power +
+ dcache.missb->local_result.power +
+ dcache.ifb->local_result.power +
+ dcache.prefetchb->local_result.power) *pppm_lkg;
+ if (cache_p==Write_back)
+ {
+ dcache.power = dcache.power + dcache.wbb->local_result.power*pppm_lkg;
+ }
+
+ ccache.power = ccache.power_t + (ccache.caches->local_result.power +
+ ccache.missb->local_result.power +
+ ccache.ifb->local_result.power +
+ ccache.prefetchb->local_result.power) *pppm_lkg;
+ if (cache_p==Write_back)
+ {
+ ccache.power = ccache.power + ccache.wbb->local_result.power*pppm_lkg;
+ }
+
+ tcache.power = tcache.power_t + (tcache.caches->local_result.power +
+ tcache.missb->local_result.power +
+ tcache.ifb->local_result.power +
+ tcache.prefetchb->local_result.power) *pppm_lkg;
+ if (cache_p==Write_back)
+ {
+ tcache.power = tcache.power + tcache.wbb->local_result.power*pppm_lkg;
+ }
+
+
+ LSQ->power = LSQ->power_t + LSQ->local_result.power *pppm_lkg;
+ //No LSQ in GPUs (Syed)
+ LSQ->power.reset();
+ power = power + dcache.power + LSQ->power +sharedmemory.power + ccache.power + tcache.power;
+
+ if ((coredynp.core_ty==OOO) && (XML->sys.core[ithCore].load_buffer_size >0))
+ {
+ LoadQ->power = LoadQ->power_t + LoadQ->local_result.power *pppm_lkg;
+ power = power + LoadQ->power;
+ }
}
+ else
+ {
+// dcache.rt_power = dcache.power_t + (dcache.caches->local_result.power +
+// dcache.missb->local_result.power +
+// dcache.ifb->local_result.power +
+// dcache.prefetchb->local_result.power +
+// dcache.wbb->local_result.power)*pppm_lkg;
+ rt_power.reset();
+ sharedmemory.rt_power.reset(); //Jingwen
+ tcache.rt_power.reset();
+ ccache.rt_power.reset();
+ dcache.rt_power.reset();
+ LSQ->rt_power.reset();
+
+
+ sharedmemory.rt_power = sharedmemory.power_t + (sharedmemory.caches->local_result.power +
+ sharedmemory.missb->local_result.power +
+ sharedmemory.ifb->local_result.power +
+ sharedmemory.prefetchb->local_result.power )*pppm_lkg;
+
+ if (cache_p==Write_back)
+ {
+ sharedmemory.rt_power = sharedmemory.rt_power + sharedmemory.wbb->local_result.power*pppm_lkg;
+ }
+
+ dcache.rt_power = dcache.power_t + (dcache.caches->local_result.power +
+ dcache.missb->local_result.power +
+ dcache.ifb->local_result.power +
+ dcache.prefetchb->local_result.power )*pppm_lkg;
+ if (cache_p==Write_back)
+ {
+ dcache.rt_power = dcache.rt_power + dcache.wbb->local_result.power*pppm_lkg;
+ }
+
+ ccache.rt_power = ccache.power_t + (ccache.caches->local_result.power +
+ ccache.missb->local_result.power +
+ ccache.ifb->local_result.power +
+ ccache.prefetchb->local_result.power )*pppm_lkg;
+ if (cache_p==Write_back)
+ {
+ ccache.rt_power = ccache.rt_power + ccache.wbb->local_result.power*pppm_lkg;
+ }
- LSQ->rt_power = LSQ->power_t + LSQ->local_result.power * pppm_lkg;
- LSQ->rt_power.reset();
- rt_power = rt_power + dcache.rt_power + LSQ->rt_power +
- sharedmemory.rt_power + ccache.rt_power + tcache.rt_power;
+ tcache.rt_power = tcache.power_t + (tcache.caches->local_result.power +
+ tcache.missb->local_result.power +
+ tcache.ifb->local_result.power +
+ tcache.prefetchb->local_result.power )*pppm_lkg;
+ if (cache_p==Write_back)
+ {
+ tcache.rt_power = tcache.rt_power + tcache.wbb->local_result.power*pppm_lkg;
+ }
- if ((coredynp.core_ty == OOO) &&
- (XML->sys.core[ithCore].load_buffer_size > 0)) {
- LoadQ->rt_power = LoadQ->power_t + LoadQ->local_result.power * pppm_lkg;
- rt_power = rt_power + LoadQ->rt_power;
+
+
+ LSQ->rt_power = LSQ->power_t + LSQ->local_result.power *pppm_lkg;
+ LSQ->rt_power.reset();
+ rt_power = rt_power + dcache.rt_power + LSQ->rt_power + sharedmemory.rt_power + ccache.rt_power + tcache.rt_power;
+
+ if ((coredynp.core_ty==OOO) && (XML->sys.core[ithCore].load_buffer_size >0))
+ {
+ LoadQ->rt_power = LoadQ->power_t + LoadQ->local_result.power *pppm_lkg;
+ rt_power = rt_power + LoadQ->rt_power;
+ }
}
- }
}
-void LoadStoreU::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
- if (is_tdp) {
- cout << indent_str << "Shared Memory:" << endl;
- cout << indent_str_next << "Area = " << sharedmemory.area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << sharedmemory.power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? sharedmemory.power.readOp.longer_channel_leakage
- : sharedmemory.power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << sharedmemory.power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << sharedmemory.rt_power.readOp.dynamic / executionTime << " W"
- << endl;
- cout << endl;
+void LoadStoreU::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
- cout << indent_str << "Data Cache:" << endl;
- cout << indent_str_next << "Area = " << dcache.area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << dcache.power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? dcache.power.readOp.longer_channel_leakage
- : dcache.power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << dcache.power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << dcache.rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "Constant Cache:" << endl;
- cout << indent_str_next << "Area = " << ccache.area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << ccache.power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? dcache.power.readOp.longer_channel_leakage
- : dcache.power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << ccache.power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << ccache.rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << indent_str_next
- << "Runtime Dynamic Energy = " << ccache.rt_power.readOp.dynamic
- << " J" << endl;
- cout << indent_str_next << "Execution Time = " << executionTime << " s"
- << endl;
- cout << endl;
+ if (is_tdp)
+ {
- cout << indent_str << "Texture Cache:" << endl;
- cout << indent_str_next << "Area = " << tcache.area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << tcache.power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? dcache.power.readOp.longer_channel_leakage
- : dcache.power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << tcache.power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << tcache.rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
+ cout << indent_str << "Shared Memory:" << endl;
+ cout << indent_str_next << "Area = " << sharedmemory.area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << sharedmemory.power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? sharedmemory.power.readOp.longer_channel_leakage:sharedmemory.power.readOp.leakage )<<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << sharedmemory.power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << sharedmemory.rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
- if (coredynp.core_ty == Inorder) {
- cout << indent_str << "Load/Store Queue:" << endl;
- cout << indent_str_next << "Area = " << LSQ->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << LSQ->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? LSQ->power.readOp.longer_channel_leakage
- : LSQ->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << LSQ->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << LSQ->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- } else
- {
- if (XML->sys.core[ithCore].load_buffer_size > 0) {
- cout << indent_str << "LoadQ:" << endl;
- cout << indent_str_next << "Area = " << LoadQ->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << LoadQ->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? LoadQ->power.readOp.longer_channel_leakage
- : LoadQ->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << LoadQ->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << LoadQ->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- }
- cout << indent_str << "StoreQ:" << endl;
- cout << indent_str_next << "Area = " << LSQ->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << LSQ->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? LSQ->power.readOp.longer_channel_leakage
- : LSQ->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << LSQ->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << LSQ->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- }
- } else {
- cout << indent_str_next << "Shared Memory Peak Dynamic = "
- << sharedmemory.rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Shared Memory Subthreshold Leakage = "
- << sharedmemory.rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Shared Memory Gate Leakage = "
- << sharedmemory.rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str << "Data Cache:" << endl;
+ cout << indent_str_next << "Area = " << dcache.area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << dcache.power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? dcache.power.readOp.longer_channel_leakage:dcache.power.readOp.leakage )<<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << dcache.power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << dcache.rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
- cout << indent_str_next << "Data Cache Peak Dynamic = "
- << dcache.rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Data Cache Subthreshold Leakage = "
- << dcache.rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Data Cache Gate Leakage = "
- << dcache.rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str << "Constant Cache:" << endl;
+ cout << indent_str_next << "Area = " << ccache.area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << ccache.power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? dcache.power.readOp.longer_channel_leakage:dcache.power.readOp.leakage )<<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << ccache.power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << ccache.rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic Energy = " << ccache.rt_power.readOp.dynamic<<" J"<<endl;
+ cout << indent_str_next << "Execution Time = " << executionTime<<" s"<<endl;
+ cout <<endl;
- cout << indent_str_next << "Constant Cache Peak Dynamic = "
- << ccache.rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Constant Cache Subthreshold Leakage = "
- << ccache.rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Constant Cache Gate Leakage = "
- << ccache.rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "Texture Cache Peak Dynamic = "
- << tcache.rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Texture Cache Subthreshold Leakage = "
- << tcache.rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Texture Cache Gate Leakage = "
- << tcache.rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str << "Texture Cache:" << endl;
+ cout << indent_str_next << "Area = " << tcache.area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << tcache.power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? dcache.power.readOp.longer_channel_leakage:dcache.power.readOp.leakage )<<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << tcache.power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << tcache.rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+
+ if (coredynp.core_ty==Inorder)
+ {
+ cout << indent_str << "Load/Store Queue:" << endl;
+ cout << indent_str_next << "Area = " << LSQ->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << LSQ->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? LSQ->power.readOp.longer_channel_leakage:LSQ->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << LSQ->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << LSQ->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ else
+
+ {
+ if (XML->sys.core[ithCore].load_buffer_size >0)
+ {
+ cout << indent_str << "LoadQ:" << endl;
+ cout << indent_str_next << "Area = " << LoadQ->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << LoadQ->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? LoadQ->power.readOp.longer_channel_leakage:LoadQ->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << LoadQ->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << LoadQ->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ cout << indent_str<< "StoreQ:" << endl;
+ cout << indent_str_next << "Area = " << LSQ->area.get_area() *1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << LSQ->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? LSQ->power.readOp.longer_channel_leakage:LSQ->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << LSQ->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << LSQ->rt_power.readOp.dynamic/executionTime<< " W" << endl;
+ cout <<endl;
+ }
+ }
+ else
+ {
+
+ cout << indent_str_next << "Shared Memory Peak Dynamic = " << sharedmemory.rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Shared Memory Subthreshold Leakage = " << sharedmemory.rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Shared Memory Gate Leakage = " << sharedmemory.rt_power.readOp.gate_leakage << " W" << endl;
+
+
+ cout << indent_str_next << "Data Cache Peak Dynamic = " << dcache.rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Data Cache Subthreshold Leakage = " << dcache.rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Data Cache Gate Leakage = " << dcache.rt_power.readOp.gate_leakage << " W" << endl;
+
+ cout << indent_str_next << "Constant Cache Peak Dynamic = " << ccache.rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Constant Cache Subthreshold Leakage = " << ccache.rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Constant Cache Gate Leakage = " << ccache.rt_power.readOp.gate_leakage << " W" << endl;
+
+ cout << indent_str_next << "Texture Cache Peak Dynamic = " << tcache.rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Texture Cache Subthreshold Leakage = " << tcache.rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Texture Cache Gate Leakage = " << tcache.rt_power.readOp.gate_leakage << " W" << endl;
+
+ if (coredynp.core_ty==Inorder)
+ {
+ cout << indent_str_next << "Load/Store Queue Peak Dynamic = " << LSQ->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Load/Store Queue Subthreshold Leakage = " << LSQ->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Load/Store Queue Gate Leakage = " << LSQ->rt_power.readOp.gate_leakage << " W" << endl;
+ }
+ else
+ {
+ cout << indent_str_next << "LoadQ Peak Dynamic = " << LoadQ->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "LoadQ Subthreshold Leakage = " << LoadQ->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "LoadQ Gate Leakage = " << LoadQ->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "StoreQ Peak Dynamic = " << LSQ->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "StoreQ Subthreshold Leakage = " << LSQ->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "StoreQ Gate Leakage = " << LSQ->rt_power.readOp.gate_leakage << " W" << endl;
+ }
+ }
- if (coredynp.core_ty == Inorder) {
- cout << indent_str_next << "Load/Store Queue Peak Dynamic = "
- << LSQ->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Load/Store Queue Subthreshold Leakage = "
- << LSQ->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Load/Store Queue Gate Leakage = "
- << LSQ->rt_power.readOp.gate_leakage << " W" << endl;
- } else {
- cout << indent_str_next << "LoadQ Peak Dynamic = "
- << LoadQ->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "LoadQ Subthreshold Leakage = "
- << LoadQ->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next
- << "LoadQ Gate Leakage = " << LoadQ->rt_power.readOp.gate_leakage
- << " W" << endl;
- cout << indent_str_next << "StoreQ Peak Dynamic = "
- << LSQ->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next
- << "StoreQ Subthreshold Leakage = " << LSQ->rt_power.readOp.leakage
- << " W" << endl;
- cout << indent_str_next
- << "StoreQ Gate Leakage = " << LSQ->rt_power.readOp.gate_leakage
- << " W" << endl;
- }
- }
}
-void MemManU::computeEnergy(bool is_tdp) {
- if (!exist) return;
- if (is_tdp) {
- // init stats for Peak
- itlb->stats_t.readAc.access = itlb->l_ip.num_search_ports;
- itlb->stats_t.readAc.miss = 0;
- itlb->stats_t.readAc.hit =
- itlb->stats_t.readAc.access - itlb->stats_t.readAc.miss;
- itlb->tdp_stats = itlb->stats_t;
+void MemManU::computeEnergy(bool is_tdp)
+{
- dtlb->stats_t.readAc.access =
- dtlb->l_ip.num_search_ports * coredynp.LSU_duty_cycle;
- dtlb->stats_t.readAc.miss = 0;
- dtlb->stats_t.readAc.hit =
- dtlb->stats_t.readAc.access - dtlb->stats_t.readAc.miss;
- dtlb->tdp_stats = dtlb->stats_t;
- } else {
- // init stats for Runtime Dynamic (RTP)
- itlb->stats_t.readAc.access = XML->sys.core[ithCore].itlb.total_accesses;
- itlb->stats_t.readAc.miss = XML->sys.core[ithCore].itlb.total_misses;
- itlb->stats_t.readAc.hit =
- itlb->stats_t.readAc.access - itlb->stats_t.readAc.miss;
- itlb->rtp_stats = itlb->stats_t;
+ if (!exist) return;
+ if (is_tdp)
+ {
+ //init stats for Peak
+ itlb->stats_t.readAc.access = itlb->l_ip.num_search_ports;
+ itlb->stats_t.readAc.miss = 0;
+ itlb->stats_t.readAc.hit = itlb->stats_t.readAc.access - itlb->stats_t.readAc.miss;
+ itlb->tdp_stats = itlb->stats_t;
- dtlb->stats_t.readAc.access = XML->sys.core[ithCore].dtlb.total_accesses;
- dtlb->stats_t.readAc.miss = XML->sys.core[ithCore].dtlb.total_misses;
- dtlb->stats_t.readAc.hit =
- dtlb->stats_t.readAc.access - dtlb->stats_t.readAc.miss;
- dtlb->rtp_stats = dtlb->stats_t;
- }
+ dtlb->stats_t.readAc.access = dtlb->l_ip.num_search_ports*coredynp.LSU_duty_cycle;
+ dtlb->stats_t.readAc.miss = 0;
+ dtlb->stats_t.readAc.hit = dtlb->stats_t.readAc.access - dtlb->stats_t.readAc.miss;
+ dtlb->tdp_stats = dtlb->stats_t;
+ }
+ else
+ {
+ //init stats for Runtime Dynamic (RTP)
+ itlb->stats_t.readAc.access = XML->sys.core[ithCore].itlb.total_accesses;
+ itlb->stats_t.readAc.miss = XML->sys.core[ithCore].itlb.total_misses;
+ itlb->stats_t.readAc.hit = itlb->stats_t.readAc.access - itlb->stats_t.readAc.miss;
+ itlb->rtp_stats = itlb->stats_t;
- itlb->power_t.reset();
- dtlb->power_t.reset();
- itlb->power_t.readOp.dynamic +=
- itlb->stats_t.readAc.access *
- itlb->local_result.power.searchOp.dynamic // FA spent most power in
- // tag, so use total access
- // not hits
- + itlb->stats_t.readAc.miss * itlb->local_result.power.writeOp.dynamic;
- dtlb->power_t.readOp.dynamic +=
- dtlb->stats_t.readAc.access *
- dtlb->local_result.power.searchOp.dynamic // FA spent most power in
- // tag, so use total access
- // not hits
- + dtlb->stats_t.readAc.miss * dtlb->local_result.power.writeOp.dynamic;
+ dtlb->stats_t.readAc.access = XML->sys.core[ithCore].dtlb.total_accesses;
+ dtlb->stats_t.readAc.miss = XML->sys.core[ithCore].dtlb.total_misses;
+ dtlb->stats_t.readAc.hit = dtlb->stats_t.readAc.access - dtlb->stats_t.readAc.miss;
+ dtlb->rtp_stats = dtlb->stats_t;
+ }
+
+ itlb->power_t.reset();
+ dtlb->power_t.reset();
+ itlb->power_t.readOp.dynamic += itlb->stats_t.readAc.access*itlb->local_result.power.searchOp.dynamic//FA spent most power in tag, so use total access not hits
+ +itlb->stats_t.readAc.miss*itlb->local_result.power.writeOp.dynamic;
+ dtlb->power_t.readOp.dynamic += dtlb->stats_t.readAc.access*dtlb->local_result.power.searchOp.dynamic//FA spent most power in tag, so use total access not hits
+ +dtlb->stats_t.readAc.miss*dtlb->local_result.power.writeOp.dynamic;
+
+ if (is_tdp)
+ {
+ itlb->power = itlb->power_t + itlb->local_result.power *pppm_lkg;
+ dtlb->power = dtlb->power_t + dtlb->local_result.power *pppm_lkg;
+ power = power + itlb->power + dtlb->power;
+ }
+ else
+ {
+ itlb->rt_power = itlb->power_t + itlb->local_result.power *pppm_lkg;
+ dtlb->rt_power = dtlb->power_t + dtlb->local_result.power *pppm_lkg;
+ rt_power = rt_power + itlb->rt_power + dtlb->rt_power;
+ }
- if (is_tdp) {
- itlb->power = itlb->power_t + itlb->local_result.power * pppm_lkg;
- dtlb->power = dtlb->power_t + dtlb->local_result.power * pppm_lkg;
- power = power + itlb->power + dtlb->power;
- } else {
- itlb->rt_power = itlb->power_t + itlb->local_result.power * pppm_lkg;
- dtlb->rt_power = dtlb->power_t + dtlb->local_result.power * pppm_lkg;
- rt_power = rt_power + itlb->rt_power + dtlb->rt_power;
- }
}
-void MemManU::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
+void MemManU::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
+
+
+
+
+ if (is_tdp)
+ {
+ cout << indent_str << "Itlb:" << endl;
+ cout << indent_str_next << "Area = " << itlb->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << itlb->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? itlb->power.readOp.longer_channel_leakage:itlb->power.readOp.leakage) <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << itlb->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << itlb->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str<< "Dtlb:" << endl;
+ cout << indent_str_next << "Area = " << dtlb->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << dtlb->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? dtlb->power.readOp.longer_channel_leakage:dtlb->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << dtlb->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << dtlb->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ else
+ {
+ cout << indent_str_next << "Itlb Peak Dynamic = " << itlb->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Itlb Subthreshold Leakage = " << itlb->rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Itlb Gate Leakage = " << itlb->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Dtlb Peak Dynamic = " << dtlb->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Dtlb Subthreshold Leakage = " << dtlb->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Dtlb Gate Leakage = " << dtlb->rt_power.readOp.gate_leakage << " W" << endl;
+ }
- if (is_tdp) {
- cout << indent_str << "Itlb:" << endl;
- cout << indent_str_next << "Area = " << itlb->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << itlb->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? itlb->power.readOp.longer_channel_leakage
- : itlb->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << itlb->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << itlb->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- cout << indent_str << "Dtlb:" << endl;
- cout << indent_str_next << "Area = " << dtlb->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << dtlb->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? dtlb->power.readOp.longer_channel_leakage
- : dtlb->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << dtlb->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << dtlb->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- } else {
- cout << indent_str_next << "Itlb Peak Dynamic = "
- << itlb->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next
- << "Itlb Subthreshold Leakage = " << itlb->rt_power.readOp.leakage
- << " W" << endl;
- cout << indent_str_next
- << "Itlb Gate Leakage = " << itlb->rt_power.readOp.gate_leakage
- << " W" << endl;
- cout << indent_str_next << "Dtlb Peak Dynamic = "
- << dtlb->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next
- << "Dtlb Subthreshold Leakage = " << dtlb->rt_power.readOp.leakage
- << " W" << endl;
- cout << indent_str_next
- << "Dtlb Gate Leakage = " << dtlb->rt_power.readOp.gate_leakage
- << " W" << endl;
- }
}
-void RegFU::computeEnergy(bool is_tdp) {
- /*
- * Architecture RF and physical RF cannot be present at the same time.
- * Therefore, the RF stats can only refer to either ARF or PRF;
- * And the same stats can be used for both.
- */
- if (!exist) return;
+void RegFU::computeEnergy(bool is_tdp)
+{
+/*
+ * Architecture RF and physical RF cannot be present at the same time.
+ * Therefore, the RF stats can only refer to either ARF or PRF;
+ * And the same stats can be used for both.
+ */
+ if (!exist) return;
+
+ executionTime=XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6);//Syed
+ //RF crossbar power (Syed Gilani)
+ xbar_rfu->compute_power();
- executionTime =
- XML->sys.total_cycles / (XML->sys.target_core_clockrate * 1e6); // Syed
- // RF crossbar power (Syed Gilani)
- xbar_rfu->compute_power();
- // Arbiter power
- arbiter_rfu->compute_power();
+ //Arbiter power
+ arbiter_rfu->compute_power();
- if (is_tdp) {
- // RF power -- modified by Syed
- // init stats for Peak
+ if (is_tdp)
+ {
+ //RF power -- modified by Syed
+ //init stats for Peak
- IRF->stats_t.readAc.access = 4;
- IRF->stats_t.writeAc.access = 4;
- IRF->tdp_stats = IRF->stats_t;
+ IRF->stats_t.readAc.access = 4;
+ IRF->stats_t.writeAc.access = 4;
+ IRF->tdp_stats = IRF->stats_t;
- IRF->stats_t.readAc.access = 2;
- IRF->stats_t.writeAc.access = 1;
- IRF->tdp_stats = IRF->stats_t;
+ IRF->stats_t.readAc.access = 2;
+ IRF->stats_t.writeAc.access = 1;
+ IRF->tdp_stats = IRF->stats_t;
- OPC->stats_t.readAc.access = 32;
- OPC->stats_t.writeAc.access = 32;
- OPC->tdp_stats = OPC->stats_t;
- // Commented by Syed (GPUs have a single RF which we model by IRF)
- // FRF->stats_t.readAc.access =
- // FRF->l_ip.num_rd_ports*coredynp.FPU_duty_cycle*1.05*coredynp.num_fp_pipelines;
- // FRF->stats_t.writeAc.access =
- // FRF->l_ip.num_wr_ports*coredynp.FPU_duty_cycle*1.05*coredynp.num_fp_pipelines;
- // FRF->tdp_stats = FRF->stats_t;
- if (coredynp.regWindowing) {
- RFWIN->stats_t.readAc.access = 0; // 0.5*RFWIN->l_ip.num_rw_ports;
- RFWIN->stats_t.writeAc.access = 0; // 0.5*RFWIN->l_ip.num_rw_ports;
- RFWIN->tdp_stats = RFWIN->stats_t;
- }
- } /* if (is_tdp) */
- else {
- // init stats for Runtime Dynamic (RTP)
- // in Tesla each RF operand accesses 2 banks, so multiply acceses by 2
- // (read and write energies of reg_file are per bank)(Tesla) : Syed
- // Also, for a SIMD width of 8 and warp size of 32 threads, 4 accesses
- // (each accessing 2 banks) need to be performed per operand
- if (XML->sys.architecture == 1) {
- IRF->stats_t.readAc.access =
- (XML->sys.core[ithCore].int_regfile_reads / 32) * (4 * 2); /// 1.5;
- IRF->stats_t.writeAc.access =
- (XML->sys.core[ithCore].int_regfile_writes / 32) * (4 * 2); /// 1.5;
- } else {
- IRF->stats_t.readAc.access =
- (XML->sys.core[ithCore].int_regfile_reads / 32) *
- (2 * 4); /// 1.5;//TODO: no diff on archi and phy
- IRF->stats_t.writeAc.access =
- (XML->sys.core[ithCore].int_regfile_writes / 32) * (2 * 4); /// 1.5;
- }
- IRF->rtp_stats = IRF->stats_t;
+ OPC->stats_t.readAc.access = 32;
+ OPC->stats_t.writeAc.access = 32;
+ OPC->tdp_stats = OPC->stats_t;
+
+ //Commented by Syed (GPUs have a single RF which we model by IRF)
+ //FRF->stats_t.readAc.access = FRF->l_ip.num_rd_ports*coredynp.FPU_duty_cycle*1.05*coredynp.num_fp_pipelines;
+ //FRF->stats_t.writeAc.access = FRF->l_ip.num_wr_ports*coredynp.FPU_duty_cycle*1.05*coredynp.num_fp_pipelines;
+ //FRF->tdp_stats = FRF->stats_t;
+ if (coredynp.regWindowing)
+ {
+ RFWIN->stats_t.readAc.access = 0;//0.5*RFWIN->l_ip.num_rw_ports;
+ RFWIN->stats_t.writeAc.access = 0;//0.5*RFWIN->l_ip.num_rw_ports;
+ RFWIN->tdp_stats = RFWIN->stats_t;
+ }
+ } /* if (is_tdp) */
+ else
+ {
+ //init stats for Runtime Dynamic (RTP)
+ //in Tesla each RF operand accesses 2 banks, so multiply acceses by 2
+ // (read and write energies of reg_file are per bank)(Tesla) : Syed
+ // Also, for a SIMD width of 8 and warp size of 32 threads, 4 accesses
+ // (each accessing 2 banks) need to be performed per operand
+if (XML->sys.architecture==1){
+ IRF->stats_t.readAc.access = (XML->sys.core[ithCore].int_regfile_reads/32)*(4*2);///1.5;
+ IRF->stats_t.writeAc.access = (XML->sys.core[ithCore].int_regfile_writes/32)*(4*2);///1.5;
+} else {
+ IRF->stats_t.readAc.access = (XML->sys.core[ithCore].int_regfile_reads/32)*(2*4);///1.5;//TODO: no diff on archi and phy
+ IRF->stats_t.writeAc.access = (XML->sys.core[ithCore].int_regfile_writes/32)*(2*4);///1.5;
+}
+ IRF->rtp_stats = IRF->stats_t;
+
+ OPC->stats_t.readAc.access = (XML->sys.core[ithCore].int_regfile_reads)/*/1.5*/+XML->sys.core[ithCore].non_rf_operands;///1.5;//TODO: no diff on archi and phy
+ OPC->stats_t.writeAc.access = 0;
+ OPC->rtp_stats = OPC->stats_t;
- OPC->stats_t.readAc.access =
- (XML->sys.core[ithCore].int_regfile_reads) /*/1.5*/ +
- XML->sys.core[ithCore]
- .non_rf_operands; /// 1.5;//TODO: no diff on archi and phy
- OPC->stats_t.writeAc.access = 0;
- OPC->rtp_stats = OPC->stats_t;
+ //cout<< "IRF read energy: "<< IRF->local_result.power.readOp.dynamic<<endl;
+ //cout<< "IRF write energy: "<< IRF->local_result.power.writeOp.dynamic<<endl;
+ //FRF->stats_t.readAc.access = XML->sys.core[ithCore].float_regfile_reads;
+ //FRF->stats_t.writeAc.access = XML->sys.core[ithCore].float_regfile_writes;
+ //FRF->rtp_stats = FRF->stats_t;
+ if (coredynp.regWindowing)
+ {
+ RFWIN->stats_t.readAc.access = XML->sys.core[ithCore].function_calls*16;
+ RFWIN->stats_t.writeAc.access = XML->sys.core[ithCore].function_calls*16;
+ RFWIN->rtp_stats = RFWIN->stats_t;
- // cout<< "IRF read energy: "<<
- // IRF->local_result.power.readOp.dynamic<<endl;
- // cout<< "IRF write energy: "<<
- // IRF->local_result.power.writeOp.dynamic<<endl;
- // FRF->stats_t.readAc.access = XML->sys.core[ithCore].float_regfile_reads;
- // FRF->stats_t.writeAc.access =
- // XML->sys.core[ithCore].float_regfile_writes;
- // FRF->rtp_stats = FRF->stats_t;
- if (coredynp.regWindowing) {
- RFWIN->stats_t.readAc.access = XML->sys.core[ithCore].function_calls * 16;
- RFWIN->stats_t.writeAc.access =
- XML->sys.core[ithCore].function_calls * 16;
- RFWIN->rtp_stats = RFWIN->stats_t;
+ IRF->stats_t.readAc.access = XML->sys.core[ithCore].int_regfile_reads +
+ XML->sys.core[ithCore].function_calls*16;
+ IRF->stats_t.writeAc.access = XML->sys.core[ithCore].int_regfile_writes +
+ XML->sys.core[ithCore].function_calls*16;
+ IRF->rtp_stats = IRF->stats_t;
- IRF->stats_t.readAc.access = XML->sys.core[ithCore].int_regfile_reads +
- XML->sys.core[ithCore].function_calls * 16;
- IRF->stats_t.writeAc.access = XML->sys.core[ithCore].int_regfile_writes +
- XML->sys.core[ithCore].function_calls * 16;
- IRF->rtp_stats = IRF->stats_t;
+ }
}
- }
- IRF->power_t.reset();
- FRF->power_t.reset();
- OPC->power_t.reset();
- // IRF->power_t = IRF->power_t + IRF->local_result.power;// +
- // xbar_rfu->power + arbiter_rfu->power;
+ IRF->power_t.reset();
+ FRF->power_t.reset();
+ OPC->power_t.reset();
+ //IRF->power_t = IRF->power_t + IRF->local_result.power;// + xbar_rfu->power + arbiter_rfu->power;
- IRF->power_t.readOp.dynamic =
- (IRF->stats_t.readAc.access * IRF->local_result.power.readOp.dynamic +
- IRF->stats_t.writeAc.access * IRF->local_result.power.writeOp.dynamic);
- OPC->power_t.readOp.dynamic =
- (OPC->stats_t.readAc.access * OPC->local_result.power.readOp.dynamic);
- if (coredynp.regWindowing) {
- RFWIN->power_t.reset();
- RFWIN->power_t.readOp.dynamic +=
- (RFWIN->stats_t.readAc.access *
- RFWIN->local_result.power.readOp.dynamic +
- RFWIN->stats_t.writeAc.access *
- RFWIN->local_result.power.writeOp.dynamic);
- }
+
+ IRF->power_t.readOp.dynamic = (IRF->stats_t.readAc.access*IRF->local_result.power.readOp.dynamic
+ +IRF->stats_t.writeAc.access*IRF->local_result.power.writeOp.dynamic);
+ OPC->power_t.readOp.dynamic = (OPC->stats_t.readAc.access*OPC->local_result.power.readOp.dynamic);
- if (is_tdp) {
- // cout<<"pre: IRF_power_t: "<<IRF->power.readOp.dynamic<<"
- // ("<<IRF->power.readOp.dynamic*clockRate<<") "<<" IRF_localresult: "<<
- // IRF->local_result.power.readOp.dynamic<<endl;
- // Syed: removed the multiplication of power by hardware threads
- // since the one IRF is shared by all threads in GPUs
+ if (coredynp.regWindowing)
+ {
+ RFWIN->power_t.reset();
+ RFWIN->power_t.readOp.dynamic += (RFWIN->stats_t.readAc.access*RFWIN->local_result.power.readOp.dynamic +
+ RFWIN->stats_t.writeAc.access*RFWIN->local_result.power.writeOp.dynamic);
+ }
- // FRF->power = FRF->power_t + FRF->local_result.power
- // *coredynp.pppm_lkg_multhread;
+ if (is_tdp)
+ {
- double pppm_lkg_banks[4];
- set_pppm(pppm_lkg_banks, 0, XML->sys.core[ithCore].collector_units,
- XML->sys.core[ithCore].collector_units);
- IRF->power = (IRF->power_t) + IRF->local_result.power * pppm_lkg;
- IRF->power.readOp.dynamic = IRF->power_t.readOp.dynamic * 1;
- OPC->power = (OPC->power_t) + OPC->local_result.power * pppm_lkg_banks;
- OPC->power.readOp.dynamic = OPC->power_t.readOp.dynamic * 1;
+ //cout<<"pre: IRF_power_t: "<<IRF->power.readOp.dynamic<<" ("<<IRF->power.readOp.dynamic*clockRate<<") "<<" IRF_localresult: "<<
+ // IRF->local_result.power.readOp.dynamic<<endl;
+ //Syed: removed the multiplication of power by hardware threads
+ //since the one IRF is shared by all threads in GPUs
- power = power + (IRF->power + OPC->power);
+ //FRF->power = FRF->power_t + FRF->local_result.power *coredynp.pppm_lkg_multhread;
- if (coredynp.regWindowing) {
- RFWIN->power = RFWIN->power_t + RFWIN->local_result.power * pppm_lkg;
- power = power + RFWIN->power;
- }
- } /* if (is_tdp) */
- else {
- // Removed *coredynp.pppm_lkg_multhread since all hardware threads shared
- // the same IRF
- IRF->rt_power =
- IRF->power_t +
- IRF->local_result.power * pppm_lkg; /* *coredynp.pppm_lkg_multhread;*/
- OPC->rt_power = OPC->power_t + OPC->local_result.power * pppm_lkg;
- if (XML->sys.architecture == 1) {
- // Each warp operand accesses the crossbar
- xbar_rfu->rt_power.readOp.dynamic =
- ((XML->sys.core[ithCore].int_regfile_reads / (32 /**1.5*/)) +
- (XML->sys.core[ithCore].non_rf_operands / (32 /**1.5*/))) *
- xbar_rfu->power.readOp.dynamic;
- } else {
- xbar_rfu->rt_power.readOp.dynamic =
- ((XML->sys.core[ithCore].int_regfile_reads / (32 /**1.5*/)) +
- (XML->sys.core[ithCore].non_rf_operands / (32 /**1.5*/))) *
- xbar_rfu->power.readOp.dynamic;
- }
- arbiter_rfu->rt_power.readOp.dynamic =
- ((XML->sys.core[ithCore].int_regfile_reads / (32 /**1.5*/)) +
- (XML->sys.core[ithCore].non_rf_operands / (32 /**1.5*/))) *
- arbiter_rfu->power.readOp.dynamic;
+ double pppm_lkg_banks[4];
+ set_pppm(pppm_lkg_banks, 0,XML->sys.core[ithCore].collector_units,XML->sys.core[ithCore].collector_units );
+ IRF->power = (IRF->power_t) + IRF->local_result.power*pppm_lkg;
+ IRF->power.readOp.dynamic=IRF->power_t.readOp.dynamic*1;
+ OPC->power = (OPC->power_t) + OPC->local_result.power *pppm_lkg_banks;
+ OPC->power.readOp.dynamic=OPC->power_t.readOp.dynamic*1;
- rt_power =
- rt_power + (IRF->power_t /*+ FRF->power_t*/ + xbar_rfu->rt_power +
- arbiter_rfu->rt_power + OPC->power_t);
- if (coredynp.regWindowing) {
- RFWIN->rt_power = RFWIN->power_t + RFWIN->local_result.power * pppm_lkg;
- rt_power = rt_power + RFWIN->rt_power;
- }
- }
+
+ power = power + (IRF->power+OPC->power);
+
+
+ if (coredynp.regWindowing)
+ {
+ RFWIN->power = RFWIN->power_t + RFWIN->local_result.power *pppm_lkg;
+ power = power + RFWIN->power;
+ }
+ } /* if (is_tdp) */
+ else
+ {
+ //Removed *coredynp.pppm_lkg_multhread since all hardware threads shared the same IRF
+ IRF->rt_power = IRF->power_t + IRF->local_result.power*pppm_lkg;/* *coredynp.pppm_lkg_multhread;*/
+ OPC->rt_power = OPC->power_t + OPC->local_result.power*pppm_lkg;
+if(XML->sys.architecture==1){
+ //Each warp operand accesses the crossbar
+ xbar_rfu->rt_power.readOp.dynamic=((XML->sys.core[ithCore].int_regfile_reads/(32/**1.5*/))+(XML->sys.core[ithCore].non_rf_operands/(32/**1.5*/)))*xbar_rfu->power.readOp.dynamic;
+} else {
+ xbar_rfu->rt_power.readOp.dynamic=((XML->sys.core[ithCore].int_regfile_reads/(32/**1.5*/))+(XML->sys.core[ithCore].non_rf_operands/(32/**1.5*/)))*xbar_rfu->power.readOp.dynamic;
}
+ arbiter_rfu->rt_power.readOp.dynamic=((XML->sys.core[ithCore].int_regfile_reads/(32/**1.5*/))+(XML->sys.core[ithCore].non_rf_operands/(32/**1.5*/)))*arbiter_rfu->power.readOp.dynamic;
-void RegFU::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
- if (is_tdp) {
- cout << indent_str << "Register file banks: " << endl;
- cout << indent_str_next << "Area = " << IRF->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << IRF->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? IRF->power.readOp.longer_channel_leakage
- : IRF->power.readOp.leakage)
- << " W" << endl;
+ rt_power = rt_power + (IRF->power_t /*+ FRF->power_t*/+xbar_rfu->rt_power+arbiter_rfu->rt_power+OPC->power_t);
+ if (coredynp.regWindowing)
+ {
+ RFWIN->rt_power = RFWIN->power_t + RFWIN->local_result.power *pppm_lkg;
+ rt_power = rt_power + RFWIN->rt_power;
+ }
+ }
+}
- cout << indent_str_next
- << "Gate Leakage = " << IRF->power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next
- << "Runtime Dynamic = " << IRF->rt_power.readOp.dynamic / executionTime
- << " W" << endl;
- cout << endl;
- cout << indent_str << "Crossbar (Integer RF):" << endl;
- cout << indent_str_next << "Area = " << xbar_rfu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << xbar_rfu->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? xbar_rfu->power.readOp.longer_channel_leakage
- : xbar_rfu->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << xbar_rfu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << xbar_rfu->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
+void RegFU::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
- cout << indent_str << "Arbiter (Integer RF):" << endl;
- cout << indent_str_next << "Area = " << arbiter_rfu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << arbiter_rfu->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? arbiter_rfu->power.readOp.longer_channel_leakage
- : arbiter_rfu->power.readOp.leakage)
- << " W" << endl;
+ if (is_tdp)
+ { cout << indent_str << "Register file banks: " << endl;
+ cout << indent_str_next << "Area = " << IRF->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << IRF->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? IRF->power.readOp.longer_channel_leakage:IRF->power.readOp.leakage) <<" W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << arbiter_rfu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << arbiter_rfu->rt_power.readOp.dynamic / executionTime << " W"
- << endl;
- cout << endl;
+ cout << indent_str_next << "Gate Leakage = " << IRF->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << IRF->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ cout << indent_str << "Crossbar (Integer RF):" << endl;
+ cout << indent_str_next << "Area = " << xbar_rfu->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << xbar_rfu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? xbar_rfu->power.readOp.longer_channel_leakage:xbar_rfu->power.readOp.leakage) <<" W" << endl;
- /*
- cout << indent_str<< "Floating Point RF:" << endl;
- cout << indent_str_next << "Area = " << FRF->area.get_area()*1e-6 << "
- mm^2" << endl;
- cout << indent_str_next << "Peak Dynamic = " <<
- FRF->power.readOp.dynamic*clockRate << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel?
- FRF->power.readOp.longer_channel_leakage:FRF->power.readOp.leakage) << " W"
- << endl;
- cout << indent_str_next << "Gate Leakage = " <<
- FRF->power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "Runtime Dynamic = " <<
- FRF->rt_power.readOp.dynamic/executionTime << " W" << endl;
- cout <<endl;
- */
- if (coredynp.regWindowing) {
- cout << indent_str << "Register Windows:" << endl;
- cout << indent_str_next << "Area = " << RFWIN->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << RFWIN->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? RFWIN->power.readOp.longer_channel_leakage
- : RFWIN->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << RFWIN->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << RFWIN->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- }
- } else {
- cout << indent_str_next << "Integer RF Peak Dynamic = "
- << IRF->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Integer RF Subthreshold Leakage = "
- << IRF->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next
- << "Integer RF Gate Leakage = " << IRF->rt_power.readOp.gate_leakage
- << " W" << endl;
- cout << indent_str_next << "Floating Point RF Peak Dynamic = "
- << FRF->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Floating Point RF Subthreshold Leakage = "
- << FRF->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Floating Point RF Gate Leakage = "
- << FRF->rt_power.readOp.gate_leakage << " W" << endl;
- if (coredynp.regWindowing) {
- cout << indent_str_next << "Register Windows Peak Dynamic = "
- << RFWIN->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Register Windows Subthreshold Leakage = "
- << RFWIN->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Register Windows Gate Leakage = "
- << RFWIN->rt_power.readOp.gate_leakage << " W" << endl;
- }
- }
+ cout << indent_str_next << "Gate Leakage = " << xbar_rfu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << xbar_rfu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+
+ cout << indent_str << "Arbiter (Integer RF):" << endl;
+ cout << indent_str_next << "Area = " << arbiter_rfu->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << arbiter_rfu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? arbiter_rfu->power.readOp.longer_channel_leakage:arbiter_rfu->power.readOp.leakage) <<" W" << endl;
+
+ cout << indent_str_next << "Gate Leakage = " << arbiter_rfu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << arbiter_rfu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+
+ /*
+ cout << indent_str<< "Floating Point RF:" << endl;
+ cout << indent_str_next << "Area = " << FRF->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << FRF->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? FRF->power.readOp.longer_channel_leakage:FRF->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << FRF->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << FRF->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ */
+ if (coredynp.regWindowing)
+ {
+ cout << indent_str << "Register Windows:" << endl;
+ cout << indent_str_next << "Area = " << RFWIN->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << RFWIN->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? RFWIN->power.readOp.longer_channel_leakage:RFWIN->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << RFWIN->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << RFWIN->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ }
+ else
+ {
+ cout << indent_str_next << "Integer RF Peak Dynamic = " << IRF->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Integer RF Subthreshold Leakage = " << IRF->rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Integer RF Gate Leakage = " << IRF->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Floating Point RF Peak Dynamic = " << FRF->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Floating Point RF Subthreshold Leakage = " << FRF->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Floating Point RF Gate Leakage = " << FRF->rt_power.readOp.gate_leakage << " W" << endl;
+ if (coredynp.regWindowing)
+ {
+ cout << indent_str_next << "Register Windows Peak Dynamic = " << RFWIN->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Register Windows Subthreshold Leakage = " << RFWIN->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Register Windows Gate Leakage = " << RFWIN->rt_power.readOp.gate_leakage << " W" << endl;
+ }
+ }
}
-void EXECU::computeEnergy(bool is_tdp) {
- if (!exist) return;
- // Syed
- double pppm_t[4] = {1, 1, 1, 1};
- double pppm_freqScaling[4] = {rf_fu_clockRate / clockRate, 1, 1, 1};
- executionTime =
- XML->sys.total_cycles / (XML->sys.target_core_clockrate * 1e6); // Syed
- // rfu->power.reset();
+void EXECU::computeEnergy(bool is_tdp)
+{
+ if (!exist) return;
+ //Syed
+ double pppm_t[4] = {1,1,1,1};
+ double pppm_freqScaling[4] = {rf_fu_clockRate/clockRate,1,1,1};
+ executionTime=XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6);//Syed
+
+
+// rfu->power.reset();
rfu->rt_power.reset();
- // scheu->power.reset();
- scheu->rt_power.reset();
- // exeu->power.reset();
- exeu->rt_power.reset();
+// scheu->power.reset();
+ scheu->rt_power.reset();
+// exeu->power.reset();
+ exeu->rt_power.reset();
- rfu->computeEnergy(is_tdp);
- scheu->computeEnergy(is_tdp);
- exeu->computeEnergy(is_tdp);
- if (coredynp.num_fpus > 0) {
+ rfu->computeEnergy(is_tdp);
+ scheu->computeEnergy(is_tdp);
+ exeu->computeEnergy(is_tdp);
+ if (coredynp.num_fpus >0)
+ {
fp_u->rt_power.reset();
- fp_u->computeEnergy(is_tdp);
- }
- if (coredynp.num_muls > 0) {
+ fp_u->computeEnergy(is_tdp);
+ }
+ if (coredynp.num_muls >0)
+ {
mul->rt_power.reset();
- mul->computeEnergy(is_tdp);
- }
+ mul->computeEnergy(is_tdp);
+ }
bypass.rt_power.reset();
- if (is_tdp) {
- set_pppm(pppm_t, 2 * coredynp.ALU_cdb_duty_cycle, 2, 2,
- 2 * coredynp.ALU_cdb_duty_cycle); // 2 means two source operands
- // needs to be passed for each
- // int instruction.
- // bypass.power = bypass.power + intTagBypass->power*pppm_t +
- // int_bypass->power*pppm_t;
- if (coredynp.num_muls > 0) {
- set_pppm(pppm_t, 2 * coredynp.MUL_cdb_duty_cycle, 2, 2,
- 2 * coredynp.MUL_cdb_duty_cycle); // 2 means two source operands
- // needs to be passed for each
- // int instruction.
- // No conventional bypassing in GPU (Syed)
- // bypass.power = bypass.power + intTag_mul_Bypass->power*pppm_t +
- // int_mul_bypass->power*pppm_t;
- power = power + mul->power * pppm_freqScaling;
- }
+ if (is_tdp)
+ {
+ set_pppm(pppm_t, 2*coredynp.ALU_cdb_duty_cycle, 2, 2, 2*coredynp.ALU_cdb_duty_cycle);//2 means two source operands needs to be passed for each int instruction.
+ //bypass.power = bypass.power + intTagBypass->power*pppm_t + int_bypass->power*pppm_t;
+ if (coredynp.num_muls >0)
+ {
+ set_pppm(pppm_t, 2*coredynp.MUL_cdb_duty_cycle, 2, 2, 2*coredynp.MUL_cdb_duty_cycle);//2 means two source operands needs to be passed for each int instruction.
+ //No conventional bypassing in GPU (Syed)
+ //bypass.power = bypass.power + intTag_mul_Bypass->power*pppm_t + int_mul_bypass->power*pppm_t;
+ power = power + mul->power*pppm_freqScaling;
+ }
- if (coredynp.num_fpus > 0) {
- set_pppm(pppm_t, 3 * coredynp.FPU_cdb_duty_cycle, 3, 3,
- 3 * coredynp.FPU_cdb_duty_cycle); // 3 means three source
- // operands needs to be passed
- // for each fp instruction.
- // No conventional bypassing in GPU (Syed)
- // bypass.power = bypass.power + fp_bypass->power*pppm_t +
- // fpTagBypass->power*pppm_t ;
- power = power + fp_u->power * pppm_freqScaling;
- }
- // No conventional bypassing in GPU (Syed)
+ if (coredynp.num_fpus>0)
+ {
+ set_pppm(pppm_t, 3*coredynp.FPU_cdb_duty_cycle, 3, 3, 3*coredynp.FPU_cdb_duty_cycle);//3 means three source operands needs to be passed for each fp instruction.
+ //No conventional bypassing in GPU (Syed)
+ //bypass.power = bypass.power + fp_bypass->power*pppm_t + fpTagBypass->power*pppm_t ;
+ power = power + fp_u->power*pppm_freqScaling;
- power = power + rfu->power * pppm_freqScaling +
- exeu->power * pppm_freqScaling /*+ bypass.power*/ + scheu->power;
+ }
+ //No conventional bypassing in GPU (Syed)
- } else {
- set_pppm(pppm_t, XML->sys.core[ithCore].cdb_alu_accesses, 2, 2,
- XML->sys.core[ithCore].cdb_alu_accesses);
- // bypass.rt_power = bypass.rt_power + intTagBypass->power*pppm_t;
- // bypass.rt_power = bypass.rt_power + int_bypass->power*pppm_t;
+ power = power + rfu->power*pppm_freqScaling + exeu->power*pppm_freqScaling /*+ bypass.power*/ + scheu->power
+ ;
- if (coredynp.num_muls > 0) {
- set_pppm(pppm_t, XML->sys.core[ithCore].cdb_mul_accesses, 2, 2,
- XML->sys.core[ithCore].cdb_mul_accesses); // 2 means two source
- // operands needs to
- // be passed for each
- // int instruction.
- // bypass.rt_power = bypass.rt_power + intTag_mul_Bypass->power*pppm_t +
- // int_mul_bypass->power*pppm_t;
- rt_power = rt_power + mul->rt_power;
- }
- if (coredynp.num_fpus > 0) {
- set_pppm(pppm_t, XML->sys.core[ithCore].cdb_fpu_accesses, 3, 3,
- XML->sys.core[ithCore].cdb_fpu_accesses);
- // bypass.rt_power = bypass.rt_power + fp_bypass->power*pppm_t;
- // bypass.rt_power = bypass.rt_power + fpTagBypass->power*pppm_t;
- rt_power = rt_power + fp_u->rt_power;
- }
- // No conventional bypassing in GPU (Syed)
- rt_power = rt_power + rfu->rt_power * pppm_freqScaling +
- exeu->rt_power * pppm_freqScaling +
- /*bypass.rt_power +*/ scheu->rt_power;
- }
+ }
+ else
+ {
+ set_pppm(pppm_t, XML->sys.core[ithCore].cdb_alu_accesses, 2, 2, XML->sys.core[ithCore].cdb_alu_accesses);
+ //bypass.rt_power = bypass.rt_power + intTagBypass->power*pppm_t;
+ //bypass.rt_power = bypass.rt_power + int_bypass->power*pppm_t;
+
+ if (coredynp.num_muls >0)
+ {
+ set_pppm(pppm_t, XML->sys.core[ithCore].cdb_mul_accesses, 2, 2, XML->sys.core[ithCore].cdb_mul_accesses);//2 means two source operands needs to be passed for each int instruction.
+ //bypass.rt_power = bypass.rt_power + intTag_mul_Bypass->power*pppm_t + int_mul_bypass->power*pppm_t;
+ rt_power = rt_power + mul->rt_power;
+ }
+
+ if (coredynp.num_fpus>0)
+ {
+ set_pppm(pppm_t, XML->sys.core[ithCore].cdb_fpu_accesses, 3, 3, XML->sys.core[ithCore].cdb_fpu_accesses);
+ //bypass.rt_power = bypass.rt_power + fp_bypass->power*pppm_t;
+ //bypass.rt_power = bypass.rt_power + fpTagBypass->power*pppm_t;
+ rt_power = rt_power + fp_u->rt_power;
+ }
+ //No conventional bypassing in GPU (Syed)
+ rt_power = rt_power + rfu->rt_power*pppm_freqScaling + exeu->rt_power*pppm_freqScaling + /*bypass.rt_power +*/ scheu->rt_power;
+ }
}
-void EXECU::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- if (!exist) return;
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
+void EXECU::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ if (!exist) return;
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
+
+
+// cout << indent_str_next << "Results Broadcast Bus Area = " << bypass->area.get_area() *1e-6 << " mm^2" << endl;
+ if (is_tdp)
+ {
+ cout << indent_str << "Register Files:" << endl;
+ cout << indent_str_next << "Area = " << rfu->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << rfu->power.readOp.dynamic*rf_fu_clockRate << " W" << endl;
+ //cout << "rf_fu Clock rate: "<< rf_fu_clockRate<<endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? rfu->power.readOp.longer_channel_leakage:rfu->power.readOp.leakage) <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << rfu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << rfu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel>3){
+ rfu->displayEnergy(indent+4,is_tdp);
+ }
+ cout << indent_str << "Instruction Scheduler:" << endl;
+ cout << indent_str_next << "Area = " << scheu->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << scheu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? scheu->power.readOp.longer_channel_leakage:scheu->power.readOp.leakage) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << scheu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << scheu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel>3){
+ scheu->displayEnergy(indent+4,is_tdp);
+ }
+ exeu->displayEnergy(indent,is_tdp);
+ if (coredynp.num_fpus>0)
+ {
+ fp_u->displayEnergy(indent,is_tdp);
+ }
+ if (coredynp.num_muls >0)
+ {
+ mul->displayEnergy(indent,is_tdp);
+ }
+ cout << indent_str << "Results Broadcast Bus:" << endl;
+ cout << indent_str_next << "Area Overhead = " << bypass.area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << bypass.power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? bypass.power.readOp.longer_channel_leakage:bypass.power.readOp.leakage ) << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << bypass.power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << bypass.rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ }
+ else
+ {
+ cout << indent_str_next << "Register Files Peak Dynamic = " << rfu->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Register Files Subthreshold Leakage = " << rfu->rt_power.readOp.leakage <<" W" << endl;
+ cout << indent_str_next << "Register Files Gate Leakage = " << rfu->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Instruction Sheduler Peak Dynamic = " << scheu->rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Instruction Sheduler Subthreshold Leakage = " << scheu->rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Instruction Sheduler Gate Leakage = " << scheu->rt_power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Results Broadcast Bus Peak Dynamic = " << bypass.rt_power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Results Broadcast Bus Subthreshold Leakage = " << bypass.rt_power.readOp.leakage << " W" << endl;
+ cout << indent_str_next << "Results Broadcast Bus Gate Leakage = " << bypass.rt_power.readOp.gate_leakage << " W" << endl;
+ }
- // cout << indent_str_next << "Results Broadcast Bus Area = " <<
- //bypass->area.get_area() *1e-6 << " mm^2" << endl;
- if (is_tdp) {
- cout << indent_str << "Register Files:" << endl;
- cout << indent_str_next << "Area = " << rfu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << rfu->power.readOp.dynamic * rf_fu_clockRate
- << " W" << endl;
- // cout << "rf_fu Clock rate: "<< rf_fu_clockRate<<endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? rfu->power.readOp.longer_channel_leakage
- : rfu->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << rfu->power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next
- << "Runtime Dynamic = " << rfu->rt_power.readOp.dynamic / executionTime
- << " W" << endl;
- cout << endl;
- if (plevel > 3) {
- rfu->displayEnergy(indent + 4, is_tdp);
- }
- cout << indent_str << "Instruction Scheduler:" << endl;
- cout << indent_str_next << "Area = " << scheu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << scheu->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? scheu->power.readOp.longer_channel_leakage
- : scheu->power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << scheu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << scheu->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (plevel > 3) {
- scheu->displayEnergy(indent + 4, is_tdp);
- }
- exeu->displayEnergy(indent, is_tdp);
- if (coredynp.num_fpus > 0) {
- fp_u->displayEnergy(indent, is_tdp);
- }
- if (coredynp.num_muls > 0) {
- mul->displayEnergy(indent, is_tdp);
- }
- cout << indent_str << "Results Broadcast Bus:" << endl;
- cout << indent_str_next
- << "Area Overhead = " << bypass.area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << bypass.power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? bypass.power.readOp.longer_channel_leakage
- : bypass.power.readOp.leakage)
- << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << bypass.power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << bypass.rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- } else {
- cout << indent_str_next << "Register Files Peak Dynamic = "
- << rfu->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Register Files Subthreshold Leakage = "
- << rfu->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Register Files Gate Leakage = "
- << rfu->rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "Instruction Sheduler Peak Dynamic = "
- << scheu->rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Instruction Sheduler Subthreshold Leakage = "
- << scheu->rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Instruction Sheduler Gate Leakage = "
- << scheu->rt_power.readOp.gate_leakage << " W" << endl;
- cout << indent_str_next << "Results Broadcast Bus Peak Dynamic = "
- << bypass.rt_power.readOp.dynamic * clockRate << " W" << endl;
- cout << indent_str_next << "Results Broadcast Bus Subthreshold Leakage = "
- << bypass.rt_power.readOp.leakage << " W" << endl;
- cout << indent_str_next << "Results Broadcast Bus Gate Leakage = "
- << bypass.rt_power.readOp.gate_leakage << " W" << endl;
- }
}
-// Jingwen
-void Core::compute() {
- // power_point_product_masks
- double pppm_t[4] = {1, 1, 1, 1};
- double rtp_pipeline_coe;
- double num_units = 4.0;
- Pipeline_energy = 0;
- // Set pipeline duty cycle for this inteval
- coredynp.pipeline_duty_cycle = XML->sys.core[ithCore].pipeline_duty_cycle;
- rt_power.reset();
- ifu->rt_power.reset();
- lsu->rt_power.reset();
- mmu->rt_power.reset();
- exu->rt_power.reset();
- ifu->computeEnergy(false);
- lsu->computeEnergy(false);
- mmu->computeEnergy(false);
- exu->computeEnergy(false);
- if (XML->sys.homogeneous_cores == 1) {
- rtp_pipeline_coe = coredynp.pipeline_duty_cycle * XML->sys.total_cycles *
- XML->sys.number_of_cores;
- } else {
- rtp_pipeline_coe = coredynp.pipeline_duty_cycle * coredynp.total_cycles;
- // Jingwen
- if (coredynp.total_cycles != XML->sys.total_cycles) {
- cout << "total cycle not match!" << endl;
- exit(1);
- }
- }
- set_pppm(pppm_t, coredynp.num_pipelines * rtp_pipeline_coe / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- if (ifu->exist) {
- Pipeline_energy += corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- ifu->rt_power = ifu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + ifu->rt_power;
- }
+//Jingwen
+void Core::compute()
+{
+ //power_point_product_masks
+ double pppm_t[4] = {1,1,1,1};
+ double rtp_pipeline_coe;
+ double num_units = 4.0;
+ Pipeline_energy=0;
- if (lsu->exist) {
- Pipeline_energy += corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- lsu->rt_power = lsu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + lsu->rt_power;
- }
- if (exu->exist) {
- Pipeline_energy += corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- exu->rt_power = exu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + exu->rt_power;
- }
- if (mmu->exist) {
- Pipeline_energy += corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- mmu->rt_power = mmu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + mmu->rt_power;
- }
+ //Set pipeline duty cycle for this inteval
+ coredynp.pipeline_duty_cycle=XML->sys.core[ithCore].pipeline_duty_cycle;
+ rt_power.reset();
+ ifu->rt_power.reset();
+ lsu->rt_power.reset();
+ mmu->rt_power.reset();
+ exu->rt_power.reset();
- rt_power = rt_power + undiffCore->power;
- if (XML->sys.Private_L2) {
- l2cache->computeEnergy(false);
- rt_power = rt_power + l2cache->rt_power;
- }
+ ifu->computeEnergy(false);
+ lsu->computeEnergy(false);
+ mmu->computeEnergy(false);
+ exu->computeEnergy(false);
+
+
+ if (XML->sys.homogeneous_cores==1)
+ {
+ rtp_pipeline_coe = coredynp.pipeline_duty_cycle * XML->sys.total_cycles * XML->sys.number_of_cores;
+ }
+ else
+ {
- IdleCoreEnergy =
- XML->sys.num_idle_cores * XML->sys.idle_core_power * executionTime;
+ rtp_pipeline_coe = coredynp.pipeline_duty_cycle * coredynp.total_cycles;
+ //Jingwen
+ if (coredynp.total_cycles != XML->sys.total_cycles)
+ {
+ cout << "total cycle not match!" << endl;
+ exit(1);
+ }
+ }
+
+ set_pppm(pppm_t, coredynp.num_pipelines*rtp_pipeline_coe/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+
+ if (ifu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ ifu->rt_power = ifu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + ifu->rt_power ;
+ }
+
+ if (lsu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ lsu->rt_power = lsu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + lsu->rt_power;
+ }
+ if (exu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ exu->rt_power = exu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + exu->rt_power;
+ }
+ if (mmu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ mmu->rt_power = mmu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + mmu->rt_power ;
+ }
+
+ rt_power = rt_power + undiffCore->power;
+
+
+ if (XML->sys.Private_L2)
+ {
+
+ l2cache->computeEnergy(false);
+ rt_power = rt_power + l2cache->rt_power;
+ }
+
+ IdleCoreEnergy=XML->sys.num_idle_cores * XML->sys.idle_core_power* executionTime;
+
+ rt_power.readOp.dynamic += IdleCoreEnergy;
- rt_power.readOp.dynamic += IdleCoreEnergy;
}
-void Core::computeEnergy(bool is_tdp) {
- // power_point_product_masks
- double pppm_t[4] = {1, 1, 1, 1};
- double rtp_pipeline_coe;
- double num_units = 4.0;
- Pipeline_energy = 0;
- if (XML->sys.homogeneous_cores == 1) {
- rtp_pipeline_coe = coredynp.pipeline_duty_cycle * XML->sys.total_cycles *
- XML->sys.number_of_cores;
- } else {
- rtp_pipeline_coe = coredynp.pipeline_duty_cycle * coredynp.total_cycles;
- }
- if (is_tdp) {
- ifu->computeEnergy(is_tdp);
- lsu->computeEnergy(is_tdp);
- mmu->computeEnergy(is_tdp);
- exu->computeEnergy(is_tdp);
- if (coredynp.core_ty == OOO) {
- num_units = 5.0;
- rnu->computeEnergy(is_tdp);
- set_pppm(pppm_t, coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- if (rnu->exist) {
- rnu->power = rnu->power + corepipe->power * pppm_t;
- power = power + rnu->power;
- }
- }
+void Core::computeEnergy(bool is_tdp)
+{
+ //power_point_product_masks
+ double pppm_t[4] = {1,1,1,1};
+ double rtp_pipeline_coe;
+ double num_units = 4.0;
+ Pipeline_energy=0;
- if (ifu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- set_pppm(pppm_t,
- coredynp.num_pipelines / num_units * coredynp.IFU_duty_cycle,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- // cout << "IFU = " <<
- //ifu->power.readOp.dynamic*clockRate << " W" << endl;
- ifu->power = ifu->power + corepipe->power * pppm_t;
- // cout << "IFU = " <<
- //ifu->power.readOp.dynamic*clockRate << " W" << endl;
- // cout << "1/4 pipe = " <<
- //corepipe->power.readOp.dynamic*clockRate/num_units << " W" << endl;
- power = power + ifu->power;
- // cout << "core = " <<
- //power.readOp.dynamic*clockRate << " W" << endl;
- }
- if (lsu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- set_pppm(pppm_t,
- coredynp.num_pipelines / num_units * coredynp.LSU_duty_cycle,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- lsu->power = lsu->power + corepipe->power * pppm_t;
- // cout << "LSU = " <<
- //lsu->power.readOp.dynamic*clockRate << " W" << endl;
- power = power + lsu->power;
- // cout << "core = " <<
- //power.readOp.dynamic*clockRate << " W" << endl;
- }
- if (exu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- set_pppm(pppm_t,
- coredynp.num_pipelines / num_units * coredynp.ALU_duty_cycle,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- // cout<<"ExPowerScalingFactor:"<<coredynp.num_pipelines/num_units*coredynp.ALU_duty_cycle<<endl;
- exu->power = exu->power + corepipe->power * pppm_t;
- // cout << "EXE = " <<
- //exu->power.readOp.dynamic*clockRate << " W" << endl;
- power = power + exu->power;
- // cout << "core = " <<
- //power.readOp.dynamic*clockRate << " W" << endl;
+ if (XML->sys.homogeneous_cores==1)
+ {
+ rtp_pipeline_coe = coredynp.pipeline_duty_cycle * XML->sys.total_cycles * XML->sys.number_of_cores;
}
- if (mmu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- set_pppm(pppm_t, coredynp.num_pipelines / num_units *
- (0.5 + 0.5 * coredynp.LSU_duty_cycle),
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- mmu->power = mmu->power + corepipe->power * pppm_t;
- // cout << "MMU = " <<
- //mmu->power.readOp.dynamic*clockRate << " W" << endl;
- power = power + mmu->power;
- // cout << "core = " <<
- //power.readOp.dynamic*clockRate << " W" << endl;
+ else
+ {
+ rtp_pipeline_coe = coredynp.pipeline_duty_cycle * coredynp.total_cycles;
}
+
- power = power + undiffCore->power;
+ if (is_tdp)
+ {
+ ifu->computeEnergy(is_tdp);
+ lsu->computeEnergy(is_tdp);
+ mmu->computeEnergy(is_tdp);
+ exu->computeEnergy(is_tdp);
- if (XML->sys.Private_L2) {
- l2cache->computeEnergy(is_tdp);
- set_pppm(pppm_t, l2cache->cachep.clockRate / clockRate, 1, 1, 1);
- // l2cache->power = l2cache->power*pppm_t;
- power = power + l2cache->power * pppm_t;
- }
+ if (coredynp.core_ty==OOO)
+ {
+ num_units = 5.0;
+ rnu->computeEnergy(is_tdp);
+ set_pppm(pppm_t, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+ if (rnu->exist)
+ {
+ rnu->power = rnu->power + corepipe->power*pppm_t;
+ power = power + rnu->power;
+ }
+ }
+
+ if (ifu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ set_pppm(pppm_t, coredynp.num_pipelines/num_units*coredynp.IFU_duty_cycle, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+// cout << "IFU = " << ifu->power.readOp.dynamic*clockRate << " W" << endl;
+ ifu->power = ifu->power + corepipe->power*pppm_t;
+// cout << "IFU = " << ifu->power.readOp.dynamic*clockRate << " W" << endl;
+// cout << "1/4 pipe = " << corepipe->power.readOp.dynamic*clockRate/num_units << " W" << endl;
+ power = power + ifu->power;
+// cout << "core = " << power.readOp.dynamic*clockRate << " W" << endl;
+ }
+ if (lsu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ set_pppm(pppm_t, coredynp.num_pipelines/num_units*coredynp.LSU_duty_cycle, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+ lsu->power = lsu->power + corepipe->power*pppm_t;
+// cout << "LSU = " << lsu->power.readOp.dynamic*clockRate << " W" << endl;
+ power = power + lsu->power;
+// cout << "core = " << power.readOp.dynamic*clockRate << " W" << endl;
+ }
+ if (exu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ set_pppm(pppm_t, coredynp.num_pipelines/num_units*coredynp.ALU_duty_cycle, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+ //cout<<"ExPowerScalingFactor:"<<coredynp.num_pipelines/num_units*coredynp.ALU_duty_cycle<<endl;
+ exu->power = exu->power + corepipe->power*pppm_t;
+// cout << "EXE = " << exu->power.readOp.dynamic*clockRate << " W" << endl;
+ power = power + exu->power;
+// cout << "core = " << power.readOp.dynamic*clockRate << " W" << endl;
+ }
+ if (mmu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ set_pppm(pppm_t, coredynp.num_pipelines/num_units*(0.5+0.5*coredynp.LSU_duty_cycle), coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+ mmu->power = mmu->power + corepipe->power*pppm_t;
+// cout << "MMU = " << mmu->power.readOp.dynamic*clockRate << " W" << endl;
+ power = power + mmu->power;
+// cout << "core = " << power.readOp.dynamic*clockRate << " W" << endl;
+ }
+
+ power = power + undiffCore->power;
- } else {
+ if (XML->sys.Private_L2)
+ {
+
+ l2cache->computeEnergy(is_tdp);
+ set_pppm(pppm_t,l2cache->cachep.clockRate/clockRate, 1,1,1);
+ //l2cache->power = l2cache->power*pppm_t;
+ power = power + l2cache->power*pppm_t;
+ }
+
+ }
+ else
+ {
rt_power.reset();
- ifu->computeEnergy(is_tdp);
- lsu->computeEnergy(is_tdp);
- mmu->computeEnergy(is_tdp);
- exu->computeEnergy(is_tdp);
- if (coredynp.core_ty == OOO) {
- num_units = 5.0;
- rnu->computeEnergy(is_tdp);
- set_pppm(pppm_t, coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- if (rnu->exist) {
- rnu->rt_power = rnu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + rnu->rt_power;
- }
- } else {
- set_pppm(pppm_t, coredynp.num_pipelines * rtp_pipeline_coe / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units,
- coredynp.num_pipelines / num_units);
- }
- if (ifu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- ifu->rt_power = ifu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + ifu->rt_power;
- }
- if (lsu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- lsu->rt_power = lsu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + lsu->rt_power;
- }
- if (exu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- exu->rt_power = exu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + exu->rt_power;
- }
- if (mmu->exist) {
- Pipeline_energy +=
- corepipe->power.readOp.dynamic *
- (coredynp.num_pipelines * rtp_pipeline_coe / num_units);
- mmu->rt_power = mmu->rt_power + corepipe->power * pppm_t;
- rt_power = rt_power + mmu->rt_power;
- }
- rt_power = rt_power + undiffCore->power;
- // cout << "EXE = " << exu->power.readOp.dynamic*clockRate << " W" <<
- //endl;
- if (XML->sys.Private_L2) {
- l2cache->computeEnergy(is_tdp);
- // set_pppm(pppm_t,1/l2cache->cachep.executionTime, 1,1,1);
- // l2cache->rt_power = l2cache->rt_power*pppm_t;
- rt_power = rt_power + l2cache->rt_power;
- }
- }
-}
+ ifu->computeEnergy(is_tdp);
+ lsu->computeEnergy(is_tdp);
+ mmu->computeEnergy(is_tdp);
+ exu->computeEnergy(is_tdp);
+ if (coredynp.core_ty==OOO)
+ {
+ num_units = 5.0;
+ rnu->computeEnergy(is_tdp);
+ set_pppm(pppm_t, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+ if (rnu->exist)
+ {
+ rnu->rt_power = rnu->rt_power + corepipe->power*pppm_t;
-void Core::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
- if (is_tdp) {
- cout << "Core:" << endl;
- cout << indent_str << "Area = " << area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str << "Peak Dynamic = " << power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str << "Subthreshold Leakage = "
- << (long_channel ? power.readOp.longer_channel_leakage
- : power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str << "Subthreshold Leakage = " <<
- // power.readOp.longer_channel_leakage <<" W" << endl;
- cout << indent_str << "Gate Leakage = " << power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str
- << "Runtime Dynamic = " << rt_power.readOp.dynamic / executionTime
- << " W" << endl;
- cout << endl;
- if (ifu->exist) {
- cout << indent_str << "Instruction Fetch Unit:" << endl;
- cout << indent_str_next << "Area = " << ifu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << ifu->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? ifu->power.readOp.longer_channel_leakage
- : ifu->power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str_next << "Subthreshold Leakage = " <<
- // ifu->power.readOp.longer_channel_leakage <<" W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << ifu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << ifu->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (plevel > 2) {
- ifu->displayEnergy(indent + 4, plevel, is_tdp);
- }
- }
- if (coredynp.core_ty == OOO) {
- if (rnu->exist) {
- cout << indent_str << "Renaming Unit:" << endl;
- cout << indent_str_next << "Area = " << rnu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << rnu->power.readOp.dynamic * clockRate
- << " W" << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? rnu->power.readOp.longer_channel_leakage
- : rnu->power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str_next << "Subthreshold Leakage = " <<
- // rnu->power.readOp.longer_channel_leakage << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << rnu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << rnu->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (plevel > 2) {
- rnu->displayEnergy(indent + 4, plevel, is_tdp);
- }
- }
- }
- if (lsu->exist) {
- cout << indent_str << "Load Store Unit:" << endl;
- cout << indent_str_next << "Area = " << lsu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << lsu->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? lsu->power.readOp.longer_channel_leakage
- : lsu->power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str_next << "Subthreshold Leakage = " <<
- // lsu->power.readOp.longer_channel_leakage << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << lsu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << lsu->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (plevel > 2) {
- lsu->displayEnergy(indent + 4, plevel, is_tdp);
- }
- }
- if (mmu->exist) {
- cout << indent_str << "Memory Management Unit:" << endl;
- cout << indent_str_next << "Area = " << mmu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << mmu->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? mmu->power.readOp.longer_channel_leakage
- : mmu->power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str_next << "Subthreshold Leakage = " <<
- // mmu->power.readOp.longer_channel_leakage << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << mmu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << mmu->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (plevel > 2) {
- mmu->displayEnergy(indent + 4, plevel, is_tdp);
- }
- }
- if (exu->exist) {
- cout << indent_str << "Execution Unit:" << endl;
- cout << indent_str_next << "Area = " << exu->area.get_area() * 1e-6
- << " mm^2" << endl;
- cout << indent_str_next
- << "Peak Dynamic = " << exu->power.readOp.dynamic * clockRate << " W"
- << endl;
- cout << indent_str_next
- << "Peak Dynamic Energy = " << exu->power.readOp.dynamic << " W"
- << endl;
- cout << indent_str_next << "clock Rate = " << clockRate << " W" << endl;
+ rt_power = rt_power + rnu->rt_power;
+ }
+ }
+ else
+ {
- cout << indent_str_next << "Subthreshold Leakage = "
- << (long_channel ? exu->power.readOp.longer_channel_leakage
- : exu->power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str_next << "Subthreshold Leakage = " <<
- // exu->power.readOp.longer_channel_leakage << " W" << endl;
- cout << indent_str_next
- << "Gate Leakage = " << exu->power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str_next << "Runtime Dynamic = "
- << exu->rt_power.readOp.dynamic / executionTime << " W" << endl;
- cout << endl;
- if (plevel > 2) {
- exu->displayEnergy(indent + 4, plevel, is_tdp);
- }
- }
- // if (plevel >2)
- // {
- // if (undiffCore->exist)
- // {
- // cout << indent_str << "Undifferentiated Core" <<
- //endl;
- // cout << indent_str_next << "Area = " <<
- //undiffCore->area.get_area()*1e-6<< " mm^2" << endl;
- // cout << indent_str_next << "Peak Dynamic = " <<
- //undiffCore->power.readOp.dynamic*clockRate << " W" << endl;
- //// cout << indent_str_next << "Subthreshold Leakage = " <<
- ///undiffCore->power.readOp.leakage <<" W" << endl;
- // cout << indent_str_next << "Subthreshold Leakage =
- //"
- // << (long_channel?
- //undiffCore->power.readOp.longer_channel_leakage:undiffCore->power.readOp.leakage)
- //<< " W" << endl;
- // cout << indent_str_next << "Gate Leakage = " <<
- //undiffCore->power.readOp.gate_leakage << " W" << endl;
- // // cout << indent_str_next << "Runtime Dynamic = " <<
- //undiffCore->rt_power.readOp.dynamic/executionTime << " W" << endl;
- // cout <<endl;
- // }
- // }
- if (XML->sys.Private_L2) {
- l2cache->displayEnergy(4, is_tdp);
- }
+ set_pppm(pppm_t, coredynp.num_pipelines*rtp_pipeline_coe/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units, coredynp.num_pipelines/num_units);
+ }
- cout << indent_str << "Idle Core: " << endl;
- cout << indent_str_next
- << "Runtime Dynamic = " << IdleCoreEnergy / executionTime << " W\n"
- << endl;
+ if (ifu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ ifu->rt_power = ifu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + ifu->rt_power ;
+ }
+ if (lsu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ lsu->rt_power = lsu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + lsu->rt_power;
+ }
+ if (exu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ exu->rt_power = exu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + exu->rt_power;
+ }
+ if (mmu->exist)
+ {
+ Pipeline_energy+=corepipe->power.readOp.dynamic* (coredynp.num_pipelines*rtp_pipeline_coe/num_units);
+ mmu->rt_power = mmu->rt_power + corepipe->power*pppm_t;
+ rt_power = rt_power + mmu->rt_power ;
+ }
- } else {
- // cout << indent_str_next << "Instruction Fetch Unit Peak Dynamic = "
- //<< ifu->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Instruction Fetch Unit Subthreshold
- //Leakage = " << ifu->rt_power.readOp.leakage <<" W" << endl;
- // cout << indent_str_next << "Instruction Fetch Unit Gate Leakage = "
- //<< ifu->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Load Store Unit Peak Dynamic = " <<
- //lsu->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Load Store Unit Subthreshold Leakage = "
- //<< lsu->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Load Store Unit Gate Leakage = " <<
- //lsu->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Memory Management Unit Peak Dynamic = "
- //<< mmu->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Memory Management Unit Subthreshold
- //Leakage = " << mmu->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Memory Management Unit Gate Leakage = "
- //<< mmu->rt_power.readOp.gate_leakage << " W" << endl;
- // cout << indent_str_next << "Execution Unit Peak Dynamic = " <<
- //exu->rt_power.readOp.dynamic*clockRate << " W" << endl;
- // cout << indent_str_next << "Execution Unit Subthreshold Leakage = "
- //<< exu->rt_power.readOp.leakage << " W" << endl;
- // cout << indent_str_next << "Execution Unit Gate Leakage = " <<
- //exu->rt_power.readOp.gate_leakage << " W" << endl;
- }
-}
-InstFetchU::~InstFetchU() {
- if (!exist) return;
- if (IB) {
- delete IB;
- IB = 0;
- }
- if (ID_inst) {
- delete ID_inst;
- ID_inst = 0;
- }
- if (ID_operand) {
- delete ID_operand;
- ID_operand = 0;
- }
- if (ID_misc) {
- delete ID_misc;
- ID_misc = 0;
- }
- if (coredynp.predictionW > 0) {
- if (BTB) {
- delete BTB;
- BTB = 0;
- }
- if (BPT) {
- delete BPT;
- BPT = 0;
- }
- }
-}
+ rt_power = rt_power + undiffCore->power;
+// cout << "EXE = " << exu->power.readOp.dynamic*clockRate << " W" << endl;
+ if (XML->sys.Private_L2)
+ {
+ l2cache->computeEnergy(is_tdp);
+ //set_pppm(pppm_t,1/l2cache->cachep.executionTime, 1,1,1);
+ //l2cache->rt_power = l2cache->rt_power*pppm_t;
+ rt_power = rt_power + l2cache->rt_power;
+ }
-BranchPredictor::~BranchPredictor() {
- if (!exist) return;
- if (globalBPT) {
- delete globalBPT;
- globalBPT = 0;
- }
- if (localBPT) {
- delete localBPT;
- localBPT = 0;
- }
- if (L1_localBPT) {
- delete L1_localBPT;
- L1_localBPT = 0;
- }
- if (L2_localBPT) {
- delete L2_localBPT;
- L2_localBPT = 0;
- }
- if (chooser) {
- delete chooser;
- chooser = 0;
- }
- if (RAS) {
- delete RAS;
- RAS = 0;
- }
-}
+ }
-RENAMINGU::~RENAMINGU() {
- if (!exist) return;
- if (iFRAT) {
- delete iFRAT;
- iFRAT = 0;
- }
- if (fFRAT) {
- delete fFRAT;
- fFRAT = 0;
- }
- if (iRRAT) {
- delete iRRAT;
- iRRAT = 0;
- }
- if (iFRAT) {
- delete iFRAT;
- iFRAT = 0;
- }
- if (ifreeL) {
- delete ifreeL;
- ifreeL = 0;
- }
- if (ffreeL) {
- delete ffreeL;
- ffreeL = 0;
- }
- if (idcl) {
- delete idcl;
- idcl = 0;
- }
- if (fdcl) {
- delete fdcl;
- fdcl = 0;
- }
- if (RAHT) {
- delete RAHT;
- RAHT = 0;
- }
}
-LoadStoreU::~LoadStoreU() {
- if (!exist) return;
- if (LSQ) {
- delete LSQ;
- LSQ = 0;
- }
-}
+void Core::displayEnergy(uint32_t indent,int plevel,bool is_tdp)
+{
+ string indent_str(indent, ' ');
+ string indent_str_next(indent+2, ' ');
+ bool long_channel = XML->sys.longer_channel_device;
+ if (is_tdp)
+ {
+ cout << "Core:" << endl;
+ cout << indent_str << "Area = " << area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str << "Peak Dynamic = " << power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str << "Subthreshold Leakage = "
+ << (long_channel? power.readOp.longer_channel_leakage:power.readOp.leakage) <<" W" << endl;
+ //cout << indent_str << "Subthreshold Leakage = " << power.readOp.longer_channel_leakage <<" W" << endl;
+ cout << indent_str << "Gate Leakage = " << power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str << "Runtime Dynamic = " << rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout<<endl;
+ if (ifu->exist)
+ {
+ cout << indent_str << "Instruction Fetch Unit:" << endl;
+ cout << indent_str_next << "Area = " << ifu->area.get_area()*1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << ifu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? ifu->power.readOp.longer_channel_leakage:ifu->power.readOp.leakage) <<" W" << endl;
+ //cout << indent_str_next << "Subthreshold Leakage = " << ifu->power.readOp.longer_channel_leakage <<" W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << ifu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << ifu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel >2){
+ ifu->displayEnergy(indent+4,plevel,is_tdp);
+ }
+ }
+ if (coredynp.core_ty==OOO)
+ {
+ if (rnu->exist)
+ {
+ cout << indent_str<< "Renaming Unit:" << endl;
+ cout << indent_str_next << "Area = " << rnu->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << rnu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? rnu->power.readOp.longer_channel_leakage:rnu->power.readOp.leakage) << " W" << endl;
+ //cout << indent_str_next << "Subthreshold Leakage = " << rnu->power.readOp.longer_channel_leakage << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << rnu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << rnu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel >2){
+ rnu->displayEnergy(indent+4,plevel,is_tdp);
+ }
+ }
-MemManU::~MemManU() {
- if (!exist) return;
- if (itlb) {
- delete itlb;
- itlb = 0;
- }
- if (dtlb) {
- delete dtlb;
- dtlb = 0;
- }
-}
+ }
+ if (lsu->exist)
+ {
+ cout << indent_str<< "Load Store Unit:" << endl;
+ cout << indent_str_next << "Area = " << lsu->area.get_area()*1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << lsu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? lsu->power.readOp.longer_channel_leakage:lsu->power.readOp.leakage ) << " W" << endl;
+ //cout << indent_str_next << "Subthreshold Leakage = " << lsu->power.readOp.longer_channel_leakage << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << lsu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << lsu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel >2){
+ lsu->displayEnergy(indent+4,plevel,is_tdp);
+ }
+ }
+ if (mmu->exist)
+ {
+ cout << indent_str<< "Memory Management Unit:" << endl;
+ cout << indent_str_next << "Area = " << mmu->area.get_area() *1e-6 << " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << mmu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? mmu->power.readOp.longer_channel_leakage:mmu->power.readOp.leakage) << " W" << endl;
+ //cout << indent_str_next << "Subthreshold Leakage = " << mmu->power.readOp.longer_channel_leakage << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << mmu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << mmu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel >2){
+ mmu->displayEnergy(indent+4,plevel,is_tdp);
+ }
+ }
+ if (exu->exist)
+ {
+ cout << indent_str<< "Execution Unit:" << endl;
+ cout << indent_str_next << "Area = " << exu->area.get_area() *1e-6<< " mm^2" << endl;
+ cout << indent_str_next << "Peak Dynamic = " << exu->power.readOp.dynamic*clockRate << " W" << endl;
+ cout << indent_str_next << "Peak Dynamic Energy = " << exu->power.readOp.dynamic << " W" << endl;
+ cout << indent_str_next << "clock Rate = " << clockRate << " W" << endl;
-RegFU::~RegFU() {
- if (!exist) return;
- if (IRF) {
- delete IRF;
- IRF = 0;
- }
- if (FRF) {
- delete FRF;
- FRF = 0;
- }
- if (RFWIN) {
- delete RFWIN;
- RFWIN = 0;
- }
-}
+ cout << indent_str_next << "Subthreshold Leakage = "
+ << (long_channel? exu->power.readOp.longer_channel_leakage:exu->power.readOp.leakage) << " W" << endl;
+ //cout << indent_str_next << "Subthreshold Leakage = " << exu->power.readOp.longer_channel_leakage << " W" << endl;
+ cout << indent_str_next << "Gate Leakage = " << exu->power.readOp.gate_leakage << " W" << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << exu->rt_power.readOp.dynamic/executionTime << " W" << endl;
+ cout <<endl;
+ if (plevel >2){
+ exu->displayEnergy(indent+4,plevel,is_tdp);
+ }
+ }
+// if (plevel >2)
+// {
+// if (undiffCore->exist)
+// {
+// cout << indent_str << "Undifferentiated Core" << endl;
+// cout << indent_str_next << "Area = " << undiffCore->area.get_area()*1e-6<< " mm^2" << endl;
+// cout << indent_str_next << "Peak Dynamic = " << undiffCore->power.readOp.dynamic*clockRate << " W" << endl;
+//// cout << indent_str_next << "Subthreshold Leakage = " << undiffCore->power.readOp.leakage <<" W" << endl;
+// cout << indent_str_next << "Subthreshold Leakage = "
+// << (long_channel? undiffCore->power.readOp.longer_channel_leakage:undiffCore->power.readOp.leakage) << " W" << endl;
+// cout << indent_str_next << "Gate Leakage = " << undiffCore->power.readOp.gate_leakage << " W" << endl;
+// // cout << indent_str_next << "Runtime Dynamic = " << undiffCore->rt_power.readOp.dynamic/executionTime << " W" << endl;
+// cout <<endl;
+// }
+// }
+ if (XML->sys.Private_L2)
+ {
-SchedulerU::~SchedulerU() {
- if (!exist) return;
- if (int_inst_window) {
- delete int_inst_window;
- int_inst_window = 0;
- }
- if (fp_inst_window) {
- delete int_inst_window;
- int_inst_window = 0;
- }
- if (ROB) {
- delete ROB;
- ROB = 0;
- }
- if (instruction_selection) {
- delete instruction_selection;
- instruction_selection = 0;
- }
-}
+ l2cache->displayEnergy(4,is_tdp);
+ }
-EXECU::~EXECU() {
- if (!exist) return;
- if (int_bypass) {
- delete int_bypass;
- int_bypass = 0;
- }
- if (intTagBypass) {
- delete intTagBypass;
- intTagBypass = 0;
- }
- if (int_mul_bypass) {
- delete int_mul_bypass;
- int_mul_bypass = 0;
- }
- if (intTag_mul_Bypass) {
- delete intTag_mul_Bypass;
- intTag_mul_Bypass = 0;
- }
- if (fp_bypass) {
- delete fp_bypass;
- fp_bypass = 0;
- }
- if (fpTagBypass) {
- delete fpTagBypass;
- fpTagBypass = 0;
- }
- if (fp_u) {
- delete fp_u;
- fp_u = 0;
- }
- if (exeu) {
- delete exeu;
- exeu = 0;
- }
- if (mul) {
- delete mul;
- mul = 0;
- }
- if (rfu) {
- delete rfu;
- rfu = 0;
- }
- if (scheu) {
- delete scheu;
- scheu = 0;
- }
+ cout << indent_str<< "Idle Core: " << endl;
+ cout << indent_str_next << "Runtime Dynamic = " << IdleCoreEnergy/executionTime << " W\n" << endl;
+
+ }
+ else
+ {
+// cout << indent_str_next << "Instruction Fetch Unit Peak Dynamic = " << ifu->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Instruction Fetch Unit Subthreshold Leakage = " << ifu->rt_power.readOp.leakage <<" W" << endl;
+// cout << indent_str_next << "Instruction Fetch Unit Gate Leakage = " << ifu->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Load Store Unit Peak Dynamic = " << lsu->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Load Store Unit Subthreshold Leakage = " << lsu->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Load Store Unit Gate Leakage = " << lsu->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Memory Management Unit Peak Dynamic = " << mmu->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Memory Management Unit Subthreshold Leakage = " << mmu->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Memory Management Unit Gate Leakage = " << mmu->rt_power.readOp.gate_leakage << " W" << endl;
+// cout << indent_str_next << "Execution Unit Peak Dynamic = " << exu->rt_power.readOp.dynamic*clockRate << " W" << endl;
+// cout << indent_str_next << "Execution Unit Subthreshold Leakage = " << exu->rt_power.readOp.leakage << " W" << endl;
+// cout << indent_str_next << "Execution Unit Gate Leakage = " << exu->rt_power.readOp.gate_leakage << " W" << endl;
+ }
}
+InstFetchU ::~InstFetchU(){
-Core::~Core() {
- if (ifu) {
- delete ifu;
- ifu = 0;
- }
- if (lsu) {
- delete lsu;
- lsu = 0;
- }
- if (rnu) {
- delete rnu;
- rnu = 0;
- }
- if (mmu) {
- delete mmu;
- mmu = 0;
- }
- if (exu) {
- delete exu;
- exu = 0;
- }
- if (corepipe) {
- delete corepipe;
- corepipe = 0;
- }
- if (undiffCore) {
- delete undiffCore;
- undiffCore = 0;
- }
- if (l2cache) {
- delete l2cache;
- l2cache = 0;
- }
+ if (!exist) return;
+ if(IB) {delete IB; IB = 0;}
+ if(ID_inst) {delete ID_inst; ID_inst = 0;}
+ if(ID_operand) {delete ID_operand; ID_operand = 0;}
+ if(ID_misc) {delete ID_misc; ID_misc = 0;}
+ if (coredynp.predictionW>0)
+ {
+ if(BTB) {delete BTB; BTB = 0;}
+ if(BPT) {delete BPT; BPT = 0;}
+ }
}
-void Core::set_core_param() {
- coredynp.opt_local = XML->sys.core[ithCore].opt_local;
- coredynp.x86 = XML->sys.core[ithCore].x86;
- coredynp.Embedded = XML->sys.Embedded;
- coredynp.core_ty = (enum Core_type)XML->sys.core[ithCore].machine_type;
- coredynp.rm_ty = (enum Renaming_type)XML->sys.core[ithCore].rename_scheme;
- coredynp.fetchW = XML->sys.core[ithCore].fetch_width;
- coredynp.decodeW = XML->sys.core[ithCore].decode_width;
- coredynp.issueW = XML->sys.core[ithCore].issue_width;
- coredynp.peak_issueW = XML->sys.core[ithCore].peak_issue_width;
- coredynp.commitW = XML->sys.core[ithCore].commit_width;
- coredynp.peak_commitW = XML->sys.core[ithCore].peak_issue_width;
- coredynp.predictionW = XML->sys.core[ithCore].prediction_width;
- coredynp.fp_issueW = XML->sys.core[ithCore].fp_issue_width;
- coredynp.fp_decodeW = XML->sys.core[ithCore].fp_issue_width;
- coredynp.num_alus = XML->sys.core[ithCore].ALU_per_core;
- coredynp.num_fpus = XML->sys.core[ithCore].FPU_per_core;
- coredynp.num_muls = XML->sys.core[ithCore].MUL_per_core;
+BranchPredictor ::~BranchPredictor(){
- coredynp.num_hthreads = XML->sys.core[ithCore].number_hardware_threads;
- coredynp.multithreaded = coredynp.num_hthreads > 1 ? true : false;
- coredynp.instruction_length = XML->sys.core[ithCore].instruction_length;
- coredynp.pc_width = XML->sys.virtual_address_width;
+ if (!exist) return;
+ if(globalBPT) {delete globalBPT; globalBPT = 0;}
+ if(localBPT) {delete localBPT; localBPT = 0;}
+ if(L1_localBPT) {delete L1_localBPT; L1_localBPT = 0;}
+ if(L2_localBPT) {delete L2_localBPT; L2_localBPT = 0;}
+ if(chooser) {delete chooser; chooser = 0;}
+ if(RAS) {delete RAS; RAS = 0;}
+ }
- coredynp.opcode_length = XML->sys.core[ithCore].opcode_width;
- coredynp.micro_opcode_length = XML->sys.core[ithCore].micro_opcode_width;
- coredynp.num_pipelines = XML->sys.core[ithCore].pipelines_per_core[0];
- coredynp.pipeline_stages = XML->sys.core[ithCore].pipeline_depth[0];
- coredynp.num_fp_pipelines = XML->sys.core[ithCore].pipelines_per_core[1];
- coredynp.fp_pipeline_stages = XML->sys.core[ithCore].pipeline_depth[1];
- coredynp.int_data_width = int(ceil(XML->sys.machine_bits / 32.0)) * 32;
- coredynp.fp_data_width = coredynp.int_data_width;
- coredynp.v_address_width = XML->sys.virtual_address_width;
- coredynp.p_address_width = XML->sys.physical_address_width;
+RENAMINGU ::~RENAMINGU(){
- coredynp.scheu_ty =
- (enum Scheduler_type)XML->sys.core[ithCore].instruction_window_scheme;
- coredynp.arch_ireg_width =
- int(ceil(log2(XML->sys.core[ithCore].archi_Regs_IRF_size)));
- coredynp.arch_freg_width =
- int(ceil(log2(XML->sys.core[ithCore].archi_Regs_FRF_size)));
- coredynp.num_IRF_entry = XML->sys.core[ithCore].archi_Regs_IRF_size;
- coredynp.num_FRF_entry = XML->sys.core[ithCore].archi_Regs_FRF_size;
- coredynp.pipeline_duty_cycle = XML->sys.core[ithCore].pipeline_duty_cycle;
- coredynp.total_cycles = XML->sys.core[ithCore].total_cycles;
- coredynp.busy_cycles = XML->sys.core[ithCore].busy_cycles;
- coredynp.idle_cycles = XML->sys.core[ithCore].idle_cycles;
+ if (!exist) return;
+ if(iFRAT ) {delete iFRAT; iFRAT = 0;}
+ if(fFRAT ) {delete fFRAT; fFRAT =0;}
+ if(iRRAT) {delete iRRAT; iRRAT = 0;}
+ if(iFRAT) {delete iFRAT; iFRAT = 0;}
+ if(ifreeL) {delete ifreeL;ifreeL= 0;}
+ if(ffreeL) {delete ffreeL;ffreeL= 0;}
+ if(idcl) {delete idcl; idcl = 0;}
+ if(fdcl) {delete fdcl; fdcl = 0;}
+ if(RAHT) {delete RAHT; RAHT = 0;}
+ }
- // Max power duty cycle for peak power estimation
- // if (coredynp.core_ty==OOO)
- // {
- // coredynp.IFU_duty_cycle = 1;
- // coredynp.LSU_duty_cycle = 1;
- // coredynp.MemManU_I_duty_cycle =1;
- // coredynp.MemManU_D_duty_cycle =1;
- // coredynp.ALU_duty_cycle =1;
- // coredynp.MUL_duty_cycle =1;
- // coredynp.FPU_duty_cycle =1;
- // coredynp.ALU_cdb_duty_cycle =1;
- // coredynp.MUL_cdb_duty_cycle =1;
- // coredynp.FPU_cdb_duty_cycle =1;
- // }
- // else
- // {
- coredynp.IFU_duty_cycle = XML->sys.core[ithCore].IFU_duty_cycle;
- coredynp.BR_duty_cycle = XML->sys.core[ithCore].BR_duty_cycle;
- coredynp.LSU_duty_cycle = XML->sys.core[ithCore].LSU_duty_cycle;
- coredynp.MemManU_I_duty_cycle = XML->sys.core[ithCore].MemManU_I_duty_cycle;
- coredynp.MemManU_D_duty_cycle = XML->sys.core[ithCore].MemManU_D_duty_cycle;
- coredynp.ALU_duty_cycle = XML->sys.core[ithCore].ALU_duty_cycle;
- coredynp.MUL_duty_cycle = XML->sys.core[ithCore].MUL_duty_cycle;
- coredynp.FPU_duty_cycle = XML->sys.core[ithCore].FPU_duty_cycle;
- coredynp.ALU_cdb_duty_cycle = XML->sys.core[ithCore].ALU_cdb_duty_cycle;
- coredynp.MUL_cdb_duty_cycle = XML->sys.core[ithCore].MUL_cdb_duty_cycle;
- coredynp.FPU_cdb_duty_cycle = XML->sys.core[ithCore].FPU_cdb_duty_cycle;
- // }
+LoadStoreU ::~LoadStoreU(){
- if (!((coredynp.core_ty == OOO) || (coredynp.core_ty == Inorder))) {
- cout << "Invalid Core Type" << endl;
- exit(0);
- }
- // if (coredynp.core_ty==OOO)
- // {
- // cout<<"OOO processor models are being updated and will be available
- //in next release"<<endl;
- // exit(0);
- // }
- if (!((coredynp.scheu_ty == PhysicalRegFile) ||
- (coredynp.scheu_ty == ReservationStation))) {
- cout << "Invalid OOO Scheduler Type" << endl;
- exit(0);
- }
+ if (!exist) return;
+ if(LSQ) {delete LSQ; LSQ = 0;}
+ }
- if (!((coredynp.rm_ty == RAMbased) || (coredynp.rm_ty == CAMbased))) {
- cout << "Invalid OOO Renaming Type" << endl;
- exit(0);
- }
+MemManU ::~MemManU(){
- if (coredynp.core_ty == OOO) {
- if (coredynp.scheu_ty == PhysicalRegFile) {
- coredynp.phy_ireg_width =
- int(ceil(log2(XML->sys.core[ithCore].phy_Regs_IRF_size)));
- coredynp.phy_freg_width =
- int(ceil(log2(XML->sys.core[ithCore].phy_Regs_FRF_size)));
- coredynp.num_ifreelist_entries = coredynp.num_IRF_entry =
- XML->sys.core[ithCore].phy_Regs_IRF_size;
- coredynp.num_ffreelist_entries = coredynp.num_FRF_entry =
- XML->sys.core[ithCore].phy_Regs_FRF_size;
- } else if (coredynp.scheu_ty ==
- ReservationStation) { // ROB serves as Phy RF in RS based OOO
- coredynp.phy_ireg_width =
- int(ceil(log2(XML->sys.core[ithCore].ROB_size)));
- coredynp.phy_freg_width =
- int(ceil(log2(XML->sys.core[ithCore].ROB_size)));
- coredynp.num_ifreelist_entries = XML->sys.core[ithCore].ROB_size;
- coredynp.num_ffreelist_entries = XML->sys.core[ithCore].ROB_size;
- }
- }
- coredynp.globalCheckpoint = 32; // best check pointing entries for a 4~8
- // issue OOO should be 16~48;See TR for
- // reference.
- coredynp.perThreadState = 8;
- coredynp.instruction_length = 32;
- coredynp.clockRate = XML->sys.core[ithCore].clock_rate;
- coredynp.clockRate *= 1e6;
- coredynp.regWindowing = (XML->sys.core[ithCore].register_windows_size > 0 &&
- coredynp.core_ty == Inorder)
- ? true
- : false;
- coredynp.executionTime = XML->sys.total_cycles / coredynp.clockRate;
- set_pppm(coredynp.pppm_lkg_multhread, 0, coredynp.num_hthreads,
- coredynp.num_hthreads, 0);
+ if (!exist) return;
+ if(itlb) {delete itlb; itlb = 0;}
+ if(dtlb) {delete dtlb; dtlb = 0;}
+ }
+
+RegFU ::~RegFU(){
+
+ if (!exist) return;
+ if(IRF) {delete IRF; IRF = 0;}
+ if(FRF) {delete FRF; FRF = 0;}
+ if(RFWIN) {delete RFWIN; RFWIN = 0;}
+ }
+
+SchedulerU ::~SchedulerU(){
+
+ if (!exist) return;
+ if(int_inst_window) {delete int_inst_window; int_inst_window = 0;}
+ if(fp_inst_window) {delete int_inst_window; int_inst_window = 0;}
+ if(ROB) {delete ROB; ROB = 0;}
+ if(instruction_selection) {delete instruction_selection;instruction_selection = 0;}
+ }
+
+EXECU ::~EXECU(){
+
+ if (!exist) return;
+ if(int_bypass) {delete int_bypass; int_bypass = 0;}
+ if(intTagBypass) {delete intTagBypass; intTagBypass =0;}
+ if(int_mul_bypass) {delete int_mul_bypass; int_mul_bypass = 0;}
+ if(intTag_mul_Bypass) {delete intTag_mul_Bypass; intTag_mul_Bypass =0;}
+ if(fp_bypass) {delete fp_bypass;fp_bypass = 0;}
+ if(fpTagBypass) {delete fpTagBypass;fpTagBypass = 0;}
+ if(fp_u) {delete fp_u;fp_u = 0;}
+ if(exeu) {delete exeu;exeu = 0;}
+ if(mul) {delete mul;mul = 0;}
+ if(rfu) {delete rfu;rfu = 0;}
+ if(scheu) {delete scheu; scheu = 0;}
+ }
+
+Core ::~Core(){
+
+ if(ifu) {delete ifu; ifu = 0;}
+ if(lsu) {delete lsu; lsu = 0;}
+ if(rnu) {delete rnu; rnu = 0;}
+ if(mmu) {delete mmu; mmu = 0;}
+ if(exu) {delete exu; exu = 0;}
+ if(corepipe) {delete corepipe; corepipe = 0;}
+ if(undiffCore) {delete undiffCore;undiffCore = 0;}
+ if(l2cache) {delete l2cache;l2cache = 0;}
+ }
+
+void Core::set_core_param()
+{
+ coredynp.opt_local = XML->sys.core[ithCore].opt_local;
+ coredynp.x86 = XML->sys.core[ithCore].x86;
+ coredynp.Embedded = XML->sys.Embedded;
+ coredynp.core_ty = (enum Core_type)XML->sys.core[ithCore].machine_type;
+ coredynp.rm_ty = (enum Renaming_type)XML->sys.core[ithCore].rename_scheme;
+ coredynp.fetchW = XML->sys.core[ithCore].fetch_width;
+ coredynp.decodeW = XML->sys.core[ithCore].decode_width;
+ coredynp.issueW = XML->sys.core[ithCore].issue_width;
+ coredynp.peak_issueW = XML->sys.core[ithCore].peak_issue_width;
+ coredynp.commitW = XML->sys.core[ithCore].commit_width;
+ coredynp.peak_commitW = XML->sys.core[ithCore].peak_issue_width;
+ coredynp.predictionW = XML->sys.core[ithCore].prediction_width;
+ coredynp.fp_issueW = XML->sys.core[ithCore].fp_issue_width;
+ coredynp.fp_decodeW = XML->sys.core[ithCore].fp_issue_width;
+ coredynp.num_alus = XML->sys.core[ithCore].ALU_per_core;
+ coredynp.num_fpus = XML->sys.core[ithCore].FPU_per_core;
+ coredynp.num_muls = XML->sys.core[ithCore].MUL_per_core;
+
+
+ coredynp.num_hthreads = XML->sys.core[ithCore].number_hardware_threads;
+ coredynp.multithreaded = coredynp.num_hthreads>1? true:false;
+ coredynp.instruction_length = XML->sys.core[ithCore].instruction_length;
+ coredynp.pc_width = XML->sys.virtual_address_width;
+
+ coredynp.opcode_length = XML->sys.core[ithCore].opcode_width;
+ coredynp.micro_opcode_length = XML->sys.core[ithCore].micro_opcode_width;
+ coredynp.num_pipelines = XML->sys.core[ithCore].pipelines_per_core[0];
+ coredynp.pipeline_stages = XML->sys.core[ithCore].pipeline_depth[0];
+ coredynp.num_fp_pipelines = XML->sys.core[ithCore].pipelines_per_core[1];
+ coredynp.fp_pipeline_stages = XML->sys.core[ithCore].pipeline_depth[1];
+ coredynp.int_data_width = int(ceil(XML->sys.machine_bits/32.0))*32;
+ coredynp.fp_data_width = coredynp.int_data_width;
+ coredynp.v_address_width = XML->sys.virtual_address_width;
+ coredynp.p_address_width = XML->sys.physical_address_width;
+
+ coredynp.scheu_ty = (enum Scheduler_type)XML->sys.core[ithCore].instruction_window_scheme;
+ coredynp.arch_ireg_width = int(ceil(log2(XML->sys.core[ithCore].archi_Regs_IRF_size)));
+ coredynp.arch_freg_width = int(ceil(log2(XML->sys.core[ithCore].archi_Regs_FRF_size)));
+ coredynp.num_IRF_entry = XML->sys.core[ithCore].archi_Regs_IRF_size;
+ coredynp.num_FRF_entry = XML->sys.core[ithCore].archi_Regs_FRF_size;
+ coredynp.pipeline_duty_cycle = XML->sys.core[ithCore].pipeline_duty_cycle;
+ coredynp.total_cycles = XML->sys.core[ithCore].total_cycles;
+ coredynp.busy_cycles = XML->sys.core[ithCore].busy_cycles;
+ coredynp.idle_cycles = XML->sys.core[ithCore].idle_cycles;
+
+ //Max power duty cycle for peak power estimation
+// if (coredynp.core_ty==OOO)
+// {
+// coredynp.IFU_duty_cycle = 1;
+// coredynp.LSU_duty_cycle = 1;
+// coredynp.MemManU_I_duty_cycle =1;
+// coredynp.MemManU_D_duty_cycle =1;
+// coredynp.ALU_duty_cycle =1;
+// coredynp.MUL_duty_cycle =1;
+// coredynp.FPU_duty_cycle =1;
+// coredynp.ALU_cdb_duty_cycle =1;
+// coredynp.MUL_cdb_duty_cycle =1;
+// coredynp.FPU_cdb_duty_cycle =1;
+// }
+// else
+// {
+ coredynp.IFU_duty_cycle = XML->sys.core[ithCore].IFU_duty_cycle;
+ coredynp.BR_duty_cycle = XML->sys.core[ithCore].BR_duty_cycle;
+ coredynp.LSU_duty_cycle = XML->sys.core[ithCore].LSU_duty_cycle;
+ coredynp.MemManU_I_duty_cycle = XML->sys.core[ithCore].MemManU_I_duty_cycle;
+ coredynp.MemManU_D_duty_cycle = XML->sys.core[ithCore].MemManU_D_duty_cycle;
+ coredynp.ALU_duty_cycle = XML->sys.core[ithCore].ALU_duty_cycle;
+ coredynp.MUL_duty_cycle = XML->sys.core[ithCore].MUL_duty_cycle;
+ coredynp.FPU_duty_cycle = XML->sys.core[ithCore].FPU_duty_cycle;
+ coredynp.ALU_cdb_duty_cycle = XML->sys.core[ithCore].ALU_cdb_duty_cycle;
+ coredynp.MUL_cdb_duty_cycle = XML->sys.core[ithCore].MUL_cdb_duty_cycle;
+ coredynp.FPU_cdb_duty_cycle = XML->sys.core[ithCore].FPU_cdb_duty_cycle;
+// }
+
+
+ if (!((coredynp.core_ty==OOO)||(coredynp.core_ty==Inorder)))
+ {
+ cout<<"Invalid Core Type"<<endl;
+ exit(0);
+ }
+// if (coredynp.core_ty==OOO)
+// {
+// cout<<"OOO processor models are being updated and will be available in next release"<<endl;
+// exit(0);
+// }
+ if (!((coredynp.scheu_ty==PhysicalRegFile)||(coredynp.scheu_ty==ReservationStation)))
+ {
+ cout<<"Invalid OOO Scheduler Type"<<endl;
+ exit(0);
+ }
+
+ if (!((coredynp.rm_ty ==RAMbased)||(coredynp.rm_ty ==CAMbased)))
+ {
+ cout<<"Invalid OOO Renaming Type"<<endl;
+ exit(0);
+ }
+
+if (coredynp.core_ty==OOO)
+{
+ if (coredynp.scheu_ty==PhysicalRegFile)
+ {
+ coredynp.phy_ireg_width = int(ceil(log2(XML->sys.core[ithCore].phy_Regs_IRF_size)));
+ coredynp.phy_freg_width = int(ceil(log2(XML->sys.core[ithCore].phy_Regs_FRF_size)));
+ coredynp.num_ifreelist_entries = coredynp.num_IRF_entry = XML->sys.core[ithCore].phy_Regs_IRF_size;
+ coredynp.num_ffreelist_entries = coredynp.num_FRF_entry = XML->sys.core[ithCore].phy_Regs_FRF_size;
+ }
+ else if (coredynp.scheu_ty==ReservationStation)
+ {//ROB serves as Phy RF in RS based OOO
+ coredynp.phy_ireg_width = int(ceil(log2(XML->sys.core[ithCore].ROB_size)));
+ coredynp.phy_freg_width = int(ceil(log2(XML->sys.core[ithCore].ROB_size)));
+ coredynp.num_ifreelist_entries = XML->sys.core[ithCore].ROB_size;
+ coredynp.num_ffreelist_entries = XML->sys.core[ithCore].ROB_size;
+
+ }
+
+}
+ coredynp.globalCheckpoint = 32;//best check pointing entries for a 4~8 issue OOO should be 16~48;See TR for reference.
+ coredynp.perThreadState = 8;
+ coredynp.instruction_length = 32;
+ coredynp.clockRate = XML->sys.core[ithCore].clock_rate;
+ coredynp.clockRate *= 1e6;
+ coredynp.regWindowing= (XML->sys.core[ithCore].register_windows_size>0&&coredynp.core_ty==Inorder)?true:false;
+ coredynp.executionTime = XML->sys.total_cycles/coredynp.clockRate;
+ set_pppm(coredynp.pppm_lkg_multhread, 0, coredynp.num_hthreads, coredynp.num_hthreads, 0);
}