将 MMIO 外设添加到小型火箭核心

Adding a MMIO peripheral to a small rocket core

我之前已经成功地添加并模拟了我的 MMIO 外设耦合到一个正常大小的火箭核心。 但现在我想尝试将它添加到一个小核心(所谓的 TinyCore),这是我遇到问题的部分。另外,为了以防万一,与我的外围设备的连接都是通过 FIFO 进行的。

首先,我在尝试生成设计时遇到的错误:

[error] java.lang.IllegalArgumentException: requirement failed: Ports cannot overlap: AddressSet(0x80000000, 0x3fff) AddressSet(0x80000000, 0xfffffff)

我想这是因为小火箭配置有一个不同的内存映射,我不知道,我正在尝试将外围设备添加到该配置中不存在的地址。

这是我使用的配置:

class myTinyRocketConfig2 extends Config(
  new freechips.rocketchip.subsystem.WithInclusiveCache(nBanks=1, nWays=4, capacityKB=128) ++
  new freechips.rocketchip.subsystem.With1TinyCore ++             // single tiny rocket-core
  new chipyard.config.AbstractConfig)

这就是我添加外围设备的方式,它显示了地址和一些其他参数:

class TLTxWriteQueue
(
  depth: Int = 4,
  csrAddress: AddressSet = AddressSet(0x2000, 0xff),
  beatBytes: Int = 4,
)(implicit p: Parameters) extends TxWriteQueue(depth) with TLHasCSR {
  val devname = "tlQueueIn"
  val devcompat = Seq("ucb-art", "dsptools")
  val device = new SimpleDevice(devname, devcompat) {
    override def describe(resources: ResourceBindings): Description = {
      val Description(name, mapping) = super.describe(resources)
      Description(name, mapping)
    }
  }
  // make diplomatic TL node for regmap
  override val mem = Some(TLRegisterNode(address = Seq(csrAddress), device = device, beatBytes = beatBytes))
}

对于任何愚蠢的错误,我提前表示歉意,因为我是一个试图完成他的第一个项目的初学者。谢谢

Rocket TinyCore 使用默认暂存器而不是后备存储器。此暂存器 0x800000000x80003fff 与 memport 的地址范围重叠。

您必须删除内存。这就是 chipyard 的 TinyRocketConfig 所做的。此配置应生成一个设计(只是没有 L2 缓存或后备内存)。

class TinyRocketConfig extends Config(
  new chipyard.config.WithTLSerialLocation(
    freechips.rocketchip.subsystem.FBUS,
    freechips.rocketchip.subsystem.PBUS) ++                       // attach TL serial adapter to f/p busses
  new chipyard.WithMulticlockIncoherentBusTopology ++             // use incoherent bus topology
  new freechips.rocketchip.subsystem.WithNBanks(0) ++             // remove L2$
  new freechips.rocketchip.subsystem.WithNoMemPort ++             // remove backing memory
  new freechips.rocketchip.subsystem.With1TinyCore ++             // single tiny rocket-core
  new chipyard.config.AbstractConfig)

如果您想在设计中包含 InclusiveCache,您可以尝试使用 chipyard TinyRocketConfig 的修改版本。尽管目前,您似乎并没有在处理整个 L2 缓存,而且我认为它在微架构上未与 TinyCore 一起使用。如果您只是需要更大的暂存器,您可以修改暂存器以包含更多集:

class WithModifiedScratchPad extends Config((site, here, up) => {
  case RocketTilesKey => up(RocketTilesKey, site) map { r =>
    // each set is currently 64 bits
    r.copy(dcache = r.dcache.map(_.copy(nSets = 2048 /*128kb scratchpad*/))) }
})