1*ad3ba452Szhanglinjuanpackage xiangshan.cache 2*ad3ba452Szhanglinjuan 3*ad3ba452Szhanglinjuanimport chisel3._ 4*ad3ba452Szhanglinjuanimport chisel3.util._ 5*ad3ba452Szhanglinjuanimport xiangshan._ 6*ad3ba452Szhanglinjuanimport xiangshan.frontend._ 7*ad3ba452Szhanglinjuanimport utils._ 8*ad3ba452Szhanglinjuanimport chipsalliance.rocketchip.config.Parameters 9*ad3ba452Szhanglinjuan 10*ad3ba452Szhanglinjuanobject CacheOpMap{ 11*ad3ba452Szhanglinjuan def apply(opcode: String, optype: String, name: String ): Map[String, String] = { 12*ad3ba452Szhanglinjuan Map( 13*ad3ba452Szhanglinjuan "opcode" -> opcode, 14*ad3ba452Szhanglinjuan "optype" -> optype, 15*ad3ba452Szhanglinjuan "name" -> name, 16*ad3ba452Szhanglinjuan ) 17*ad3ba452Szhanglinjuan } 18*ad3ba452Szhanglinjuan} 19*ad3ba452Szhanglinjuan 20*ad3ba452Szhanglinjuanobject CacheRegMap{ 21*ad3ba452Szhanglinjuan def apply(offset: String, width: String, authority: String, name: String ): Pair[String, Map[String, String]] = { 22*ad3ba452Szhanglinjuan name -> Map( 23*ad3ba452Szhanglinjuan "offset" -> offset, 24*ad3ba452Szhanglinjuan "width" -> width, 25*ad3ba452Szhanglinjuan "authority" -> authority, 26*ad3ba452Szhanglinjuan ) 27*ad3ba452Szhanglinjuan } 28*ad3ba452Szhanglinjuan} 29*ad3ba452Szhanglinjuan 30*ad3ba452Szhanglinjuantrait CacheControlConst{ 31*ad3ba452Szhanglinjuan def maxDataRowSupport = 8 32*ad3ba452Szhanglinjuan} 33*ad3ba452Szhanglinjuan 34*ad3ba452Szhanglinjuanobject CacheInstrucion{ 35*ad3ba452Szhanglinjuan def CacheOperation = List( 36*ad3ba452Szhanglinjuan CacheOpMap("b00000", "CHECK", "READ_TAG_ECC"), 37*ad3ba452Szhanglinjuan CacheOpMap("b00001", "CHECK", "READ_DATA_ECC"), 38*ad3ba452Szhanglinjuan CacheOpMap("b00010", "LOAD", "READ_TAG"), 39*ad3ba452Szhanglinjuan CacheOpMap("b00011", "LOAD", "READ_DATA"), 40*ad3ba452Szhanglinjuan CacheOpMap("b00100", "STORE", "WRITE_TAG_ECC"), 41*ad3ba452Szhanglinjuan CacheOpMap("b00101", "STORE", "WRITE_DATA_ECC"), 42*ad3ba452Szhanglinjuan CacheOpMap("b00110", "STORE", "WRITE_TAG"), 43*ad3ba452Szhanglinjuan CacheOpMap("b00111", "STORE", "WRITE_DATA"), 44*ad3ba452Szhanglinjuan CacheOpMap("b01000", "FLUSH", "FLUSH_BLOCK") 45*ad3ba452Szhanglinjuan ) 46*ad3ba452Szhanglinjuan 47*ad3ba452Szhanglinjuan def CacheInsRegisterList = Map( 48*ad3ba452Szhanglinjuan /** offset width authority name */ 49*ad3ba452Szhanglinjuan CacheRegMap("0", "64", "RW", "CACHE_LEVEL"), 50*ad3ba452Szhanglinjuan CacheRegMap("1", "64", "RW", "CACHE_WAY"), 51*ad3ba452Szhanglinjuan CacheRegMap("2", "64", "RW", "CACHE_IDX"), 52*ad3ba452Szhanglinjuan CacheRegMap("3", "64", "RW", "CACHE_TAG_ECC"), 53*ad3ba452Szhanglinjuan CacheRegMap("4", "64", "RW", "CACHE_TAG_BITS"), 54*ad3ba452Szhanglinjuan CacheRegMap("5", "64", "RW", "CACHE_TAG_LOW"), 55*ad3ba452Szhanglinjuan CacheRegMap("6", "64", "RW", "CACHE_TAG_HIGH"), 56*ad3ba452Szhanglinjuan CacheRegMap("7", "64", "R", "CACHE_ECC_WIDTH"), 57*ad3ba452Szhanglinjuan CacheRegMap("8", "64", "RW", "CACHE_ECC_NUM"), 58*ad3ba452Szhanglinjuan CacheRegMap("9", "64", "RW", "CACHE_DATA_ECC"), 59*ad3ba452Szhanglinjuan CacheRegMap("10", "64", "RW", "CACHE_DATA_0"), 60*ad3ba452Szhanglinjuan CacheRegMap("11", "64", "RW", "CACHE_DATA_1"), 61*ad3ba452Szhanglinjuan CacheRegMap("12", "64", "RW", "CACHE_DATA_2"), 62*ad3ba452Szhanglinjuan CacheRegMap("13", "64", "RW", "CACHE_DATA_3"), 63*ad3ba452Szhanglinjuan CacheRegMap("14", "64", "RW", "CACHE_DATA_4"), 64*ad3ba452Szhanglinjuan CacheRegMap("15", "64", "RW", "CACHE_DATA_5"), 65*ad3ba452Szhanglinjuan CacheRegMap("16", "64", "RW", "CACHE_DATA_6"), 66*ad3ba452Szhanglinjuan CacheRegMap("17", "64", "RW", "CACHE_DATA_7"), 67*ad3ba452Szhanglinjuan CacheRegMap("18", "64", "R", "OP_FINISH") , 68*ad3ba452Szhanglinjuan CacheRegMap("19", "64", "RW", "CACHE_OP") 69*ad3ba452Szhanglinjuan ) 70*ad3ba452Szhanglinjuan 71*ad3ba452Szhanglinjuan def COP_CHECK = 0.U 72*ad3ba452Szhanglinjuan def COP_LOAD = 1.U 73*ad3ba452Szhanglinjuan def COP_STORE = 2.U 74*ad3ba452Szhanglinjuan def COP_FLUSH = 3.U 75*ad3ba452Szhanglinjuan 76*ad3ba452Szhanglinjuan def isReadTagECC(opcode: UInt) = opcode === "b00000".U 77*ad3ba452Szhanglinjuan def isReadDataECC(opcode: UInt) = opcode === "b00001".U 78*ad3ba452Szhanglinjuan def isReadTag(opcode: UInt) = opcode === "b00010".U 79*ad3ba452Szhanglinjuan def isReadData(opcode: UInt) = opcode === "b00011".U 80*ad3ba452Szhanglinjuan def isWriteTagECC(opcode: UInt) = opcode === "b00101".U 81*ad3ba452Szhanglinjuan def isWriteTag(opcode: UInt) = opcode === "b00110".U 82*ad3ba452Szhanglinjuan def isWriteData(opcode: UInt) = opcode === "b00111".U 83*ad3ba452Szhanglinjuan def isFlush(opcode: UInt) = opcode === "b01000".U 84*ad3ba452Szhanglinjuan} 85*ad3ba452Szhanglinjuan 86*ad3ba452Szhanglinjuanclass CacheCtrlReqInfo(implicit p: Parameters) extends XSBundle with CacheControlConst { 87*ad3ba452Szhanglinjuan val wayNum = UInt(XLEN.W) 88*ad3ba452Szhanglinjuan val index = UInt(XLEN.W) 89*ad3ba452Szhanglinjuan val opCode = UInt(XLEN.W) 90*ad3ba452Szhanglinjuan val write_tag_high = UInt(XLEN.W) 91*ad3ba452Szhanglinjuan val write_tag_low = UInt(XLEN.W) 92*ad3ba452Szhanglinjuan val write_tag_ecc = UInt(XLEN.W) 93*ad3ba452Szhanglinjuan val write_data_vec = Vec(maxDataRowSupport, UInt(XLEN.W)) 94*ad3ba452Szhanglinjuan val write_data_ecc = UInt(XLEN.W) 95*ad3ba452Szhanglinjuan val ecc_num = UInt(XLEN.W) 96*ad3ba452Szhanglinjuan} 97*ad3ba452Szhanglinjuan 98*ad3ba452Szhanglinjuanclass CacheCtrlRespInfo(implicit p: Parameters) extends XSBundle with HasICacheParameters with CacheControlConst{ 99*ad3ba452Szhanglinjuan val read_tag_high = UInt(XLEN.W) 100*ad3ba452Szhanglinjuan val read_tag_low = UInt(XLEN.W) 101*ad3ba452Szhanglinjuan val read_tag_ecc = UInt(XLEN.W) 102*ad3ba452Szhanglinjuan val read_data_vec = Vec(maxDataRowSupport, UInt(XLEN.W)) 103*ad3ba452Szhanglinjuan val read_data_ecc = UInt(XLEN.W) 104*ad3ba452Szhanglinjuan val ecc_num = UInt(XLEN.W) 105*ad3ba452Szhanglinjuan} 106*ad3ba452Szhanglinjuan 107*ad3ba452Szhanglinjuan 108*ad3ba452Szhanglinjuan// class CSRCacheInsIO(implicit p: Parameters) extends XSModule{ 109*ad3ba452Szhanglinjuan// // TODO: extend pmp cfg interface 110*ad3ba452Szhanglinjuan// } 111