xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRModule.scala (revision e2216eca0e0ca4615994eafcd15445083e968a7f)
1039cdc35SXuan Hupackage xiangshan.backend.fu.NewCSR
2039cdc35SXuan Hu
3039cdc35SXuan Huimport chisel3._
4039cdc35SXuan Huimport chisel3.util.Mux1H
5039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines._
6039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRBundles._
7039cdc35SXuan Huimport chisel3.experimental.BundleLiterals.AddBundleLiteralConstructor
801cdded8SXuan Huimport org.chipsalliance.cde.config.Parameters
9039cdc35SXuan Hu
10039cdc35SXuan Huclass CSRModule[T <: CSRBundle](
11039cdc35SXuan Hu  val modName: String,
12039cdc35SXuan Hu  val bundle: T = new OneFieldBundle,
1301cdded8SXuan Hu)(implicit val p: Parameters) extends Module {
14039cdc35SXuan Hu
15039cdc35SXuan Hu  override def desiredName: String = modName + "Module"
16039cdc35SXuan Hu
17039cdc35SXuan Hu  val w = IO(Input(new CSRAddrWriteBundle(bundle)))
18039cdc35SXuan Hu
198aa89407SXuan Hu  // read data with mask, the same as the value of CSRR
208aa89407SXuan Hu  val rdata = IO(Output(UInt(bundle.len.W)))
21039cdc35SXuan Hu  // read data without mask
22039cdc35SXuan Hu  val regOut = IO(Output(bundle))
23039cdc35SXuan Hu
24cb36ac0fSXuan Hu  protected val reg = (if (bundle.needReset) RegInit(bundle, bundle.init) else Reg(bundle))
25039cdc35SXuan Hu
26039cdc35SXuan Hu  protected val wen = w.wen
27039cdc35SXuan Hu  protected val wdata = w.wdataFields
28039cdc35SXuan Hu
29cb36ac0fSXuan Hu  bundle.elements.foreach { case (str, field: CSREnumType) =>
30039cdc35SXuan Hu    val wfield = wdata.elements(str).asInstanceOf[CSREnumType]
31039cdc35SXuan Hu    field.rwType match {
32039cdc35SXuan Hu      case WARLType(wfn, _) =>
33cb36ac0fSXuan Hu        field.addOtherUpdate(wen && wfield.isLegal, wdata.elements(str).asInstanceOf[CSREnumType])
34039cdc35SXuan Hu      case WLRLType(wfn, _) =>
35cb36ac0fSXuan Hu        field.addOtherUpdate(wen && wfield.isLegal, wdata.elements(str).asInstanceOf[CSREnumType])
36039cdc35SXuan Hu      case RWType() =>
37cb36ac0fSXuan Hu        field.addOtherUpdate(wen, wdata.elements(str).asInstanceOf[CSREnumType])
38039cdc35SXuan Hu      case ROType(_) =>
39039cdc35SXuan Hu      case _ =>
40039cdc35SXuan Hu    }
41039cdc35SXuan Hu  }
42039cdc35SXuan Hu
43cb36ac0fSXuan Hu  reconnectReg()
44cb36ac0fSXuan Hu
45*e2216ecaSXuan Hu  val rdataFields = IO(Output(bundle))
46a37e0a1fSsinceforYy  rdataFields :|= regOut
478aa89407SXuan Hu
488aa89407SXuan Hu  rdata := rdataFields.asUInt
49039cdc35SXuan Hu  regOut := reg
50039cdc35SXuan Hu
51cb36ac0fSXuan Hu  private def wfnField(field: CSREnumType, str: String): Unit = {
52039cdc35SXuan Hu    val wfield: CSREnumType = wdata.elements(str).asInstanceOf[CSREnumType]
53039cdc35SXuan Hu
54cb36ac0fSXuan Hu    when (wen && wfield.isLegal || field.otherUpdateSeq.map(_._1).fold(false.B)(_ || _)) {
55039cdc35SXuan Hu      field := Mux1H(
56cb36ac0fSXuan Hu        field.otherUpdateSeq.map { case (valid, data) =>
57cb36ac0fSXuan Hu          valid -> data
58cb36ac0fSXuan Hu        } :+ (wen -> wdata.elements(str)),
59039cdc35SXuan Hu      )
60cb36ac0fSXuan Hu    }.otherwise {
61cb36ac0fSXuan Hu      field := field
62039cdc35SXuan Hu    }
63039cdc35SXuan Hu  }
64039cdc35SXuan Hu
65cb36ac0fSXuan Hu  private def wfn(reg: CSRBundle): Unit = {
66039cdc35SXuan Hu    reg.elements.foreach { case (str, field: CSREnumType) =>
67039cdc35SXuan Hu      if (!field.isRef) {
68cb36ac0fSXuan Hu        wfnField(field, str)
69039cdc35SXuan Hu      }
70039cdc35SXuan Hu    }
71039cdc35SXuan Hu  }
72039cdc35SXuan Hu
73cb36ac0fSXuan Hu  protected def reconnectReg(): Unit = {
74cb36ac0fSXuan Hu    this.wfn(this.reg)
75cb36ac0fSXuan Hu  }
76cb36ac0fSXuan Hu
77039cdc35SXuan Hu  def dumpFields: String = {
78039cdc35SXuan Hu    this.reg.getFields.map(_.dumpName).mkString("\n")
79039cdc35SXuan Hu  }
80039cdc35SXuan Hu
81039cdc35SXuan Hu  var addr = 0
82039cdc35SXuan Hu
83039cdc35SXuan Hu  def setAddr(addr_ : Int): this.type = {
84039cdc35SXuan Hu    this.addr = addr_
85039cdc35SXuan Hu    this
86039cdc35SXuan Hu  }
87039cdc35SXuan Hu}
88039cdc35SXuan Hu
89039cdc35SXuan Huclass CSRAddrWriteBundle[T <: CSRBundle](bundle: T) extends Bundle {
90039cdc35SXuan Hu  val wen = Bool()
91039cdc35SXuan Hu  val wdata = UInt(64.W)
92039cdc35SXuan Hu
93039cdc35SXuan Hu  def wdataFields: T = {
94039cdc35SXuan Hu    val wdataField = (Wire(bundle))
95039cdc35SXuan Hu    wdataField := wdata
96039cdc35SXuan Hu    wdataField
97039cdc35SXuan Hu  }
98039cdc35SXuan Hu}
99039cdc35SXuan Hu
100039cdc35SXuan Hu// Interrupt Controller
101039cdc35SXuan Huclass CSRIRCBundle extends Bundle {
102039cdc35SXuan Hu  val sip = Input(Bool())
103039cdc35SXuan Hu  val tip = Input(Bool())
104039cdc35SXuan Hu  val eip = Input(Bool())
105039cdc35SXuan Hu}
106