PLIC: Annotate regmap with RegFieldDescs
This commit is contained in:
		| @@ -169,12 +169,18 @@ class TLPLIC(params: PLICParams)(implicit p: Parameters) extends LazyModule | ||||
|       harts(hart) := ShiftRegister(Reg(next = maxPri) > Cat(UInt(1), threshold(hart)), params.intStages) | ||||
|     } | ||||
|  | ||||
|     def priorityRegField(x: UInt) = if (nPriorities > 0) RegField(32, x) else RegField.r(32, x) | ||||
|     val priorityRegFields = Seq(PLICConsts.priorityBase -> priority.map(p => priorityRegField(p))) | ||||
|     val pendingRegFields = Seq(PLICConsts.pendingBase  -> pending .map(b => RegField.r(1, b))) | ||||
|     def priorityRegDesc(i: Int) = RegFieldDesc(s"priority_$i", s"Acting priority of interrupt source $i", reset=if (nPriorities > 0) None else Some(1))  | ||||
|     def pendingRegDesc(i: Int) = RegFieldDesc(s"pending_$i", s"Set to 1 if interrupt source $i is pending, regardless of its enable or priority setting.")  | ||||
|     def priorityRegField(x: UInt, i: Int) = if (nPriorities > 0) RegField(32, x, priorityRegDesc(i)) else RegField.r(32, x, priorityRegDesc(i)) | ||||
|     val priorityRegFields = Seq(PLICConsts.priorityBase -> RegFieldGroup("priority", Some("Acting priorities of each interrupt source. 32 bits for each interrupt source."), | ||||
|       priority.zipWithIndex.map{case (p, i) => priorityRegField(p, i)})) | ||||
|     val pendingRegFields = Seq(PLICConsts.pendingBase  -> RegFieldGroup("pending", Some("Pending Bit Array. 1 Bit for each interrupt source."), | ||||
|       pending.zipWithIndex.map{case (b, i) => RegField.r(1, b, pendingRegDesc(i))})) | ||||
|  | ||||
|   | ||||
|     val enableRegFields = enables.zipWithIndex.map { case (e, i) => | ||||
|       PLICConsts.enableBase(i) -> e.map(b => RegField(1, b)) | ||||
|       PLICConsts.enableBase(i) -> RegFieldGroup("enable", Some("Enable bits for each interrupt source. 1 bit for each interrupt source."), | ||||
|         e.map(b => RegField(1, b, RegFieldDesc(s"enable_$i", "Enable interrupt and claim for source $i", reset=None)))) | ||||
|     } | ||||
|  | ||||
|     // When a hart reads a claim/complete register, then the | ||||
| @@ -208,9 +214,12 @@ class TLPLIC(params: PLICParams)(implicit p: Parameters) extends LazyModule | ||||
|        g.complete := c | ||||
|     } | ||||
|  | ||||
|     def thresholdRegDesc(i: Int) = RegFieldDesc(s"threshold_$i", s"Interrupt & claim threshold for target $i", reset=if (nPriorities > 0) None else Some(1)) | ||||
|     def thresholdRegField(x: UInt, i: Int) = if (nPriorities > 0) RegField(32, x, thresholdRegDesc(i)) else RegField.r(32, x, thresholdRegDesc(i)) | ||||
|  | ||||
|     val hartRegFields = Seq.tabulate(nHarts) { i => | ||||
|       PLICConsts.hartBase(i) -> Seq( | ||||
|         priorityRegField(threshold(i)), | ||||
|         thresholdRegField(threshold(i), i), | ||||
|         RegField(32, | ||||
|           RegReadFn { valid => | ||||
|             claimer(i) := valid | ||||
| @@ -222,10 +231,14 @@ class TLPLIC(params: PLICParams)(implicit p: Parameters) extends LazyModule | ||||
|             completerDev := data.extract(log2Ceil(nDevices+1)-1, 0) | ||||
|             completer(i) := valid && enables(i)(completerDev) | ||||
|             Bool(true) | ||||
|           } | ||||
|           }, | ||||
|           Some(RegFieldDesc(s"claim_complete_$i", ("Claim/Complete register for Target $i. Reading this register returns the claimed interrupt number and makes it no longer pending." + | ||||
|             "Writing the interrupt number back completes the interrupt."), | ||||
|             reset = None, | ||||
|             access = RegFieldAccessType.RWSPECIAL)) | ||||
|         ) | ||||
|       ) | ||||
|     } | ||||
|     }  | ||||
|  | ||||
|     node.regmap((priorityRegFields ++ pendingRegFields ++ enableRegFields ++ hartRegFields):_*) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user