diff --git a/generators/chipyard/src/main/scala/ChipTop.scala b/generators/chipyard/src/main/scala/ChipTop.scala index e6cfa8cb..8d05d10e 100644 --- a/generators/chipyard/src/main/scala/ChipTop.scala +++ b/generators/chipyard/src/main/scala/ChipTop.scala @@ -16,7 +16,7 @@ import barstools.iocell.chisel._ case object BuildSystem extends Field[Parameters => LazyModule]((p: Parameters) => new DigitalTop()(p)) trait HasReferenceClockFreq { - var refClockFreqMHz: Option[Double] = None + def refClockFreqMHz: Double } /** @@ -35,7 +35,8 @@ class ChipTop(implicit p: Parameters) extends LazyModule with BindingScope val implicitClockSinkNode = ClockSinkNode(Seq(ClockSinkParameters(name = Some("implicit_clock")))) // Generate Clocks and Reset - p(ClockingSchemeKey)(this) + val mvRefClkFreq = p(ClockingSchemeKey)(this) + def refClockFreqMHz: Double = mvRefClkFreq.getWrappedValue // NOTE: Making this a LazyRawModule is moderately dangerous, as anonymous children // of ChipTop (ex: ClockGroup) do not receive clock or reset. diff --git a/generators/chipyard/src/main/scala/Clocks.scala b/generators/chipyard/src/main/scala/Clocks.scala index 9d400e6c..c25366c6 100644 --- a/generators/chipyard/src/main/scala/Clocks.scala +++ b/generators/chipyard/src/main/scala/Clocks.scala @@ -7,7 +7,7 @@ import scala.collection.mutable.{ArrayBuffer} import freechips.rocketchip.prci._ import freechips.rocketchip.subsystem.{BaseSubsystem, SubsystemDriveAsyncClockGroupsKey, InstantiatesTiles} import freechips.rocketchip.config.{Parameters, Field, Config} -import freechips.rocketchip.diplomacy.{OutwardNodeHandle, InModuleBody, LazyModule} +import freechips.rocketchip.diplomacy.{ModuleValue, OutwardNodeHandle, InModuleBody, LazyModule} import freechips.rocketchip.util.{ResetCatchAndSync} import barstools.iocell.chisel._ @@ -38,7 +38,7 @@ object GenerateReset { } -case object ClockingSchemeKey extends Field[ChipTop => Unit](ClockingSchemeGenerators.dividerOnlyClockGenerator) +case object ClockingSchemeKey extends Field[ChipTop => ModuleValue[Double]](ClockingSchemeGenerators.dividerOnlyClockGenerator) /* * This is a Seq of assignment functions, that accept a clock name and return an optional frequency. * Functions that appear later in this seq have higher precedence that earlier ones. @@ -59,7 +59,7 @@ class ClockNameContainsAssignment(name: String, fMHz: Double) extends Config((si }) object ClockingSchemeGenerators { - val dividerOnlyClockGenerator: ChipTop => Unit = { chiptop => + val dividerOnlyClockGenerator: ChipTop => ModuleValue[Double] = { chiptop => implicit val p = chiptop.p // Requires existence of undriven asyncClockGroups in subsystem @@ -100,9 +100,6 @@ object ClockingSchemeGenerators { val (clock_io, clockIOCell) = IOCell.generateIOFromSignal(clock_wire, "clock") chiptop.iocells ++= clockIOCell - // set the reference clock used - chiptop.refClockFreqMHz = Some(dividerOnlyClkGenerator.module.referenceFreq) - referenceClockSource.out.unzip._1.map { o => o.clock := clock_wire o.reset := reset_wire @@ -111,6 +108,9 @@ object ClockingSchemeGenerators { chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => { clock_io := th.harnessClock Nil }) + + // return the reference frequency + dividerOnlyClkGenerator.module.referenceFreq } } } diff --git a/generators/chipyard/src/main/scala/TestHarness.scala b/generators/chipyard/src/main/scala/TestHarness.scala index e5af755a..82be0093 100644 --- a/generators/chipyard/src/main/scala/TestHarness.scala +++ b/generators/chipyard/src/main/scala/TestHarness.scala @@ -91,7 +91,7 @@ class TestHarness(implicit val p: Parameters) extends Module with HasHarnessSign io.success := false.B val freqMHz = lazyDut match { - case d: HasReferenceClockFreq => d.refClockFreqMHz.getOrElse(p(DefaultClockFrequencyKey)) + case d: HasReferenceClockFreq => d.refClockFreqMHz case _ => p(DefaultClockFrequencyKey) } val refClkBundle = p(HarnessClockInstantiatorKey).requestClockBundle("buildtop_reference_clock", freqMHz * (1000 * 1000)) diff --git a/generators/firechip/src/main/scala/FireSim.scala b/generators/firechip/src/main/scala/FireSim.scala index 7a66c896..68533146 100644 --- a/generators/firechip/src/main/scala/FireSim.scala +++ b/generators/firechip/src/main/scala/FireSim.scala @@ -194,14 +194,14 @@ class WithFireSimSimpleClocks extends Config((site, here, up) => { RationalClock(sinkP.name.get, 1, division) } - // Set the reference frequency used - chiptop.refClockFreqMHz = Some(pllConfig.referenceFreqMHz) - chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => { reset := th.harnessReset input_clocks := p(ClockBridgeInstantiatorKey) .requestClockRecordMap(rationalClockSpecs.toSeq, p(FireSimBaseClockNameKey), pllConfig.referenceFreqMHz * (1000 * 1000)) Nil }) + + // return the reference frequency + pllConfig.referenceFreqMHz } } }) @@ -230,7 +230,7 @@ class FireSim(implicit val p: Parameters) extends RawModule with HasHarnessSigna val module = Module(lazyModule.module) btFreqMHz = Some(lazyModule match { - case d: HasReferenceClockFreq => d.refClockFreqMHz.getOrElse(p(DefaultClockFrequencyKey)) + case d: HasReferenceClockFreq => d.refClockFreqMHz case _ => p(DefaultClockFrequencyKey) })