Merge pull request #826 from ucb-bar/tile-reset-async

Fix TileResetCtrl to be ahead of reset synchronizers.
This commit is contained in:
Jerry Zhao
2021-03-12 16:51:58 -08:00
committed by GitHub
2 changed files with 15 additions and 4 deletions

View File

@@ -71,16 +71,16 @@ object ClockingSchemeGenerators {
// Add a control register for each tile's reset // Add a control register for each tile's reset
val resetSetter = chiptop.lazySystem match { val resetSetter = chiptop.lazySystem match {
case sys: BaseSubsystem with InstantiatesTiles => TLTileResetCtrl(sys) case sys: BaseSubsystem with InstantiatesTiles => Some(TLTileResetCtrl(sys))
case _ => ClockGroupEphemeralNode() case _ => None
} }
val resetSetterResetProvider = resetSetter.map(_.tileResetProviderNode).getOrElse(ClockGroupEphemeralNode())
val aggregator = LazyModule(new ClockGroupAggregator("allClocks")).node val aggregator = LazyModule(new ClockGroupAggregator("allClocks")).node
(chiptop.implicitClockSinkNode (chiptop.implicitClockSinkNode
:= ClockGroup() := ClockGroup()
:= aggregator) := aggregator)
(systemAsyncClockGroup (systemAsyncClockGroup
:*= resetSetter
:*= ClockGroupNamePrefixer() :*= ClockGroupNamePrefixer()
:*= aggregator) :*= aggregator)
@@ -88,10 +88,16 @@ object ClockingSchemeGenerators {
(aggregator (aggregator
:= ClockGroupFrequencySpecifier(p(ClockFrequencyAssignersKey), p(DefaultClockFrequencyKey)) := ClockGroupFrequencySpecifier(p(ClockFrequencyAssignersKey), p(DefaultClockFrequencyKey))
:= ClockGroupResetSynchronizer() := ClockGroupResetSynchronizer()
:= resetSetterResetProvider
:= DividerOnlyClockGenerator() := DividerOnlyClockGenerator()
:= referenceClockSource) := referenceClockSource)
val asyncResetBroadcast = FixedClockBroadcast(None)
resetSetter.foreach(_.asyncResetSinkNode := asyncResetBroadcast)
val asyncResetSource = ClockSourceNode(Seq(ClockSourceParameters()))
asyncResetBroadcast := asyncResetSource
InModuleBody { InModuleBody {
val clock_wire = Wire(Input(Clock())) val clock_wire = Wire(Input(Clock()))
val reset_wire = GenerateReset(chiptop, clock_wire) val reset_wire = GenerateReset(chiptop, clock_wire)
@@ -103,6 +109,11 @@ object ClockingSchemeGenerators {
o.reset := reset_wire 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) => { chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => {
clock_io := th.harnessClock clock_io := th.harnessClock
Nil }) Nil })