devices: create periphery keys for all devices
Standardize how they are connected to the periphery bus
This commit is contained in:
committed by
Henry Cook
parent
03be9aba67
commit
baccd5ada2
@ -3,11 +3,11 @@ package sifive.blocks.devices.spi
|
||||
|
||||
import Chisel._
|
||||
|
||||
class SPIInnerIO(c: SPIConfigBase) extends SPILinkIO(c) {
|
||||
class SPIInnerIO(c: SPIParamsBase) extends SPILinkIO(c) {
|
||||
val lock = Bool(OUTPUT)
|
||||
}
|
||||
|
||||
class SPIArbiter(c: SPIConfigBase, n: Int) extends Module {
|
||||
class SPIArbiter(c: SPIParamsBase, n: Int) extends Module {
|
||||
val io = new Bundle {
|
||||
val inner = Vec(n, new SPIInnerIO(c)).flip
|
||||
val outer = new SPILinkIO(c)
|
||||
|
@ -3,7 +3,7 @@ package sifive.blocks.devices.spi
|
||||
|
||||
import Chisel._
|
||||
|
||||
abstract class SPIBundle(val c: SPIConfigBase) extends Bundle {
|
||||
abstract class SPIBundle(val c: SPIParamsBase) extends Bundle {
|
||||
override def cloneType: SPIBundle.this.type =
|
||||
this.getClass.getConstructors.head.newInstance(c).asInstanceOf[this.type]
|
||||
}
|
||||
@ -14,7 +14,7 @@ class SPIDataIO extends Bundle {
|
||||
val oe = Bool(OUTPUT)
|
||||
}
|
||||
|
||||
class SPIPortIO(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIPortIO(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val sck = Bool(OUTPUT)
|
||||
val dq = Vec(4, new SPIDataIO)
|
||||
val cs = Vec(c.csWidth, Bool(OUTPUT))
|
||||
@ -26,7 +26,7 @@ trait HasSPIProtocol {
|
||||
trait HasSPIEndian {
|
||||
val endian = Bits(width = SPIEndian.width)
|
||||
}
|
||||
class SPIFormat(c: SPIConfigBase) extends SPIBundle(c)
|
||||
class SPIFormat(c: SPIParamsBase) extends SPIBundle(c)
|
||||
with HasSPIProtocol
|
||||
with HasSPIEndian {
|
||||
val iodir = Bits(width = SPIDirection.width)
|
||||
@ -36,13 +36,13 @@ trait HasSPILength extends SPIBundle {
|
||||
val len = UInt(width = c.lengthBits)
|
||||
}
|
||||
|
||||
class SPIClocking(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIClocking(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val div = UInt(width = c.divisorBits)
|
||||
val pol = Bool()
|
||||
val pha = Bool()
|
||||
}
|
||||
|
||||
class SPIChipSelect(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIChipSelect(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val id = UInt(width = c.csIdBits)
|
||||
val dflt = Vec(c.csWidth, Bool())
|
||||
|
||||
@ -57,19 +57,19 @@ trait HasSPICSMode {
|
||||
val mode = Bits(width = SPICSMode.width)
|
||||
}
|
||||
|
||||
class SPIDelay(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIDelay(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val cssck = UInt(width = c.delayBits)
|
||||
val sckcs = UInt(width = c.delayBits)
|
||||
val intercs = UInt(width = c.delayBits)
|
||||
val interxfr = UInt(width = c.delayBits)
|
||||
}
|
||||
|
||||
class SPIWatermark(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIWatermark(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val tx = UInt(width = c.txDepthBits)
|
||||
val rx = UInt(width = c.rxDepthBits)
|
||||
}
|
||||
|
||||
class SPIControl(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIControl(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val fmt = new SPIFormat(c) with HasSPILength
|
||||
val sck = new SPIClocking(c)
|
||||
val cs = new SPIChipSelect(c) with HasSPICSMode
|
||||
@ -78,7 +78,7 @@ class SPIControl(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
}
|
||||
|
||||
object SPIControl {
|
||||
def init(c: SPIConfigBase): SPIControl = {
|
||||
def init(c: SPIParamsBase): SPIControl = {
|
||||
val ctrl = Wire(new SPIControl(c))
|
||||
ctrl.fmt.proto := SPIProtocol.Single
|
||||
ctrl.fmt.iodir := SPIDirection.Rx
|
||||
|
@ -3,13 +3,13 @@ package sifive.blocks.devices.spi
|
||||
|
||||
import Chisel._
|
||||
|
||||
class SPIFIFOControl(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIFIFOControl(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val fmt = new SPIFormat(c) with HasSPILength
|
||||
val cs = new Bundle with HasSPICSMode
|
||||
val wm = new SPIWatermark(c)
|
||||
}
|
||||
|
||||
class SPIFIFO(c: SPIConfigBase) extends Module {
|
||||
class SPIFIFO(c: SPIParamsBase) extends Module {
|
||||
val io = new Bundle {
|
||||
val ctrl = new SPIFIFOControl(c).asInput
|
||||
val link = new SPIInnerIO(c)
|
||||
|
@ -3,7 +3,7 @@ package sifive.blocks.devices.spi
|
||||
|
||||
import Chisel._
|
||||
|
||||
class SPIFlashInsn(c: SPIFlashConfigBase) extends SPIBundle(c) {
|
||||
class SPIFlashInsn(c: SPIFlashParamsBase) extends SPIBundle(c) {
|
||||
val cmd = new Bundle with HasSPIProtocol {
|
||||
val code = Bits(width = c.insnCmdBits)
|
||||
val en = Bool()
|
||||
@ -18,13 +18,13 @@ class SPIFlashInsn(c: SPIFlashConfigBase) extends SPIBundle(c) {
|
||||
val data = new Bundle with HasSPIProtocol
|
||||
}
|
||||
|
||||
class SPIFlashControl(c: SPIFlashConfigBase) extends SPIBundle(c) {
|
||||
class SPIFlashControl(c: SPIFlashParamsBase) extends SPIBundle(c) {
|
||||
val insn = new SPIFlashInsn(c)
|
||||
val fmt = new Bundle with HasSPIEndian
|
||||
}
|
||||
|
||||
object SPIFlashInsn {
|
||||
def init(c: SPIFlashConfigBase): SPIFlashInsn = {
|
||||
def init(c: SPIFlashParamsBase): SPIFlashInsn = {
|
||||
val insn = Wire(new SPIFlashInsn(c))
|
||||
insn.cmd.en := Bool(true)
|
||||
insn.cmd.code := Bits(0x03)
|
||||
@ -38,12 +38,12 @@ object SPIFlashInsn {
|
||||
}
|
||||
}
|
||||
|
||||
class SPIFlashAddr(c: SPIFlashConfigBase) extends SPIBundle(c) {
|
||||
class SPIFlashAddr(c: SPIFlashParamsBase) extends SPIBundle(c) {
|
||||
val next = UInt(width = c.insnAddrBits)
|
||||
val hold = UInt(width = c.insnAddrBits)
|
||||
}
|
||||
|
||||
class SPIFlashMap(c: SPIFlashConfigBase) extends Module {
|
||||
class SPIFlashMap(c: SPIFlashParamsBase) extends Module {
|
||||
val io = new Bundle {
|
||||
val en = Bool(INPUT)
|
||||
val ctrl = new SPIFlashControl(c).asInput
|
||||
|
@ -3,7 +3,7 @@ package sifive.blocks.devices.spi
|
||||
|
||||
import Chisel._
|
||||
|
||||
class SPILinkIO(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPILinkIO(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val tx = Decoupled(Bits(width = c.frameBits))
|
||||
val rx = Valid(Bits(width = c.frameBits)).flip
|
||||
|
||||
@ -17,7 +17,7 @@ class SPILinkIO(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
val active = Bool(INPUT)
|
||||
}
|
||||
|
||||
class SPIMedia(c: SPIConfigBase) extends Module {
|
||||
class SPIMedia(c: SPIParamsBase) extends Module {
|
||||
val io = new Bundle {
|
||||
val port = new SPIPortIO(c)
|
||||
val ctrl = new Bundle {
|
||||
|
@ -2,56 +2,58 @@
|
||||
package sifive.blocks.devices.spi
|
||||
|
||||
import Chisel._
|
||||
import config.Field
|
||||
import diplomacy.LazyModule
|
||||
import uncore.tilelink2._
|
||||
import rocketchip.{TopNetwork,TopNetworkModule}
|
||||
import rocketchip.{
|
||||
HasTopLevelNetworks,
|
||||
HasTopLevelNetworksBundle,
|
||||
HasTopLevelNetworksModule
|
||||
}
|
||||
import uncore.tilelink2.{TLFragmenter, TLWidthWidget}
|
||||
import util.HeterogeneousBag
|
||||
|
||||
trait PeripherySPI {
|
||||
this: TopNetwork { val spiConfigs: Seq[SPIConfig] } =>
|
||||
val spi = (spiConfigs.zipWithIndex) map {case (c, i) =>
|
||||
val spi = LazyModule(new TLSPI(c))
|
||||
spi.rnode := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node)
|
||||
case object PeripherySPIKey extends Field[Seq[SPIParams]]
|
||||
|
||||
trait HasPeripherySPI extends HasTopLevelNetworks {
|
||||
val spiParams = p(PeripherySPIKey)
|
||||
val spis = spiParams map { params =>
|
||||
val spi = LazyModule(new TLSPI(peripheryBusBytes, params))
|
||||
spi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
|
||||
intBus.intnode := spi.intnode
|
||||
spi
|
||||
}
|
||||
}
|
||||
|
||||
trait PeripherySPIBundle {
|
||||
this: { val spiConfigs: Seq[SPIConfig] } =>
|
||||
val spis = HeterogeneousBag(spiConfigs.map(new SPIPortIO(_)))
|
||||
trait HasPeripherySPIBundle extends HasTopLevelNetworksBundle {
|
||||
val outer: HasPeripherySPI
|
||||
val spis = HeterogeneousBag(outer.spiParams.map(new SPIPortIO(_)))
|
||||
}
|
||||
|
||||
trait PeripherySPIModule {
|
||||
this: TopNetworkModule {
|
||||
val spiConfigs: Seq[SPIConfig]
|
||||
val outer: PeripherySPI
|
||||
val io: PeripherySPIBundle
|
||||
} =>
|
||||
(io.spis zip outer.spi).foreach { case (io, device) =>
|
||||
trait HasPeripherySPIModule extends HasTopLevelNetworksModule {
|
||||
val outer: HasPeripherySPI
|
||||
val io: HasPeripherySPIBundle
|
||||
(io.spis zip outer.spis).foreach { case (io, device) =>
|
||||
io <> device.module.io.port
|
||||
}
|
||||
}
|
||||
|
||||
case object PeripherySPIFlashKey extends Field[SPIFlashParams]
|
||||
|
||||
trait PeripherySPIFlash {
|
||||
this: TopNetwork { val spiFlashConfig: SPIFlashConfig } =>
|
||||
val qspi = LazyModule(new TLSPIFlash(spiFlashConfig))
|
||||
qspi.rnode := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node)
|
||||
qspi.fnode := TLFragmenter(1, cacheBlockBytes)(TLWidthWidget(peripheryBusConfig.beatBytes)(peripheryBus.node))
|
||||
trait HasPeripherySPIFlash extends HasTopLevelNetworks {
|
||||
val spiFlashParams = p(PeripherySPIFlashKey)
|
||||
val qspi = LazyModule(new TLSPIFlash(peripheryBusBytes, spiFlashParams))
|
||||
qspi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
|
||||
qspi.fnode := TLFragmenter(1, cacheBlockBytes)(TLWidthWidget(peripheryBusBytes)(peripheryBus.node))
|
||||
intBus.intnode := qspi.intnode
|
||||
}
|
||||
|
||||
trait PeripherySPIFlashBundle {
|
||||
this: { val spiFlashConfig: SPIFlashConfig } =>
|
||||
val qspi = new SPIPortIO(spiFlashConfig)
|
||||
trait HasPeripherySPIFlashBundle extends HasTopLevelNetworksBundle {
|
||||
val outer: HasPeripherySPIFlash
|
||||
val qspi = new SPIPortIO(outer.spiFlashParams)
|
||||
}
|
||||
|
||||
trait PeripherySPIFlashModule {
|
||||
this: TopNetworkModule {
|
||||
val spiConfigs: Seq[SPIConfig]
|
||||
val outer: PeripherySPIFlash
|
||||
val io: PeripherySPIFlashBundle
|
||||
} =>
|
||||
trait HasPeripherySPIFlashModule extends HasTopLevelNetworksModule {
|
||||
val outer: HasPeripherySPIFlash
|
||||
val io: HasPeripherySPIFlashBundle
|
||||
io.qspi <> outer.qspi.module.io.port
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ package sifive.blocks.devices.spi
|
||||
import Chisel._
|
||||
import sifive.blocks.util.ShiftRegisterInit
|
||||
|
||||
class SPIMicroOp(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIMicroOp(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val fn = Bits(width = 1)
|
||||
val stb = Bool()
|
||||
val cnt = UInt(width = c.countBits)
|
||||
@ -16,12 +16,12 @@ object SPIMicroOp {
|
||||
def Delay = UInt(1, 1)
|
||||
}
|
||||
|
||||
class SPIPhyControl(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIPhyControl(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val sck = new SPIClocking(c)
|
||||
val fmt = new SPIFormat(c)
|
||||
}
|
||||
|
||||
class SPIPhysical(c: SPIConfigBase) extends Module {
|
||||
class SPIPhysical(c: SPIParamsBase) extends Module {
|
||||
val io = new SPIBundle(c) {
|
||||
val port = new SPIPortIO(c)
|
||||
val ctrl = new SPIPhyControl(c).asInput
|
||||
|
@ -4,13 +4,13 @@ package sifive.blocks.devices.spi
|
||||
import Chisel._
|
||||
import sifive.blocks.devices.gpio.{GPIOPin, GPIOOutputPinCtrl, GPIOInputPinCtrl}
|
||||
|
||||
class SPIPinsIO(c: SPIConfigBase) extends SPIBundle(c) {
|
||||
class SPIPinsIO(c: SPIParamsBase) extends SPIBundle(c) {
|
||||
val sck = new GPIOPin
|
||||
val dq = Vec(4, new GPIOPin)
|
||||
val cs = Vec(c.csWidth, new GPIOPin)
|
||||
}
|
||||
|
||||
class SPIGPIOPort(c: SPIConfigBase, syncStages: Int = 0, driveStrength: Bool = Bool(false)) extends Module {
|
||||
class SPIGPIOPort(c: SPIParamsBase, syncStages: Int = 0, driveStrength: Bool = Bool(false)) extends Module {
|
||||
val io = new SPIBundle(c) {
|
||||
val spi = new SPIPortIO(c).flip
|
||||
val pins = new SPIPinsIO(c)
|
||||
|
@ -3,14 +3,13 @@ package sifive.blocks.devices.spi
|
||||
|
||||
import Chisel._
|
||||
import config._
|
||||
import uncore.tilelink2._
|
||||
import diplomacy._
|
||||
import regmapper._
|
||||
import junctions._
|
||||
import rocketchip.PeripheryBusConfig
|
||||
import uncore.tilelink2._
|
||||
|
||||
import sifive.blocks.util.{NonBlockingEnqueue, NonBlockingDequeue}
|
||||
|
||||
trait SPIConfigBase {
|
||||
trait SPIParamsBase {
|
||||
val rAddress: BigInt
|
||||
val rSize: BigInt
|
||||
val rxDepth: Int
|
||||
@ -32,7 +31,7 @@ trait SPIConfigBase {
|
||||
|
||||
}
|
||||
|
||||
case class SPIConfig(
|
||||
case class SPIParams(
|
||||
rAddress: BigInt,
|
||||
rSize: BigInt = 0x1000,
|
||||
rxDepth: Int = 8,
|
||||
@ -42,15 +41,15 @@ case class SPIConfig(
|
||||
delayBits: Int = 8,
|
||||
divisorBits: Int = 12,
|
||||
sampleDelay: Int = 2)
|
||||
extends SPIConfigBase {
|
||||
extends SPIParamsBase {
|
||||
|
||||
require(frameBits >= 4)
|
||||
require(sampleDelay >= 0)
|
||||
}
|
||||
|
||||
class SPITopBundle(val i: Vec[Vec[Bool]], val r: Vec[TLBundle]) extends Bundle
|
||||
class SPITopBundle(val i: util.HeterogeneousBag[Vec[Bool]], val r: util.HeterogeneousBag[TLBundle]) extends Bundle
|
||||
|
||||
class SPITopModule[B <: SPITopBundle](c: SPIConfigBase, bundle: => B, outer: TLSPIBase)
|
||||
class SPITopModule[B <: SPITopBundle](c: SPIParamsBase, bundle: => B, outer: TLSPIBase)
|
||||
extends LazyModuleImp(outer) {
|
||||
|
||||
val io = new Bundle {
|
||||
@ -108,13 +107,13 @@ class SPITopModule[B <: SPITopBundle](c: SPIConfigBase, bundle: => B, outer: TLS
|
||||
RegField.r(1, ip.rxwm)))
|
||||
}
|
||||
|
||||
abstract class TLSPIBase(c: SPIConfigBase)(implicit p: Parameters) extends LazyModule {
|
||||
abstract class TLSPIBase(w: Int, c: SPIParamsBase)(implicit p: Parameters) extends LazyModule {
|
||||
require(isPow2(c.rSize))
|
||||
val rnode = TLRegisterNode(address = AddressSet(c.rAddress, c.rSize-1), beatBytes = p(PeripheryBusConfig).beatBytes)
|
||||
val rnode = TLRegisterNode(address = AddressSet(c.rAddress, c.rSize-1), beatBytes = w)
|
||||
val intnode = IntSourceNode(1)
|
||||
}
|
||||
|
||||
class TLSPI(c: SPIConfig)(implicit p: Parameters) extends TLSPIBase(c)(p) {
|
||||
class TLSPI(w: Int, c: SPIParams)(implicit p: Parameters) extends TLSPIBase(w,c)(p) {
|
||||
lazy val module = new SPITopModule(c, new SPITopBundle(intnode.bundleOut, rnode.bundleIn), this) {
|
||||
mac.io.link <> fifo.io.link
|
||||
rnode.regmap(regmapBase:_*)
|
||||
|
@ -7,7 +7,7 @@ import diplomacy._
|
||||
import regmapper._
|
||||
import uncore.tilelink2._
|
||||
|
||||
trait SPIFlashConfigBase extends SPIConfigBase {
|
||||
trait SPIFlashParamsBase extends SPIParamsBase {
|
||||
val fAddress: BigInt
|
||||
val fSize: BigInt
|
||||
|
||||
@ -18,7 +18,7 @@ trait SPIFlashConfigBase extends SPIConfigBase {
|
||||
lazy val insnAddrLenBits = log2Floor(insnAddrBytes) + 1
|
||||
}
|
||||
|
||||
case class SPIFlashConfig(
|
||||
case class SPIFlashParams(
|
||||
rAddress: BigInt,
|
||||
fAddress: BigInt,
|
||||
rSize: BigInt = 0x1000,
|
||||
@ -29,7 +29,7 @@ case class SPIFlashConfig(
|
||||
delayBits: Int = 8,
|
||||
divisorBits: Int = 12,
|
||||
sampleDelay: Int = 2)
|
||||
extends SPIFlashConfigBase {
|
||||
extends SPIFlashParamsBase {
|
||||
val frameBits = 8
|
||||
val insnAddrBytes = 4
|
||||
val insnPadLenBits = 4
|
||||
@ -38,10 +38,10 @@ case class SPIFlashConfig(
|
||||
require(sampleDelay >= 0)
|
||||
}
|
||||
|
||||
class SPIFlashTopBundle(i: Vec[Vec[Bool]], r: Vec[TLBundle], val f: Vec[TLBundle]) extends SPITopBundle(i, r)
|
||||
class SPIFlashTopBundle(i: util.HeterogeneousBag[Vec[Bool]], r: util.HeterogeneousBag[TLBundle], val f: util.HeterogeneousBag[TLBundle]) extends SPITopBundle(i, r)
|
||||
|
||||
class SPIFlashTopModule[B <: SPIFlashTopBundle]
|
||||
(c: SPIFlashConfigBase, bundle: => B, outer: TLSPIFlashBase)
|
||||
(c: SPIFlashParamsBase, bundle: => B, outer: TLSPIFlashBase)
|
||||
extends SPITopModule(c, bundle, outer) {
|
||||
|
||||
val flash = Module(new SPIFlashMap(c))
|
||||
@ -91,7 +91,7 @@ class SPIFlashTopModule[B <: SPIFlashTopBundle]
|
||||
SPICRs.insnpad -> Seq(RegField(c.frameBits, insn.pad.code)))
|
||||
}
|
||||
|
||||
abstract class TLSPIFlashBase(c: SPIFlashConfigBase)(implicit p: Parameters) extends TLSPIBase(c)(p) {
|
||||
abstract class TLSPIFlashBase(w: Int, c: SPIFlashParamsBase)(implicit p: Parameters) extends TLSPIBase(w,c)(p) {
|
||||
require(isPow2(c.fSize))
|
||||
val fnode = TLManagerNode(1, TLManagerParameters(
|
||||
address = Seq(AddressSet(c.fAddress, c.fSize-1)),
|
||||
@ -101,7 +101,7 @@ abstract class TLSPIFlashBase(c: SPIFlashConfigBase)(implicit p: Parameters) ext
|
||||
fifoId = Some(0)))
|
||||
}
|
||||
|
||||
class TLSPIFlash(c: SPIFlashConfig)(implicit p: Parameters) extends TLSPIFlashBase(c)(p) {
|
||||
class TLSPIFlash(w: Int, c: SPIFlashParams)(implicit p: Parameters) extends TLSPIFlashBase(w,c)(p) {
|
||||
lazy val module = new SPIFlashTopModule(c,
|
||||
new SPIFlashTopBundle(intnode.bundleOut, rnode.bundleIn, fnode.bundleIn), this) {
|
||||
|
||||
|
Reference in New Issue
Block a user