Support not instantiating the TileClockGater/ResetSetter PRCI controllers (#1459)
This commit is contained in:
@@ -20,7 +20,8 @@ import chipyard.{DefaultClockFrequencyKey}
|
|||||||
case class ChipyardPRCIControlParams(
|
case class ChipyardPRCIControlParams(
|
||||||
slaveWhere: TLBusWrapperLocation = CBUS,
|
slaveWhere: TLBusWrapperLocation = CBUS,
|
||||||
baseAddress: BigInt = 0x100000,
|
baseAddress: BigInt = 0x100000,
|
||||||
enableTileClockGating: Boolean = true
|
enableTileClockGating: Boolean = true,
|
||||||
|
enableTileResetSetting: Boolean = true
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -72,12 +73,13 @@ trait HasChipyardPRCI { this: BaseSubsystem with InstantiatesTiles =>
|
|||||||
val frequencySpecifier = ClockGroupFrequencySpecifier(p(ClockFrequencyAssignersKey), p(DefaultClockFrequencyKey))
|
val frequencySpecifier = ClockGroupFrequencySpecifier(p(ClockFrequencyAssignersKey), p(DefaultClockFrequencyKey))
|
||||||
val clockGroupCombiner = ClockGroupCombiner()
|
val clockGroupCombiner = ClockGroupCombiner()
|
||||||
val resetSynchronizer = ClockGroupResetSynchronizer()
|
val resetSynchronizer = ClockGroupResetSynchronizer()
|
||||||
val tileClockGater = prci_ctrl_domain {
|
val tileClockGater = if (prciParams.enableTileClockGating) { prci_ctrl_domain {
|
||||||
TileClockGater(prciParams.baseAddress + 0x00000, tlbus, prciParams.enableTileClockGating)
|
TileClockGater(prciParams.baseAddress + 0x00000, tlbus)
|
||||||
}
|
} } else { ClockGroupEphemeralNode() }
|
||||||
val tileResetSetter = prci_ctrl_domain {
|
val tileResetSetter = if (prciParams.enableTileResetSetting) { prci_ctrl_domain {
|
||||||
TileResetSetter(prciParams.baseAddress + 0x10000, tlbus, tile_prci_domains.map(_.tile_reset_domain.clockNode.portParams(0).name.get), Nil)
|
TileResetSetter(prciParams.baseAddress + 0x10000, tlbus, tile_prci_domains.map(_.tile_reset_domain.clockNode.portParams(0).name.get), Nil)
|
||||||
}
|
} } else { ClockGroupEphemeralNode() }
|
||||||
|
|
||||||
(aggregator
|
(aggregator
|
||||||
:= frequencySpecifier
|
:= frequencySpecifier
|
||||||
:= clockGroupCombiner
|
:= clockGroupCombiner
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import freechips.rocketchip.subsystem._
|
|||||||
* flag will generate the registers, preserving the same memory map and behavior, but will not
|
* flag will generate the registers, preserving the same memory map and behavior, but will not
|
||||||
* generate any gaters
|
* generate any gaters
|
||||||
*/
|
*/
|
||||||
class TileClockGater(address: BigInt, beatBytes: Int, enable: Boolean)(implicit p: Parameters, valName: ValName) extends LazyModule
|
class TileClockGater(address: BigInt, beatBytes: Int)(implicit p: Parameters, valName: ValName) extends LazyModule
|
||||||
{
|
{
|
||||||
val device = new SimpleDevice(s"clock-gater", Nil)
|
val device = new SimpleDevice(s"clock-gater", Nil)
|
||||||
val clockNode = ClockGroupIdentityNode()
|
val clockNode = ClockGroupIdentityNode()
|
||||||
@@ -31,7 +31,7 @@ class TileClockGater(address: BigInt, beatBytes: Int, enable: Boolean)(implicit
|
|||||||
val regs = (0 until nSinks).map({i =>
|
val regs = (0 until nSinks).map({i =>
|
||||||
val sinkName = sinks(i)._1
|
val sinkName = sinks(i)._1
|
||||||
val reg = withReset(sources(i).reset) { Module(new AsyncResetRegVec(w=1, init=1)) }
|
val reg = withReset(sources(i).reset) { Module(new AsyncResetRegVec(w=1, init=1)) }
|
||||||
if (sinkName.contains("tile") && enable) {
|
if (sinkName.contains("tile")) {
|
||||||
println(s"${(address+i*4).toString(16)}: Tile $sinkName clock gate")
|
println(s"${(address+i*4).toString(16)}: Tile $sinkName clock gate")
|
||||||
sinks(i)._2.clock := ClockGate(sources(i).clock, reg.io.q.asBool)
|
sinks(i)._2.clock := ClockGate(sources(i).clock, reg.io.q.asBool)
|
||||||
sinks(i)._2.reset := sources(i).reset
|
sinks(i)._2.reset := sources(i).reset
|
||||||
@@ -47,8 +47,8 @@ class TileClockGater(address: BigInt, beatBytes: Int, enable: Boolean)(implicit
|
|||||||
}
|
}
|
||||||
|
|
||||||
object TileClockGater {
|
object TileClockGater {
|
||||||
def apply(address: BigInt, tlbus: TLBusWrapper, enable: Boolean)(implicit p: Parameters, v: ValName) = {
|
def apply(address: BigInt, tlbus: TLBusWrapper)(implicit p: Parameters, v: ValName) = {
|
||||||
val gater = LazyModule(new TileClockGater(address, tlbus.beatBytes, enable))
|
val gater = LazyModule(new TileClockGater(address, tlbus.beatBytes))
|
||||||
tlbus.toVariableWidthSlave(Some("clock-gater")) { gater.tlNode := TLBuffer() }
|
tlbus.toVariableWidthSlave(Some("clock-gater")) { gater.tlNode := TLBuffer() }
|
||||||
gater.clockNode
|
gater.clockNode
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user