class MyRocketConfig extends Config( new chipyard.config.WithTileFrequency(100, Some(0)) ++ new chipyard.config.WithTileFrequency(50, Some(1)) ++ new chipyard.config.WithTileFrequency(50, Some(2)) ++ new chipyard.config.WithGCBusFrequency(50) ++ new chipyard.config.WithSystemBusFrequency(100) ++ new chipyard.config.WithSystemBusFrequencyAsDefault ++ new freechips.rocketchip.guardiancouncil.WithGHE ++ new freechips.rocketchip.subsystem.WithAsynchronousRocketTiles( AsynchronousCrossing().depth, AsynchronousCrossing().sourceSync) ++ // Crossing specifications new boom.common.WithNMegaBooms(1, overrideIdOffset=Some(0)) ++ new freechips.rocketchip.subsystem.WithNGCCheckers(GH_GlobalParams.GH_NUM_CORES - 1, overrideIdOffset=Some(1)) ++ new chipyard.config.AbstractConfig )
之后ClockFrequencyAssignersKey存放着函数对
1 2 3 4
class ClockNameContainsAssignment(name: String, fMHz: Double) extends Config((site, here, up) => { case ClockFrequencyAssignersKey => up(ClockFrequencyAssignersKey, site) ++ Seq((cName: String) => if (cName.contains(name)) Some(fMHz) else None) })
for (((sinkBName, sinkB), sinkP) <- outClocks.member.elements.zip(outSinkParams.members)) { val div = pllConfig.sinkDividerMap(sinkP) sinkB.clock := dividedClocks.getOrElse(div, instantiateDivider(div)) // Reset handling and synchronization is expected to be handled by a downstream node sinkB.reset := refClock.reset }
然后这个模块调用了
1 2
val pllConfig = new SimplePllConfiguration(pllName, outSinkParams.members)
def lookupFrequencyForName(clock: ClockSinkParameters): ClockSinkParameters = { require(clock.name.nonEmpty, "All clocks in clock group must have an assigned name") val clockFreq = assigners.foldLeft(defaultFreq)( (currentFreq, candidateFunc) => candidateFunc(clock.name.get).getOrElse(currentFreq))
clock.copy(take = clock.take match { case Some(cp) => println(s"Clock ${clock.name.get}: using diplomatically specified frequency of ${cp.freqMHz}.") Some(cp) case None => Some(ClockParameters(clockFreq)) }) }