BranchPredictor.py revision 13627
113481Sgiacomo.travaglini@arm.com# Copyright (c) 2012 Mark D. Hill and David A. Wood 213481Sgiacomo.travaglini@arm.com# Copyright (c) 2015 The University of Wisconsin 313481Sgiacomo.travaglini@arm.com# All rights reserved. 413481Sgiacomo.travaglini@arm.com# 513481Sgiacomo.travaglini@arm.com# Redistribution and use in source and binary forms, with or without 613481Sgiacomo.travaglini@arm.com# modification, are permitted provided that the following conditions are 713481Sgiacomo.travaglini@arm.com# met: redistributions of source code must retain the above copyright 813481Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer; 913481Sgiacomo.travaglini@arm.com# redistributions in binary form must reproduce the above copyright 1013481Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer in the 1113481Sgiacomo.travaglini@arm.com# documentation and/or other materials provided with the distribution; 1213481Sgiacomo.travaglini@arm.com# neither the name of the copyright holders nor the names of its 1313481Sgiacomo.travaglini@arm.com# contributors may be used to endorse or promote products derived from 1413481Sgiacomo.travaglini@arm.com# this software without specific prior written permission. 1513481Sgiacomo.travaglini@arm.com# 1613481Sgiacomo.travaglini@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713481Sgiacomo.travaglini@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813481Sgiacomo.travaglini@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913481Sgiacomo.travaglini@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013481Sgiacomo.travaglini@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113481Sgiacomo.travaglini@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213481Sgiacomo.travaglini@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313481Sgiacomo.travaglini@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413481Sgiacomo.travaglini@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513481Sgiacomo.travaglini@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613481Sgiacomo.travaglini@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713481Sgiacomo.travaglini@arm.com# 2813481Sgiacomo.travaglini@arm.com# Authors: Nilay Vaish and Dibakar Gope 2913481Sgiacomo.travaglini@arm.com 3013481Sgiacomo.travaglini@arm.comfrom m5.SimObject import SimObject 3113481Sgiacomo.travaglini@arm.comfrom m5.params import * 3213481Sgiacomo.travaglini@arm.comfrom m5.proxy import * 3313481Sgiacomo.travaglini@arm.com 3413481Sgiacomo.travaglini@arm.comclass BranchPredictor(SimObject): 3513481Sgiacomo.travaglini@arm.com type = 'BranchPredictor' 3613481Sgiacomo.travaglini@arm.com cxx_class = 'BPredUnit' 3713481Sgiacomo.travaglini@arm.com cxx_header = "cpu/pred/bpred_unit.hh" 3813481Sgiacomo.travaglini@arm.com abstract = True 3913481Sgiacomo.travaglini@arm.com 4013481Sgiacomo.travaglini@arm.com numThreads = Param.Unsigned(Parent.numThreads, "Number of threads") 4113481Sgiacomo.travaglini@arm.com BTBEntries = Param.Unsigned(4096, "Number of BTB entries") 4213481Sgiacomo.travaglini@arm.com BTBTagSize = Param.Unsigned(16, "Size of the BTB tags, in bits") 4313481Sgiacomo.travaglini@arm.com RASSize = Param.Unsigned(16, "RAS size") 4413481Sgiacomo.travaglini@arm.com instShiftAmt = Param.Unsigned(2, "Number of bits to shift instructions by") 4513481Sgiacomo.travaglini@arm.com 4613481Sgiacomo.travaglini@arm.com useIndirect = Param.Bool(True, "Use indirect branch predictor") 4713481Sgiacomo.travaglini@arm.com indirectHashGHR = Param.Bool(True, "Hash branch predictor GHR") 4813481Sgiacomo.travaglini@arm.com indirectHashTargets = Param.Bool(True, "Hash path history targets") 4913481Sgiacomo.travaglini@arm.com indirectSets = Param.Unsigned(256, "Cache sets for indirect predictor") 5013481Sgiacomo.travaglini@arm.com indirectWays = Param.Unsigned(2, "Ways for indirect predictor") 5113481Sgiacomo.travaglini@arm.com indirectTagSize = Param.Unsigned(16, "Indirect target cache tag bits") 5213481Sgiacomo.travaglini@arm.com indirectPathLength = Param.Unsigned(3, 5313481Sgiacomo.travaglini@arm.com "Previous indirect targets to use for path history") 5413481Sgiacomo.travaglini@arm.com 5513481Sgiacomo.travaglini@arm.com 5613481Sgiacomo.travaglini@arm.com 5713481Sgiacomo.travaglini@arm.comclass LocalBP(BranchPredictor): 5813481Sgiacomo.travaglini@arm.com type = 'LocalBP' 5913481Sgiacomo.travaglini@arm.com cxx_class = 'LocalBP' 6013481Sgiacomo.travaglini@arm.com cxx_header = "cpu/pred/2bit_local.hh" 6113481Sgiacomo.travaglini@arm.com 6213481Sgiacomo.travaglini@arm.com localPredictorSize = Param.Unsigned(2048, "Size of local predictor") 6313481Sgiacomo.travaglini@arm.com localCtrBits = Param.Unsigned(2, "Bits per counter") 6413481Sgiacomo.travaglini@arm.com 6513481Sgiacomo.travaglini@arm.com 6613481Sgiacomo.travaglini@arm.comclass TournamentBP(BranchPredictor): 6713481Sgiacomo.travaglini@arm.com type = 'TournamentBP' 6813481Sgiacomo.travaglini@arm.com cxx_class = 'TournamentBP' 6913481Sgiacomo.travaglini@arm.com cxx_header = "cpu/pred/tournament.hh" 7013481Sgiacomo.travaglini@arm.com 7113481Sgiacomo.travaglini@arm.com localPredictorSize = Param.Unsigned(2048, "Size of local predictor") 7213481Sgiacomo.travaglini@arm.com localCtrBits = Param.Unsigned(2, "Bits per counter") 7313481Sgiacomo.travaglini@arm.com localHistoryTableSize = Param.Unsigned(2048, "size of local history table") 7413481Sgiacomo.travaglini@arm.com globalPredictorSize = Param.Unsigned(8192, "Size of global predictor") 7513481Sgiacomo.travaglini@arm.com globalCtrBits = Param.Unsigned(2, "Bits per counter") 7613481Sgiacomo.travaglini@arm.com choicePredictorSize = Param.Unsigned(8192, "Size of choice predictor") 7713481Sgiacomo.travaglini@arm.com choiceCtrBits = Param.Unsigned(2, "Bits of choice counters") 7813481Sgiacomo.travaglini@arm.com 7913481Sgiacomo.travaglini@arm.com 8013481Sgiacomo.travaglini@arm.comclass BiModeBP(BranchPredictor): 8113481Sgiacomo.travaglini@arm.com type = 'BiModeBP' 8213481Sgiacomo.travaglini@arm.com cxx_class = 'BiModeBP' 8313481Sgiacomo.travaglini@arm.com cxx_header = "cpu/pred/bi_mode.hh" 8413481Sgiacomo.travaglini@arm.com 8513481Sgiacomo.travaglini@arm.com globalPredictorSize = Param.Unsigned(8192, "Size of global predictor") 8613481Sgiacomo.travaglini@arm.com globalCtrBits = Param.Unsigned(2, "Bits per counter") 8713481Sgiacomo.travaglini@arm.com choicePredictorSize = Param.Unsigned(8192, "Size of choice predictor") 8813481Sgiacomo.travaglini@arm.com choiceCtrBits = Param.Unsigned(2, "Bits of choice counters") 8913481Sgiacomo.travaglini@arm.com 9013481Sgiacomo.travaglini@arm.comclass TAGEBase(SimObject): 9113481Sgiacomo.travaglini@arm.com type = 'TAGEBase' 9213481Sgiacomo.travaglini@arm.com cxx_class = 'TAGEBase' 9313481Sgiacomo.travaglini@arm.com cxx_header = "cpu/pred/tage_base.hh" 9413481Sgiacomo.travaglini@arm.com 9513481Sgiacomo.travaglini@arm.com numThreads = Param.Unsigned(Parent.numThreads, "Number of threads") 9613481Sgiacomo.travaglini@arm.com instShiftAmt = Param.Unsigned(Parent.instShiftAmt, 9713481Sgiacomo.travaglini@arm.com "Number of bits to shift instructions by") 9813481Sgiacomo.travaglini@arm.com 9913481Sgiacomo.travaglini@arm.com nHistoryTables = Param.Unsigned(7, "Number of history tables") 10013481Sgiacomo.travaglini@arm.com minHist = Param.Unsigned(5, "Minimum history size of TAGE") 10113481Sgiacomo.travaglini@arm.com maxHist = Param.Unsigned(130, "Maximum history size of TAGE") 10213481Sgiacomo.travaglini@arm.com 10313481Sgiacomo.travaglini@arm.com tagTableTagWidths = VectorParam.Unsigned( 10413481Sgiacomo.travaglini@arm.com [0, 9, 9, 10, 10, 11, 11, 12], "Tag size in TAGE tag tables") 10513481Sgiacomo.travaglini@arm.com logTagTableSizes = VectorParam.Int( 10613481Sgiacomo.travaglini@arm.com [13, 9, 9, 9, 9, 9, 9, 9], "Log2 of TAGE table sizes") 10713481Sgiacomo.travaglini@arm.com logRatioBiModalHystEntries = Param.Unsigned(2, 10813481Sgiacomo.travaglini@arm.com "Log num of prediction entries for a shared hysteresis bit " \ 10913481Sgiacomo.travaglini@arm.com "for the Bimodal") 11013481Sgiacomo.travaglini@arm.com 11113481Sgiacomo.travaglini@arm.com tagTableCounterBits = Param.Unsigned(3, "Number of tag table counter bits") 11213481Sgiacomo.travaglini@arm.com tagTableUBits = Param.Unsigned(2, "Number of tag table u bits") 11313481Sgiacomo.travaglini@arm.com 11413481Sgiacomo.travaglini@arm.com histBufferSize = Param.Unsigned(2097152, 11513481Sgiacomo.travaglini@arm.com "A large number to track all branch histories(2MEntries default)") 11613481Sgiacomo.travaglini@arm.com 11713481Sgiacomo.travaglini@arm.com pathHistBits = Param.Unsigned(16, "Path history size") 11813481Sgiacomo.travaglini@arm.com logUResetPeriod = Param.Unsigned(18, 11913481Sgiacomo.travaglini@arm.com "Log period in number of branches to reset TAGE useful counters") 12013481Sgiacomo.travaglini@arm.com numUseAltOnNa = Param.Unsigned(1, "Number of USE_ALT_ON_NA counters") 12113481Sgiacomo.travaglini@arm.com useAltOnNaBits = Param.Unsigned(4, "Size of the USE_ALT_ON_NA counter") 12213481Sgiacomo.travaglini@arm.com 12313481Sgiacomo.travaglini@arm.com maxNumAlloc = Param.Unsigned(1, 12413481Sgiacomo.travaglini@arm.com "Max number of TAGE entries allocted on mispredict") 12513481Sgiacomo.travaglini@arm.com 12613481Sgiacomo.travaglini@arm.com # List of enabled TAGE tables. If empty, all are enabled 12713481Sgiacomo.travaglini@arm.com noSkip = VectorParam.Bool([], "Vector of enabled TAGE tables") 12813481Sgiacomo.travaglini@arm.com 12913481Sgiacomo.travaglini@arm.com speculativeHistUpdate = Param.Bool(True, 13013481Sgiacomo.travaglini@arm.com "Use speculative update for histories") 13113481Sgiacomo.travaglini@arm.com 13213481Sgiacomo.travaglini@arm.com# TAGE branch predictor as described in https://www.jilp.org/vol8/v8paper1.pdf 13313481Sgiacomo.travaglini@arm.com# The default sizes below are for the 8C-TAGE configuration (63.5 Kbits) 13413481Sgiacomo.travaglini@arm.comclass TAGE(BranchPredictor): 13513481Sgiacomo.travaglini@arm.com type = 'TAGE' 13613481Sgiacomo.travaglini@arm.com cxx_class = 'TAGE' 13713481Sgiacomo.travaglini@arm.com cxx_header = "cpu/pred/tage.hh" 13813481Sgiacomo.travaglini@arm.com tage = Param.TAGEBase(TAGEBase(), "Tage object") 13913481Sgiacomo.travaglini@arm.com 14013481Sgiacomo.travaglini@arm.comclass LTAGE_TAGE(TAGEBase): 14113481Sgiacomo.travaglini@arm.com nHistoryTables = 12 14213481Sgiacomo.travaglini@arm.com minHist = 4 14313481Sgiacomo.travaglini@arm.com maxHist = 640 14413481Sgiacomo.travaglini@arm.com tagTableTagWidths = [0, 7, 7, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15] 14513481Sgiacomo.travaglini@arm.com logTagTableSizes = [14, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9] 14613481Sgiacomo.travaglini@arm.com logUResetPeriod = 19 14713481Sgiacomo.travaglini@arm.com 14813481Sgiacomo.travaglini@arm.comclass LoopPredictor(SimObject): 14913481Sgiacomo.travaglini@arm.com type = 'LoopPredictor' 15013481Sgiacomo.travaglini@arm.com cxx_class = 'LoopPredictor' 15113481Sgiacomo.travaglini@arm.com cxx_header = 'cpu/pred/loop_predictor.hh' 15213481Sgiacomo.travaglini@arm.com 15313481Sgiacomo.travaglini@arm.com logSizeLoopPred = Param.Unsigned(8, "Log size of the loop predictor") 15413481Sgiacomo.travaglini@arm.com withLoopBits = Param.Unsigned(7, "Size of the WITHLOOP counter") 15513481Sgiacomo.travaglini@arm.com loopTableAgeBits = Param.Unsigned(8, "Number of age bits per loop entry") 15613481Sgiacomo.travaglini@arm.com loopTableConfidenceBits = Param.Unsigned(2, 15713481Sgiacomo.travaglini@arm.com "Number of confidence bits per loop entry") 15813481Sgiacomo.travaglini@arm.com loopTableTagBits = Param.Unsigned(14, "Number of tag bits per loop entry") 15913481Sgiacomo.travaglini@arm.com loopTableIterBits = Param.Unsigned(14, "Nuber of iteration bits per loop") 16013481Sgiacomo.travaglini@arm.com logLoopTableAssoc = Param.Unsigned(2, "Log loop predictor associativity") 16113481Sgiacomo.travaglini@arm.com 16213481Sgiacomo.travaglini@arm.com # Parameters for enabling modifications to the loop predictor 16313481Sgiacomo.travaglini@arm.com # They have been copied from TAGE-GSC-IMLI 16413481Sgiacomo.travaglini@arm.com # (http://www.irisa.fr/alf/downloads/seznec/TAGE-GSC-IMLI.tar) 16513481Sgiacomo.travaglini@arm.com # 16613481Sgiacomo.travaglini@arm.com # All of them should be disabled to match the original LTAGE implementation 16713481Sgiacomo.travaglini@arm.com # (http://hpca23.cse.tamu.edu/taco/camino/cbp2/cbp-src/realistic-seznec.h) 16813481Sgiacomo.travaglini@arm.com 16913481Sgiacomo.travaglini@arm.com # Add speculation 17013481Sgiacomo.travaglini@arm.com useSpeculation = Param.Bool(False, "Use speculation") 17113481Sgiacomo.travaglini@arm.com 17213481Sgiacomo.travaglini@arm.com # Add hashing for calculating the loop table index 17313481Sgiacomo.travaglini@arm.com useHashing = Param.Bool(False, "Use hashing") 17413481Sgiacomo.travaglini@arm.com 17513481Sgiacomo.travaglini@arm.com # Add a direction bit to the loop table entries 17613481Sgiacomo.travaglini@arm.com useDirectionBit = Param.Bool(False, "Use direction info") 17713481Sgiacomo.travaglini@arm.com 17813481Sgiacomo.travaglini@arm.com # If true, use random to decide whether to allocate or not, and only try 17913481Sgiacomo.travaglini@arm.com # with one entry 18013481Sgiacomo.travaglini@arm.com restrictAllocation = Param.Bool(False, 18113481Sgiacomo.travaglini@arm.com "Restrict the allocation conditions") 18213481Sgiacomo.travaglini@arm.com 18313481Sgiacomo.travaglini@arm.com initialLoopIter = Param.Unsigned(1, "Initial iteration number") 18413481Sgiacomo.travaglini@arm.com initialLoopAge = Param.Unsigned(255, "Initial age value") 18513481Sgiacomo.travaglini@arm.com optionalAgeReset = Param.Bool(True, 18613481Sgiacomo.travaglini@arm.com "Reset age bits optionally in some cases") 18713481Sgiacomo.travaglini@arm.com 18813481Sgiacomo.travaglini@arm.com 18913481Sgiacomo.travaglini@arm.com# LTAGE branch predictor as described in 19013481Sgiacomo.travaglini@arm.com# https://www.irisa.fr/caps/people/seznec/L-TAGE.pdf 19113481Sgiacomo.travaglini@arm.com# It is basically a TAGE predictor plus a loop predictor 19213481Sgiacomo.travaglini@arm.com# The differnt TAGE sizes are updated according to the paper values (256 Kbits) 19313481Sgiacomo.travaglini@arm.comclass LTAGE(TAGE): 19413481Sgiacomo.travaglini@arm.com type = 'LTAGE' 19513481Sgiacomo.travaglini@arm.com cxx_class = 'LTAGE' 19613481Sgiacomo.travaglini@arm.com cxx_header = "cpu/pred/ltage.hh" 19713481Sgiacomo.travaglini@arm.com 19813481Sgiacomo.travaglini@arm.com tage = LTAGE_TAGE() 19913481Sgiacomo.travaglini@arm.com loop_predictor = Param.LoopPredictor(LoopPredictor(), "Loop predictor") 20013481Sgiacomo.travaglini@arm.com