1ad3ba452Szhanglinjuanpackage xiangshan.cache 2ad3ba452Szhanglinjuan 3ad3ba452Szhanglinjuanimport chisel3._ 4ad3ba452Szhanglinjuanimport chisel3.util._ 5ad3ba452Szhanglinjuanimport xiangshan._ 61d8f4dcbSJayimport xiangshan.frontend.icache._ 73c02ee8fSwakafaimport utility._ 88891a219SYinan Xuimport org.chipsalliance.cde.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{ 22935edac4STang Haojin def apply(offset: String, width: String, authority: String, name: String ): (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 35a9c1b353SMaxpicca-Liabstract class CacheCtrlModule(implicit p: Parameters) extends XSModule with HasCSRConst with CacheControlConst with HasDCacheParameters 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 144a9c1b353SMaxpicca-Li val cache_req_dup = Vec(DCacheDupNum, Valid(new CacheCtrlReqInfo)) 145a9c1b353SMaxpicca-Li val cacheOp_req_bits_opCode_dup = Output(Vec(DCacheDupNum, UInt(XLEN.W))) 146*0184a80eSYanqin Li val error = Flipped(ValidIO(new L1CacheErrorInfo)) 147e19f7967SWilliam Wang }) 148e19f7967SWilliam Wang 149e19f7967SWilliam Wang // CSRCacheOpDecoder state 150b6358f8fSWilliam Wang val wait_csr_op_req = RegInit(true.B) // waiting for csr "CACHE_OP" being write 151b6358f8fSWilliam Wang val wait_cache_op_resp = RegInit(false.B) // waiting for dcache to finish dcache op 152b6358f8fSWilliam Wang val schedule_csr_op_resp_data = RegInit(false.B) // ready to write data readed from cache back to csr 153b6358f8fSWilliam Wang val schedule_csr_op_resp_finish = RegInit(false.B) // ready to write "OP_FINISH" csr 154e19f7967SWilliam Wang // val cache_op_resp_timer = RegInit(0.U(4.W)) 155e19f7967SWilliam Wang val data_transfer_finished = WireInit(false.B) 156e19f7967SWilliam Wang val data_transfer_cnt = RegInit(0.U(log2Up(maxDataRowSupport).W)) 157e19f7967SWilliam Wang 158e19f7967SWilliam Wang // Translate CSR write to cache op 159b11ec622Slixin val translated_cache_req = Reg(new CacheCtrlReqInfo) 160a9c1b353SMaxpicca-Li val translated_cache_req_opCode_dup = Reg(Vec(DCacheDupNum, UInt(XLEN.W))) 161e19f7967SWilliam Wang println("Cache op decoder (" + decoder_name + "):") 162e19f7967SWilliam Wang println(" Id " + id) 163e19f7967SWilliam Wang // CacheInsRegisterList.map{case (name, attribute) => { 164e19f7967SWilliam Wang // println(" Register CSR mirror " + name) 165e19f7967SWilliam Wang // }} 166e19f7967SWilliam Wang 167e19f7967SWilliam Wang def cacheop_csr_is_being_write(csr_name: String): Bool = { 168e19f7967SWilliam Wang io.csr.distribute_csr.w.bits.addr === (CacheInstrucion.CacheInsRegisterList(csr_name)("offset").toInt + Scachebase).U && 169e19f7967SWilliam Wang io.csr.distribute_csr.w.valid 170e19f7967SWilliam Wang } 171e19f7967SWilliam Wang 172e19f7967SWilliam Wang def update_cache_req_when_write(csr_name: String, req_field: Data) = { 173e19f7967SWilliam Wang when( 174e19f7967SWilliam Wang cacheop_csr_is_being_write(csr_name) 175e19f7967SWilliam Wang ){ 176e19f7967SWilliam Wang req_field := io.csr.distribute_csr.w.bits.data 177b6358f8fSWilliam Wang assert(wait_csr_op_req) 178e19f7967SWilliam Wang } 179e19f7967SWilliam Wang } 180e19f7967SWilliam Wang 181e19f7967SWilliam Wang update_cache_req_when_write("CACHE_OP", translated_cache_req.opCode) 182779109e3Slixin translated_cache_req_opCode_dup.map(dup => update_cache_req_when_write("CACHE_OP", dup)) 183e19f7967SWilliam Wang update_cache_req_when_write("CACHE_LEVEL", translated_cache_req.level) 184e19f7967SWilliam Wang update_cache_req_when_write("CACHE_WAY", translated_cache_req.wayNum) 185e19f7967SWilliam Wang update_cache_req_when_write("CACHE_IDX", translated_cache_req.index) 186e19f7967SWilliam Wang update_cache_req_when_write("CACHE_BANK_NUM", translated_cache_req.bank_num) 187e19f7967SWilliam Wang update_cache_req_when_write("CACHE_TAG_HIGH", translated_cache_req.write_tag_high) 188e19f7967SWilliam Wang update_cache_req_when_write("CACHE_TAG_LOW", translated_cache_req.write_tag_low) 18977decb47Szhanglinjuan update_cache_req_when_write("CACHE_TAG_ECC", translated_cache_req.write_tag_ecc) 190e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_0", translated_cache_req.write_data_vec(0)) 191e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_1", translated_cache_req.write_data_vec(1)) 192e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_2", translated_cache_req.write_data_vec(2)) 193e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_3", translated_cache_req.write_data_vec(3)) 194e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_4", translated_cache_req.write_data_vec(4)) 195e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_5", translated_cache_req.write_data_vec(5)) 196e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_6", translated_cache_req.write_data_vec(6)) 197e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_7", translated_cache_req.write_data_vec(7)) 198e19f7967SWilliam Wang update_cache_req_when_write("CACHE_DATA_ECC", translated_cache_req.write_data_ecc) 199e19f7967SWilliam Wang 200e19f7967SWilliam Wang val cache_op_start = WireInit(cacheop_csr_is_being_write("CACHE_OP") && id.U === translated_cache_req.level) 201e19f7967SWilliam Wang when(cache_op_start) { 202b6358f8fSWilliam Wang wait_csr_op_req := false.B 203e19f7967SWilliam Wang } 204e19f7967SWilliam Wang 205e19f7967SWilliam Wang // Send cache op to cache 206e19f7967SWilliam Wang io.cache.req.valid := RegNext(cache_op_start) 207779109e3Slixin io.cache_req_dup.map( dup => dup.valid := RegNext(cache_op_start) ) 208e19f7967SWilliam Wang io.cache.req.bits := translated_cache_req 209779109e3Slixin io.cache_req_dup.map( dup => dup.bits := translated_cache_req ) 210935edac4STang Haojin when(io.cache.req.fire){ 211b6358f8fSWilliam Wang wait_cache_op_resp := true.B 212e19f7967SWilliam Wang } 213e19f7967SWilliam Wang 214779109e3Slixin io.cacheOp_req_bits_opCode_dup.zipWithIndex.map{ case (dup, i) => dup := translated_cache_req_opCode_dup(i) } 215c3a5fe5fShappy-lx 216e19f7967SWilliam Wang // Receive cache op resp from cache 217e19f7967SWilliam Wang val raw_cache_resp = Reg(new CacheCtrlRespInfo) 218935edac4STang Haojin when(io.cache.resp.fire){ 219b6358f8fSWilliam Wang wait_cache_op_resp := false.B 220e19f7967SWilliam Wang raw_cache_resp := io.cache.resp.bits 221e19f7967SWilliam Wang when(CacheInstrucion.isReadOp(translated_cache_req.opCode)){ 222b6358f8fSWilliam Wang schedule_csr_op_resp_data := true.B 223b6358f8fSWilliam Wang schedule_csr_op_resp_finish := false.B 224e19f7967SWilliam Wang assert(data_transfer_cnt === 0.U) 225e19f7967SWilliam Wang }.otherwise{ 226b6358f8fSWilliam Wang schedule_csr_op_resp_data := false.B 227b6358f8fSWilliam Wang schedule_csr_op_resp_finish := true.B 228e19f7967SWilliam Wang } 229e19f7967SWilliam Wang } 230e19f7967SWilliam Wang 231e19f7967SWilliam Wang // Translate cache op resp to CSR write, send it back to CSR 232935edac4STang Haojin when(io.csr.update.w.fire && schedule_csr_op_resp_data && data_transfer_finished){ 233b6358f8fSWilliam Wang schedule_csr_op_resp_data := false.B 234b6358f8fSWilliam Wang schedule_csr_op_resp_finish := true.B 235e19f7967SWilliam Wang } 236935edac4STang Haojin when(io.csr.update.w.fire && schedule_csr_op_resp_finish){ 237b6358f8fSWilliam Wang schedule_csr_op_resp_finish := false.B 238b6358f8fSWilliam Wang wait_csr_op_req := true.B 239e19f7967SWilliam Wang } 240e19f7967SWilliam Wang 241b6358f8fSWilliam Wang io.csr.update.w.valid := schedule_csr_op_resp_data || schedule_csr_op_resp_finish 242e19f7967SWilliam Wang io.csr.update.w.bits := DontCare 243e19f7967SWilliam Wang 244779109e3Slixin val isReadTagECC = WireInit(CacheInstrucion.isReadTagECC(translated_cache_req_opCode_dup(0))) 245779109e3Slixin val isReadDataECC = WireInit(CacheInstrucion.isReadDataECC(translated_cache_req_opCode_dup(0))) 246e19f7967SWilliam Wang val isReadTag = WireInit(CacheInstrucion.isReadTag(translated_cache_req.opCode)) 247e19f7967SWilliam Wang val isReadData = WireInit(CacheInstrucion.isReadData(translated_cache_req.opCode)) 248e19f7967SWilliam Wang 249b6358f8fSWilliam Wang when(schedule_csr_op_resp_data){ 250e19f7967SWilliam Wang io.csr.update.w.bits.addr := Mux1H(List( 251e19f7967SWilliam Wang isReadTagECC -> (CacheInstrucion.CacheInsRegisterList("CACHE_TAG_ECC")("offset").toInt + Scachebase).U, 25277decb47Szhanglinjuan isReadDataECC -> (CacheInstrucion.CacheInsRegisterList("CACHE_DATA_ECC")("offset").toInt + Scachebase).U, 253e19f7967SWilliam Wang isReadTag -> ((CacheInstrucion.CacheInsRegisterList("CACHE_TAG_LOW")("offset").toInt + Scachebase).U + data_transfer_cnt), 254e19f7967SWilliam Wang isReadData -> ((CacheInstrucion.CacheInsRegisterList("CACHE_DATA_0")("offset").toInt + Scachebase).U + data_transfer_cnt), 255e19f7967SWilliam Wang )) 256e19f7967SWilliam Wang io.csr.update.w.bits.data := Mux1H(List( 257e19f7967SWilliam Wang isReadTagECC -> raw_cache_resp.read_tag_ecc, 25877decb47Szhanglinjuan isReadDataECC -> raw_cache_resp.read_data_ecc, 259e19f7967SWilliam Wang isReadTag -> raw_cache_resp.read_tag_low, 260e19f7967SWilliam Wang isReadData -> raw_cache_resp.read_data_vec(data_transfer_cnt), 261e19f7967SWilliam Wang )) 262b6358f8fSWilliam Wang data_transfer_finished := Mux(isReadData, 263e19f7967SWilliam Wang data_transfer_cnt === (maxDataRowSupport-1).U, 264e19f7967SWilliam Wang true.B 265e19f7967SWilliam Wang ) 266e19f7967SWilliam Wang data_transfer_cnt := data_transfer_cnt + 1.U 267e19f7967SWilliam Wang } 268e19f7967SWilliam Wang 269b6358f8fSWilliam Wang when(schedule_csr_op_resp_finish){ 270e19f7967SWilliam Wang io.csr.update.w.bits.addr := (CacheInstrucion.CacheInsRegisterList("OP_FINISH")("offset").toInt + Scachebase).U 271e19f7967SWilliam Wang io.csr.update.w.bits.data := CacheInstrucion.COP_RESULT_CODE_OK 272e19f7967SWilliam Wang data_transfer_cnt := 0.U 273e19f7967SWilliam Wang } 274026615fcSWilliam Wang 275*0184a80eSYanqin Li val error = DelayNWithValid(io.error, 1) 276*0184a80eSYanqin Li when(error.bits.report_to_beu && error.valid) { 277026615fcSWilliam Wang io.csr.update.w.bits.addr := (CacheInstrucion.CacheInsRegisterList("CACHE_ERROR")("offset").toInt + Scachebase).U 2789ef181f4SWilliam Wang io.csr.update.w.bits.data := error.asUInt 2790f59c834SWilliam Wang io.csr.update.w.valid := true.B 2809ef181f4SWilliam Wang } 2819ef181f4SWilliam Wang} 2829ef181f4SWilliam Wang 2839ef181f4SWilliam Wangclass CSRCacheErrorDecoder(implicit p: Parameters) extends CacheCtrlModule { 2849ef181f4SWilliam Wang val io = IO(new Bundle{ 2859ef181f4SWilliam Wang val encoded_cache_error = Input(UInt()) 2869ef181f4SWilliam Wang }) 2879ef181f4SWilliam Wang val encoded_cache_error = io.encoded_cache_error 2889ef181f4SWilliam Wang def print_cache_error_flag(flag: Bool, desc: String) = { 2899ef181f4SWilliam Wang when(flag){ 2909ef181f4SWilliam Wang printf(" " + desc + "\n") 2919ef181f4SWilliam Wang } 2929ef181f4SWilliam Wang } 293*0184a80eSYanqin Li val decoded_cache_error = WireInit(encoded_cache_error.asTypeOf(ValidIO(new L1CacheErrorInfo))) 2940f59c834SWilliam Wang when(decoded_cache_error.valid && !RegNext(decoded_cache_error.valid)){ 2959ef181f4SWilliam Wang printf("CACHE_ERROR CSR reported an error:\n") 296*0184a80eSYanqin Li printf(" paddr 0x%x\n", decoded_cache_error.bits.paddr) 297*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.report_to_beu, "report to bus error unit") 298*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.source.tag, "tag") 299*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.source.data, "data") 300*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.source.l2, "l2") 301*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.opType.fetch, "fetch") 302*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.opType.load, "load") 303*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.opType.store, "store") 304*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.opType.probe, "probe") 305*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.opType.release, "release") 306*0184a80eSYanqin Li print_cache_error_flag(decoded_cache_error.bits.opType.atom, "atom") 3079ef181f4SWilliam Wang printf("It should not happen in normal execution flow\n") 308026615fcSWilliam Wang } 309e19f7967SWilliam Wang} 310