Add no-reset-sync config option to disable synchronizers for simulators which don't handle async reset properly
This commit is contained in:
@@ -14,13 +14,14 @@ import freechips.rocketchip.util._
|
|||||||
import freechips.rocketchip.tile._
|
import freechips.rocketchip.tile._
|
||||||
import freechips.rocketchip.prci._
|
import freechips.rocketchip.prci._
|
||||||
|
|
||||||
import testchipip.{TLTileResetCtrl}
|
import testchipip.{TLTileResetCtrl, ClockGroupFakeResetSynchronizer}
|
||||||
|
|
||||||
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
|
enableTileResetSetting: Boolean = true,
|
||||||
|
enableResetSynchronizers: Boolean = true // this should only be disable to work around verilator async-reset initialziation problems
|
||||||
) {
|
) {
|
||||||
def generatePRCIXBar = enableTileClockGating || enableTileResetSetting
|
def generatePRCIXBar = enableTileClockGating || enableTileResetSetting
|
||||||
}
|
}
|
||||||
@@ -81,7 +82,9 @@ trait HasChipyardPRCI { this: BaseSubsystem with InstantiatesTiles =>
|
|||||||
// diplomatic IOBinder should drive
|
// diplomatic IOBinder should drive
|
||||||
val frequencySpecifier = ClockGroupFrequencySpecifier(p(ClockFrequencyAssignersKey))
|
val frequencySpecifier = ClockGroupFrequencySpecifier(p(ClockFrequencyAssignersKey))
|
||||||
val clockGroupCombiner = ClockGroupCombiner()
|
val clockGroupCombiner = ClockGroupCombiner()
|
||||||
val resetSynchronizer = prci_ctrl_domain { ClockGroupResetSynchronizer() }
|
val resetSynchronizer = prci_ctrl_domain {
|
||||||
|
if (prciParams.enableResetSynchronizers) ClockGroupResetSynchronizer() else ClockGroupFakeResetSynchronizer()
|
||||||
|
}
|
||||||
val tileClockGater = Option.when(prciParams.enableTileClockGating) { prci_ctrl_domain {
|
val tileClockGater = Option.when(prciParams.enableTileClockGating) { prci_ctrl_domain {
|
||||||
val clock_gater = LazyModule(new TileClockGater(prciParams.baseAddress + 0x00000, tlbus.beatBytes))
|
val clock_gater = LazyModule(new TileClockGater(prciParams.baseAddress + 0x00000, tlbus.beatBytes))
|
||||||
clock_gater.tlNode := prci_ctrl_bus.get
|
clock_gater.tlNode := prci_ctrl_bus.get
|
||||||
@@ -94,6 +97,25 @@ trait HasChipyardPRCI { this: BaseSubsystem with InstantiatesTiles =>
|
|||||||
reset_setter
|
reset_setter
|
||||||
} }
|
} }
|
||||||
|
|
||||||
|
if (!prciParams.enableResetSynchronizers) {
|
||||||
|
println(Console.RED + s"""
|
||||||
|
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
|
||||||
|
DISABLING THE RESET SYNCHRONIZERS RESULTS IN
|
||||||
|
A BROKEN DESIGN THAT WILL NOT BEHAVE
|
||||||
|
PROPERLY AS ASIC OR FPGA.
|
||||||
|
|
||||||
|
THESE SHOULD ONLY BE DISABLED TO WORK AROUND
|
||||||
|
LIMITATIONS IN ASYNC RESET INITIALIZATION IN
|
||||||
|
RTL SIMULATORS.
|
||||||
|
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
""" + Console.RESET)
|
||||||
|
}
|
||||||
|
|
||||||
(aggregator
|
(aggregator
|
||||||
:= frequencySpecifier
|
:= frequencySpecifier
|
||||||
:= clockGroupCombiner
|
:= clockGroupCombiner
|
||||||
|
|||||||
@@ -95,3 +95,13 @@ class TetheredChipLikeRocketConfig extends Config(
|
|||||||
new chipyard.harness.WithMultiChipSerialTL(0, 1) ++ // connect the serial-tl ports of the chips together
|
new chipyard.harness.WithMultiChipSerialTL(0, 1) ++ // connect the serial-tl ports of the chips together
|
||||||
new chipyard.harness.WithMultiChip(0, new ChipLikeRocketConfig) ++
|
new chipyard.harness.WithMultiChip(0, new ChipLikeRocketConfig) ++
|
||||||
new chipyard.harness.WithMultiChip(1, new ChipBringupHostConfig))
|
new chipyard.harness.WithMultiChip(1, new ChipBringupHostConfig))
|
||||||
|
|
||||||
|
|
||||||
|
// Verilator does not initialize some of the async-reset reset-synchronizer
|
||||||
|
// flops properly, so this config disables them.
|
||||||
|
// This config should only be used for verilator simulations
|
||||||
|
class VerilatorCITetheredChipLikeRocketConfig extends Config(
|
||||||
|
new chipyard.harness.WithAbsoluteFreqHarnessClockInstantiator ++ // use absolute freqs for sims in the harness
|
||||||
|
new chipyard.harness.WithMultiChipSerialTL(0, 1) ++ // connect the serial-tl ports of the chips together
|
||||||
|
new chipyard.harness.WithMultiChip(0, new chipyard.config.WithNoResetSynchronizers ++ new ChipLikeRocketConfig) ++
|
||||||
|
new chipyard.harness.WithMultiChip(1, new ChipBringupHostConfig))
|
||||||
|
|||||||
@@ -114,3 +114,7 @@ class WithNoTileClockGaters extends Config((site, here, up) => {
|
|||||||
class WithNoTileResetSetters extends Config((site, here, up) => {
|
class WithNoTileResetSetters extends Config((site, here, up) => {
|
||||||
case ChipyardPRCIControlKey => up(ChipyardPRCIControlKey).copy(enableTileResetSetting = false)
|
case ChipyardPRCIControlKey => up(ChipyardPRCIControlKey).copy(enableTileResetSetting = false)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
class WithNoResetSynchronizers extends Config((site, here, up) => {
|
||||||
|
case ChipyardPRCIControlKey => up(ChipyardPRCIControlKey).copy(enableResetSynchronizers = false)
|
||||||
|
})
|
||||||
|
|||||||
Submodule generators/testchipip updated: 978e53e003...bc43b99cfc
Reference in New Issue
Block a user