diff --git a/build.sbt b/build.sbt index 0f379698..633ff032 100644 --- a/build.sbt +++ b/build.sbt @@ -42,7 +42,7 @@ def conditionalDependsOn(prj: Project): Project = { } lazy val example = conditionalDependsOn(project in file(".")) - .dependsOn(boom) + .dependsOn(boom, sifive_blocks) .settings(commonSettings) lazy val boom = (project in file("generators/boom")) @@ -60,3 +60,7 @@ lazy val `barstools-macros` = (project in file("./tools/barstools/macros/")) .dependsOn(mdf, rocketchip, rebarFirrtl) .enablePlugins(sbtassembly.AssemblyPlugin) .settings(commonSettings) + +lazy val sifive_blocks = (project in file("generators/sifive-blocks")) + .dependsOn(rocketchip) + .settings(commonSettings) diff --git a/src/main/scala/boomexample/Configs.scala b/src/main/scala/boomexample/Configs.scala deleted file mode 100644 index 738e2922..00000000 --- a/src/main/scala/boomexample/Configs.scala +++ /dev/null @@ -1,90 +0,0 @@ -package boomexample - -import chisel3._ -import freechips.rocketchip.config.{Parameters, Config} -import freechips.rocketchip.subsystem.{WithRoccExample, WithNMemoryChannels} -import freechips.rocketchip.diplomacy.{LazyModule, ValName} -import freechips.rocketchip.devices.tilelink.BootROMParams -import freechips.rocketchip.tile.XLen -import testchipip._ - -class WithBootROM extends Config((site, here, up) => { - case BootROMParams => BootROMParams( - contentFileName = s"./bootrom/bootrom.rv${site(XLen)}.img") -}) - -object ConfigValName { - implicit val valName = ValName("TestHarness") -} -import ConfigValName._ - -class WithBoomExampleTop extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => { - Module(LazyModule(new BoomExampleTop()(p)).module) - } -}) - -class WithPWM extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => - Module(LazyModule(new BoomExampleTopWithPWMTL()(p)).module) -}) - -class WithPWMAXI4 extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => - Module(LazyModule(new BoomExampleTopWithPWMAXI4()(p)).module) -}) - -class WithBlockDeviceModel extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => { - val top = Module(LazyModule(new BoomExampleTopWithBlockDevice()(p)).module) - top.connectBlockDeviceModel() - top - } -}) - -class WithSimBlockDevice extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => { - val top = Module(LazyModule(new BoomExampleTopWithBlockDevice()(p)).module) - top.connectSimBlockDevice(clock, reset) - top - } -}) - -class BaseBoomExampleConfig extends Config( - new WithBootROM ++ - new boom.system.SmallBoomConfig) - -class DefaultBoomExampleConfig extends Config( - new WithBoomExampleTop ++ - new BaseBoomExampleConfig) - -class RoccBoomExampleConfig extends Config( - new WithRoccExample ++ - new DefaultBoomExampleConfig) - -class PWMBoomExampleConfig extends Config( - new WithPWM ++ - new BaseBoomExampleConfig) - -class PWMAXI4BoomExampleConfig extends Config( - new WithPWMAXI4 ++ - new BaseBoomExampleConfig) - -class SimBlockDeviceBoomExampleConfig extends Config( - new WithBlockDevice ++ - new WithSimBlockDevice ++ - new BaseBoomExampleConfig) - -class BlockDeviceModelBoomExampleConfig extends Config( - new WithBlockDevice ++ - new WithBlockDeviceModel ++ - new BaseBoomExampleConfig) - -class DualCoreBoomExampleConfig extends Config( - // Core gets tacked onto existing list - new boom.system.WithNBoomCores(2) ++ - new DefaultBoomExampleConfig) - -class RV32BoomExampleConfig extends Config( - new WithBootROM ++ - new boom.system.SmallRV32UnifiedBoomConfig) diff --git a/src/main/scala/boomexample/TestHarness.scala b/src/main/scala/boomexample/TestHarness.scala deleted file mode 100644 index fd5e766d..00000000 --- a/src/main/scala/boomexample/TestHarness.scala +++ /dev/null @@ -1,44 +0,0 @@ -package boomexample - -import chisel3._ -import chisel3.experimental._ -import firrtl.transforms.{BlackBoxResourceAnno, BlackBoxSourceHelper} -import freechips.rocketchip.diplomacy.LazyModule -import freechips.rocketchip.config.{Field, Parameters} -import freechips.rocketchip.util.GeneratorApp - -case object BuildTop extends Field[(Clock, Bool, Parameters) => BoomExampleTopModule[BoomExampleTop]] - -class TestHarness(implicit val p: Parameters) extends Module { - val io = IO(new Bundle { - val success = Output(Bool()) - }) - - val dut = p(BuildTop)(clock, reset.toBool, p) - dut.debug := DontCare - dut.connectSimAXIMem() - dut.connectSimAXIMMIO() - dut.dontTouchPorts() - dut.tieOffInterrupts() - dut.l2_frontend_bus_axi4.foreach(axi => { - axi.tieoff() - experimental.DataMirror.directionOf(axi.ar.ready) match { - case core.ActualDirection.Input => - axi.r.bits := DontCare - axi.b.bits := DontCare - case core.ActualDirection.Output => - axi.aw.bits := DontCare - axi.ar.bits := DontCare - axi.w.bits := DontCare - } - }) - io.success := dut.connectSimSerial() -} - -object Generator extends GeneratorApp { - val longName = names.topModuleProject + "." + names.topModuleClass + "." + names.configs - generateFirrtl - generateAnno - generateTestSuiteMakefrags - generateArtefacts -} diff --git a/src/main/scala/boomexample/Top.scala b/src/main/scala/boomexample/Top.scala deleted file mode 100644 index 312d43fd..00000000 --- a/src/main/scala/boomexample/Top.scala +++ /dev/null @@ -1,54 +0,0 @@ -package boomexample - -import chisel3._ -import freechips.rocketchip.subsystem._ -import freechips.rocketchip.system._ -import freechips.rocketchip.config.Parameters -import freechips.rocketchip.devices.tilelink._ -import freechips.rocketchip.util.DontTouch -import testchipip._ -import example.{HasPeripheryPWMTL, HasPeripheryPWMAXI4, HasPeripheryPWMTLModuleImp, HasPeripheryPWMAXI4ModuleImp} - -//--------------------------------------------------------------------------------------------------------- - -class BoomExampleTop(implicit p: Parameters) extends boom.system.ExampleBoomSystem - with HasNoDebug - with HasPeripherySerial { - override lazy val module = new BoomExampleTopModule(this) -} - -class BoomExampleTopModule[+L <: BoomExampleTop](l: L) extends boom.system.ExampleBoomSystemModule(l) - with HasRTCModuleImp - with HasNoDebugModuleImp - with HasPeripherySerialModuleImp - with DontTouch - -//--------------------------------------------------------------------------------------------------------- - -class BoomExampleTopWithPWMTL(implicit p: Parameters) extends BoomExampleTop - with HasPeripheryPWMTL { - override lazy val module = new BoomExampleTopWithPWMTLModule(this) -} - -class BoomExampleTopWithPWMTLModule(l: BoomExampleTopWithPWMTL) extends BoomExampleTopModule(l) - with HasPeripheryPWMTLModuleImp - -//--------------------------------------------------------------------------------------------------------- - -class BoomExampleTopWithPWMAXI4(implicit p: Parameters) extends BoomExampleTop - with HasPeripheryPWMAXI4 { - override lazy val module = new BoomExampleTopWithPWMAXI4Module(this) -} - -class BoomExampleTopWithPWMAXI4Module(l: BoomExampleTopWithPWMAXI4) extends BoomExampleTopModule(l) - with HasPeripheryPWMAXI4ModuleImp - -//--------------------------------------------------------------------------------------------------------- - -class BoomExampleTopWithBlockDevice(implicit p: Parameters) extends BoomExampleTop - with HasPeripheryBlockDevice { - override lazy val module = new BoomExampleTopWithBlockDeviceModule(this) -} - -class BoomExampleTopWithBlockDeviceModule(l: BoomExampleTopWithBlockDevice) extends BoomExampleTopModule(l) - with HasPeripheryBlockDeviceModuleImp diff --git a/src/main/scala/example/Configs.scala b/src/main/scala/example/Configs.scala index b7664614..72c40a1b 100644 --- a/src/main/scala/example/Configs.scala +++ b/src/main/scala/example/Configs.scala @@ -8,77 +8,190 @@ import freechips.rocketchip.devices.tilelink.BootROMParams import freechips.rocketchip.tile.XLen import testchipip._ +/** + * Class to specify where the BootRom file is (from `rebar` top) + */ class WithBootROM extends Config((site, here, up) => { case BootROMParams => BootROMParams( contentFileName = s"./bootrom/bootrom.rv${site(XLen)}.img") }) +/** + * TODO: Why do we need this? + */ object ConfigValName { implicit val valName = ValName("TestHarness") } import ConfigValName._ -class WithExampleTop extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => { - Module(LazyModule(new ExampleTop()(p)).module) +// ------------------------------- +// Rocket Top Level System Configs +// ------------------------------- + +/** + * Class to specify a "plain" top level rocket-chip system + */ +class WithNormalRocketTop extends Config((site, here, up) => { + case BuildRocketTop => (clock: Clock, reset: Bool, p: Parameters) => { + Module(LazyModule(new RocketTop()(p)).module) } }) -class WithPWM extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => - Module(LazyModule(new ExampleTopWithPWMTL()(p)).module) +/** + * Class to specify a top level rocket-chip system with PWM + */ +class WithPWMRocketTop extends Config((site, here, up) => { + case BuildRocketTop => (clock: Clock, reset: Bool, p: Parameters) => + Module(LazyModule(new RocketTopWithPWMTL()(p)).module) }) -class WithPWMAXI4 extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => - Module(LazyModule(new ExampleTopWithPWMAXI4()(p)).module) +/** + * Class to specify a top level rocket-chip system with a PWM AXI4 + */ +class WithPWMAXI4RocketTop extends Config((site, here, up) => { + case BuildRocketTop => (clock: Clock, reset: Bool, p: Parameters) => + Module(LazyModule(new RocketTopWithPWMAXI4()(p)).module) }) -class WithBlockDeviceModel extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => { - val top = Module(LazyModule(new ExampleTopWithBlockDevice()(p)).module) +/** + * Class to specify a top level rocket-chip system with a block device + */ +class WithBlockDeviceModelRocketTop extends Config((site, here, up) => { + case BuildRocketTop => (clock: Clock, reset: Bool, p: Parameters) => { + val top = Module(LazyModule(new RocketTopWithBlockDevice()(p)).module) top.connectBlockDeviceModel() top } }) -class WithSimBlockDevice extends Config((site, here, up) => { - case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => { - val top = Module(LazyModule(new ExampleTopWithBlockDevice()(p)).module) +/** + * Class to specify a top level rocket-chip system with a simulator block device + */ +class WithSimBlockDeviceRocketTop extends Config((site, here, up) => { + case BuildRocketTop => (clock: Clock, reset: Bool, p: Parameters) => { + val top = Module(LazyModule(new RocketTopWithBlockDevice()(p)).module) top.connectSimBlockDevice(clock, reset) top } }) -class BaseExampleConfig extends Config( +// -------------- +// Rocket Configs +// -------------- + +class BaseRocketConfig extends Config( new WithBootROM ++ new freechips.rocketchip.system.DefaultConfig) -class DefaultExampleConfig extends Config( - new WithExampleTop ++ new BaseExampleConfig) +class DefaultRocketConfig extends Config( + new WithNormalRocketTop ++ + new BaseRocketConfig) -class RoccExampleConfig extends Config( - new WithRoccExample ++ new DefaultExampleConfig) +class RoccRocketConfig extends Config( + new WithRoccExample ++ + new DefaultRocketConfig) -class PWMConfig extends Config(new WithPWM ++ new BaseExampleConfig) +class PWMRocketConfig extends Config( + new WithPWMRocketTop ++ + new BaseRocketConfig) -class PWMAXI4Config extends Config(new WithPWMAXI4 ++ new BaseExampleConfig) +class PWMAXI4RocketConfig extends Config( + new WithPWMAXI4RocketTop ++ + new BaseRocketConfig) -class SimBlockDeviceConfig extends Config( - new WithBlockDevice ++ new WithSimBlockDevice ++ new BaseExampleConfig) +class SimBlockDeviceRocketConfig extends Config( + new WithBlockDevice ++ + new WithSimBlockDeviceRocketTop ++ + new BaseRocketConfig) -class BlockDeviceModelConfig extends Config( - new WithBlockDevice ++ new WithBlockDeviceModel ++ new BaseExampleConfig) +class BlockDeviceModelRocketConfig extends Config( + new WithBlockDevice ++ + new WithBlockDeviceModelRocketTop ++ + new BaseRocketConfig) -class WithTwoTrackers extends WithNBlockDeviceTrackers(2) -class WithFourTrackers extends WithNBlockDeviceTrackers(4) +class DualCoreRocketConfig extends Config( + new WithNBigCores(2) ++ + new DefaultRocketConfig) -class WithTwoMemChannels extends WithNMemoryChannels(2) -class WithFourMemChannels extends WithNMemoryChannels(4) +class RV32RocketConfig extends Config( + new WithRV32 ++ + new DefaultRocketConfig) -class DualCoreConfig extends Config( +// ----------------------------- +// BOOM Top Level System Configs +// ----------------------------- + +class WithNormalBoomTop extends Config((site, here, up) => { + case BuildBoomTop => (clock: Clock, reset: Bool, p: Parameters) => { + Module(LazyModule(new BoomTop()(p)).module) + } +}) + +class WithPWMBoomTop extends Config((site, here, up) => { + case BuildBoomTop => (clock: Clock, reset: Bool, p: Parameters) => + Module(LazyModule(new BoomTopWithPWMTL()(p)).module) +}) + +class WithPWMAXI4BoomTop extends Config((site, here, up) => { + case BuildBoomTop => (clock: Clock, reset: Bool, p: Parameters) => + Module(LazyModule(new BoomTopWithPWMAXI4()(p)).module) +}) + +class WithBlockDeviceModelBoomTop extends Config((site, here, up) => { + case BuildBoomTop => (clock: Clock, reset: Bool, p: Parameters) => { + val top = Module(LazyModule(new BoomTopWithBlockDevice()(p)).module) + top.connectBlockDeviceModel() + top + } +}) + +class WithSimBlockDeviceBoomTop extends Config((site, here, up) => { + case BuildBoomTop => (clock: Clock, reset: Bool, p: Parameters) => { + val top = Module(LazyModule(new BoomTopWithBlockDevice()(p)).module) + top.connectSimBlockDevice(clock, reset) + top + } +}) + +// ------------ +// BOOM Configs +// ------------ + +class BaseBoomConfig extends Config( + new WithBootROM ++ + new boom.system.SmallBoomConfig) + +class DefaultBoomConfig extends Config( + new WithNormalBoomTop ++ + new BaseBoomConfig) + +class RoccBoomConfig extends Config( + new WithRoccExample ++ + new DefaultBoomConfig) + +class PWMBoomConfig extends Config( + new WithPWMBoomTop ++ + new BaseBoomConfig) + +class PWMAXI4BoomConfig extends Config( + new WithPWMAXI4BoomTop ++ + new BaseBoomConfig) + +class SimBlockDeviceBoomConfig extends Config( + new WithBlockDevice ++ + new WithSimBlockDeviceBoomTop ++ + new BaseBoomConfig) + +class BlockDeviceModelBoomConfig extends Config( + new WithBlockDevice ++ + new WithBlockDeviceModelBoomTop ++ + new BaseBoomConfig) + +class DualCoreBoomConfig extends Config( // Core gets tacked onto existing list - new WithNBigCores(2) ++ new DefaultExampleConfig) + new boom.system.WithNBoomCores(2) ++ + new DefaultBoomConfig) -class RV32ExampleConfig extends Config( - new WithRV32 ++ new DefaultExampleConfig) +class RV32BoomConfig extends Config( + new WithBootROM ++ + new boom.system.SmallRV32UnifiedBoomConfig) diff --git a/src/main/scala/example/Generator.scala b/src/main/scala/example/Generator.scala new file mode 100644 index 00000000..9b86a826 --- /dev/null +++ b/src/main/scala/example/Generator.scala @@ -0,0 +1,16 @@ +package example + +import chisel3._ +import chisel3.experimental._ +import firrtl.transforms.{BlackBoxResourceAnno, BlackBoxSourceHelper} +import freechips.rocketchip.diplomacy.LazyModule +import freechips.rocketchip.config.{Field, Parameters} +import freechips.rocketchip.util.GeneratorApp + +object Generator extends GeneratorApp { + val longName = names.topModuleProject + "." + names.topModuleClass + "." + names.configs + generateFirrtl + generateAnno + generateTestSuiteMakefrags + generateArtefacts +} diff --git a/src/main/scala/example/TestHarness.scala b/src/main/scala/example/TestHarness.scala index a5af6240..a278c46b 100644 --- a/src/main/scala/example/TestHarness.scala +++ b/src/main/scala/example/TestHarness.scala @@ -7,14 +7,18 @@ import freechips.rocketchip.diplomacy.LazyModule import freechips.rocketchip.config.{Field, Parameters} import freechips.rocketchip.util.GeneratorApp -case object BuildTop extends Field[(Clock, Bool, Parameters) => ExampleTopModule[ExampleTop]] +// ------------------- +// Rocket Test Harness +// ------------------- -class TestHarness(implicit val p: Parameters) extends Module { +case object BuildRocketTop extends Field[(Clock, Bool, Parameters) => RocketTopModule[RocketTop]] + +class RocketTestHarness(implicit val p: Parameters) extends Module { val io = IO(new Bundle { val success = Output(Bool()) }) - val dut = p(BuildTop)(clock, reset.toBool, p) + val dut = p(BuildRocketTop)(clock, reset.toBool, p) dut.debug := DontCare dut.connectSimAXIMem() dut.connectSimAXIMMIO() @@ -35,10 +39,34 @@ class TestHarness(implicit val p: Parameters) extends Module { io.success := dut.connectSimSerial() } -object Generator extends GeneratorApp { - val longName = names.topModuleProject + "." + names.topModuleClass + "." + names.configs - generateFirrtl - generateAnno - generateTestSuiteMakefrags - generateArtefacts +// ----------------- +// BOOM Test Harness +// ----------------- + +case object BuildBoomTop extends Field[(Clock, Bool, Parameters) => BoomTopModule[BoomTop]] + +class BoomTestHarness(implicit val p: Parameters) extends Module { + val io = IO(new Bundle { + val success = Output(Bool()) + }) + + val dut = p(BuildBoomTop)(clock, reset.toBool, p) + dut.debug := DontCare + dut.connectSimAXIMem() + dut.connectSimAXIMMIO() + dut.dontTouchPorts() + dut.tieOffInterrupts() + dut.l2_frontend_bus_axi4.foreach(axi => { + axi.tieoff() + experimental.DataMirror.directionOf(axi.ar.ready) match { + case core.ActualDirection.Input => + axi.r.bits := DontCare + axi.b.bits := DontCare + case core.ActualDirection.Output => + axi.aw.bits := DontCare + axi.ar.bits := DontCare + axi.w.bits := DontCare + } + }) + io.success := dut.connectSimSerial() } diff --git a/src/main/scala/example/Top.scala b/src/main/scala/example/Top.scala index bb156575..4dbf5a53 100644 --- a/src/main/scala/example/Top.scala +++ b/src/main/scala/example/Top.scala @@ -8,54 +8,99 @@ import freechips.rocketchip.devices.tilelink._ import freechips.rocketchip.util.DontTouch import testchipip._ -//--------------------------------------------------------------------------------------------------------- +// ------------------------ +// Rocket Top Level Systems +// ------------------------ -class ExampleTop(implicit p: Parameters) extends ExampleRocketSystem //RocketSubsystem +class RocketTop(implicit p: Parameters) extends RocketSystem with CanHaveMasterAXI4MemPort with HasPeripheryBootROM -// with HasSystemErrorSlave -// with HasSyncExtInterrupts with HasNoDebug with HasPeripherySerial { - override lazy val module = new ExampleTopModule(this) + override lazy val module = new RocketTopModule(this) } -class ExampleTopModule[+L <: ExampleTop](l: L) extends ExampleRocketSystemModuleImp(l) // RocketSubsystemModuleImp(l) +class RocketTopModule[+L <: RocketTop](l: L) extends RocketSystemModuleImp(l) with HasRTCModuleImp with CanHaveMasterAXI4MemPortModuleImp with HasPeripheryBootROMModuleImp -// with HasExtInterruptsModuleImp with HasNoDebugModuleImp with HasPeripherySerialModuleImp with DontTouch //--------------------------------------------------------------------------------------------------------- -class ExampleTopWithPWMTL(implicit p: Parameters) extends ExampleTop +class RocketTopWithPWMTL(implicit p: Parameters) extends RocketTop with HasPeripheryPWMTL { - override lazy val module = new ExampleTopWithPWMTLModule(this) + override lazy val module = new RocketTopWithPWMTLModule(this) } -class ExampleTopWithPWMTLModule(l: ExampleTopWithPWMTL) - extends ExampleTopModule(l) with HasPeripheryPWMTLModuleImp +class RocketTopWithPWMTLModule(l: RocketTopWithPWMTL) + extends RocketTopModule(l) with HasPeripheryPWMTLModuleImp //--------------------------------------------------------------------------------------------------------- -class ExampleTopWithPWMAXI4(implicit p: Parameters) extends ExampleTop +class RocketTopWithPWMAXI4(implicit p: Parameters) extends RocketTop with HasPeripheryPWMAXI4 { - override lazy val module = new ExampleTopWithPWMAXI4Module(this) + override lazy val module = new RocketTopWithPWMAXI4Module(this) } -class ExampleTopWithPWMAXI4Module(l: ExampleTopWithPWMAXI4) - extends ExampleTopModule(l) with HasPeripheryPWMAXI4ModuleImp +class RocketTopWithPWMAXI4Module(l: RocketTopWithPWMAXI4) + extends RocketTopModule(l) with HasPeripheryPWMAXI4ModuleImp //--------------------------------------------------------------------------------------------------------- -class ExampleTopWithBlockDevice(implicit p: Parameters) extends ExampleTop +class RocketTopWithBlockDevice(implicit p: Parameters) extends RocketTop with HasPeripheryBlockDevice { - override lazy val module = new ExampleTopWithBlockDeviceModule(this) + override lazy val module = new RocketTopWithBlockDeviceModule(this) } -class ExampleTopWithBlockDeviceModule(l: ExampleTopWithBlockDevice) - extends ExampleTopModule(l) +class RocketTopWithBlockDeviceModule(l: RocketTopWithBlockDevice) + extends RocketTopModule(l) + with HasPeripheryBlockDeviceModuleImp + +// ---------------------- +// BOOM Top Level Systems +// ---------------------- + +class BoomTop(implicit p: Parameters) extends boom.system.BoomSystem + with HasNoDebug + with HasPeripherySerial { + override lazy val module = new BoomTopModule(this) +} + +class BoomTopModule[+L <: BoomTop](l: L) extends boom.system.BoomSystemModule(l) + with HasRTCModuleImp + with HasNoDebugModuleImp + with HasPeripherySerialModuleImp + with DontTouch + +//--------------------------------------------------------------------------------------------------------- + +class BoomTopWithPWMTL(implicit p: Parameters) extends BoomTop + with HasPeripheryPWMTL { + override lazy val module = new BoomTopWithPWMTLModule(this) +} + +class BoomTopWithPWMTLModule(l: BoomTopWithPWMTL) extends BoomTopModule(l) + with HasPeripheryPWMTLModuleImp + +//--------------------------------------------------------------------------------------------------------- + +class BoomTopWithPWMAXI4(implicit p: Parameters) extends BoomTop + with HasPeripheryPWMAXI4 { + override lazy val module = new BoomTopWithPWMAXI4Module(this) +} + +class BoomTopWithPWMAXI4Module(l: BoomTopWithPWMAXI4) extends BoomTopModule(l) + with HasPeripheryPWMAXI4ModuleImp + +//--------------------------------------------------------------------------------------------------------- + +class BoomTopWithBlockDevice(implicit p: Parameters) extends BoomTop + with HasPeripheryBlockDevice { + override lazy val module = new BoomTopWithBlockDeviceModule(this) +} + +class BoomTopWithBlockDeviceModule(l: BoomTopWithBlockDevice) extends BoomTopModule(l) with HasPeripheryBlockDeviceModuleImp