1ad3ba452Szhanglinjuanpackage xiangshan.cache 2ad3ba452Szhanglinjuan 3ad3ba452Szhanglinjuanimport chisel3._ 4ad3ba452Szhanglinjuanimport chisel3.util._ 5ad3ba452Szhanglinjuanimport xiangshan._ 61d8f4dcbSJayimport xiangshan.frontend.icache._ 7ad3ba452Szhanglinjuanimport utils._ 8ad3ba452Szhanglinjuanimport chipsalliance.rocketchip.config.Parameters 9e19f7967SWilliam Wangimport xiangshan.backend.fu.util.HasCSRConst 10ad3ba452Szhanglinjuan 11ad3ba452Szhanglinjuanobject CacheOpMap{ 12ad3ba452Szhanglinjuan def apply(opcode: String, optype: String, name: String ): Map[String, String] = { 13ad3ba452Szhanglinjuan Map( 14ad3ba452Szhanglinjuan "opcode" -> opcode, 15ad3ba452Szhanglinjuan "optype" -> optype, 16ad3ba452Szhanglinjuan "name" -> name, 17ad3ba452Szhanglinjuan ) 18ad3ba452Szhanglinjuan } 19ad3ba452Szhanglinjuan} 20ad3ba452Szhanglinjuan 21ad3ba452Szhanglinjuanobject CacheRegMap{ 22ad3ba452Szhanglinjuan def apply(offset: String, width: String, authority: String, name: String ): Pair[String, Map[String, String]] = { 23ad3ba452Szhanglinjuan name -> Map( 24ad3ba452Szhanglinjuan "offset" -> offset, 25ad3ba452Szhanglinjuan "width" -> width, 26ad3ba452Szhanglinjuan "authority" -> authority, 27ad3ba452Szhanglinjuan ) 28ad3ba452Szhanglinjuan } 29ad3ba452Szhanglinjuan} 30ad3ba452Szhanglinjuan 31ad3ba452Szhanglinjuantrait CacheControlConst{ 32ad3ba452Szhanglinjuan def maxDataRowSupport = 8 33ad3ba452Szhanglinjuan} 34ad3ba452Szhanglinjuan 35e19f7967SWilliam Wangabstract class CacheCtrlModule(implicit p: Parameters) extends XSModule with HasCSRConst with CacheControlConst 36e19f7967SWilliam Wang 37ad3ba452Szhanglinjuanobject CacheInstrucion{ 38ad3ba452Szhanglinjuan def CacheOperation = List( 39ad3ba452Szhanglinjuan CacheOpMap("b00000", "CHECK", "READ_TAG_ECC"), 40ad3ba452Szhanglinjuan CacheOpMap("b00001", "CHECK", "READ_DATA_ECC"), 41ad3ba452Szhanglinjuan CacheOpMap("b00010", "LOAD", "READ_TAG"), 42ad3ba452Szhanglinjuan CacheOpMap("b00011", "LOAD", "READ_DATA"), 43ad3ba452Szhanglinjuan CacheOpMap("b00100", "STORE", "WRITE_TAG_ECC"), 44ad3ba452Szhanglinjuan CacheOpMap("b00101", "STORE", "WRITE_DATA_ECC"), 45ad3ba452Szhanglinjuan CacheOpMap("b00110", "STORE", "WRITE_TAG"), 46ad3ba452Szhanglinjuan CacheOpMap("b00111", "STORE", "WRITE_DATA"), 47ad3ba452Szhanglinjuan CacheOpMap("b01000", "FLUSH", "FLUSH_BLOCK") 48ad3ba452Szhanglinjuan ) 49ad3ba452Szhanglinjuan 50ad3ba452Szhanglinjuan def CacheInsRegisterList = Map( 51e19f7967SWilliam Wang // offset width authority name 52e19f7967SWilliam Wang CacheRegMap("0", "64", "RW", "CACHE_OP"), 53e19f7967SWilliam Wang CacheRegMap("1", "64", "RW", "OP_FINISH"), 54e19f7967SWilliam Wang CacheRegMap("2", "64", "RW", "CACHE_LEVEL"), 55e19f7967SWilliam Wang CacheRegMap("3", "64", "RW", "CACHE_WAY"), 56e19f7967SWilliam Wang CacheRegMap("4", "64", "RW", "CACHE_IDX"), 57e19f7967SWilliam Wang CacheRegMap("5", "64", "RW", "CACHE_BANK_NUM"), 58e19f7967SWilliam Wang CacheRegMap("6", "64", "RW", "CACHE_TAG_ECC"), 59e19f7967SWilliam Wang CacheRegMap("7", "64", "RW", "CACHE_TAG_BITS"), // TODO 60e19f7967SWilliam Wang CacheRegMap("8", "64", "RW", "CACHE_TAG_LOW"), 61e19f7967SWilliam Wang CacheRegMap("9", "64", "RW", "CACHE_TAG_HIGH"), // not used in 64 bit arch 62e19f7967SWilliam Wang CacheRegMap("10", "64", "RW", "CACHE_ECC_WIDTH"), // TODO 63e19f7967SWilliam Wang CacheRegMap("11", "64", "RW", "CACHE_DATA_ECC"), 64e19f7967SWilliam Wang CacheRegMap("12", "64", "RW", "CACHE_DATA_0"), 65e19f7967SWilliam Wang CacheRegMap("13", "64", "RW", "CACHE_DATA_1"), 66e19f7967SWilliam Wang CacheRegMap("14", "64", "RW", "CACHE_DATA_2"), 67e19f7967SWilliam Wang CacheRegMap("15", "64", "RW", "CACHE_DATA_3"), 68e19f7967SWilliam Wang CacheRegMap("16", "64", "RW", "CACHE_DATA_4"), 69e19f7967SWilliam Wang CacheRegMap("17", "64", "RW", "CACHE_DATA_5"), 70e19f7967SWilliam Wang CacheRegMap("18", "64", "RW", "CACHE_DATA_6"), 71e19f7967SWilliam Wang CacheRegMap("19", "64", "RW", "CACHE_DATA_7"), 72026615fcSWilliam Wang CacheRegMap("20", "64", "RW", "CACHE_ERROR"), 73ad3ba452Szhanglinjuan ) 74ad3ba452Szhanglinjuan 75e19f7967SWilliam Wang // Usage: 76e19f7967SWilliam Wang // val cacheopMapping = CacheInstrucion.CacheInsRegisterList.map{case (name, attribute) => { 77e19f7967SWilliam Wang // doSthWith(name, attribute("offset"), attribute("width")) 78e19f7967SWilliam Wang // }} 79e19f7967SWilliam Wang 80ad3ba452Szhanglinjuan def COP_CHECK = 0.U 81ad3ba452Szhanglinjuan def COP_LOAD = 1.U 82ad3ba452Szhanglinjuan def COP_STORE = 2.U 83ad3ba452Szhanglinjuan def COP_FLUSH = 3.U 84ad3ba452Szhanglinjuan 85e19f7967SWilliam Wang def COP_ID_ICACHE = 0 86e19f7967SWilliam Wang def COP_ID_DCACHE = 1 87e19f7967SWilliam Wang 88e19f7967SWilliam Wang def COP_RESULT_CODE_IDLE = 0.U 89e19f7967SWilliam Wang def COP_RESULT_CODE_OK = 1.U 90e19f7967SWilliam Wang def COP_RESULT_CODE_ERROR = 2.U 91e19f7967SWilliam Wang 92ad3ba452Szhanglinjuan def isReadTagECC(opcode: UInt) = opcode === "b00000".U 93ad3ba452Szhanglinjuan def isReadDataECC(opcode: UInt) = opcode === "b00001".U 94ad3ba452Szhanglinjuan def isReadTag(opcode: UInt) = opcode === "b00010".U 95ad3ba452Szhanglinjuan def isReadData(opcode: UInt) = opcode === "b00011".U 96e19f7967SWilliam Wang def isWriteTagECC(opcode: UInt) = opcode === "b00100".U 97e19f7967SWilliam Wang def isWriteDataECC(opcode: UInt) = opcode === "b00101".U 98ad3ba452Szhanglinjuan def isWriteTag(opcode: UInt) = opcode === "b00110".U 99ad3ba452Szhanglinjuan def isWriteData(opcode: UInt) = opcode === "b00111".U 100ad3ba452Szhanglinjuan def isFlush(opcode: UInt) = opcode === "b01000".U 101e19f7967SWilliam Wang 102e19f7967SWilliam Wang def isReadOp(opcode: UInt) = isReadTagECC(opcode) || 103e19f7967SWilliam Wang isReadDataECC(opcode) || 104e19f7967SWilliam Wang isReadTag(opcode) || 105e19f7967SWilliam Wang isReadData(opcode) 106ad3ba452Szhanglinjuan} 107ad3ba452Szhanglinjuan 108ad3ba452Szhanglinjuanclass CacheCtrlReqInfo(implicit p: Parameters) extends XSBundle with CacheControlConst { 109e19f7967SWilliam Wang val level = UInt(XLEN.W) // op target id 110ad3ba452Szhanglinjuan val wayNum = UInt(XLEN.W) 111ad3ba452Szhanglinjuan val index = UInt(XLEN.W) 112ad3ba452Szhanglinjuan val opCode = UInt(XLEN.W) 113ad3ba452Szhanglinjuan val write_tag_high = UInt(XLEN.W) 114ad3ba452Szhanglinjuan val write_tag_low = UInt(XLEN.W) 115ad3ba452Szhanglinjuan val write_tag_ecc = UInt(XLEN.W) 116ad3ba452Szhanglinjuan val write_data_vec = Vec(maxDataRowSupport, UInt(XLEN.W)) 117ad3ba452Szhanglinjuan val write_data_ecc = UInt(XLEN.W) 118e19f7967SWilliam Wang val bank_num = UInt(XLEN.W) 119ad3ba452Szhanglinjuan} 120ad3ba452Szhanglinjuan 121ad3ba452Szhanglinjuanclass CacheCtrlRespInfo(implicit p: Parameters) extends XSBundle with HasICacheParameters with CacheControlConst{ 122ad3ba452Szhanglinjuan val read_tag_high = UInt(XLEN.W) 123ad3ba452Szhanglinjuan val read_tag_low = UInt(XLEN.W) 124ad3ba452Szhanglinjuan val read_tag_ecc = UInt(XLEN.W) 125ad3ba452Szhanglinjuan val read_data_vec = Vec(maxDataRowSupport, UInt(XLEN.W)) 126ad3ba452Szhanglinjuan val read_data_ecc = UInt(XLEN.W) 127e19f7967SWilliam Wang val bank_num = UInt(XLEN.W) 128ad3ba452Szhanglinjuan} 129ad3ba452Szhanglinjuan 130e19f7967SWilliam Wangclass L1CacheToCsrIO(implicit p: Parameters) extends DCacheBundle { 131e19f7967SWilliam Wang val distribute_csr = Flipped(new DistributedCSRIO) 132e19f7967SWilliam Wang val update = new DistributedCSRUpdateReq 133e19f7967SWilliam Wang} 134ad3ba452Szhanglinjuan 135026615fcSWilliam Wangclass L1CacheInnerOpIO(implicit p: Parameters) extends DCacheBundle { 136e19f7967SWilliam Wang val req = Valid(new CacheCtrlReqInfo) 137e19f7967SWilliam Wang val resp = Flipped(Valid(new CacheCtrlRespInfo)) 138e19f7967SWilliam Wang} 139e19f7967SWilliam Wang 140e19f7967SWilliam Wangclass CSRCacheOpDecoder(decoder_name: String, id: Int)(implicit p: Parameters) extends CacheCtrlModule { 141e19f7967SWilliam Wang val io = IO(new Bundle { 142e19f7967SWilliam Wang val csr = new L1CacheToCsrIO 143026615fcSWilliam Wang val cache = new L1CacheInnerOpIO 144026615fcSWilliam Wang val error = Flipped(new L1CacheErrorInfo) 145e19f7967SWilliam Wang }) 146e19f7967SWilliam Wang 147e19f7967SWilliam Wang // CSRCacheOpDecoder state 148b6358f8fSWilliam Wang val wait_csr_op_req = RegInit(true.B) // waiting for csr "CACHE_OP" being write 149b6358f8fSWilliam Wang val wait_cache_op_resp = RegInit(false.B) // waiting for dcache to finish dcache op 150b6358f8fSWilliam Wang val schedule_csr_op_resp_data = RegInit(false.B) // ready to write data readed from cache back to csr 151b6358f8fSWilliam Wang val schedule_csr_op_resp_finish = RegInit(false.B) // ready to write "OP_FINISH" csr 152e19f7967SWilliam Wang // val cache_op_resp_timer = RegInit(0.U(4.W)) 153e19f7967SWilliam Wang val data_transfer_finished = WireInit(false.B) 154e19f7967SWilliam Wang val data_transfer_cnt = RegInit(0.U(log2Up(maxDataRowSupport).W)) 155e19f7967SWilliam Wang 156e19f7967SWilliam Wang // Translate CSR write to cache op 157e19f7967SWilliam Wang val translated_cache_req = Reg(new CacheCtrlReqInfo) 158e19f7967SWilliam Wang println("Cache op decoder (" + decoder_name + "):") 159e19f7967SWilliam Wang println(" Id " + id) 160e19f7967SWilliam Wang // CacheInsRegisterList.map{case (name, attribute) => { 161e19f7967SWilliam Wang // println(" Register CSR mirror " + name) 162e19f7967SWilliam Wang // }} 163e19f7967SWilliam Wang 164e19f7967SWilliam Wang def cacheop_csr_is_being_write(csr_name: String): Bool = { 165e19f7967SWilliam Wang io.csr.distribute_csr.w.bits.addr === (CacheInstrucion.CacheInsRegisterList(csr_name)("offset").toInt + Scachebase).U && 166e19f7967SWilliam Wang io.csr.distribute_csr.w.valid 167e19f7967SWilliam Wang } 168e19f7967SWilliam Wang 169e19f7967SWilliam Wang def update_cache_req_when_write(csr_name: String, req_field: Data) = { 170e19f7967SWilliam Wang when( 171e19f7967SWilliam Wang cacheop_csr_is_being_write(csr_name) 172e19f7967SWilliam Wang ){ 173e19f7967SWilliam Wang req_field := io.csr.distribute_csr.w.bits.data 174b6358f8fSWilliam Wang assert(wait_csr_op_req) 175e19f7967SWilliam Wang } 176e19f7967SWilliam Wang } 177e19f7967SWilliam Wang 178e19f7967SWilliam Wang update_cache_req_when_write("CACHE_OP", translated_cache_req.opCode) 179e19f7967SWilliam Wang update_cache_req_when_write("CACHE_LEVEL", translated_cache_req.level) 180e19f7967SWilliam Wang update_cache_req_when_write("CACHE_WAY", translated_cache_req.wayNum) 181e19f7967SWilliam Wang update_cache_req_when_write("CACHE_IDX", translated_cache_req.index) 182e19f7967SWilliam Wang update_cache_req_when_write("CACHE_BANK_NUM", translated_cache_req.bank_num) 183e19f7967SWilliam Wang update_cache_req_when_write("CACHE_TAG_HIGH", translated_cache_req.write_tag_high) 184e19f7967SWilliam Wang update_cache_req_when_write("CACHE_TAG_LOW", translated_cache_req.write_tag_low) 18577decb47Szhanglinjuan update_cache_req_when_write("CACHE_TAG_ECC", translated_cache_req.write_tag_ecc) 186e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_0", translated_cache_req.write_data_vec(0)) 187e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_1", translated_cache_req.write_data_vec(1)) 188e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_2", translated_cache_req.write_data_vec(2)) 189e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_3", translated_cache_req.write_data_vec(3)) 190e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_4", translated_cache_req.write_data_vec(4)) 191e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_5", translated_cache_req.write_data_vec(5)) 192e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_6", translated_cache_req.write_data_vec(6)) 193e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_7", translated_cache_req.write_data_vec(7)) 194e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_ECC", translated_cache_req.write_data_ecc) 195e19f7967SWilliam Wang 196e19f7967SWilliam Wang val cache_op_start = WireInit(cacheop_csr_is_being_write("CACHE_OP") && id.U === translated_cache_req.level) 197e19f7967SWilliam Wang when(cache_op_start) { 198b6358f8fSWilliam Wang wait_csr_op_req := false.B 199e19f7967SWilliam Wang } 200e19f7967SWilliam Wang 201e19f7967SWilliam Wang // Send cache op to cache 202e19f7967SWilliam Wang io.cache.req.valid := RegNext(cache_op_start) 203e19f7967SWilliam Wang io.cache.req.bits := translated_cache_req 204e19f7967SWilliam Wang when(io.cache.req.fire()){ 205b6358f8fSWilliam Wang wait_cache_op_resp := true.B 206e19f7967SWilliam Wang } 207e19f7967SWilliam Wang 208e19f7967SWilliam Wang // Receive cache op resp from cache 209e19f7967SWilliam Wang val raw_cache_resp = Reg(new CacheCtrlRespInfo) 210e19f7967SWilliam Wang when(io.cache.resp.fire()){ 211b6358f8fSWilliam Wang wait_cache_op_resp := false.B 212e19f7967SWilliam Wang raw_cache_resp := io.cache.resp.bits 213e19f7967SWilliam Wang when(CacheInstrucion.isReadOp(translated_cache_req.opCode)){ 214b6358f8fSWilliam Wang schedule_csr_op_resp_data := true.B 215b6358f8fSWilliam Wang schedule_csr_op_resp_finish := false.B 216e19f7967SWilliam Wang assert(data_transfer_cnt === 0.U) 217e19f7967SWilliam Wang }.otherwise{ 218b6358f8fSWilliam Wang schedule_csr_op_resp_data := false.B 219b6358f8fSWilliam Wang schedule_csr_op_resp_finish := true.B 220e19f7967SWilliam Wang } 221e19f7967SWilliam Wang } 222e19f7967SWilliam Wang 223e19f7967SWilliam Wang // Translate cache op resp to CSR write, send it back to CSR 224b6358f8fSWilliam Wang when(io.csr.update.w.fire() && schedule_csr_op_resp_data && data_transfer_finished){ 225b6358f8fSWilliam Wang schedule_csr_op_resp_data := false.B 226b6358f8fSWilliam Wang schedule_csr_op_resp_finish := true.B 227e19f7967SWilliam Wang } 228b6358f8fSWilliam Wang when(io.csr.update.w.fire() && schedule_csr_op_resp_finish){ 229b6358f8fSWilliam Wang schedule_csr_op_resp_finish := false.B 230b6358f8fSWilliam Wang wait_csr_op_req := true.B 231e19f7967SWilliam Wang } 232e19f7967SWilliam Wang 233b6358f8fSWilliam Wang io.csr.update.w.valid := schedule_csr_op_resp_data || schedule_csr_op_resp_finish 234e19f7967SWilliam Wang io.csr.update.w.bits := DontCare 235e19f7967SWilliam Wang 236e19f7967SWilliam Wang val isReadTagECC = WireInit(CacheInstrucion.isReadTagECC(translated_cache_req.opCode)) 237e19f7967SWilliam Wang val isReadDataECC = WireInit(CacheInstrucion.isReadDataECC(translated_cache_req.opCode)) 238e19f7967SWilliam Wang val isReadTag = WireInit(CacheInstrucion.isReadTag(translated_cache_req.opCode)) 239e19f7967SWilliam Wang val isReadData = WireInit(CacheInstrucion.isReadData(translated_cache_req.opCode)) 240e19f7967SWilliam Wang 241b6358f8fSWilliam Wang when(schedule_csr_op_resp_data){ 242e19f7967SWilliam Wang io.csr.update.w.bits.addr := Mux1H(List( 243e19f7967SWilliam Wang isReadTagECC -> (CacheInstrucion.CacheInsRegisterList("CACHE_TAG_ECC")("offset").toInt + Scachebase).U, 24477decb47Szhanglinjuan isReadDataECC -> (CacheInstrucion.CacheInsRegisterList("CACHE_DATA_ECC")("offset").toInt + Scachebase).U, 245e19f7967SWilliam Wang isReadTag -> ((CacheInstrucion.CacheInsRegisterList("CACHE_TAG_LOW")("offset").toInt + Scachebase).U + data_transfer_cnt), 246e19f7967SWilliam Wang isReadData -> ((CacheInstrucion.CacheInsRegisterList("CACHE_DATA_0")("offset").toInt + Scachebase).U + data_transfer_cnt), 247e19f7967SWilliam Wang )) 248e19f7967SWilliam Wang io.csr.update.w.bits.data := Mux1H(List( 249e19f7967SWilliam Wang isReadTagECC -> raw_cache_resp.read_tag_ecc, 25077decb47Szhanglinjuan isReadDataECC -> raw_cache_resp.read_data_ecc, 251e19f7967SWilliam Wang isReadTag -> raw_cache_resp.read_tag_low, 252e19f7967SWilliam Wang isReadData -> raw_cache_resp.read_data_vec(data_transfer_cnt), 253e19f7967SWilliam Wang )) 254b6358f8fSWilliam Wang data_transfer_finished := Mux(isReadData, 255e19f7967SWilliam Wang data_transfer_cnt === (maxDataRowSupport-1).U, 256e19f7967SWilliam Wang true.B 257e19f7967SWilliam Wang ) 258e19f7967SWilliam Wang data_transfer_cnt := data_transfer_cnt + 1.U 259e19f7967SWilliam Wang } 260e19f7967SWilliam Wang 261b6358f8fSWilliam Wang when(schedule_csr_op_resp_finish){ 262e19f7967SWilliam Wang io.csr.update.w.bits.addr := (CacheInstrucion.CacheInsRegisterList("OP_FINISH")("offset").toInt + Scachebase).U 263e19f7967SWilliam Wang io.csr.update.w.bits.data := CacheInstrucion.COP_RESULT_CODE_OK 264e19f7967SWilliam Wang data_transfer_cnt := 0.U 265e19f7967SWilliam Wang } 266026615fcSWilliam Wang 267026615fcSWilliam Wang val error = DelayN(io.error, 1) 268*0f59c834SWilliam Wang when(error.report_to_beu) { 269026615fcSWilliam Wang io.csr.update.w.bits.addr := (CacheInstrucion.CacheInsRegisterList("CACHE_ERROR")("offset").toInt + Scachebase).U 2709ef181f4SWilliam Wang io.csr.update.w.bits.data := error.asUInt 271*0f59c834SWilliam Wang io.csr.update.w.valid := true.B 2729ef181f4SWilliam Wang } 2739ef181f4SWilliam Wang} 2749ef181f4SWilliam Wang 2759ef181f4SWilliam Wangclass CSRCacheErrorDecoder(implicit p: Parameters) extends CacheCtrlModule { 2769ef181f4SWilliam Wang val io = IO(new Bundle{ 2779ef181f4SWilliam Wang val encoded_cache_error = Input(UInt()) 2789ef181f4SWilliam Wang }) 2799ef181f4SWilliam Wang val encoded_cache_error = io.encoded_cache_error 2809ef181f4SWilliam Wang def print_cache_error_flag(flag: Bool, desc: String) = { 2819ef181f4SWilliam Wang when(flag){ 2829ef181f4SWilliam Wang printf(" " + desc + "\n") 2839ef181f4SWilliam Wang } 2849ef181f4SWilliam Wang } 2859ef181f4SWilliam Wang val decoded_cache_error = WireInit(encoded_cache_error.asTypeOf(new L1CacheErrorInfo)) 286*0f59c834SWilliam Wang when(decoded_cache_error.valid && !RegNext(decoded_cache_error.valid)){ 2879ef181f4SWilliam Wang printf("CACHE_ERROR CSR reported an error:\n") 288*0f59c834SWilliam Wang printf(" paddr 0x%x\n", decoded_cache_error.paddr) 289*0f59c834SWilliam Wang print_cache_error_flag(decoded_cache_error.report_to_beu, "report to bus error unit") 2909ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.source.tag, "tag") 2919ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.source.data, "data") 2929ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.source.l2, "l2") 2939ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.opType.fetch, "fetch") 2949ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.opType.load, "load") 2959ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.opType.store, "store") 2969ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.opType.probe, "probe") 2979ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.opType.release, "release") 2989ef181f4SWilliam Wang print_cache_error_flag(decoded_cache_error.opType.atom, "atom") 2999ef181f4SWilliam Wang printf("It should not happen in normal execution flow\n") 300026615fcSWilliam Wang } 301e19f7967SWilliam Wang}