From 9a5673ddef7e5dd925a3a0d352553b85f1e973c9 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Fri, 5 May 2023 11:26:27 -0700 Subject: [PATCH] Add singleclock broadcast clockbinder --- .../main/scala/clocking/ClockBinders.scala | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/generators/chipyard/src/main/scala/clocking/ClockBinders.scala b/generators/chipyard/src/main/scala/clocking/ClockBinders.scala index d075fcbb..3582ba08 100644 --- a/generators/chipyard/src/main/scala/clocking/ClockBinders.scala +++ b/generators/chipyard/src/main/scala/clocking/ClockBinders.scala @@ -102,6 +102,42 @@ class WithPassthroughClockGenerator extends OverrideLazyIOBinder({ } }) +// Broadcasts a single clock IO to all clock domains +class WithSingleClockBroadcastClockGenerator extends OverrideLazyIOBinder({ + (system: HasChipyardPRCI) => { + implicit val p = GetSystemParameters(system) + val implicitClockSinkNode = ClockSinkNode(Seq(ClockSinkParameters(name = Some("implicit_clock")))) + system.connectImplicitClockSinkNode(implicitClockSinkNode) + InModuleBody { + val implicit_clock = implicitClockSinkNode.in.head._1.clock + val implicit_reset = implicitClockSinkNode.in.head._1.reset + system.asInstanceOf[BaseSubsystem].module match { case l: LazyModuleImp => { + l.clock := implicit_clock + l.reset := implicit_reset + }} + } + + val clockGroupsAggregateNode = ClockGroupAggregateNode("single_clock") + val clockGroupsSourceNode = ClockGroupSourceNode(Seq(ClockGroupSourceParameters())) + system.allClockGroupsNode :*= clockGroupsAggregateNode := clockGroupsSourceNode + + InModuleBody { + val clock_wire = Wire(Input(new ClockWithFreq(100))) + val reset_wire = Wire(Input(AsyncReset())) + val (clock_io, clockIOCell) = IOCell.generateIOFromSignal(clock_wire, "clock", p(IOCellKey)) + val (reset_io, resetIOCell) = IOCell.generateIOFromSignal(reset_wire, "reset", p(IOCellKey)) + + clockGroupsSourceNode.out.foreach { case (bundle, edge) => + bundle.member.data.foreach { b => + b.clock := clock_io.clock + b.reset := reset_io + } + } + (Seq(clock_io, reset_io), clockIOCell ++ resetIOCell) + } + } +}) + class WithClockTapIOCells extends OverrideIOBinder({ (system: CanHaveClockTap) => { system.clockTapIO.map { tap =>