Use def instead of var Option for ref frequency

This commit is contained in:
abejgonzalez
2021-03-16 19:42:24 -07:00
parent 3439266b2e
commit 5301723404
4 changed files with 14 additions and 13 deletions

View File

@@ -16,7 +16,7 @@ import barstools.iocell.chisel._
case object BuildSystem extends Field[Parameters => LazyModule]((p: Parameters) => new DigitalTop()(p)) case object BuildSystem extends Field[Parameters => LazyModule]((p: Parameters) => new DigitalTop()(p))
trait HasReferenceClockFreq { 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")))) val implicitClockSinkNode = ClockSinkNode(Seq(ClockSinkParameters(name = Some("implicit_clock"))))
// Generate Clocks and Reset // 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 // NOTE: Making this a LazyRawModule is moderately dangerous, as anonymous children
// of ChipTop (ex: ClockGroup) do not receive clock or reset. // of ChipTop (ex: ClockGroup) do not receive clock or reset.

View File

@@ -7,7 +7,7 @@ import scala.collection.mutable.{ArrayBuffer}
import freechips.rocketchip.prci._ import freechips.rocketchip.prci._
import freechips.rocketchip.subsystem.{BaseSubsystem, SubsystemDriveAsyncClockGroupsKey, InstantiatesTiles} import freechips.rocketchip.subsystem.{BaseSubsystem, SubsystemDriveAsyncClockGroupsKey, InstantiatesTiles}
import freechips.rocketchip.config.{Parameters, Field, Config} 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 freechips.rocketchip.util.{ResetCatchAndSync}
import barstools.iocell.chisel._ 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. * 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. * 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 { object ClockingSchemeGenerators {
val dividerOnlyClockGenerator: ChipTop => Unit = { chiptop => val dividerOnlyClockGenerator: ChipTop => ModuleValue[Double] = { chiptop =>
implicit val p = chiptop.p implicit val p = chiptop.p
// Requires existence of undriven asyncClockGroups in subsystem // Requires existence of undriven asyncClockGroups in subsystem
@@ -100,9 +100,6 @@ object ClockingSchemeGenerators {
val (clock_io, clockIOCell) = IOCell.generateIOFromSignal(clock_wire, "clock") val (clock_io, clockIOCell) = IOCell.generateIOFromSignal(clock_wire, "clock")
chiptop.iocells ++= clockIOCell chiptop.iocells ++= clockIOCell
// set the reference clock used
chiptop.refClockFreqMHz = Some(dividerOnlyClkGenerator.module.referenceFreq)
referenceClockSource.out.unzip._1.map { o => referenceClockSource.out.unzip._1.map { o =>
o.clock := clock_wire o.clock := clock_wire
o.reset := reset_wire o.reset := reset_wire
@@ -111,6 +108,9 @@ object ClockingSchemeGenerators {
chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => { chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => {
clock_io := th.harnessClock clock_io := th.harnessClock
Nil }) Nil })
// return the reference frequency
dividerOnlyClkGenerator.module.referenceFreq
} }
} }
} }

View File

@@ -91,7 +91,7 @@ class TestHarness(implicit val p: Parameters) extends Module with HasHarnessSign
io.success := false.B io.success := false.B
val freqMHz = lazyDut match { val freqMHz = lazyDut match {
case d: HasReferenceClockFreq => d.refClockFreqMHz.getOrElse(p(DefaultClockFrequencyKey)) case d: HasReferenceClockFreq => d.refClockFreqMHz
case _ => p(DefaultClockFrequencyKey) case _ => p(DefaultClockFrequencyKey)
} }
val refClkBundle = p(HarnessClockInstantiatorKey).requestClockBundle("buildtop_reference_clock", freqMHz * (1000 * 1000)) val refClkBundle = p(HarnessClockInstantiatorKey).requestClockBundle("buildtop_reference_clock", freqMHz * (1000 * 1000))

View File

@@ -194,14 +194,14 @@ class WithFireSimSimpleClocks extends Config((site, here, up) => {
RationalClock(sinkP.name.get, 1, division) RationalClock(sinkP.name.get, 1, division)
} }
// Set the reference frequency used
chiptop.refClockFreqMHz = Some(pllConfig.referenceFreqMHz)
chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => { chiptop.harnessFunctions += ((th: HasHarnessSignalReferences) => {
reset := th.harnessReset reset := th.harnessReset
input_clocks := p(ClockBridgeInstantiatorKey) input_clocks := p(ClockBridgeInstantiatorKey)
.requestClockRecordMap(rationalClockSpecs.toSeq, p(FireSimBaseClockNameKey), pllConfig.referenceFreqMHz * (1000 * 1000)) .requestClockRecordMap(rationalClockSpecs.toSeq, p(FireSimBaseClockNameKey), pllConfig.referenceFreqMHz * (1000 * 1000))
Nil }) 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) val module = Module(lazyModule.module)
btFreqMHz = Some(lazyModule match { btFreqMHz = Some(lazyModule match {
case d: HasReferenceClockFreq => d.refClockFreqMHz.getOrElse(p(DefaultClockFrequencyKey)) case d: HasReferenceClockFreq => d.refClockFreqMHz
case _ => p(DefaultClockFrequencyKey) case _ => p(DefaultClockFrequencyKey)
}) })