From aac77b3d74c6033eb03f9055a2304bd645529db8 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 10 Mar 2021 14:46:53 -0800 Subject: [PATCH] Move TileResetCtrl before the ResetSynchronizers, and give them an async reset --- generators/chipyard/src/main/scala/Clocks.scala | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/generators/chipyard/src/main/scala/Clocks.scala b/generators/chipyard/src/main/scala/Clocks.scala index 9ca6a801..e29f8392 100644 --- a/generators/chipyard/src/main/scala/Clocks.scala +++ b/generators/chipyard/src/main/scala/Clocks.scala @@ -70,16 +70,16 @@ object ClockingSchemeGenerators { // Add a control register for each tile's reset val resetSetter = chiptop.lazySystem match { - case sys: BaseSubsystem with InstantiatesTiles => TLTileResetCtrl(sys) - case _ => ClockGroupEphemeralNode() + case sys: BaseSubsystem with InstantiatesTiles => Some(TLTileResetCtrl(sys)) + case _ => None } + val resetSetterResetProvider = resetSetter.map(_.tileResetProviderNode).getOrElse(ClockGroupEphemeralNode()) val aggregator = LazyModule(new ClockGroupAggregator("allClocks")).node (chiptop.implicitClockSinkNode := ClockGroup() := aggregator) (systemAsyncClockGroup - :*= resetSetter :*= ClockGroupNamePrefixer() :*= aggregator) @@ -87,10 +87,16 @@ object ClockingSchemeGenerators { (aggregator := ClockGroupFrequencySpecifier(p(ClockFrequencyAssignersKey), p(DefaultClockFrequencyKey)) := ClockGroupResetSynchronizer() + := resetSetterResetProvider := DividerOnlyClockGenerator() := referenceClockSource) + val asyncResetBroadcast = FixedClockBroadcast(None) + resetSetter.foreach(_.asyncResetSinkNode := asyncResetBroadcast) + val asyncResetSource = ClockSourceNode(Seq(ClockSourceParameters())) + asyncResetBroadcast := asyncResetSource + InModuleBody { val clock_wire = Wire(Input(Clock())) val reset_wire = GenerateReset(chiptop, clock_wire) @@ -102,6 +108,11 @@ object ClockingSchemeGenerators { o.reset := reset_wire } + asyncResetSource.out.unzip._1.map { o => + o.clock := false.B.asClock // async reset broadcast network does not provide a clock + o.reset := reset_wire + } + chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => { clock_io := th.harnessClock Nil })