2020-09-07 16:25:23 +08:00
|
|
|
package lib
|
2020-09-07 16:27:29 +08:00
|
|
|
import chisel3._
|
2020-09-08 13:00:45 +08:00
|
|
|
import chisel3.util._
|
2020-09-07 16:27:29 +08:00
|
|
|
trait param {
|
|
|
|
val BTB_ADDR_HI = 9
|
|
|
|
val BTB_ADDR_LO = 2
|
|
|
|
val BTB_BTAG_SIZE = 5
|
2020-09-08 13:00:45 +08:00
|
|
|
val BTB_FOLD2_INDEX_HASH = false
|
2020-09-07 16:27:29 +08:00
|
|
|
val BTB_INDEX1_HI = 9
|
|
|
|
val BTB_INDEX1_LO = 2
|
|
|
|
val BTB_INDEX2_HI = 17
|
|
|
|
val BTB_INDEX2_LO = 10
|
|
|
|
val BTB_INDEX3_HI = 25
|
|
|
|
val BTB_INDEX3_LO = 18
|
2020-09-08 13:00:45 +08:00
|
|
|
val BHT_GHR_HASH_1 = false
|
|
|
|
val BHT_GHR_SIZE = 8
|
2020-09-07 16:27:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
trait el2_lib extends param{
|
|
|
|
def el2_btb_tag_hash(pc : UInt) =
|
|
|
|
(VecInit.tabulate(3)(i => pc(BTB_ADDR_HI+((i+1)*(BTB_BTAG_SIZE)),BTB_ADDR_HI+(i*BTB_BTAG_SIZE)+1))).reduce(_^_)
|
|
|
|
|
|
|
|
def el2_btb_tag_hash_fold(pc : UInt) =
|
|
|
|
pc(BTB_ADDR_HI+(2*BTB_BTAG_SIZE),BTB_ADDR_HI+BTB_BTAG_SIZE+1)^pc(BTB_ADDR_HI+BTB_BTAG_SIZE,BTB_ADDR_HI+1)
|
2020-09-07 16:25:23 +08:00
|
|
|
|
2020-09-08 13:00:45 +08:00
|
|
|
def el2_btb_addr_hash(pc : UInt) =
|
|
|
|
if(BTB_FOLD2_INDEX_HASH) pc(BTB_INDEX1_HI,BTB_INDEX1_LO) ^ pc(BTB_INDEX3_HI,BTB_INDEX3_LO)
|
|
|
|
else pc(BTB_INDEX1_HI,BTB_INDEX1_LO) ^ pc(BTB_INDEX2_HI,BTB_INDEX2_LO) ^ pc(BTB_INDEX3_HI,BTB_INDEX3_LO)
|
|
|
|
|
|
|
|
def el2_btb_ghr_hash(hashin : UInt, ghr :UInt) =
|
|
|
|
if(BHT_GHR_HASH_1) Cat(ghr(BHT_GHR_SIZE-1,BTB_INDEX1_HI), hashin(BTB_INDEX1_HI,2) ^ ghr(BTB_INDEX1_HI-2,0))
|
|
|
|
else hashin(BHT_GHR_SIZE+1,2) ^ ghr(BHT_GHR_SIZE-1,0)
|
2020-09-07 16:25:23 +08:00
|
|
|
}
|