Я провожу некоторые эксперименты с 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
).
Кажется, это должно быть легко, поскольку это чисто структурный рефакторинг следующего:
- Переместить вспомогательные элементы (
ww
и bh
из системы)
- Переместить шину памяти за пределы системы и в жгут проводов
- Определите IO и подключите все
Я могу сделать это, вручную изменив FIRRTL конфигурации TL-UH, чтобы получить работающую конфигурацию TL-C. Тем не менее, я что-то напортачу при попытке сделать это с Diplomacy
.
Может кто-нибудь уточнить, что я делаю неправильно с моим определением TLManagerNode
или какие дополнительные дипломатические виджеты мне нужно разместить между системной шиной и TLManagerNode
, чтобы это работало?
В качестве альтернативы, есть ли способ избежать определения параметров узла TLManager
и просто позволить дипломатии выяснить это?