Distinguish between implicit clock/reset and reference harnessClock/Reset | Don't use parameter system to pass referenceFreq

This commit is contained in:
abejgonzalez
2021-03-05 16:31:18 -08:00
parent 2b7e359326
commit 562d8e5116
4 changed files with 26 additions and 17 deletions

View File

@@ -15,6 +15,9 @@ import barstools.iocell.chisel._
case object BuildSystem extends Field[Parameters => LazyModule]((p: Parameters) => new DigitalTop()(p))
trait HasReferenceClockFreq {
var refClockFreqMHz: Option[Double] = None
}
/**
* The base class used for building chips. This constructor instantiates a module specified by the BuildSystem parameter,
@@ -24,7 +27,7 @@ case object BuildSystem extends Field[Parameters => LazyModule]((p: Parameters)
*/
class ChipTop(implicit p: Parameters) extends LazyModule with BindingScope
with HasTestHarnessFunctions with HasIOBinders {
with HasTestHarnessFunctions with HasReferenceClockFreq with HasIOBinders {
// The system module specified by BuildSystem
lazy val lazySystem = LazyModule(p(BuildSystem)(p)).suggestName("system")

View File

@@ -47,12 +47,6 @@ case object ClockingSchemeKey extends Field[ChipTop => Unit](ClockingSchemeGener
*/
case object ClockFrequencyAssignersKey extends Field[Seq[(String) => Option[Double]]](Seq.empty)
case object DefaultClockFrequencyKey extends Field[Double]()
case object ReferenceClockTrackerKey extends Field[ReferenceClockTracker](new ReferenceClockTracker)
class ReferenceClockTracker {
private var _refFreqMHz: Option[Double] = None
def set(freqMHz: Double): Unit = { _refFreqMHz = Some(freqMHz) }
def get: Option[Double] = { _refFreqMHz }
}
class ClockNameMatchesAssignment(name: String, fMHz: Double) extends Config((site, here, up) => {
case ClockFrequencyAssignersKey => up(ClockFrequencyAssignersKey, site) ++
@@ -106,7 +100,8 @@ object ClockingSchemeGenerators {
val (clock_io, clockIOCell) = IOCell.generateIOFromSignal(clock_wire, "clock")
chiptop.iocells ++= clockIOCell
p(ReferenceClockTrackerKey).set(dividerOnlyClkGenerator.module.referenceFreq)
// set the reference clock used
chiptop.refClockFreqMHz = Some(dividerOnlyClkGenerator.module.referenceFreq)
referenceClockSource.out.unzip._1.map { o =>
o.clock := clock_wire

View File

@@ -23,6 +23,7 @@ trait HasTestHarnessFunctions {
}
trait HasHarnessSignalReferences {
// clock/reset of the chiptop reference clock (can be different than the implicit harness clock/reset)
def harnessClock: Clock
def harnessReset: Reset
def dutReset: Reset
@@ -81,15 +82,25 @@ class TestHarness(implicit val p: Parameters) extends Module with HasHarnessSign
val success = Output(Bool())
})
val harnessClock = Wire(Clock())
val harnessReset = Wire(Reset())
val lazyDut = LazyModule(p(BuildTop)(p)).suggestName("chiptop")
val dut = Module(lazyDut.module)
withClockAndReset(harnessClock, harnessReset) {
val dut = Module(lazyDut.module)
}
io.success := false.B
val (harnessClock, harnessReset, dutReset) = {
val freqMHz = p(ReferenceClockTrackerKey).get.getOrElse(100.0) // default to 100MHz
val bundle = p(HarnessClockInstantiatorKey).getClockBundleWire("implicit_harness_clock", freqMHz*1000000.0)
(bundle.clock, WireInit(bundle.reset), bundle.reset.asAsyncReset)
val freqMHz = lazyDut match {
case d: HasReferenceClockFreq => d.refClockFreqMHz.getOrElse(p(DefaultClockFrequencyKey))
case _ => p(DefaultClockFrequencyKey)
}
val refClkBundle = p(HarnessClockInstantiatorKey).getClockBundleWire("chiptop_reference_clock", freqMHz * (1000 * 1000))
harnessClock := refClkBundle.clock
harnessReset := WireInit(refClkBundle.reset)
val dutReset = refClkBundle.reset.asAsyncReset
val success = io.success
lazyDut match { case d: HasTestHarnessFunctions =>

View File

@@ -215,11 +215,11 @@ class LBWIFRocketConfig extends Config(
class MulticlockAXIOverSerialConfig extends Config(
new chipyard.config.WithSystemBusFrequencyAsDefault ++
new chipyard.config.WithSystemBusFrequency(500) ++
new chipyard.config.WithPeripheryBusFrequency(500) ++
new chipyard.config.WithMemoryBusFrequency(500) ++
new chipyard.config.WithSystemBusFrequency(250) ++
new chipyard.config.WithPeripheryBusFrequency(250) ++
new chipyard.config.WithMemoryBusFrequency(250) ++
new chipyard.config.WithFrontBusFrequency(50) ++
new chipyard.config.WithTileFrequency(1000, Some(1)) ++
new chipyard.config.WithTileFrequency(500, Some(1)) ++
new chipyard.config.WithTileFrequency(250, Some(0)) ++
new chipyard.config.WithFbusToSbusCrossingType(AsynchronousCrossing()) ++