【问题标题】:Adding a MMIO peripheral to a small rocket core向小型火箭核心添加 MMIO 外围设备
【发布时间】:2022-09-26 16:29:41
【问题描述】:

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

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

[错误] java.lang.IllegalArgumentException:要求失败:端口不能重叠:地址集(0x80000000,0x3fff)地址集(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-chip


    【解决方案1】:

    Rocket TinyCore 使用默认暂存器而不是后备内存。这个暂存器0x800000000x80003fff 与内存端口的地址范围重叠。

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

    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 bytes
        r.copy(dcache = r.dcache.map(_.copy(nSets = 2048 /*128KiB scratchpad*/))) }
    })
    

    【讨论】:

    • 这是否意味着 TinyCore 无法使用内存映射加速器,因为它与内存端口地址范围重叠?
    • 不,你可以!内存映射是从0x00xFFFFFFFF 的任何地址,而不仅仅是内存端口的内存地址。 memport 是“内存”映射到0x800000000x80003fff
    • 谢谢,看来现在我可以用我的 MMIO 加速器生成我的设计了。你知道是否有关于不同配置参数及其效果的详细信息吗?
    • 它在文档计划列表中。目前,最好的 RC 提供的是读取系统和子系统中的Configs.scala 文件,以了解其中的参数和配置(Chipyard 也是如此)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2016-09-14
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多