parameter.cc revision 10152
110152Satgutier@umich.edu/***************************************************************************** 210152Satgutier@umich.edu * McPAT/CACTI 310152Satgutier@umich.edu * SOFTWARE LICENSE AGREEMENT 410152Satgutier@umich.edu * Copyright 2012 Hewlett-Packard Development Company, L.P. 510152Satgutier@umich.edu * All Rights Reserved 610152Satgutier@umich.edu * 710152Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without 810152Satgutier@umich.edu * modification, are permitted provided that the following conditions are 910152Satgutier@umich.edu * met: redistributions of source code must retain the above copyright 1010152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer; 1110152Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright 1210152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the 1310152Satgutier@umich.edu * documentation and/or other materials provided with the distribution; 1410152Satgutier@umich.edu * neither the name of the copyright holders nor the names of its 1510152Satgutier@umich.edu * contributors may be used to endorse or promote products derived from 1610152Satgutier@umich.edu * this software without specific prior written permission. 1710152Satgutier@umich.edu 1810152Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1910152Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2010152Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2110152Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2210152Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2310152Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2410152Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2510152Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2610152Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2710152Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2810152Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.” 2910152Satgutier@umich.edu * 3010152Satgutier@umich.edu ***************************************************************************/ 3110152Satgutier@umich.edu 3210152Satgutier@umich.edu 3310152Satgutier@umich.edu 3410152Satgutier@umich.edu#include <iomanip> 3510152Satgutier@umich.edu#include <iostream> 3610152Satgutier@umich.edu#include <string> 3710152Satgutier@umich.edu 3810152Satgutier@umich.edu#include "area.h" 3910152Satgutier@umich.edu#include "parameter.h" 4010152Satgutier@umich.edu 4110152Satgutier@umich.eduusing namespace std; 4210152Satgutier@umich.edu 4310152Satgutier@umich.edu 4410152Satgutier@umich.eduInputParameter * g_ip; 4510152Satgutier@umich.eduTechnologyParameter g_tp; 4610152Satgutier@umich.edu 4710152Satgutier@umich.edu 4810152Satgutier@umich.edu 4910152Satgutier@umich.eduvoid TechnologyParameter::DeviceType::display(uint32_t indent) 5010152Satgutier@umich.edu{ 5110152Satgutier@umich.edu string indent_str(indent, ' '); 5210152Satgutier@umich.edu 5310152Satgutier@umich.edu cout << indent_str << "C_g_ideal = " << setw(12) << C_g_ideal << " F/um" << endl; 5410152Satgutier@umich.edu cout << indent_str << "C_fringe = " << setw(12) << C_fringe << " F/um" << endl; 5510152Satgutier@umich.edu cout << indent_str << "C_overlap = " << setw(12) << C_overlap << " F/um" << endl; 5610152Satgutier@umich.edu cout << indent_str << "C_junc = " << setw(12) << C_junc << " F/um^2" << endl; 5710152Satgutier@umich.edu cout << indent_str << "l_phy = " << setw(12) << l_phy << " um" << endl; 5810152Satgutier@umich.edu cout << indent_str << "l_elec = " << setw(12) << l_elec << " um" << endl; 5910152Satgutier@umich.edu cout << indent_str << "R_nch_on = " << setw(12) << R_nch_on << " ohm-um" << endl; 6010152Satgutier@umich.edu cout << indent_str << "R_pch_on = " << setw(12) << R_pch_on << " ohm-um" << endl; 6110152Satgutier@umich.edu cout << indent_str << "Vdd = " << setw(12) << Vdd << " V" << endl; 6210152Satgutier@umich.edu cout << indent_str << "Vth = " << setw(12) << Vth << " V" << endl; 6310152Satgutier@umich.edu cout << indent_str << "I_on_n = " << setw(12) << I_on_n << " A/um" << endl; 6410152Satgutier@umich.edu cout << indent_str << "I_on_p = " << setw(12) << I_on_p << " A/um" << endl; 6510152Satgutier@umich.edu cout << indent_str << "I_off_n = " << setw(12) << I_off_n << " A/um" << endl; 6610152Satgutier@umich.edu cout << indent_str << "I_off_p = " << setw(12) << I_off_p << " A/um" << endl; 6710152Satgutier@umich.edu cout << indent_str << "C_ox = " << setw(12) << C_ox << " F/um^2" << endl; 6810152Satgutier@umich.edu cout << indent_str << "t_ox = " << setw(12) << t_ox << " um" << endl; 6910152Satgutier@umich.edu cout << indent_str << "n_to_p_eff_curr_drv_ratio = " << n_to_p_eff_curr_drv_ratio << endl; 7010152Satgutier@umich.edu} 7110152Satgutier@umich.edu 7210152Satgutier@umich.edu 7310152Satgutier@umich.edu 7410152Satgutier@umich.eduvoid TechnologyParameter::InterconnectType::display(uint32_t indent) 7510152Satgutier@umich.edu{ 7610152Satgutier@umich.edu string indent_str(indent, ' '); 7710152Satgutier@umich.edu 7810152Satgutier@umich.edu cout << indent_str << "pitch = " << setw(12) << pitch << " um" << endl; 7910152Satgutier@umich.edu cout << indent_str << "R_per_um = " << setw(12) << R_per_um << " ohm/um" << endl; 8010152Satgutier@umich.edu cout << indent_str << "C_per_um = " << setw(12) << C_per_um << " F/um" << endl; 8110152Satgutier@umich.edu} 8210152Satgutier@umich.edu 8310152Satgutier@umich.eduvoid TechnologyParameter::ScalingFactor::display(uint32_t indent) 8410152Satgutier@umich.edu{ 8510152Satgutier@umich.edu string indent_str(indent, ' '); 8610152Satgutier@umich.edu 8710152Satgutier@umich.edu cout << indent_str << "logic_scaling_co_eff = " << setw(12) << logic_scaling_co_eff << endl; 8810152Satgutier@umich.edu cout << indent_str << "curr_core_tx_density = " << setw(12) << core_tx_density << " # of tx/um^2" << endl; 8910152Satgutier@umich.edu} 9010152Satgutier@umich.edu 9110152Satgutier@umich.eduvoid TechnologyParameter::MemoryType::display(uint32_t indent) 9210152Satgutier@umich.edu{ 9310152Satgutier@umich.edu string indent_str(indent, ' '); 9410152Satgutier@umich.edu 9510152Satgutier@umich.edu cout << indent_str << "b_w = " << setw(12) << b_w << " um" << endl; 9610152Satgutier@umich.edu cout << indent_str << "b_h = " << setw(12) << b_h << " um" << endl; 9710152Satgutier@umich.edu cout << indent_str << "cell_a_w = " << setw(12) << cell_a_w << " um" << endl; 9810152Satgutier@umich.edu cout << indent_str << "cell_pmos_w = " << setw(12) << cell_pmos_w << " um" << endl; 9910152Satgutier@umich.edu cout << indent_str << "cell_nmos_w = " << setw(12) << cell_nmos_w << " um" << endl; 10010152Satgutier@umich.edu cout << indent_str << "Vbitpre = " << setw(12) << Vbitpre << " V" << endl; 10110152Satgutier@umich.edu} 10210152Satgutier@umich.edu 10310152Satgutier@umich.edu 10410152Satgutier@umich.edu 10510152Satgutier@umich.eduvoid TechnologyParameter::display(uint32_t indent) 10610152Satgutier@umich.edu{ 10710152Satgutier@umich.edu string indent_str(indent, ' '); 10810152Satgutier@umich.edu 10910152Satgutier@umich.edu cout << indent_str << "ram_wl_stitching_overhead_ = " << setw(12) << ram_wl_stitching_overhead_ << " um" << endl; 11010152Satgutier@umich.edu cout << indent_str << "min_w_nmos_ = " << setw(12) << min_w_nmos_ << " um" << endl; 11110152Satgutier@umich.edu cout << indent_str << "max_w_nmos_ = " << setw(12) << max_w_nmos_ << " um" << endl; 11210152Satgutier@umich.edu cout << indent_str << "unit_len_wire_del = " << setw(12) << unit_len_wire_del << " s/um^2" << endl; 11310152Satgutier@umich.edu cout << indent_str << "FO4 = " << setw(12) << FO4 << " s" << endl; 11410152Satgutier@umich.edu cout << indent_str << "kinv = " << setw(12) << kinv << " s" << endl; 11510152Satgutier@umich.edu cout << indent_str << "vpp = " << setw(12) << vpp << " V" << endl; 11610152Satgutier@umich.edu cout << indent_str << "w_sense_en = " << setw(12) << w_sense_en << " um" << endl; 11710152Satgutier@umich.edu cout << indent_str << "w_sense_n = " << setw(12) << w_sense_n << " um" << endl; 11810152Satgutier@umich.edu cout << indent_str << "w_sense_p = " << setw(12) << w_sense_p << " um" << endl; 11910152Satgutier@umich.edu cout << indent_str << "w_iso = " << setw(12) << w_iso << " um" << endl; 12010152Satgutier@umich.edu cout << indent_str << "w_poly_contact = " << setw(12) << w_poly_contact << " um" << endl; 12110152Satgutier@umich.edu cout << indent_str << "spacing_poly_to_poly = " << setw(12) << spacing_poly_to_poly << " um" << endl; 12210152Satgutier@umich.edu cout << indent_str << "spacing_poly_to_contact = " << setw(12) << spacing_poly_to_contact << " um" << endl; 12310152Satgutier@umich.edu cout << endl; 12410152Satgutier@umich.edu cout << indent_str << "w_comp_inv_p1 = " << setw(12) << w_comp_inv_p1 << " um" << endl; 12510152Satgutier@umich.edu cout << indent_str << "w_comp_inv_p2 = " << setw(12) << w_comp_inv_p2 << " um" << endl; 12610152Satgutier@umich.edu cout << indent_str << "w_comp_inv_p3 = " << setw(12) << w_comp_inv_p3 << " um" << endl; 12710152Satgutier@umich.edu cout << indent_str << "w_comp_inv_n1 = " << setw(12) << w_comp_inv_n1 << " um" << endl; 12810152Satgutier@umich.edu cout << indent_str << "w_comp_inv_n2 = " << setw(12) << w_comp_inv_n2 << " um" << endl; 12910152Satgutier@umich.edu cout << indent_str << "w_comp_inv_n3 = " << setw(12) << w_comp_inv_n3 << " um" << endl; 13010152Satgutier@umich.edu cout << indent_str << "w_eval_inv_p = " << setw(12) << w_eval_inv_p << " um" << endl; 13110152Satgutier@umich.edu cout << indent_str << "w_eval_inv_n = " << setw(12) << w_eval_inv_n << " um" << endl; 13210152Satgutier@umich.edu cout << indent_str << "w_comp_n = " << setw(12) << w_comp_n << " um" << endl; 13310152Satgutier@umich.edu cout << indent_str << "w_comp_p = " << setw(12) << w_comp_p << " um" << endl; 13410152Satgutier@umich.edu cout << endl; 13510152Satgutier@umich.edu cout << indent_str << "dram_cell_I_on = " << setw(12) << dram_cell_I_on << " A/um" << endl; 13610152Satgutier@umich.edu cout << indent_str << "dram_cell_Vdd = " << setw(12) << dram_cell_Vdd << " V" << endl; 13710152Satgutier@umich.edu cout << indent_str << "dram_cell_I_off_worst_case_len_temp = " << setw(12) << dram_cell_I_off_worst_case_len_temp << " A/um" << endl; 13810152Satgutier@umich.edu cout << indent_str << "dram_cell_C = " << setw(12) << dram_cell_C << " F" << endl; 13910152Satgutier@umich.edu cout << indent_str << "gm_sense_amp_latch = " << setw(12) << gm_sense_amp_latch << " F/s" << endl; 14010152Satgutier@umich.edu cout << endl; 14110152Satgutier@umich.edu cout << indent_str << "w_nmos_b_mux = " << setw(12) << w_nmos_b_mux << " um" << endl; 14210152Satgutier@umich.edu cout << indent_str << "w_nmos_sa_mux = " << setw(12) << w_nmos_sa_mux << " um" << endl; 14310152Satgutier@umich.edu cout << indent_str << "w_pmos_bl_precharge = " << setw(12) << w_pmos_bl_precharge << " um" << endl; 14410152Satgutier@umich.edu cout << indent_str << "w_pmos_bl_eq = " << setw(12) << w_pmos_bl_eq << " um" << endl; 14510152Satgutier@umich.edu cout << indent_str << "MIN_GAP_BET_P_AND_N_DIFFS = " << setw(12) << MIN_GAP_BET_P_AND_N_DIFFS << " um" << endl; 14610152Satgutier@umich.edu cout << indent_str << "HPOWERRAIL = " << setw(12) << HPOWERRAIL << " um" << endl; 14710152Satgutier@umich.edu cout << indent_str << "cell_h_def = " << setw(12) << cell_h_def << " um" << endl; 14810152Satgutier@umich.edu 14910152Satgutier@umich.edu cout << endl; 15010152Satgutier@umich.edu cout << indent_str << "SRAM cell transistor: " << endl; 15110152Satgutier@umich.edu sram_cell.display(indent + 2); 15210152Satgutier@umich.edu 15310152Satgutier@umich.edu cout << endl; 15410152Satgutier@umich.edu cout << indent_str << "DRAM access transistor: " << endl; 15510152Satgutier@umich.edu dram_acc.display(indent + 2); 15610152Satgutier@umich.edu 15710152Satgutier@umich.edu cout << endl; 15810152Satgutier@umich.edu cout << indent_str << "DRAM wordline transistor: " << endl; 15910152Satgutier@umich.edu dram_wl.display(indent + 2); 16010152Satgutier@umich.edu 16110152Satgutier@umich.edu cout << endl; 16210152Satgutier@umich.edu cout << indent_str << "peripheral global transistor: " << endl; 16310152Satgutier@umich.edu peri_global.display(indent + 2); 16410152Satgutier@umich.edu 16510152Satgutier@umich.edu cout << endl; 16610152Satgutier@umich.edu cout << indent_str << "wire local" << endl; 16710152Satgutier@umich.edu wire_local.display(indent + 2); 16810152Satgutier@umich.edu 16910152Satgutier@umich.edu cout << endl; 17010152Satgutier@umich.edu cout << indent_str << "wire inside mat" << endl; 17110152Satgutier@umich.edu wire_inside_mat.display(indent + 2); 17210152Satgutier@umich.edu 17310152Satgutier@umich.edu cout << endl; 17410152Satgutier@umich.edu cout << indent_str << "wire outside mat" << endl; 17510152Satgutier@umich.edu wire_outside_mat.display(indent + 2); 17610152Satgutier@umich.edu 17710152Satgutier@umich.edu cout << endl; 17810152Satgutier@umich.edu cout << indent_str << "SRAM" << endl; 17910152Satgutier@umich.edu sram.display(indent + 2); 18010152Satgutier@umich.edu 18110152Satgutier@umich.edu cout << endl; 18210152Satgutier@umich.edu cout << indent_str << "DRAM" << endl; 18310152Satgutier@umich.edu dram.display(indent + 2); 18410152Satgutier@umich.edu} 18510152Satgutier@umich.edu 18610152Satgutier@umich.edu 18710152Satgutier@umich.eduDynamicParameter::DynamicParameter(): 18810152Satgutier@umich.edu use_inp_params(0), cell(), is_valid(true) 18910152Satgutier@umich.edu{ 19010152Satgutier@umich.edu} 19110152Satgutier@umich.edu 19210152Satgutier@umich.edu 19310152Satgutier@umich.edu 19410152Satgutier@umich.eduDynamicParameter::DynamicParameter( 19510152Satgutier@umich.edu bool is_tag_, 19610152Satgutier@umich.edu int pure_ram_, 19710152Satgutier@umich.edu int pure_cam_, 19810152Satgutier@umich.edu double Nspd_, 19910152Satgutier@umich.edu unsigned int Ndwl_, 20010152Satgutier@umich.edu unsigned int Ndbl_, 20110152Satgutier@umich.edu unsigned int Ndcm_, 20210152Satgutier@umich.edu unsigned int Ndsam_lev_1_, 20310152Satgutier@umich.edu unsigned int Ndsam_lev_2_, 20410152Satgutier@umich.edu bool is_main_mem_): 20510152Satgutier@umich.edu is_tag(is_tag_), pure_ram(pure_ram_), pure_cam(pure_cam_), tagbits(0), Nspd(Nspd_), Ndwl(Ndwl_), Ndbl(Ndbl_),Ndcm(Ndcm_), 20610152Satgutier@umich.edu Ndsam_lev_1(Ndsam_lev_1_), Ndsam_lev_2(Ndsam_lev_2_), 20710152Satgutier@umich.edu number_way_select_signals_mat(0), V_b_sense(0), use_inp_params(0), 20810152Satgutier@umich.edu is_main_mem(is_main_mem_), cell(), is_valid(false) 20910152Satgutier@umich.edu{ 21010152Satgutier@umich.edu ram_cell_tech_type = (is_tag) ? g_ip->tag_arr_ram_cell_tech_type : g_ip->data_arr_ram_cell_tech_type; 21110152Satgutier@umich.edu is_dram = ((ram_cell_tech_type == lp_dram) || (ram_cell_tech_type == comm_dram)); 21210152Satgutier@umich.edu 21310152Satgutier@umich.edu unsigned int capacity_per_die = g_ip->cache_sz / NUMBER_STACKED_DIE_LAYERS; // capacity per stacked die layer 21410152Satgutier@umich.edu const TechnologyParameter::InterconnectType & wire_local = g_tp.wire_local; 21510152Satgutier@umich.edu fully_assoc = (g_ip->fully_assoc) ? true : false; 21610152Satgutier@umich.edu 21710152Satgutier@umich.edu if (fully_assoc || pure_cam) 21810152Satgutier@umich.edu { // fully-assocative cache -- ref: CACTi 2.0 report 21910152Satgutier@umich.edu if (Ndwl != 1 || //Ndwl is fixed to 1 for FA 22010152Satgutier@umich.edu Ndcm != 1 || //Ndcm is fixed to 1 for FA 22110152Satgutier@umich.edu Nspd < 1 || Nspd > 1 || //Nspd is fixed to 1 for FA 22210152Satgutier@umich.edu Ndsam_lev_1 != 1 || //Ndsam_lev_1 is fixed to one 22310152Satgutier@umich.edu Ndsam_lev_2 != 1 || //Ndsam_lev_2 is fixed to one 22410152Satgutier@umich.edu Ndbl < 2) 22510152Satgutier@umich.edu { 22610152Satgutier@umich.edu return; 22710152Satgutier@umich.edu } 22810152Satgutier@umich.edu } 22910152Satgutier@umich.edu 23010152Satgutier@umich.edu if ((is_dram) && (!is_tag) && (Ndcm > 1)) 23110152Satgutier@umich.edu { 23210152Satgutier@umich.edu return; // For a DRAM array, each bitline has its own sense-amp 23310152Satgutier@umich.edu } 23410152Satgutier@umich.edu 23510152Satgutier@umich.edu // If it's not an FA tag/data array, Ndwl should be at least two and Ndbl should be 23610152Satgutier@umich.edu // at least two because an array is assumed to have at least one mat. And a mat 23710152Satgutier@umich.edu // is formed out of two horizontal subarrays and two vertical subarrays 23810152Satgutier@umich.edu if (fully_assoc == false && (Ndwl < 1 || Ndbl < 1)) 23910152Satgutier@umich.edu { 24010152Satgutier@umich.edu return; 24110152Satgutier@umich.edu } 24210152Satgutier@umich.edu 24310152Satgutier@umich.edu //***********compute row, col of an subarray 24410152Satgutier@umich.edu if (!(fully_assoc || pure_cam))//Not fully_asso nor cam 24510152Satgutier@umich.edu { 24610152Satgutier@umich.edu // if data array, let tagbits = 0 24710152Satgutier@umich.edu if (is_tag) 24810152Satgutier@umich.edu { 24910152Satgutier@umich.edu if (g_ip->specific_tag) 25010152Satgutier@umich.edu { 25110152Satgutier@umich.edu tagbits = g_ip->tag_w; 25210152Satgutier@umich.edu } 25310152Satgutier@umich.edu else 25410152Satgutier@umich.edu { 25510152Satgutier@umich.edu tagbits = ADDRESS_BITS + EXTRA_TAG_BITS - _log2(capacity_per_die) + 25610152Satgutier@umich.edu _log2(g_ip->tag_assoc*2 - 1) - _log2(g_ip->nbanks); 25710152Satgutier@umich.edu 25810152Satgutier@umich.edu } 25910152Satgutier@umich.edu tagbits = (((tagbits + 3) >> 2) << 2); 26010152Satgutier@umich.edu 26110152Satgutier@umich.edu num_r_subarray = (int)ceil(capacity_per_die / (g_ip->nbanks * 26210152Satgutier@umich.edu g_ip->block_sz * g_ip->tag_assoc * Ndbl * Nspd));// + EPSILON); 26310152Satgutier@umich.edu num_c_subarray = (int)ceil((tagbits * g_ip->tag_assoc * Nspd / Ndwl));// + EPSILON); 26410152Satgutier@umich.edu //burst_length = 1; 26510152Satgutier@umich.edu } 26610152Satgutier@umich.edu else 26710152Satgutier@umich.edu { 26810152Satgutier@umich.edu num_r_subarray = (int)ceil(capacity_per_die / (g_ip->nbanks * 26910152Satgutier@umich.edu g_ip->block_sz * g_ip->data_assoc * Ndbl * Nspd));// + EPSILON); 27010152Satgutier@umich.edu num_c_subarray = (int)ceil((8 * g_ip->block_sz * g_ip->data_assoc * Nspd / Ndwl));// + EPSILON); + EPSILON); 27110152Satgutier@umich.edu // burst_length = g_ip->block_sz * 8 / g_ip->out_w; 27210152Satgutier@umich.edu } 27310152Satgutier@umich.edu 27410152Satgutier@umich.edu if (num_r_subarray < MINSUBARRAYROWS) return; 27510152Satgutier@umich.edu if (num_r_subarray == 0) return; 27610152Satgutier@umich.edu if (num_r_subarray > MAXSUBARRAYROWS) return; 27710152Satgutier@umich.edu if (num_c_subarray < MINSUBARRAYCOLS) return; 27810152Satgutier@umich.edu if (num_c_subarray > MAXSUBARRAYCOLS) return; 27910152Satgutier@umich.edu 28010152Satgutier@umich.edu } 28110152Satgutier@umich.edu 28210152Satgutier@umich.edu else 28310152Satgutier@umich.edu {//either fully-asso or cam 28410152Satgutier@umich.edu if (pure_cam) 28510152Satgutier@umich.edu { 28610152Satgutier@umich.edu if (g_ip->specific_tag) 28710152Satgutier@umich.edu { 28810152Satgutier@umich.edu tagbits = int(ceil(g_ip->tag_w/8.0)*8); 28910152Satgutier@umich.edu } 29010152Satgutier@umich.edu else 29110152Satgutier@umich.edu { 29210152Satgutier@umich.edu tagbits = int(ceil((ADDRESS_BITS + EXTRA_TAG_BITS)/8.0)*8); 29310152Satgutier@umich.edu// cout<<"Pure CAM needs tag width to be specified"<<endl; 29410152Satgutier@umich.edu// exit(0); 29510152Satgutier@umich.edu } 29610152Satgutier@umich.edu //tagbits = (((tagbits + 3) >> 2) << 2); 29710152Satgutier@umich.edu 29810152Satgutier@umich.edu tag_num_r_subarray = (int)ceil(capacity_per_die / (g_ip->nbanks*tagbits/8.0 * Ndbl));//TODO: error check input of tagbits and blocksize //TODO: for pure CAM, g_ip->block should be number of entries. 29910152Satgutier@umich.edu //tag_num_c_subarray = (int)(tagbits + EPSILON); 30010152Satgutier@umich.edu tag_num_c_subarray = tagbits; 30110152Satgutier@umich.edu if (tag_num_r_subarray == 0) return; 30210152Satgutier@umich.edu if (tag_num_r_subarray > MAXSUBARRAYROWS) return; 30310152Satgutier@umich.edu if (tag_num_c_subarray < MINSUBARRAYCOLS) return; 30410152Satgutier@umich.edu if (tag_num_c_subarray > MAXSUBARRAYCOLS) return; 30510152Satgutier@umich.edu num_r_subarray = tag_num_r_subarray; 30610152Satgutier@umich.edu } 30710152Satgutier@umich.edu else //fully associative 30810152Satgutier@umich.edu { 30910152Satgutier@umich.edu if (g_ip->specific_tag) 31010152Satgutier@umich.edu { 31110152Satgutier@umich.edu tagbits = g_ip->tag_w; 31210152Satgutier@umich.edu } 31310152Satgutier@umich.edu else 31410152Satgutier@umich.edu { 31510152Satgutier@umich.edu tagbits = ADDRESS_BITS + EXTRA_TAG_BITS - _log2(g_ip->block_sz);//TODO: should be the page_offset=log2(page size), but this info is not avail with CACTI, for McPAT this is no problem. 31610152Satgutier@umich.edu } 31710152Satgutier@umich.edu tagbits = (((tagbits + 3) >> 2) << 2); 31810152Satgutier@umich.edu 31910152Satgutier@umich.edu tag_num_r_subarray = (int)(capacity_per_die / (g_ip->nbanks*g_ip->block_sz * Ndbl)); 32010152Satgutier@umich.edu tag_num_c_subarray = (int)ceil((tagbits * Nspd / Ndwl));// + EPSILON); 32110152Satgutier@umich.edu if (tag_num_r_subarray == 0) return; 32210152Satgutier@umich.edu if (tag_num_r_subarray > MAXSUBARRAYROWS) return; 32310152Satgutier@umich.edu if (tag_num_c_subarray < MINSUBARRAYCOLS) return; 32410152Satgutier@umich.edu if (tag_num_c_subarray > MAXSUBARRAYCOLS) return; 32510152Satgutier@umich.edu 32610152Satgutier@umich.edu data_num_r_subarray = tag_num_r_subarray; 32710152Satgutier@umich.edu data_num_c_subarray = 8 * g_ip->block_sz; 32810152Satgutier@umich.edu if (data_num_r_subarray == 0) return; 32910152Satgutier@umich.edu if (data_num_r_subarray > MAXSUBARRAYROWS) return; 33010152Satgutier@umich.edu if (data_num_c_subarray < MINSUBARRAYCOLS) return; 33110152Satgutier@umich.edu if (data_num_c_subarray > MAXSUBARRAYCOLS) return; 33210152Satgutier@umich.edu num_r_subarray = tag_num_r_subarray; 33310152Satgutier@umich.edu } 33410152Satgutier@umich.edu } 33510152Satgutier@umich.edu 33610152Satgutier@umich.edu num_subarrays = Ndwl * Ndbl; 33710152Satgutier@umich.edu //****************end of computation of row, col of an subarray 33810152Satgutier@umich.edu 33910152Satgutier@umich.edu // calculate wire parameters 34010152Satgutier@umich.edu if (fully_assoc || pure_cam) 34110152Satgutier@umich.edu { 34210152Satgutier@umich.edu cam_cell.h = g_tp.cam.b_h + 2 * wire_local.pitch * (g_ip->num_rw_ports-1 + g_ip->num_rd_ports + g_ip->num_wr_ports) 34310152Satgutier@umich.edu + 2 * wire_local.pitch*(g_ip->num_search_ports-1) + wire_local.pitch * g_ip->num_se_rd_ports; 34410152Satgutier@umich.edu cam_cell.w = g_tp.cam.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports-1 + g_ip->num_rd_ports + g_ip->num_wr_ports) 34510152Satgutier@umich.edu + 2 * wire_local.pitch*(g_ip->num_search_ports-1) + wire_local.pitch * g_ip->num_se_rd_ports; 34610152Satgutier@umich.edu 34710152Satgutier@umich.edu cell.h = g_tp.sram.b_h + 2 * wire_local.pitch * (g_ip->num_wr_ports +g_ip->num_rw_ports-1 + g_ip->num_rd_ports) 34810152Satgutier@umich.edu + 2 * wire_local.pitch*(g_ip->num_search_ports-1); 34910152Satgutier@umich.edu cell.w = g_tp.sram.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports -1 + (g_ip->num_rd_ports - g_ip->num_se_rd_ports) 35010152Satgutier@umich.edu + g_ip->num_wr_ports) + g_tp.wire_local.pitch * g_ip->num_se_rd_ports + 2 * wire_local.pitch*(g_ip->num_search_ports-1); 35110152Satgutier@umich.edu } 35210152Satgutier@umich.edu else 35310152Satgutier@umich.edu { 35410152Satgutier@umich.edu if(is_tag) 35510152Satgutier@umich.edu { 35610152Satgutier@umich.edu cell.h = g_tp.sram.b_h + 2 * wire_local.pitch * (g_ip->num_rw_ports - 1 + g_ip->num_rd_ports + 35710152Satgutier@umich.edu g_ip->num_wr_ports); 35810152Satgutier@umich.edu cell.w = g_tp.sram.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports - 1 + g_ip->num_wr_ports + 35910152Satgutier@umich.edu (g_ip->num_rd_ports - g_ip->num_se_rd_ports)) + 36010152Satgutier@umich.edu wire_local.pitch * g_ip->num_se_rd_ports; 36110152Satgutier@umich.edu } 36210152Satgutier@umich.edu else 36310152Satgutier@umich.edu { 36410152Satgutier@umich.edu if (is_dram) 36510152Satgutier@umich.edu { 36610152Satgutier@umich.edu cell.h = g_tp.dram.b_h; 36710152Satgutier@umich.edu cell.w = g_tp.dram.b_w; 36810152Satgutier@umich.edu } 36910152Satgutier@umich.edu else 37010152Satgutier@umich.edu { 37110152Satgutier@umich.edu cell.h = g_tp.sram.b_h + 2 * wire_local.pitch * (g_ip->num_wr_ports + 37210152Satgutier@umich.edu g_ip->num_rw_ports - 1 + g_ip->num_rd_ports); 37310152Satgutier@umich.edu cell.w = g_tp.sram.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports - 1 + 37410152Satgutier@umich.edu (g_ip->num_rd_ports - g_ip->num_se_rd_ports) + 37510152Satgutier@umich.edu g_ip->num_wr_ports) + g_tp.wire_local.pitch * g_ip->num_se_rd_ports; 37610152Satgutier@umich.edu } 37710152Satgutier@umich.edu } 37810152Satgutier@umich.edu } 37910152Satgutier@umich.edu 38010152Satgutier@umich.edu double c_b_metal = cell.h * wire_local.C_per_um; 38110152Satgutier@umich.edu double C_bl; 38210152Satgutier@umich.edu 38310152Satgutier@umich.edu if (!(fully_assoc || pure_cam)) 38410152Satgutier@umich.edu { 38510152Satgutier@umich.edu if (is_dram) 38610152Satgutier@umich.edu { 38710152Satgutier@umich.edu deg_bl_muxing = 1; 38810152Satgutier@umich.edu if (ram_cell_tech_type == comm_dram) 38910152Satgutier@umich.edu { 39010152Satgutier@umich.edu C_bl = num_r_subarray * c_b_metal; 39110152Satgutier@umich.edu V_b_sense = (g_tp.dram_cell_Vdd/2) * g_tp.dram_cell_C / (g_tp.dram_cell_C + C_bl); 39210152Satgutier@umich.edu if (V_b_sense < VBITSENSEMIN) 39310152Satgutier@umich.edu { 39410152Satgutier@umich.edu return; 39510152Satgutier@umich.edu } 39610152Satgutier@umich.edu V_b_sense = VBITSENSEMIN; // in any case, we fix sense amp input signal to a constant value 39710152Satgutier@umich.edu dram_refresh_period = 64e-3; 39810152Satgutier@umich.edu } 39910152Satgutier@umich.edu else 40010152Satgutier@umich.edu { 40110152Satgutier@umich.edu double Cbitrow_drain_cap = drain_C_(g_tp.dram.cell_a_w, NCH, 1, 0, cell.w, true, true) / 2.0; 40210152Satgutier@umich.edu C_bl = num_r_subarray * (Cbitrow_drain_cap + c_b_metal); 40310152Satgutier@umich.edu V_b_sense = (g_tp.dram_cell_Vdd/2) * g_tp.dram_cell_C /(g_tp.dram_cell_C + C_bl); 40410152Satgutier@umich.edu 40510152Satgutier@umich.edu if (V_b_sense < VBITSENSEMIN) 40610152Satgutier@umich.edu { 40710152Satgutier@umich.edu return; //Sense amp input signal is smaller that minimum allowable sense amp input signal 40810152Satgutier@umich.edu } 40910152Satgutier@umich.edu V_b_sense = VBITSENSEMIN; // in any case, we fix sense amp input signal to a constant value 41010152Satgutier@umich.edu //v_storage_worst = g_tp.dram_cell_Vdd / 2 - VBITSENSEMIN * (g_tp.dram_cell_C + C_bl) / g_tp.dram_cell_C; 41110152Satgutier@umich.edu //dram_refresh_period = 1.1 * g_tp.dram_cell_C * v_storage_worst / g_tp.dram_cell_I_off_worst_case_len_temp; 41210152Satgutier@umich.edu dram_refresh_period = 0.9 * g_tp.dram_cell_C * VDD_STORAGE_LOSS_FRACTION_WORST * g_tp.dram_cell_Vdd / g_tp.dram_cell_I_off_worst_case_len_temp; 41310152Satgutier@umich.edu } 41410152Satgutier@umich.edu } 41510152Satgutier@umich.edu else 41610152Satgutier@umich.edu { //SRAM 41710152Satgutier@umich.edu V_b_sense = (0.05 * g_tp.sram_cell.Vdd > VBITSENSEMIN) ? 0.05 * g_tp.sram_cell.Vdd : VBITSENSEMIN; 41810152Satgutier@umich.edu deg_bl_muxing = Ndcm; 41910152Satgutier@umich.edu // "/ 2.0" below is due to the fact that two adjacent access transistors share drain 42010152Satgutier@umich.edu // contacts in a physical layout 42110152Satgutier@umich.edu double Cbitrow_drain_cap = drain_C_(g_tp.sram.cell_a_w, NCH, 1, 0, cell.w, false, true) / 2.0; 42210152Satgutier@umich.edu C_bl = num_r_subarray * (Cbitrow_drain_cap + c_b_metal); 42310152Satgutier@umich.edu dram_refresh_period = 0; 42410152Satgutier@umich.edu } 42510152Satgutier@umich.edu } 42610152Satgutier@umich.edu else 42710152Satgutier@umich.edu { 42810152Satgutier@umich.edu c_b_metal = cam_cell.h * wire_local.C_per_um;//IBM and SUN design, SRAM array uses dummy cells to fill the blank space due to mismatch on CAM-RAM 42910152Satgutier@umich.edu V_b_sense = (0.05 * g_tp.sram_cell.Vdd > VBITSENSEMIN) ? 0.05 * g_tp.sram_cell.Vdd : VBITSENSEMIN; 43010152Satgutier@umich.edu deg_bl_muxing = 1;//FA fix as 1 43110152Satgutier@umich.edu // "/ 2.0" below is due to the fact that two adjacent access transistors share drain 43210152Satgutier@umich.edu // contacts in a physical layout 43310152Satgutier@umich.edu double Cbitrow_drain_cap = drain_C_(g_tp.cam.cell_a_w, NCH, 1, 0, cam_cell.w, false, true) / 2.0;//TODO: comment out these two lines 43410152Satgutier@umich.edu C_bl = num_r_subarray * (Cbitrow_drain_cap + c_b_metal); 43510152Satgutier@umich.edu dram_refresh_period = 0; 43610152Satgutier@umich.edu } 43710152Satgutier@umich.edu 43810152Satgutier@umich.edu 43910152Satgutier@umich.edu // do/di: data in/out, for fully associative they are the data width for normal read and write 44010152Satgutier@umich.edu // so/si: search data in/out, for fully associative they are the data width for the search ops 44110152Satgutier@umich.edu // for CAM, si=di, but so = matching address. do = data out = di (for normal read/write) 44210152Satgutier@umich.edu // so/si needs broadcase while do/di do not 44310152Satgutier@umich.edu 44410152Satgutier@umich.edu if (fully_assoc || pure_cam) 44510152Satgutier@umich.edu { 44610152Satgutier@umich.edu switch (Ndbl) { 44710152Satgutier@umich.edu case (0): 44810152Satgutier@umich.edu cout << " Invalid Ndbl \n"<<endl; 44910152Satgutier@umich.edu exit(0); 45010152Satgutier@umich.edu break; 45110152Satgutier@umich.edu case (1): 45210152Satgutier@umich.edu num_mats_h_dir = 1;//one subarray per mat 45310152Satgutier@umich.edu num_mats_v_dir = 1; 45410152Satgutier@umich.edu break; 45510152Satgutier@umich.edu case (2): 45610152Satgutier@umich.edu num_mats_h_dir = 1;//two subarrays per mat 45710152Satgutier@umich.edu num_mats_v_dir = 1; 45810152Satgutier@umich.edu break; 45910152Satgutier@umich.edu default: 46010152Satgutier@umich.edu num_mats_h_dir = int(floor(sqrt(Ndbl/4.0)));//4 subbarrys per mat 46110152Satgutier@umich.edu num_mats_v_dir = int(Ndbl/4.0 / num_mats_h_dir); 46210152Satgutier@umich.edu } 46310152Satgutier@umich.edu num_mats = num_mats_h_dir * num_mats_v_dir; 46410152Satgutier@umich.edu 46510152Satgutier@umich.edu if (fully_assoc) 46610152Satgutier@umich.edu { 46710152Satgutier@umich.edu num_so_b_mat = data_num_c_subarray; 46810152Satgutier@umich.edu num_do_b_mat = data_num_c_subarray + tagbits; 46910152Satgutier@umich.edu } 47010152Satgutier@umich.edu else 47110152Satgutier@umich.edu { 47210152Satgutier@umich.edu num_so_b_mat = int(ceil(log2(num_r_subarray)) + ceil(log2(num_subarrays)));//the address contains the matched data 47310152Satgutier@umich.edu num_do_b_mat = tagbits; 47410152Satgutier@umich.edu } 47510152Satgutier@umich.edu } 47610152Satgutier@umich.edu else 47710152Satgutier@umich.edu { 47810152Satgutier@umich.edu num_mats_h_dir = MAX(Ndwl / 2, 1); 47910152Satgutier@umich.edu num_mats_v_dir = MAX(Ndbl / 2, 1); 48010152Satgutier@umich.edu num_mats = num_mats_h_dir * num_mats_v_dir; 48110152Satgutier@umich.edu num_do_b_mat = MAX((num_subarrays/num_mats) * num_c_subarray / (deg_bl_muxing * Ndsam_lev_1 * Ndsam_lev_2), 1); 48210152Satgutier@umich.edu } 48310152Satgutier@umich.edu 48410152Satgutier@umich.edu if (!(fully_assoc|| pure_cam) && (num_do_b_mat < (num_subarrays/num_mats))) 48510152Satgutier@umich.edu { 48610152Satgutier@umich.edu return; 48710152Satgutier@umich.edu } 48810152Satgutier@umich.edu 48910152Satgutier@umich.edu 49010152Satgutier@umich.edu int deg_sa_mux_l1_non_assoc; 49110152Satgutier@umich.edu //TODO:the i/o for subbank is not necessary and should be removed. 49210152Satgutier@umich.edu if (!(fully_assoc || pure_cam)) 49310152Satgutier@umich.edu { 49410152Satgutier@umich.edu if (!is_tag) 49510152Satgutier@umich.edu { 49610152Satgutier@umich.edu if (is_main_mem == true) 49710152Satgutier@umich.edu { 49810152Satgutier@umich.edu num_do_b_subbank = g_ip->int_prefetch_w * g_ip->out_w; 49910152Satgutier@umich.edu deg_sa_mux_l1_non_assoc = Ndsam_lev_1; 50010152Satgutier@umich.edu } 50110152Satgutier@umich.edu else 50210152Satgutier@umich.edu { 50310152Satgutier@umich.edu if (g_ip->fast_access == true) 50410152Satgutier@umich.edu { 50510152Satgutier@umich.edu num_do_b_subbank = g_ip->out_w * g_ip->data_assoc; 50610152Satgutier@umich.edu deg_sa_mux_l1_non_assoc = Ndsam_lev_1; 50710152Satgutier@umich.edu } 50810152Satgutier@umich.edu else 50910152Satgutier@umich.edu { 51010152Satgutier@umich.edu 51110152Satgutier@umich.edu num_do_b_subbank = g_ip->out_w; 51210152Satgutier@umich.edu deg_sa_mux_l1_non_assoc = Ndsam_lev_1 / g_ip->data_assoc; 51310152Satgutier@umich.edu if (deg_sa_mux_l1_non_assoc < 1) 51410152Satgutier@umich.edu { 51510152Satgutier@umich.edu return; 51610152Satgutier@umich.edu } 51710152Satgutier@umich.edu 51810152Satgutier@umich.edu } 51910152Satgutier@umich.edu } 52010152Satgutier@umich.edu } 52110152Satgutier@umich.edu else 52210152Satgutier@umich.edu { 52310152Satgutier@umich.edu num_do_b_subbank = tagbits * g_ip->tag_assoc; 52410152Satgutier@umich.edu if (num_do_b_mat < tagbits) 52510152Satgutier@umich.edu { 52610152Satgutier@umich.edu return; 52710152Satgutier@umich.edu } 52810152Satgutier@umich.edu deg_sa_mux_l1_non_assoc = Ndsam_lev_1; 52910152Satgutier@umich.edu //num_do_b_mat = g_ip->tag_assoc / num_mats_h_dir; 53010152Satgutier@umich.edu } 53110152Satgutier@umich.edu } 53210152Satgutier@umich.edu else 53310152Satgutier@umich.edu { 53410152Satgutier@umich.edu if (fully_assoc) 53510152Satgutier@umich.edu { 53610152Satgutier@umich.edu num_so_b_subbank = 8 * g_ip->block_sz;//TODO:internal perfetch should be considered also for fa 53710152Satgutier@umich.edu num_do_b_subbank = num_so_b_subbank + tag_num_c_subarray; 53810152Satgutier@umich.edu } 53910152Satgutier@umich.edu else 54010152Satgutier@umich.edu { 54110152Satgutier@umich.edu num_so_b_subbank = int(ceil(log2(num_r_subarray)) + ceil(log2(num_subarrays)));//the address contains the matched data 54210152Satgutier@umich.edu num_do_b_subbank = tag_num_c_subarray; 54310152Satgutier@umich.edu } 54410152Satgutier@umich.edu 54510152Satgutier@umich.edu deg_sa_mux_l1_non_assoc = 1; 54610152Satgutier@umich.edu } 54710152Satgutier@umich.edu 54810152Satgutier@umich.edu deg_senseamp_muxing_non_associativity = deg_sa_mux_l1_non_assoc; 54910152Satgutier@umich.edu 55010152Satgutier@umich.edu if (fully_assoc || pure_cam) 55110152Satgutier@umich.edu { 55210152Satgutier@umich.edu num_act_mats_hor_dir = 1; 55310152Satgutier@umich.edu num_act_mats_hor_dir_sl = num_mats_h_dir;//TODO: this is unnecessary, since search op, num_mats is used 55410152Satgutier@umich.edu } 55510152Satgutier@umich.edu else 55610152Satgutier@umich.edu { 55710152Satgutier@umich.edu num_act_mats_hor_dir = num_do_b_subbank / num_do_b_mat; 55810152Satgutier@umich.edu if (num_act_mats_hor_dir == 0) 55910152Satgutier@umich.edu { 56010152Satgutier@umich.edu return; 56110152Satgutier@umich.edu } 56210152Satgutier@umich.edu } 56310152Satgutier@umich.edu 56410152Satgutier@umich.edu //compute num_do_mat for tag 56510152Satgutier@umich.edu if (is_tag) 56610152Satgutier@umich.edu { 56710152Satgutier@umich.edu if (!(fully_assoc || pure_cam)) 56810152Satgutier@umich.edu { 56910152Satgutier@umich.edu num_do_b_mat = g_ip->tag_assoc / num_act_mats_hor_dir; 57010152Satgutier@umich.edu num_do_b_subbank = num_act_mats_hor_dir * num_do_b_mat; 57110152Satgutier@umich.edu } 57210152Satgutier@umich.edu } 57310152Satgutier@umich.edu 57410152Satgutier@umich.edu if ((g_ip->is_cache == false && is_main_mem == true) || (PAGE_MODE == 1 && is_dram)) 57510152Satgutier@umich.edu { 57610152Satgutier@umich.edu if (num_act_mats_hor_dir * num_do_b_mat * Ndsam_lev_1 * Ndsam_lev_2 != (int)g_ip->page_sz_bits) 57710152Satgutier@umich.edu { 57810152Satgutier@umich.edu return; 57910152Satgutier@umich.edu } 58010152Satgutier@umich.edu } 58110152Satgutier@umich.edu 58210152Satgutier@umich.edu// if (is_tag == false && g_ip->is_cache == true && !fully_assoc && !pure_cam && //TODO: TODO burst transfer should also apply to RAM arrays 58310152Satgutier@umich.edu if (is_tag == false && g_ip->is_main_mem == true && 58410152Satgutier@umich.edu num_act_mats_hor_dir*num_do_b_mat*Ndsam_lev_1*Ndsam_lev_2 < ((int) g_ip->out_w * (int) g_ip->burst_len * (int) g_ip->data_assoc)) 58510152Satgutier@umich.edu { 58610152Satgutier@umich.edu return; 58710152Satgutier@umich.edu } 58810152Satgutier@umich.edu 58910152Satgutier@umich.edu if (num_act_mats_hor_dir > num_mats_h_dir) 59010152Satgutier@umich.edu { 59110152Satgutier@umich.edu return; 59210152Satgutier@umich.edu } 59310152Satgutier@umich.edu 59410152Satgutier@umich.edu 59510152Satgutier@umich.edu //compute di for mat subbank and bank 59610152Satgutier@umich.edu if (!(fully_assoc ||pure_cam)) 59710152Satgutier@umich.edu { 59810152Satgutier@umich.edu if(!is_tag) 59910152Satgutier@umich.edu { 60010152Satgutier@umich.edu if(g_ip->fast_access == true) 60110152Satgutier@umich.edu { 60210152Satgutier@umich.edu num_di_b_mat = num_do_b_mat / g_ip->data_assoc; 60310152Satgutier@umich.edu } 60410152Satgutier@umich.edu else 60510152Satgutier@umich.edu { 60610152Satgutier@umich.edu num_di_b_mat = num_do_b_mat; 60710152Satgutier@umich.edu } 60810152Satgutier@umich.edu } 60910152Satgutier@umich.edu else 61010152Satgutier@umich.edu { 61110152Satgutier@umich.edu num_di_b_mat = tagbits; 61210152Satgutier@umich.edu } 61310152Satgutier@umich.edu } 61410152Satgutier@umich.edu else 61510152Satgutier@umich.edu { 61610152Satgutier@umich.edu if (fully_assoc) 61710152Satgutier@umich.edu { 61810152Satgutier@umich.edu num_di_b_mat = num_do_b_mat; 61910152Satgutier@umich.edu //*num_subarrays/num_mats; bits per mat of CAM/FA is as same as cache, 62010152Satgutier@umich.edu //but inside the mat wire tracks need to be reserved for search data bus 62110152Satgutier@umich.edu num_si_b_mat = tagbits; 62210152Satgutier@umich.edu } 62310152Satgutier@umich.edu else 62410152Satgutier@umich.edu { 62510152Satgutier@umich.edu num_di_b_mat = tagbits; 62610152Satgutier@umich.edu num_si_b_mat = tagbits;//*num_subarrays/num_mats; 62710152Satgutier@umich.edu } 62810152Satgutier@umich.edu 62910152Satgutier@umich.edu } 63010152Satgutier@umich.edu 63110152Satgutier@umich.edu num_di_b_subbank = num_di_b_mat * num_act_mats_hor_dir;//normal cache or normal r/w for FA 63210152Satgutier@umich.edu num_si_b_subbank = num_si_b_mat; //* num_act_mats_hor_dir_sl; inside the data is broadcast 63310152Satgutier@umich.edu 63410152Satgutier@umich.edu int num_addr_b_row_dec = _log2(num_r_subarray); 63510152Satgutier@umich.edu if ((fully_assoc ||pure_cam)) 63610152Satgutier@umich.edu num_addr_b_row_dec +=_log2(num_subarrays/num_mats); 63710152Satgutier@umich.edu int number_subbanks = num_mats / num_act_mats_hor_dir; 63810152Satgutier@umich.edu number_subbanks_decode = _log2(number_subbanks);//TODO: add log2(num_subarray_per_bank) to FA/CAM 63910152Satgutier@umich.edu 64010152Satgutier@umich.edu num_rw_ports = g_ip->num_rw_ports; 64110152Satgutier@umich.edu num_rd_ports = g_ip->num_rd_ports; 64210152Satgutier@umich.edu num_wr_ports = g_ip->num_wr_ports; 64310152Satgutier@umich.edu num_se_rd_ports = g_ip->num_se_rd_ports; 64410152Satgutier@umich.edu num_search_ports = g_ip->num_search_ports; 64510152Satgutier@umich.edu 64610152Satgutier@umich.edu if (is_dram && is_main_mem) 64710152Satgutier@umich.edu { 64810152Satgutier@umich.edu number_addr_bits_mat = MAX((unsigned int) num_addr_b_row_dec, 64910152Satgutier@umich.edu _log2(deg_bl_muxing) + _log2(deg_sa_mux_l1_non_assoc) + _log2(Ndsam_lev_2)); 65010152Satgutier@umich.edu } 65110152Satgutier@umich.edu else 65210152Satgutier@umich.edu { 65310152Satgutier@umich.edu number_addr_bits_mat = num_addr_b_row_dec + _log2(deg_bl_muxing) + 65410152Satgutier@umich.edu _log2(deg_sa_mux_l1_non_assoc) + _log2(Ndsam_lev_2); 65510152Satgutier@umich.edu } 65610152Satgutier@umich.edu 65710152Satgutier@umich.edu if (!(fully_assoc ||pure_cam)) 65810152Satgutier@umich.edu { 65910152Satgutier@umich.edu if (is_tag) 66010152Satgutier@umich.edu { 66110152Satgutier@umich.edu num_di_b_bank_per_port = tagbits; 66210152Satgutier@umich.edu num_do_b_bank_per_port = g_ip->data_assoc; 66310152Satgutier@umich.edu } 66410152Satgutier@umich.edu else 66510152Satgutier@umich.edu { 66610152Satgutier@umich.edu num_di_b_bank_per_port = g_ip->out_w + g_ip->data_assoc; 66710152Satgutier@umich.edu num_do_b_bank_per_port = g_ip->out_w; 66810152Satgutier@umich.edu } 66910152Satgutier@umich.edu } 67010152Satgutier@umich.edu else 67110152Satgutier@umich.edu { 67210152Satgutier@umich.edu if (fully_assoc) 67310152Satgutier@umich.edu { 67410152Satgutier@umich.edu num_di_b_bank_per_port = g_ip->out_w + tagbits;//TODO: out_w or block_sz? 67510152Satgutier@umich.edu num_si_b_bank_per_port = tagbits; 67610152Satgutier@umich.edu num_do_b_bank_per_port = g_ip->out_w + tagbits; 67710152Satgutier@umich.edu num_so_b_bank_per_port = g_ip->out_w; 67810152Satgutier@umich.edu } 67910152Satgutier@umich.edu else 68010152Satgutier@umich.edu { 68110152Satgutier@umich.edu num_di_b_bank_per_port = tagbits; 68210152Satgutier@umich.edu num_si_b_bank_per_port = tagbits; 68310152Satgutier@umich.edu num_do_b_bank_per_port = tagbits; 68410152Satgutier@umich.edu num_so_b_bank_per_port = int(ceil(log2(num_r_subarray)) + ceil(log2(num_subarrays))); 68510152Satgutier@umich.edu } 68610152Satgutier@umich.edu } 68710152Satgutier@umich.edu 68810152Satgutier@umich.edu if ((!is_tag) && (g_ip->data_assoc > 1) && (!g_ip->fast_access)) 68910152Satgutier@umich.edu { 69010152Satgutier@umich.edu number_way_select_signals_mat = g_ip->data_assoc; 69110152Satgutier@umich.edu } 69210152Satgutier@umich.edu 69310152Satgutier@umich.edu // add ECC adjustment to all data signals that traverse on H-trees. 69410152Satgutier@umich.edu if (g_ip->add_ecc_b_ == true) 69510152Satgutier@umich.edu { 69610152Satgutier@umich.edu num_do_b_mat += (int) (ceil(num_do_b_mat / num_bits_per_ecc_b_)); 69710152Satgutier@umich.edu num_di_b_mat += (int) (ceil(num_di_b_mat / num_bits_per_ecc_b_)); 69810152Satgutier@umich.edu num_di_b_subbank += (int) (ceil(num_di_b_subbank / num_bits_per_ecc_b_)); 69910152Satgutier@umich.edu num_do_b_subbank += (int) (ceil(num_do_b_subbank / num_bits_per_ecc_b_)); 70010152Satgutier@umich.edu num_di_b_bank_per_port += (int) (ceil(num_di_b_bank_per_port / num_bits_per_ecc_b_)); 70110152Satgutier@umich.edu num_do_b_bank_per_port += (int) (ceil(num_do_b_bank_per_port / num_bits_per_ecc_b_)); 70210152Satgutier@umich.edu 70310152Satgutier@umich.edu num_so_b_mat += (int) (ceil(num_so_b_mat / num_bits_per_ecc_b_)); 70410152Satgutier@umich.edu num_si_b_mat += (int) (ceil(num_si_b_mat / num_bits_per_ecc_b_)); 70510152Satgutier@umich.edu num_si_b_subbank += (int) (ceil(num_si_b_subbank / num_bits_per_ecc_b_)); 70610152Satgutier@umich.edu num_so_b_subbank += (int) (ceil(num_so_b_subbank / num_bits_per_ecc_b_)); 70710152Satgutier@umich.edu num_si_b_bank_per_port += (int) (ceil(num_si_b_bank_per_port / num_bits_per_ecc_b_)); 70810152Satgutier@umich.edu num_so_b_bank_per_port += (int) (ceil(num_so_b_bank_per_port / num_bits_per_ecc_b_)); 70910152Satgutier@umich.edu } 71010152Satgutier@umich.edu 71110152Satgutier@umich.edu is_valid = true; 71210152Satgutier@umich.edu} 71310152Satgutier@umich.edu 714