implement DMA streaming functionality
This commit is contained in:
parent
2f71a3da5a
commit
806e40d19b
@ -1 +1 @@
|
|||||||
Subproject commit 32c9c5f658759e4bb401ac18a5b9c858df6d349f
|
Subproject commit 5cacda85cf3e5cf07d8cdabdd8a90df2a0a29539
|
@ -1 +1 @@
|
|||||||
Subproject commit b770662965bcefee5921b482016fd11d4e40f053
|
Subproject commit ee032b025af50e5f87ff5da51ad196c354a6b182
|
2
rocket
2
rocket
@ -1 +1 @@
|
|||||||
Subproject commit f19ab09004912575372f9680251847e3727d3133
|
Subproject commit 63c7f343f28332a8e5286282030ac52ba9fed5b5
|
@ -29,6 +29,7 @@ class DefaultConfig extends Config (
|
|||||||
}
|
}
|
||||||
def makeDeviceTree() = {
|
def makeDeviceTree() = {
|
||||||
val addrMap = new AddrHashMap(site(GlobalAddrMap))
|
val addrMap = new AddrHashMap(site(GlobalAddrMap))
|
||||||
|
val devices = site(GlobalDeviceSet)
|
||||||
val dt = new DeviceTreeGenerator
|
val dt = new DeviceTreeGenerator
|
||||||
dt.beginNode("")
|
dt.beginNode("")
|
||||||
dt.addProp("#address-cells", 2)
|
dt.addProp("#address-cells", 2)
|
||||||
@ -58,6 +59,15 @@ class DefaultConfig extends Config (
|
|||||||
dt.addProp("protection", scrs.prot)
|
dt.addProp("protection", scrs.prot)
|
||||||
dt.addReg(scrs.start.toLong, scrs.size.toLong)
|
dt.addReg(scrs.start.toLong, scrs.size.toLong)
|
||||||
dt.endNode()
|
dt.endNode()
|
||||||
|
for (dev <- devices.toSeq) {
|
||||||
|
val entry = addrMap(s"devices:${dev.name}")
|
||||||
|
dt.beginNode(s"${dev.name}@${entry.start}")
|
||||||
|
dt.addProp("device_type", s"${dev.dtype}")
|
||||||
|
dt.addProp("compatible", "riscv")
|
||||||
|
dt.addProp("protection", entry.prot)
|
||||||
|
dt.addReg(entry.start.toLong, entry.size.toLong)
|
||||||
|
dt.endNode()
|
||||||
|
}
|
||||||
dt.endNode()
|
dt.endNode()
|
||||||
dt.toArray()
|
dt.toArray()
|
||||||
}
|
}
|
||||||
@ -79,7 +89,8 @@ class DefaultConfig extends Config (
|
|||||||
case MIFTagBits => // Bits needed at the L2 agent
|
case MIFTagBits => // Bits needed at the L2 agent
|
||||||
log2Up(site(NAcquireTransactors)+2) +
|
log2Up(site(NAcquireTransactors)+2) +
|
||||||
// Bits added by NASTI interconnect
|
// Bits added by NASTI interconnect
|
||||||
log2Up(site(NMemoryChannels) * site(NBanksPerMemoryChannel) + 1)
|
log2Up(site(NMemoryChannels) * site(NBanksPerMemoryChannel) +
|
||||||
|
(if (site(UseDma)) 2 else 1))
|
||||||
case MIFDataBits => 64
|
case MIFDataBits => 64
|
||||||
case MIFAddrBits => site(PAddrBits) - site(CacheBlockOffsetBits)
|
case MIFAddrBits => site(PAddrBits) - site(CacheBlockOffsetBits)
|
||||||
case MIFDataBeats => site(CacheBlockBytes) * 8 / site(MIFDataBits)
|
case MIFDataBeats => site(CacheBlockBytes) * 8 / site(MIFDataBits)
|
||||||
@ -143,6 +154,7 @@ class DefaultConfig extends Config (
|
|||||||
case BuildRoCC => Nil
|
case BuildRoCC => Nil
|
||||||
case RoccNMemChannels => site(BuildRoCC).map(_.nMemChannels).foldLeft(0)(_ + _)
|
case RoccNMemChannels => site(BuildRoCC).map(_.nMemChannels).foldLeft(0)(_ + _)
|
||||||
case UseDma => false
|
case UseDma => false
|
||||||
|
case UseStreamLoopback => false
|
||||||
case NDmaTransactors => 3
|
case NDmaTransactors => 3
|
||||||
case NDmaClients => site(NTiles)
|
case NDmaClients => site(NTiles)
|
||||||
case NDmaXactsPerClient => site(NDmaTransactors)
|
case NDmaXactsPerClient => site(NDmaTransactors)
|
||||||
@ -210,10 +222,21 @@ class DefaultConfig extends Config (
|
|||||||
case MMIOBase => Dump("MEM_SIZE", BigInt(1 << 30)) // 1 GB
|
case MMIOBase => Dump("MEM_SIZE", BigInt(1 << 30)) // 1 GB
|
||||||
case ExternalIOStart => 2 * site(MMIOBase)
|
case ExternalIOStart => 2 * site(MMIOBase)
|
||||||
case DeviceTree => makeDeviceTree()
|
case DeviceTree => makeDeviceTree()
|
||||||
case GlobalAddrMap => AddrMap(
|
case GlobalAddrMap => {
|
||||||
AddrMapEntry("mem", None, MemChannels(site(MMIOBase), site(NMemoryChannels), AddrMapConsts.RWX)),
|
val extraSize = site(ExternalIOStart) - site(MMIOBase)
|
||||||
AddrMapEntry("conf", None, MemSubmap(site(ExternalIOStart) - site(MMIOBase), genCsrAddrMap)),
|
AddrMap(
|
||||||
AddrMapEntry("io", Some(site(ExternalIOStart)), MemSize(2 * site(MMIOBase), AddrMapConsts.RW)))
|
AddrMapEntry("mem", None, MemChannels(site(MMIOBase), site(NMemoryChannels), AddrMapConsts.RWX)),
|
||||||
|
AddrMapEntry("conf", None, MemSubmap(extraSize / 2, genCsrAddrMap)),
|
||||||
|
AddrMapEntry("devices", None, MemSubmap(extraSize / 2, site(GlobalDeviceSet).getAddrMap)),
|
||||||
|
AddrMapEntry("io", Some(site(ExternalIOStart)), MemSize(2 * site(MMIOBase), AddrMapConsts.RW)))
|
||||||
|
}
|
||||||
|
case GlobalDeviceSet => {
|
||||||
|
val devset = new DeviceSet
|
||||||
|
if (site(UseStreamLoopback)) {
|
||||||
|
devset.addDevice("loopback", site(StreamLoopbackWidth) / 8, "stream")
|
||||||
|
}
|
||||||
|
devset
|
||||||
|
}
|
||||||
}},
|
}},
|
||||||
knobValues = {
|
knobValues = {
|
||||||
case "NTILES" => 1
|
case "NTILES" => 1
|
||||||
@ -384,8 +407,19 @@ class WithDmaController extends Config(
|
|||||||
case RoccMaxTaggedMemXacts => 1
|
case RoccMaxTaggedMemXacts => 1
|
||||||
})
|
})
|
||||||
|
|
||||||
|
class WithStreamLoopback extends Config(
|
||||||
|
(pname, site, here) => pname match {
|
||||||
|
case UseStreamLoopback => true
|
||||||
|
case StreamLoopbackSize => 128
|
||||||
|
case StreamLoopbackWidth => 64
|
||||||
|
})
|
||||||
|
|
||||||
class DmaControllerConfig extends Config(new WithDmaController ++ new DefaultL2Config)
|
class DmaControllerConfig extends Config(new WithDmaController ++ new DefaultL2Config)
|
||||||
|
|
||||||
class SmallL2Config extends Config(
|
class SmallL2Config extends Config(
|
||||||
new With2MemoryChannels ++ new With4BanksPerMemChannel ++
|
new With2MemoryChannels ++ new With4BanksPerMemChannel ++
|
||||||
new WithL2Capacity256 ++ new DefaultL2Config)
|
new WithL2Capacity256 ++ new DefaultL2Config)
|
||||||
|
|
||||||
|
class SingleChannelBenchmarkConfig extends Config(new WithL2Capacity256 ++ new DefaultL2Config)
|
||||||
|
class DualChannelBenchmarkConfig extends Config(new With2MemoryChannels ++ new SingleChannelBenchmarkConfig)
|
||||||
|
class QuadChannelBenchmarkConfig extends Config(new With4MemoryChannels ++ new SingleChannelBenchmarkConfig)
|
||||||
|
36
src/main/scala/DeviceSet.scala
Normal file
36
src/main/scala/DeviceSet.scala
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package rocketchip
|
||||||
|
|
||||||
|
import Chisel.log2Ceil
|
||||||
|
import cde.{Parameters, Field}
|
||||||
|
import scala.collection.mutable.HashMap
|
||||||
|
import junctions._
|
||||||
|
import junctions.AddrMapConsts._
|
||||||
|
|
||||||
|
case object GlobalDeviceSet extends Field[DeviceSet]
|
||||||
|
|
||||||
|
case class Device(name: String, size: Int, dtype: String,
|
||||||
|
readable: Boolean = true, writeable: Boolean = true)
|
||||||
|
|
||||||
|
class DeviceSet {
|
||||||
|
val deviceMap = new HashMap[String, Device]()
|
||||||
|
|
||||||
|
def addDevice(name: String, size: Int, dtype: String, readable: Boolean = true, writeable: Boolean = true): Unit =
|
||||||
|
addDevice(Device(name, size, dtype, readable, writeable))
|
||||||
|
|
||||||
|
def addDevice(dev: Device): Unit =
|
||||||
|
deviceMap(dev.name) = dev
|
||||||
|
|
||||||
|
private def roundup(size: Int): Int = (1 << log2Ceil(size))
|
||||||
|
|
||||||
|
def toSeq: Seq[Device] = deviceMap.values.toSeq
|
||||||
|
|
||||||
|
def getAddrMap: AddrMap = {
|
||||||
|
val devices = this.toSeq.sortWith((a, b) => a.size > b.size)
|
||||||
|
val entries = devices.map { case Device(name, size, _, readable, writeable) =>
|
||||||
|
val prot = (if (readable) R else 0) | (if (writeable) W else 0)
|
||||||
|
val realsize = roundup(size)
|
||||||
|
new AddrMapEntry(name, None, new MemSize(realsize, prot))
|
||||||
|
}
|
||||||
|
new AddrMap(entries)
|
||||||
|
}
|
||||||
|
}
|
@ -32,6 +32,10 @@ case object ExternalIOStart extends Field[BigInt]
|
|||||||
/** Enable DMA engine */
|
/** Enable DMA engine */
|
||||||
case object UseDma extends Field[Boolean]
|
case object UseDma extends Field[Boolean]
|
||||||
|
|
||||||
|
case object UseStreamLoopback extends Field[Boolean]
|
||||||
|
case object StreamLoopbackSize extends Field[Int]
|
||||||
|
case object StreamLoopbackWidth extends Field[Int]
|
||||||
|
|
||||||
/** Utility trait for quick access to some relevant parameters */
|
/** Utility trait for quick access to some relevant parameters */
|
||||||
trait HasTopLevelParameters {
|
trait HasTopLevelParameters {
|
||||||
implicit val p: Parameters
|
implicit val p: Parameters
|
||||||
@ -213,13 +217,12 @@ class OuterMemorySystem(implicit val p: Parameters) extends Module with HasTopLe
|
|||||||
}
|
}
|
||||||
|
|
||||||
val dmaOpt = if (p(UseDma)) Some(Module(new DmaEngine)) else None
|
val dmaOpt = if (p(UseDma)) Some(Module(new DmaEngine)) else None
|
||||||
dmaOpt.foreach { dma => dma.io.dma <> io.dma }
|
|
||||||
|
|
||||||
// Create a simple L1toL2 NoC between the tiles+htif and the banks of outer memory
|
// Create a simple L1toL2 NoC between the tiles+htif and the banks of outer memory
|
||||||
// Cached ports are first in client list, making sharerToClientId just an indentity function
|
// Cached ports are first in client list, making sharerToClientId just an indentity function
|
||||||
// addrToBank is sed to hash physical addresses (of cache blocks) to banks (and thereby memory channels)
|
// addrToBank is sed to hash physical addresses (of cache blocks) to banks (and thereby memory channels)
|
||||||
val ordered_clients = (io.tiles_cached ++
|
val ordered_clients = (io.tiles_cached ++
|
||||||
(io.tiles_uncached ++ dmaOpt.map(_.io.mem) :+ io.htif_uncached)
|
(io.tiles_uncached ++ dmaOpt.map(_.io.inner) :+ io.htif_uncached)
|
||||||
.map(TileLinkIOWrapper(_)))
|
.map(TileLinkIOWrapper(_)))
|
||||||
def sharerToClientId(sharerId: UInt) = sharerId
|
def sharerToClientId(sharerId: UInt) = sharerId
|
||||||
def addrToBank(addr: Bits): UInt = if(nBanks > 1) addr(lsb + log2Up(nBanks) - 1, lsb) else UInt(0)
|
def addrToBank(addr: Bits): UInt = if(nBanks > 1) addr(lsb + log2Up(nBanks) - 1, lsb) else UInt(0)
|
||||||
@ -246,7 +249,7 @@ class OuterMemorySystem(implicit val p: Parameters) extends Module with HasTopLe
|
|||||||
|
|
||||||
val addrMap = p(GlobalAddrMap)
|
val addrMap = p(GlobalAddrMap)
|
||||||
val addrHashMap = new AddrHashMap(addrMap)
|
val addrHashMap = new AddrHashMap(addrMap)
|
||||||
val nMasters = managerEndpoints.size + 1
|
val nMasters = managerEndpoints.size + (if (dmaOpt.isEmpty) 1 else 2)
|
||||||
val nSlaves = addrHashMap.nEntries
|
val nSlaves = addrHashMap.nEntries
|
||||||
|
|
||||||
println("Generated Address Map")
|
println("Generated Address Map")
|
||||||
@ -274,6 +277,11 @@ class OuterMemorySystem(implicit val p: Parameters) extends Module with HasTopLe
|
|||||||
val rtc = Module(new RTC(CSRs.mtime))
|
val rtc = Module(new RTC(CSRs.mtime))
|
||||||
interconnect.io.masters(nManagers) <> rtc.io
|
interconnect.io.masters(nManagers) <> rtc.io
|
||||||
|
|
||||||
|
dmaOpt.foreach { dma =>
|
||||||
|
dma.io.dma <> io.dma
|
||||||
|
interconnect.io.masters(nManagers + 1) <> dma.io.outer
|
||||||
|
}
|
||||||
|
|
||||||
for (i <- 0 until nTiles) {
|
for (i <- 0 until nTiles) {
|
||||||
val csrName = s"conf:csr$i"
|
val csrName = s"conf:csr$i"
|
||||||
val csrPort = addrHashMap(csrName).port
|
val csrPort = addrHashMap(csrName).port
|
||||||
@ -282,9 +290,17 @@ class OuterMemorySystem(implicit val p: Parameters) extends Module with HasTopLe
|
|||||||
io.csr(i) <> conv.io.smi
|
io.csr(i) <> conv.io.smi
|
||||||
}
|
}
|
||||||
|
|
||||||
val conv = Module(new SMIIONastiIOConverter(scrDataBits, scrAddrBits))
|
val src_conv = Module(new SMIIONastiIOConverter(scrDataBits, scrAddrBits))
|
||||||
conv.io.nasti <> interconnect.io.slaves(addrHashMap("conf:scr").port)
|
src_conv.io.nasti <> interconnect.io.slaves(addrHashMap("conf:scr").port)
|
||||||
io.scr <> conv.io.smi
|
io.scr <> src_conv.io.smi
|
||||||
|
|
||||||
|
if (p(UseStreamLoopback)) {
|
||||||
|
val lo_width = p(StreamLoopbackWidth)
|
||||||
|
val lo_size = p(StreamLoopbackSize)
|
||||||
|
val lo_conv = Module(new NastiIOStreamIOConverter(lo_width))
|
||||||
|
lo_conv.io.nasti <> interconnect.io.slaves(addrHashMap("devices:loopback").port)
|
||||||
|
lo_conv.io.stream.in <> Queue(lo_conv.io.stream.out, lo_size)
|
||||||
|
}
|
||||||
|
|
||||||
io.mmio <> interconnect.io.slaves(addrHashMap("io").port)
|
io.mmio <> interconnect.io.slaves(addrHashMap("io").port)
|
||||||
io.deviceTree <> interconnect.io.slaves(addrHashMap("conf:devicetree").port)
|
io.deviceTree <> interconnect.io.slaves(addrHashMap("conf:devicetree").port)
|
||||||
|
@ -4,6 +4,7 @@ import Chisel._
|
|||||||
import groundtest._
|
import groundtest._
|
||||||
import rocket._
|
import rocket._
|
||||||
import uncore._
|
import uncore._
|
||||||
|
import junctions._
|
||||||
import cde.{Parameters, Config, Dump, Knob}
|
import cde.{Parameters, Config, Dump, Knob}
|
||||||
import scala.math.max
|
import scala.math.max
|
||||||
|
|
||||||
@ -87,6 +88,20 @@ class WithDmaTest extends Config(
|
|||||||
case DmaTestDataStride => 8
|
case DmaTestDataStride => 8
|
||||||
})
|
})
|
||||||
|
|
||||||
|
class WithDmaStreamTest extends Config(
|
||||||
|
(pname, site, here) => pname match {
|
||||||
|
case UseDma => true
|
||||||
|
case BuildGroundTest =>
|
||||||
|
(id: Int, p: Parameters) => Module(new DmaStreamTest()(p))
|
||||||
|
case DmaStreamLoopbackAddr => {
|
||||||
|
val addrMap = new AddrHashMap(site(GlobalAddrMap))
|
||||||
|
addrMap("devices:loopback").start
|
||||||
|
}
|
||||||
|
case DmaStreamTestSettings => DmaStreamTestConfig(
|
||||||
|
source = 0x10, dest = 0x28, len = 0x18,
|
||||||
|
size = site(StreamLoopbackWidth) / 8)
|
||||||
|
})
|
||||||
|
|
||||||
class GroundTestConfig extends Config(new WithGroundTest ++ new DefaultConfig)
|
class GroundTestConfig extends Config(new WithGroundTest ++ new DefaultConfig)
|
||||||
class MemtestConfig extends Config(new WithMemtest ++ new GroundTestConfig)
|
class MemtestConfig extends Config(new WithMemtest ++ new GroundTestConfig)
|
||||||
class MemtestL2Config extends Config(
|
class MemtestL2Config extends Config(
|
||||||
@ -98,6 +113,7 @@ class BroadcastRegressionTestConfig extends Config(
|
|||||||
class CacheRegressionTestConfig extends Config(
|
class CacheRegressionTestConfig extends Config(
|
||||||
new WithCacheRegressionTest ++ new WithL2Cache ++ new GroundTestConfig)
|
new WithCacheRegressionTest ++ new WithL2Cache ++ new GroundTestConfig)
|
||||||
class DmaTestConfig extends Config(new WithDmaTest ++ new WithL2Cache ++ new GroundTestConfig)
|
class DmaTestConfig extends Config(new WithDmaTest ++ new WithL2Cache ++ new GroundTestConfig)
|
||||||
|
class DmaStreamTestConfig extends Config(new WithDmaStreamTest ++ new WithStreamLoopback ++ new WithL2Cache ++ new GroundTestConfig)
|
||||||
|
|
||||||
class FancyMemtestConfig extends Config(
|
class FancyMemtestConfig extends Config(
|
||||||
new With2Cores ++ new With2MemoryChannels ++ new With2BanksPerMemChannel ++
|
new With2Cores ++ new With2MemoryChannels ++ new With2BanksPerMemChannel ++
|
||||||
|
2
uncore
2
uncore
@ -1 +1 @@
|
|||||||
Subproject commit e41f2ed1ad9f12e7f975af37a07b87663ad577a8
|
Subproject commit 1e6c22a60c6eccbb85cecadf7503be8eb4c1e476
|
Loading…
Reference in New Issue
Block a user