xref: /XiangShan/src/main/scala/xiangshan/cache/CacheInstruction.scala (revision c3a5fe5fa6e274f7b8e5678138f3644c31a929d4)
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
144b11ec622Slixin    val cache_req_dup_0 = Valid(new CacheCtrlReqInfo)
145*c3a5fe5fShappy-lx    val cache_req_dup_1 = Valid(new CacheCtrlReqInfo)
146*c3a5fe5fShappy-lx    val cacheOp_req_bits_opCode_dup_0 = Output(UInt(XLEN.W))
147*c3a5fe5fShappy-lx    val cacheOp_req_bits_opCode_dup_1 = Output(UInt(XLEN.W))
148026615fcSWilliam Wang    val error = Flipped(new L1CacheErrorInfo)
149e19f7967SWilliam Wang  })
150e19f7967SWilliam Wang
151e19f7967SWilliam Wang  // CSRCacheOpDecoder state
152b6358f8fSWilliam Wang  val wait_csr_op_req = RegInit(true.B) // waiting for csr "CACHE_OP" being write
153b6358f8fSWilliam Wang  val wait_cache_op_resp = RegInit(false.B) // waiting for dcache to finish dcache op
154b6358f8fSWilliam Wang  val schedule_csr_op_resp_data = RegInit(false.B) // ready to write data readed from cache back to csr
155b6358f8fSWilliam Wang  val schedule_csr_op_resp_finish = RegInit(false.B) // ready to write "OP_FINISH" csr
156e19f7967SWilliam Wang  // val cache_op_resp_timer = RegInit(0.U(4.W))
157e19f7967SWilliam Wang  val data_transfer_finished = WireInit(false.B)
158e19f7967SWilliam Wang  val data_transfer_cnt = RegInit(0.U(log2Up(maxDataRowSupport).W))
159e19f7967SWilliam Wang
160e19f7967SWilliam Wang  // Translate CSR write to cache op
161b11ec622Slixin  val translated_cache_req = Reg(new CacheCtrlReqInfo)
162b11ec622Slixin  val translated_cache_req_opCode_dup_0 = Reg(UInt(XLEN.W))
163*c3a5fe5fShappy-lx  val translated_cache_req_opCode_dup_1 = Reg(UInt(XLEN.W))
164e19f7967SWilliam Wang  println("Cache op decoder (" + decoder_name + "):")
165e19f7967SWilliam Wang  println("  Id " + id)
166e19f7967SWilliam Wang  // CacheInsRegisterList.map{case (name, attribute) => {
167e19f7967SWilliam Wang  //   println("  Register CSR mirror " + name)
168e19f7967SWilliam Wang  // }}
169e19f7967SWilliam Wang
170e19f7967SWilliam Wang  def cacheop_csr_is_being_write(csr_name: String): Bool = {
171e19f7967SWilliam Wang    io.csr.distribute_csr.w.bits.addr === (CacheInstrucion.CacheInsRegisterList(csr_name)("offset").toInt + Scachebase).U &&
172e19f7967SWilliam Wang      io.csr.distribute_csr.w.valid
173e19f7967SWilliam Wang  }
174e19f7967SWilliam Wang
175e19f7967SWilliam Wang  def update_cache_req_when_write(csr_name: String, req_field: Data) = {
176e19f7967SWilliam Wang    when(
177e19f7967SWilliam Wang      cacheop_csr_is_being_write(csr_name)
178e19f7967SWilliam Wang    ){
179e19f7967SWilliam Wang      req_field := io.csr.distribute_csr.w.bits.data
180b6358f8fSWilliam Wang      assert(wait_csr_op_req)
181e19f7967SWilliam Wang    }
182e19f7967SWilliam Wang  }
183e19f7967SWilliam Wang
184e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_OP", translated_cache_req.opCode)
185b11ec622Slixin  update_cache_req_when_write("CACHE_OP", translated_cache_req_opCode_dup_0)
186*c3a5fe5fShappy-lx  update_cache_req_when_write("CACHE_OP", translated_cache_req_opCode_dup_1)
187e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_LEVEL", translated_cache_req.level)
188e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_WAY", translated_cache_req.wayNum)
189e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_IDX", translated_cache_req.index)
190e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_BANK_NUM", translated_cache_req.bank_num)
191e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_TAG_HIGH", translated_cache_req.write_tag_high)
192e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_TAG_LOW", translated_cache_req.write_tag_low)
19377decb47Szhanglinjuan  update_cache_req_when_write("CACHE_TAG_ECC", translated_cache_req.write_tag_ecc)
194e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_0", translated_cache_req.write_data_vec(0))
195e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_1", translated_cache_req.write_data_vec(1))
196e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_2", translated_cache_req.write_data_vec(2))
197e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_3", translated_cache_req.write_data_vec(3))
198e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_4", translated_cache_req.write_data_vec(4))
199e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_5", translated_cache_req.write_data_vec(5))
200e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_6", translated_cache_req.write_data_vec(6))
201e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_7", translated_cache_req.write_data_vec(7))
202e19f7967SWilliam Wang  update_cache_req_when_write("CACHE_DATA_ECC", translated_cache_req.write_data_ecc)
203e19f7967SWilliam Wang
204e19f7967SWilliam Wang  val cache_op_start = WireInit(cacheop_csr_is_being_write("CACHE_OP") && id.U === translated_cache_req.level)
205e19f7967SWilliam Wang  when(cache_op_start) {
206b6358f8fSWilliam Wang    wait_csr_op_req := false.B
207e19f7967SWilliam Wang  }
208e19f7967SWilliam Wang
209e19f7967SWilliam Wang  // Send cache op to cache
210e19f7967SWilliam Wang  io.cache.req.valid := RegNext(cache_op_start)
211b11ec622Slixin  io.cache_req_dup_0.valid := RegNext(cache_op_start)
212*c3a5fe5fShappy-lx  io.cache_req_dup_1.valid := RegNext(cache_op_start)
213e19f7967SWilliam Wang  io.cache.req.bits := translated_cache_req
214b11ec622Slixin  io.cache_req_dup_0.bits := translated_cache_req
215*c3a5fe5fShappy-lx  io.cache_req_dup_1.bits := translated_cache_req
216e19f7967SWilliam Wang  when(io.cache.req.fire()){
217b6358f8fSWilliam Wang    wait_cache_op_resp := true.B
218e19f7967SWilliam Wang  }
219e19f7967SWilliam Wang
220*c3a5fe5fShappy-lx  io.cacheOp_req_bits_opCode_dup_0 := translated_cache_req_opCode_dup_0
221*c3a5fe5fShappy-lx  io.cacheOp_req_bits_opCode_dup_1 := translated_cache_req_opCode_dup_1
222*c3a5fe5fShappy-lx
223e19f7967SWilliam Wang  // Receive cache op resp from cache
224e19f7967SWilliam Wang  val raw_cache_resp = Reg(new CacheCtrlRespInfo)
225e19f7967SWilliam Wang  when(io.cache.resp.fire()){
226b6358f8fSWilliam Wang    wait_cache_op_resp := false.B
227e19f7967SWilliam Wang    raw_cache_resp := io.cache.resp.bits
228e19f7967SWilliam Wang    when(CacheInstrucion.isReadOp(translated_cache_req.opCode)){
229b6358f8fSWilliam Wang      schedule_csr_op_resp_data := true.B
230b6358f8fSWilliam Wang      schedule_csr_op_resp_finish := false.B
231e19f7967SWilliam Wang      assert(data_transfer_cnt === 0.U)
232e19f7967SWilliam Wang    }.otherwise{
233b6358f8fSWilliam Wang      schedule_csr_op_resp_data := false.B
234b6358f8fSWilliam Wang      schedule_csr_op_resp_finish := true.B
235e19f7967SWilliam Wang    }
236e19f7967SWilliam Wang  }
237e19f7967SWilliam Wang
238e19f7967SWilliam Wang  // Translate cache op resp to CSR write, send it back to CSR
239b6358f8fSWilliam Wang  when(io.csr.update.w.fire() && schedule_csr_op_resp_data && data_transfer_finished){
240b6358f8fSWilliam Wang    schedule_csr_op_resp_data := false.B
241b6358f8fSWilliam Wang    schedule_csr_op_resp_finish := true.B
242e19f7967SWilliam Wang  }
243b6358f8fSWilliam Wang  when(io.csr.update.w.fire() && schedule_csr_op_resp_finish){
244b6358f8fSWilliam Wang    schedule_csr_op_resp_finish := false.B
245b6358f8fSWilliam Wang    wait_csr_op_req := true.B
246e19f7967SWilliam Wang  }
247e19f7967SWilliam Wang
248b6358f8fSWilliam Wang  io.csr.update.w.valid := schedule_csr_op_resp_data || schedule_csr_op_resp_finish
249e19f7967SWilliam Wang  io.csr.update.w.bits := DontCare
250e19f7967SWilliam Wang
251b11ec622Slixin  val isReadTagECC = WireInit(CacheInstrucion.isReadTagECC(translated_cache_req_opCode_dup_0))
252b11ec622Slixin  val isReadDataECC = WireInit(CacheInstrucion.isReadDataECC(translated_cache_req_opCode_dup_0))
253e19f7967SWilliam Wang  val isReadTag = WireInit(CacheInstrucion.isReadTag(translated_cache_req.opCode))
254e19f7967SWilliam Wang  val isReadData = WireInit(CacheInstrucion.isReadData(translated_cache_req.opCode))
255e19f7967SWilliam Wang
256b6358f8fSWilliam Wang  when(schedule_csr_op_resp_data){
257e19f7967SWilliam Wang    io.csr.update.w.bits.addr := Mux1H(List(
258e19f7967SWilliam Wang      isReadTagECC -> (CacheInstrucion.CacheInsRegisterList("CACHE_TAG_ECC")("offset").toInt + Scachebase).U,
25977decb47Szhanglinjuan      isReadDataECC -> (CacheInstrucion.CacheInsRegisterList("CACHE_DATA_ECC")("offset").toInt + Scachebase).U,
260e19f7967SWilliam Wang      isReadTag -> ((CacheInstrucion.CacheInsRegisterList("CACHE_TAG_LOW")("offset").toInt + Scachebase).U + data_transfer_cnt),
261e19f7967SWilliam Wang      isReadData -> ((CacheInstrucion.CacheInsRegisterList("CACHE_DATA_0")("offset").toInt + Scachebase).U + data_transfer_cnt),
262e19f7967SWilliam Wang    ))
263e19f7967SWilliam Wang    io.csr.update.w.bits.data := Mux1H(List(
264e19f7967SWilliam Wang      isReadTagECC -> raw_cache_resp.read_tag_ecc,
26577decb47Szhanglinjuan      isReadDataECC -> raw_cache_resp.read_data_ecc,
266e19f7967SWilliam Wang      isReadTag -> raw_cache_resp.read_tag_low,
267e19f7967SWilliam Wang      isReadData -> raw_cache_resp.read_data_vec(data_transfer_cnt),
268e19f7967SWilliam Wang    ))
269b6358f8fSWilliam Wang    data_transfer_finished := Mux(isReadData,
270e19f7967SWilliam Wang      data_transfer_cnt === (maxDataRowSupport-1).U,
271e19f7967SWilliam Wang      true.B
272e19f7967SWilliam Wang    )
273e19f7967SWilliam Wang    data_transfer_cnt := data_transfer_cnt + 1.U
274e19f7967SWilliam Wang  }
275e19f7967SWilliam Wang
276b6358f8fSWilliam Wang  when(schedule_csr_op_resp_finish){
277e19f7967SWilliam Wang    io.csr.update.w.bits.addr := (CacheInstrucion.CacheInsRegisterList("OP_FINISH")("offset").toInt + Scachebase).U
278e19f7967SWilliam Wang    io.csr.update.w.bits.data := CacheInstrucion.COP_RESULT_CODE_OK
279e19f7967SWilliam Wang    data_transfer_cnt := 0.U
280e19f7967SWilliam Wang  }
281026615fcSWilliam Wang
282026615fcSWilliam Wang  val error = DelayN(io.error, 1)
2830f59c834SWilliam Wang  when(error.report_to_beu) {
284026615fcSWilliam Wang    io.csr.update.w.bits.addr := (CacheInstrucion.CacheInsRegisterList("CACHE_ERROR")("offset").toInt + Scachebase).U
2859ef181f4SWilliam Wang    io.csr.update.w.bits.data := error.asUInt
2860f59c834SWilliam Wang    io.csr.update.w.valid := true.B
2879ef181f4SWilliam Wang  }
2889ef181f4SWilliam Wang}
2899ef181f4SWilliam Wang
2909ef181f4SWilliam Wangclass CSRCacheErrorDecoder(implicit p: Parameters) extends CacheCtrlModule {
2919ef181f4SWilliam Wang  val io = IO(new Bundle{
2929ef181f4SWilliam Wang    val encoded_cache_error = Input(UInt())
2939ef181f4SWilliam Wang  })
2949ef181f4SWilliam Wang  val encoded_cache_error = io.encoded_cache_error
2959ef181f4SWilliam Wang  def print_cache_error_flag(flag: Bool, desc: String) = {
2969ef181f4SWilliam Wang    when(flag){
2979ef181f4SWilliam Wang      printf("  " + desc + "\n")
2989ef181f4SWilliam Wang    }
2999ef181f4SWilliam Wang  }
3009ef181f4SWilliam Wang  val decoded_cache_error = WireInit(encoded_cache_error.asTypeOf(new L1CacheErrorInfo))
3010f59c834SWilliam Wang  when(decoded_cache_error.valid && !RegNext(decoded_cache_error.valid)){
3029ef181f4SWilliam Wang    printf("CACHE_ERROR CSR reported an error:\n")
3030f59c834SWilliam Wang    printf("  paddr 0x%x\n", decoded_cache_error.paddr)
3040f59c834SWilliam Wang    print_cache_error_flag(decoded_cache_error.report_to_beu, "report to bus error unit")
3059ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.source.tag, "tag")
3069ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.source.data, "data")
3079ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.source.l2, "l2")
3089ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.opType.fetch, "fetch")
3099ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.opType.load, "load")
3109ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.opType.store, "store")
3119ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.opType.probe, "probe")
3129ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.opType.release, "release")
3139ef181f4SWilliam Wang    print_cache_error_flag(decoded_cache_error.opType.atom, "atom")
3149ef181f4SWilliam Wang    printf("It should not happen in normal execution flow\n")
315026615fcSWilliam Wang  }
316e19f7967SWilliam Wang}
317