commit
71f2445c62
@ -71,27 +71,26 @@ trait CoreplexNetworkModule extends HasCoreplexParameters {
|
||||
trait BankedL2CoherenceManagers extends CoreplexNetwork {
|
||||
val module: BankedL2CoherenceManagersModule
|
||||
|
||||
require (isPow2(l2Config.nMemoryChannels) || l2Config.nMemoryChannels == 0)
|
||||
require (isPow2(l2Config.nBanksPerChannel))
|
||||
require (isPow2(l1tol2_lineBytes))
|
||||
|
||||
val mem = TLOutputNode()
|
||||
for (channel <- 0 until l2Config.nMemoryChannels) {
|
||||
val bankBar = LazyModule(new TLXbar)
|
||||
val (in, out) = l2Config.coherenceManager(p, this)
|
||||
|
||||
in :*= l1tol2.node
|
||||
mem := bankBar.node
|
||||
|
||||
val mask = ~BigInt((l2Config.nBanksPerChannel-1) * l1tol2_lineBytes)
|
||||
private val (in, out) = l2Config.coherenceManager(p, this)
|
||||
private val mask = ~BigInt((l2Config.nBanks-1) * l1tol2_lineBytes)
|
||||
val mem = Seq.tabulate(l2Config.nMemoryChannels) { channel =>
|
||||
val node = TLOutputNode()
|
||||
for (bank <- 0 until l2Config.nBanksPerChannel) {
|
||||
bankBar.node := TLFilter(AddressSet(bank * l1tol2_lineBytes, mask))(out)
|
||||
val offset = (bank * l2Config.nMemoryChannels) + channel
|
||||
in := l1tol2.node
|
||||
node := TLFilter(AddressSet(offset * l1tol2_lineBytes, mask))(out)
|
||||
}
|
||||
node
|
||||
}
|
||||
}
|
||||
|
||||
trait BankedL2CoherenceManagersBundle extends CoreplexNetworkBundle {
|
||||
val outer: BankedL2CoherenceManagers
|
||||
val mem = outer.mem.bundleOut
|
||||
val mem = HeterogeneousBag(outer.mem.map(_.bundleOut))
|
||||
}
|
||||
|
||||
trait BankedL2CoherenceManagersModule extends CoreplexNetworkModule {
|
||||
|
@ -17,7 +17,7 @@ class GroundTestTop(implicit p: Parameters) extends BaseTop
|
||||
|
||||
socBus.node := coreplex.mmio
|
||||
coreplex.mmioInt := intBus.intnode
|
||||
mem.foreach { _ := coreplex.mem }
|
||||
(mem zip coreplex.mem) foreach { case (xbar, channel) => xbar.node :=* channel }
|
||||
}
|
||||
|
||||
class GroundTestTopBundle[+L <: GroundTestTop](_outer: L) extends BaseTopBundle(_outer)
|
||||
|
@ -35,6 +35,7 @@ trait TopNetwork extends HasPeripheryParameters {
|
||||
val peripheryBus = LazyModule(new TLXbar)
|
||||
val intBus = LazyModule(new IntXbar)
|
||||
val l2 = LazyModule(new TLBuffer)
|
||||
val mem = Seq.fill(p(coreplex.BankedL2Config).nMemoryChannels) { LazyModule(new TLXbar) }
|
||||
|
||||
peripheryBus.node :=
|
||||
TLBuffer()(
|
||||
|
@ -31,6 +31,7 @@ class BasePlatformConfig extends Config((site, here, up) => {
|
||||
case PeripheryBusArithmetic => true
|
||||
// Note that PLIC asserts that this is > 0.
|
||||
case IncludeJtagDTM => false
|
||||
case ZeroConfig => ZeroConfig(base=0xa000000L, size=0x2000000L, beatBytes=8)
|
||||
case ExtMem => MasterConfig(base=0x80000000L, size=0x10000000L, beatBytes=8, idBits=4)
|
||||
case ExtBus => MasterConfig(base=0x60000000L, size=0x20000000L, beatBytes=8, idBits=4)
|
||||
case ExtIn => SlaveConfig(beatBytes=8, idBits=8, sourceBits=2)
|
||||
@ -86,6 +87,7 @@ class RoccExampleConfig extends Config(new WithRoccExample ++ new BaseConfig)
|
||||
|
||||
class WithEdgeDataBits(dataBits: Int) extends Config((site, here, up) => {
|
||||
case ExtMem => up(ExtMem, site).copy(beatBytes = dataBits/8)
|
||||
case ZeroConfig => up(ZeroConfig, site).copy(beatBytes = dataBits/8)
|
||||
})
|
||||
|
||||
class Edge128BitConfig extends Config(
|
||||
|
@ -30,6 +30,7 @@ class ExampleTopModule[+L <: ExampleTop, +B <: ExampleTopBundle[L]](_outer: L, _
|
||||
|
||||
class ExampleRocketTop(implicit p: Parameters) extends ExampleTop
|
||||
with PeripheryBootROM
|
||||
with PeripheryZero
|
||||
with PeripheryDebug
|
||||
with PeripheryCounter
|
||||
with HardwiredResetVector
|
||||
@ -39,6 +40,7 @@ class ExampleRocketTop(implicit p: Parameters) extends ExampleTop
|
||||
|
||||
class ExampleRocketTopBundle[+L <: ExampleRocketTop](_outer: L) extends ExampleTopBundle(_outer)
|
||||
with PeripheryBootROMBundle
|
||||
with PeripheryZeroBundle
|
||||
with PeripheryDebugBundle
|
||||
with PeripheryCounterBundle
|
||||
with HardwiredResetVectorBundle
|
||||
@ -46,6 +48,7 @@ class ExampleRocketTopBundle[+L <: ExampleRocketTop](_outer: L) extends ExampleT
|
||||
|
||||
class ExampleRocketTopModule[+L <: ExampleRocketTop, +B <: ExampleRocketTopBundle[L]](_outer: L, _io: () => B) extends ExampleTopModule(_outer, _io)
|
||||
with PeripheryBootROMModule
|
||||
with PeripheryZeroModule
|
||||
with PeripheryDebugModule
|
||||
with PeripheryCounterModule
|
||||
with HardwiredResetVectorModule
|
||||
|
@ -34,6 +34,9 @@ case object PeripheryBusConfig extends Field[TLBusConfig]
|
||||
case object PeripheryBusArithmetic extends Field[Boolean]
|
||||
/* Specifies the SOC-bus configuration */
|
||||
case object SOCBusConfig extends Field[TLBusConfig]
|
||||
/* Specifies the location of the Zero device */
|
||||
case class ZeroConfig(base: Long, size: Long, beatBytes: Int)
|
||||
case object ZeroConfig extends Field[ZeroConfig]
|
||||
|
||||
/** Utility trait for quick access to some relevant parameters */
|
||||
trait HasPeripheryParameters {
|
||||
@ -72,28 +75,21 @@ trait PeripheryExtInterruptsModule {
|
||||
|
||||
/////
|
||||
|
||||
trait PeripheryNoMem extends TopNetwork {
|
||||
private val channels = p(BankedL2Config).nMemoryChannels
|
||||
require (channels == 0)
|
||||
val mem = Seq()
|
||||
}
|
||||
|
||||
/////
|
||||
|
||||
trait PeripheryMasterAXI4Mem {
|
||||
this: TopNetwork =>
|
||||
val module: PeripheryMasterAXI4MemModule
|
||||
|
||||
private val config = p(ExtMem)
|
||||
private val channels = p(BankedL2Config).nMemoryChannels
|
||||
private val lineBytes = p(CacheBlockBytes)
|
||||
|
||||
val mem_axi4 = AXI4BlindOutputNode(Seq.tabulate(channels) { i =>
|
||||
val c_size = config.size/channels
|
||||
val c_base = config.base + c_size*i
|
||||
val mem_axi4 = AXI4BlindOutputNode(Seq.tabulate(channels) { channel =>
|
||||
val base = AddressSet(config.base, config.size-1)
|
||||
val filter = AddressSet(channel * lineBytes, ~((channels-1) * lineBytes))
|
||||
|
||||
AXI4SlavePortParameters(
|
||||
slaves = Seq(AXI4SlaveParameters(
|
||||
address = List(AddressSet(c_base, c_size-1)),
|
||||
address = base.intersect(filter).toList,
|
||||
regionType = RegionType.UNCACHED, // cacheable
|
||||
executable = true,
|
||||
supportsWrite = TransferSizes(1, 256), // The slave supports 1-256 byte transfers
|
||||
@ -102,10 +98,13 @@ trait PeripheryMasterAXI4Mem {
|
||||
beatBytes = config.beatBytes)
|
||||
})
|
||||
|
||||
val mem = Seq.fill(channels) {
|
||||
val converter = LazyModule(new TLToAXI4(config.idBits))
|
||||
mem_axi4 := AXI4Buffer()(converter.node)
|
||||
converter.node
|
||||
private val converter = LazyModule(new TLToAXI4(config.idBits))
|
||||
private val buffer = LazyModule(new AXI4Buffer)
|
||||
|
||||
mem foreach { case xbar =>
|
||||
converter.node := xbar.node
|
||||
buffer.node := converter.node
|
||||
mem_axi4 := buffer.node
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,6 +124,36 @@ trait PeripheryMasterAXI4MemModule {
|
||||
|
||||
/////
|
||||
|
||||
trait PeripheryZero {
|
||||
this: TopNetwork =>
|
||||
val module: PeripheryZeroModule
|
||||
|
||||
private val config = p(ZeroConfig)
|
||||
private val address = AddressSet(config.base, config.size-1)
|
||||
private val lineBytes = p(CacheBlockBytes)
|
||||
|
||||
val zeros = mem map { case xbar =>
|
||||
val zero = LazyModule(new TLZero(address, beatBytes = config.beatBytes))
|
||||
zero.node := TLFragmenter(config.beatBytes, lineBytes)(xbar.node)
|
||||
zero
|
||||
}
|
||||
}
|
||||
|
||||
trait PeripheryZeroBundle {
|
||||
this: TopNetworkBundle {
|
||||
val outer: PeripheryZero
|
||||
} =>
|
||||
}
|
||||
|
||||
trait PeripheryZeroModule {
|
||||
this: TopNetworkModule {
|
||||
val outer: PeripheryZero
|
||||
val io: PeripheryZeroBundle
|
||||
} =>
|
||||
}
|
||||
|
||||
/////
|
||||
|
||||
// PeripheryMasterAXI4MMIO is an example, make your own cake pattern like this one.
|
||||
trait PeripheryMasterAXI4MMIO {
|
||||
this: TopNetwork =>
|
||||
|
@ -12,14 +12,15 @@ import coreplex._
|
||||
|
||||
trait RocketPlexMaster extends TopNetwork {
|
||||
val module: RocketPlexMasterModule
|
||||
val mem: Seq[TLInwardNode]
|
||||
|
||||
val coreplex = LazyModule(new DefaultCoreplex)
|
||||
|
||||
coreplex.l2in :=* l2.node
|
||||
socBus.node := coreplex.mmio
|
||||
coreplex.mmioInt := intBus.intnode
|
||||
mem.foreach { _ := coreplex.mem }
|
||||
|
||||
require (mem.size == coreplex.mem.size)
|
||||
(mem zip coreplex.mem) foreach { case (xbar, channel) => xbar.node :=* channel }
|
||||
}
|
||||
|
||||
trait RocketPlexMasterBundle extends TopNetworkBundle {
|
||||
|
44
src/main/scala/uncore/tilelink2/Zero.scala
Normal file
44
src/main/scala/uncore/tilelink2/Zero.scala
Normal file
@ -0,0 +1,44 @@
|
||||
// See LICENSE.SiFive for license details.
|
||||
|
||||
package uncore.tilelink2
|
||||
|
||||
import Chisel._
|
||||
import config._
|
||||
import diplomacy._
|
||||
|
||||
class TLZero(address: AddressSet, executable: Boolean = true, beatBytes: Int = 4)(implicit p: Parameters) extends LazyModule
|
||||
{
|
||||
val node = TLManagerNode(Seq(TLManagerPortParameters(
|
||||
Seq(TLManagerParameters(
|
||||
address = List(address),
|
||||
regionType = RegionType.UNCACHED,
|
||||
executable = executable,
|
||||
supportsGet = TransferSizes(1, beatBytes),
|
||||
supportsPutPartial = TransferSizes(1, beatBytes),
|
||||
supportsPutFull = TransferSizes(1, beatBytes),
|
||||
fifoId = Some(0))), // requests are handled in order
|
||||
beatBytes = beatBytes,
|
||||
minLatency = 1))) // no bypass needed for this device
|
||||
|
||||
lazy val module = new LazyModuleImp(this) {
|
||||
val io = new Bundle {
|
||||
val in = node.bundleIn
|
||||
}
|
||||
|
||||
val in = io.in(0)
|
||||
val edge = node.edgesIn(0)
|
||||
|
||||
val a = Queue(in.a, 2)
|
||||
val hasData = edge.hasData(a.bits)
|
||||
|
||||
a.ready := in.d.ready
|
||||
in.d.valid := a.valid
|
||||
in.d.bits := edge.AccessAck(a.bits, UInt(0))
|
||||
in.d.bits.opcode := Mux(hasData, TLMessages.AccessAck, TLMessages.AccessAckData)
|
||||
|
||||
// Tie off unused channels
|
||||
in.b.valid := Bool(false)
|
||||
in.c.ready := Bool(true)
|
||||
in.e.ready := Bool(true)
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@ abstract class Decoding
|
||||
def uncorrected: UInt
|
||||
def corrected: UInt
|
||||
def correctable: Bool
|
||||
def uncorrectable: Bool
|
||||
def uncorrectable: Bool // If true, correctable should be ignored
|
||||
def error = correctable || uncorrectable
|
||||
}
|
||||
|
||||
@ -81,7 +81,7 @@ class SECCode extends Code
|
||||
def uncorrected = swizzle(y)
|
||||
def corrected = swizzle(((y << 1) ^ UIntToOH(syndrome)) >> 1)
|
||||
def correctable = syndrome.orR
|
||||
def uncorrectable = Bool(false)
|
||||
def uncorrectable = syndrome > UInt(n)
|
||||
}
|
||||
private def mapping(i: Int) = i-1-log2Up(i)
|
||||
}
|
||||
|
13
src/main/scala/util/HeterogeneousBag.scala
Normal file
13
src/main/scala/util/HeterogeneousBag.scala
Normal file
@ -0,0 +1,13 @@
|
||||
package util
|
||||
|
||||
import Chisel._
|
||||
import chisel3.core.Record
|
||||
import scala.collection.immutable.ListMap
|
||||
|
||||
final case class HeterogeneousBag[T <: Data](elts: Seq[T]) extends Record with collection.IndexedSeq[T] {
|
||||
def apply(x: Int) = elts(x)
|
||||
def length = elts.length
|
||||
|
||||
val elements = ListMap(elts.zipWithIndex.map { case (n,i) => (i.toString, n) }:_*)
|
||||
override def cloneType: this.type = (new HeterogeneousBag(elts.map(_.cloneType))).asInstanceOf[this.type]
|
||||
}
|
Loading…
Reference in New Issue
Block a user