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