Как выбрать параметры / виджеты TLManager для открытого SystemBus? - PullRequest
0 голосов
/ 11 июня 2019

Я провожу некоторые эксперименты с Rocket Chip, где я манипулирую значением по умолчанию ExampleRocketSystem, чтобы выставить порт TL-C (который в конечном итоге будет подключен к памяти) на границе Системы.

Я делаю это в два этапа: (1) преобразование примера системы из памяти AXI4 в память TL-UH, а затем (2) миграция (структурно) шины памяти и сопутствующего обеспечения вне системы и подключить это через порт TL-C между системой и тестовым жгутом.

Версия TL-UH передает регрессии со следующим (и использует взломанную версию Rocket Chip, которая разбивает каждую шину на непересекающуюся черту):

trait CanHaveMasterTLMemPort extends BareSubsystem with MBus {
  val module: CanHaveMasterTLMemPortModuleImp
  val portName: String = "tlMem"

  /** The external TileLink node */
  val memTLNode: Option[TLManagerNode] = p(ExtMem).map { case MemoryPortParams(memPortParams, nMemoryChannels) =>
    val portName = "tlmem"
    val device = new MemoryDevice

    val memTLNode = TLManagerNode(
      Seq.tabulate(nMemoryChannels) { channel =>
        val base = AddressSet.misaligned(memPortParams.base, memPortParams.size)
        val filter = AddressSet(channel * mbus.blockBytes, ~((nMemoryChannels-1) * mbus.blockBytes))

        TLManagerPortParameters(
          managers = Seq(
            TLManagerParameters(
              address            = base.flatMap(_.intersect(filter)),
              resources          = device.reg("mem"),
              regionType         = RegionType.UNCACHED,
              executable         = memPortParams.executable,
              supportsGet        = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsPutPartial = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsPutFull    = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsArithmetic = TransferSizes.none,
              supportsLogical    = TransferSizes.none,
              fifoId             = Some(0)
            )
          ),
          beatBytes = memPortParams.beatBytes
        )
      }
    )

    memTLNode := mbus.toDRAMController(Some(portName)) { TLEphemeralNode() }

    memTLNode
  }

}

Тогда связанный с TL-C залог выглядит примерно так (что не работает):

trait CanHaveMasterTLCMemPort { this: BareSubsystem with SBus =>
  val module: CanHaveMasterTLCMemPortModuleImp

  /** The external TileLink node */
  val memTLNode: Option[TLManagerNode] = p(ExtMem).map { case MemoryPortParams(memPortParams, nMemoryChannels) =>
    val device = new MemoryDevice

    val mbusParams = p(MemoryBusKey)

    val memTLNode = TLManagerNode(
      Seq.tabulate(nMemoryChannels) { channel =>
        val base = AddressSet.misaligned(memPortParams.base, memPortParams.size)
        val filter = AddressSet(channel * mbusParams.blockBytes, ~((nMemoryChannels-1) * mbusParams.blockBytes))

        println(base.flatMap(_.intersect(filter)))

        TLManagerPortParameters(
          managers = Seq(
            TLManagerParameters(
              address            = base.flatMap(_.intersect(filter)),
              resources          = device.reg("mem"),
              regionType         = RegionType.UNCACHED,
              executable         = memPortParams.executable,
              supportsAcquireT   = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsAcquireB   = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsArithmetic = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsLogical    = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsGet        = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsPutFull    = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsPutPartial = TransferSizes(1, memPortParams.beatBytes * 8),
              supportsHint       = TransferSizes(1, memPortParams.beatBytes * 8),
              fifoId             = Some(0)
            )
          ),
          beatBytes = memPortParams.beatBytes,
          endSinkId = 4
        )
      }
    )

    sbus.toFixedWidthPort(Some("mem")){ memTLNode }

    memTLNode
  }

}

Используя последнее, я сталкиваюсь с ошибками TLMonitor (в мониторах, сгенерированных в подключении toFixedWidthPort выше), где я пытаюсь проверить неуправляемый адрес (0x0, т.е. не в основной памяти) , Если я использую конфигурацию TL-UH, эти зонды отображаются как правильно управляемый адрес (например, что-то в основной памяти, например 0x80000040).

Кажется, это должно быть легко, поскольку это чисто структурный рефакторинг следующего:

  1. Переместить вспомогательные элементы (ww и bh из системы)
  2. Переместить шину памяти за пределы системы и в жгут проводов
  3. Определите IO и подключите все

Я могу сделать это, вручную изменив FIRRTL конфигурации TL-UH, чтобы получить работающую конфигурацию TL-C. Тем не менее, я что-то напортачу при попытке сделать это с Diplomacy.

Может кто-нибудь уточнить, что я делаю неправильно с моим определением TLManagerNode или какие дополнительные дипломатические виджеты мне нужно разместить между системной шиной и TLManagerNode, чтобы это работало?

В качестве альтернативы, есть ли способ избежать определения параметров узла TLManager и просто позволить дипломатии выяснить это?

...