Skip to content

Commit 7241286

Browse files
authored
Merge pull request #2321 from ucb-bar/clock-binders-iocell
fix single clock broadcasting binder, add option for 1 io cell per clock
2 parents 291733d + a26cf86 commit 7241286

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

generators/chipyard/src/main/scala/clocking/ClockBinders.scala

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,46 @@ class WithSingleClockBroadcastClockGenerator(freqMHz: Int = 100) extends Overrid
119119

120120
clockGroupsSourceNode.out.foreach { case (bundle, edge) =>
121121
bundle.member.data.foreach { b =>
122-
b.clock := clock_io
123-
b.reset := reset_io
122+
b.clock := clock_wire
123+
b.reset := reset_wire
124124
}
125125
}
126126
(Seq(ClockPort(() => clock_io, freqMHz), ResetPort(() => reset_io)), clockIOCell ++ resetIOCell)
127127
}
128128
}
129129
})
130130

131+
class WithMultiIOCellsClockGenerator extends OverrideLazyIOBinder({
132+
(system: HasChipyardPRCI) => {
133+
implicit val p = GetSystemParameters(system)
134+
135+
val clockGroupsSourceNode = ClockGroupSourceNode(Seq(ClockGroupSourceParameters()))
136+
system.chiptopClockGroupsNode :*= clockGroupsSourceNode
137+
138+
InModuleBody {
139+
val reset_wire = Wire(Input(AsyncReset()))
140+
val (reset_io, resetIOCell) = IOCell.generateIOFromSignal(reset_wire, "reset", p(IOCellKey))
141+
142+
require(clockGroupsSourceNode.out.size == 1)
143+
val (bundle, edge) = clockGroupsSourceNode.out.head
144+
145+
val iosAndIOCells = (bundle.member.data zip edge.sink.members).map { case (b, m) =>
146+
require(m.take.isDefined, s"""Clock ${m.name.get} has no requested frequency
147+
|Clocks: ${edge.sink.members.map(_.name.get)}""".stripMargin)
148+
val freq = m.take.get.freqMHz
149+
val clock_wire = Wire(Input(Clock()))
150+
val (clock_io, clockIOCell) = IOCell.generateIOFromSignal(clock_wire, s"clock_${m.name.get}", p(IOCellKey))
151+
b.clock := clock_wire
152+
b.reset := reset_wire
153+
(ClockPort(() => clock_io, freq), clockIOCell)
154+
}.toSeq
155+
val clock_ios = iosAndIOCells.map(_._1)
156+
val clockIOCells = iosAndIOCells.flatMap(_._2)
157+
((clock_ios :+ ResetPort(() => reset_io)), clockIOCells ++ resetIOCell)
158+
}
159+
}
160+
})
161+
131162
class WithClockTapIOCells extends OverrideIOBinder({
132163
(system: CanHaveClockTap) => {
133164
system.clockTapIO.map { tap =>

0 commit comments

Comments
 (0)