Skip to content

Commit 4e20fd7

Browse files
authored
Support reset-initializing the lastGrant register in RRArbiter (#4903)
* Support reset-initializing the lastGrant register in RRArbiter The default behavior remains the same: don't initialize the `lastGrant` register in `LockingRRArbiter`. See #267 for previous discussions on this. * Give RRArbiter a default stable module name
1 parent d76c25f commit 4e20fd7

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

src/main/scala/chisel3/util/Arbiter.scala

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,18 @@ abstract class LockingArbiterLike[T <: Data](gen: T, n: Int, count: Int, needsLo
7575
}
7676
}
7777

78-
class LockingRRArbiter[T <: Data](gen: T, n: Int, count: Int, needsLock: Option[T => Bool] = None)
79-
extends LockingArbiterLike[T](gen, n, count, needsLock) {
80-
// this register is not initialized on purpose, see #267
81-
lazy val lastGrant = RegEnable(io.chosen, io.out.fire)
78+
class LockingRRArbiter[T <: Data](
79+
gen: T,
80+
n: Int,
81+
count: Int,
82+
needsLock: Option[T => Bool] = None,
83+
initLastGrant: Boolean = false
84+
) extends LockingArbiterLike[T](gen, n, count, needsLock) {
85+
lazy val lastGrant = if (initLastGrant) {
86+
RegEnable(io.chosen, 0.U, io.out.fire)
87+
} else {
88+
RegEnable(io.chosen, io.out.fire)
89+
}
8290
lazy val grantMask = (0 until n).map(_.asUInt > lastGrant)
8391
lazy val validMask = io.in.zip(grantMask).map { case (in, g) => in.valid && g }
8492

@@ -108,14 +116,22 @@ class LockingArbiter[T <: Data](gen: T, n: Int, count: Int, needsLock: Option[T
108116
*
109117
* @param gen data type
110118
* @param n number of inputs
119+
* @param initLastGrant when true, initialize the `lastGrant` register to 0
111120
* @example {{{
112121
* val arb = Module(new RRArbiter(UInt(), 2))
113122
* arb.io.in(0) <> producer0.io.out
114123
* arb.io.in(1) <> producer1.io.out
115124
* consumer.io.in <> arb.io.out
116125
* }}}
117126
*/
118-
class RRArbiter[T <: Data](val gen: T, val n: Int) extends LockingRRArbiter[T](gen, n, 1)
127+
class RRArbiter[T <: Data](val gen: T, val n: Int, initLastGrant: Boolean = false)
128+
extends LockingRRArbiter[T](gen, n, 1, initLastGrant = initLastGrant) {
129+
130+
/** Give this Arbiter a default, stable desired name using the supplied `Data`
131+
* generator's `typeName` and input count parameter
132+
*/
133+
override def desiredName = s"RRArbiter${n}_${gen.typeName}"
134+
}
119135

120136
/** Hardware module that is used to sequence n producers into 1 consumer.
121137
* Priority is given to lower producer.

0 commit comments

Comments
 (0)