PLIC: Annotate regmap with RegFieldDescs
This commit is contained in:
parent
13b120fb01
commit
718c88a8f9
@ -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)
|
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)
|
def priorityRegDesc(i: Int) = RegFieldDesc(s"priority_$i", s"Acting priority of interrupt source $i", reset=if (nPriorities > 0) None else Some(1))
|
||||||
val priorityRegFields = Seq(PLICConsts.priorityBase -> priority.map(p => priorityRegField(p)))
|
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.")
|
||||||
val pendingRegFields = Seq(PLICConsts.pendingBase -> pending .map(b => RegField.r(1, b)))
|
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) =>
|
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
|
// 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
|
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 =>
|
val hartRegFields = Seq.tabulate(nHarts) { i =>
|
||||||
PLICConsts.hartBase(i) -> Seq(
|
PLICConsts.hartBase(i) -> Seq(
|
||||||
priorityRegField(threshold(i)),
|
thresholdRegField(threshold(i), i),
|
||||||
RegField(32,
|
RegField(32,
|
||||||
RegReadFn { valid =>
|
RegReadFn { valid =>
|
||||||
claimer(i) := valid
|
claimer(i) := valid
|
||||||
@ -222,7 +231,11 @@ class TLPLIC(params: PLICParams)(implicit p: Parameters) extends LazyModule
|
|||||||
completerDev := data.extract(log2Ceil(nDevices+1)-1, 0)
|
completerDev := data.extract(log2Ceil(nDevices+1)-1, 0)
|
||||||
completer(i) := valid && enables(i)(completerDev)
|
completer(i) := valid && enables(i)(completerDev)
|
||||||
Bool(true)
|
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))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user