Distinguish between implicit clock/reset and reference harnessClock/Reset | Don't use parameter system to pass referenceFreq
This commit is contained in:
@@ -15,6 +15,9 @@ 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 {
|
||||||
|
var refClockFreqMHz: Option[Double] = None
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The base class used for building chips. This constructor instantiates a module specified by the BuildSystem parameter,
|
* 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
|
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
|
// The system module specified by BuildSystem
|
||||||
lazy val lazySystem = LazyModule(p(BuildSystem)(p)).suggestName("system")
|
lazy val lazySystem = LazyModule(p(BuildSystem)(p)).suggestName("system")
|
||||||
|
|
||||||
|
|||||||
@@ -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 ClockFrequencyAssignersKey extends Field[Seq[(String) => Option[Double]]](Seq.empty)
|
||||||
case object DefaultClockFrequencyKey extends Field[Double]()
|
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) => {
|
class ClockNameMatchesAssignment(name: String, fMHz: Double) extends Config((site, here, up) => {
|
||||||
case ClockFrequencyAssignersKey => up(ClockFrequencyAssignersKey, site) ++
|
case ClockFrequencyAssignersKey => up(ClockFrequencyAssignersKey, site) ++
|
||||||
@@ -106,7 +100,8 @@ 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
|
||||||
|
|
||||||
p(ReferenceClockTrackerKey).set(dividerOnlyClkGenerator.module.referenceFreq)
|
// 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
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ trait HasTestHarnessFunctions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
trait HasHarnessSignalReferences {
|
trait HasHarnessSignalReferences {
|
||||||
|
// clock/reset of the chiptop reference clock (can be different than the implicit harness clock/reset)
|
||||||
def harnessClock: Clock
|
def harnessClock: Clock
|
||||||
def harnessReset: Reset
|
def harnessReset: Reset
|
||||||
def dutReset: Reset
|
def dutReset: Reset
|
||||||
@@ -81,15 +82,25 @@ class TestHarness(implicit val p: Parameters) extends Module with HasHarnessSign
|
|||||||
val success = Output(Bool())
|
val success = Output(Bool())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
val harnessClock = Wire(Clock())
|
||||||
|
val harnessReset = Wire(Reset())
|
||||||
|
|
||||||
val lazyDut = LazyModule(p(BuildTop)(p)).suggestName("chiptop")
|
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
|
io.success := false.B
|
||||||
|
|
||||||
val (harnessClock, harnessReset, dutReset) = {
|
val freqMHz = lazyDut match {
|
||||||
val freqMHz = p(ReferenceClockTrackerKey).get.getOrElse(100.0) // default to 100MHz
|
case d: HasReferenceClockFreq => d.refClockFreqMHz.getOrElse(p(DefaultClockFrequencyKey))
|
||||||
val bundle = p(HarnessClockInstantiatorKey).getClockBundleWire("implicit_harness_clock", freqMHz*1000000.0)
|
case _ => p(DefaultClockFrequencyKey)
|
||||||
(bundle.clock, WireInit(bundle.reset), bundle.reset.asAsyncReset)
|
|
||||||
}
|
}
|
||||||
|
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
|
val success = io.success
|
||||||
|
|
||||||
lazyDut match { case d: HasTestHarnessFunctions =>
|
lazyDut match { case d: HasTestHarnessFunctions =>
|
||||||
|
|||||||
@@ -215,11 +215,11 @@ class LBWIFRocketConfig extends Config(
|
|||||||
|
|
||||||
class MulticlockAXIOverSerialConfig extends Config(
|
class MulticlockAXIOverSerialConfig extends Config(
|
||||||
new chipyard.config.WithSystemBusFrequencyAsDefault ++
|
new chipyard.config.WithSystemBusFrequencyAsDefault ++
|
||||||
new chipyard.config.WithSystemBusFrequency(500) ++
|
new chipyard.config.WithSystemBusFrequency(250) ++
|
||||||
new chipyard.config.WithPeripheryBusFrequency(500) ++
|
new chipyard.config.WithPeripheryBusFrequency(250) ++
|
||||||
new chipyard.config.WithMemoryBusFrequency(500) ++
|
new chipyard.config.WithMemoryBusFrequency(250) ++
|
||||||
new chipyard.config.WithFrontBusFrequency(50) ++
|
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.WithTileFrequency(250, Some(0)) ++
|
||||||
|
|
||||||
new chipyard.config.WithFbusToSbusCrossingType(AsynchronousCrossing()) ++
|
new chipyard.config.WithFbusToSbusCrossingType(AsynchronousCrossing()) ++
|
||||||
|
|||||||
Reference in New Issue
Block a user