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