1 // See LICENSE for license details.
2 package sifive.blocks.devices.spi
6 import diplomacy.LazyModule
9 HasTopLevelNetworksBundle,
10 HasTopLevelNetworksModule
12 import uncore.tilelink2.{TLFragmenter, TLWidthWidget}
13 import util.HeterogeneousBag
15 case object PeripherySPIKey extends Field[Seq[SPIParams]]
17 trait HasPeripherySPI extends HasTopLevelNetworks {
18 val spiParams = p(PeripherySPIKey)
19 val spis = spiParams map { params =>
20 val spi = LazyModule(new TLSPI(peripheryBusBytes, params))
21 spi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
22 intBus.intnode := spi.intnode
27 trait HasPeripherySPIBundle extends HasTopLevelNetworksBundle {
28 val outer: HasPeripherySPI
29 val spis = HeterogeneousBag(outer.spiParams.map(new SPIPortIO(_)))
32 trait HasPeripherySPIModule extends HasTopLevelNetworksModule {
33 val outer: HasPeripherySPI
34 val io: HasPeripherySPIBundle
35 (io.spis zip outer.spis).foreach { case (io, device) =>
36 io <> device.module.io.port
40 case object PeripherySPIFlashKey extends Field[Seq[SPIFlashParams]]
42 trait HasPeripherySPIFlash extends HasTopLevelNetworks {
43 val spiFlashParams = p(PeripherySPIFlashKey)
44 val qspi = spiFlashParams map { params =>
45 val qspi = LazyModule(new TLSPIFlash(peripheryBusBytes, params))
46 qspi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
47 qspi.fnode := TLFragmenter(1, cacheBlockBytes)(TLWidthWidget(peripheryBusBytes)(peripheryBus.node))
48 intBus.intnode := qspi.intnode
53 trait HasPeripherySPIFlashBundle extends HasTopLevelNetworksBundle {
54 val outer: HasPeripherySPIFlash
55 val qspi = HeterogeneousBag(outer.spiFlashParams.map(new SPIPortIO(_)))
58 trait HasPeripherySPIFlashModule extends HasTopLevelNetworksModule {
59 val outer: HasPeripherySPIFlash
60 val io: HasPeripherySPIFlashBundle
62 (io.qspi zip outer.qspi) foreach { case (io, device) =>
63 io <> device.module.io.port