Я пытаюсь реализовать DMA-подобную периферию для чипа ракеты.
Имеется в виду модуль, подключенный к pbus и контролируемый регистрами.
к нему также подключен мастер.
Я следовал формату sifive , чтобы без проблем подключать регистры контролируемых периферийных устройств.
У меня вопрос, как мне добавить мастер sbus?, Вот что я пробовал, прежде чем попасть в тупик.
К классу параметров присоединения я добавил sbus:
case class dmaAttachParams(
dma : dmaParams,
controlBus: TLBusWrapper,
masterBus : TLBusWrapper, // <-- my addition
....
) (implicit val p: Parameters)
Затем я изменил метод присоединения в фабричном объекте:
def attach(params: dmaAttachParams): TLdma = {
implicit val p = params.p
val name = s"dma_${nextId()}"
val cbus = params.controlBus
val mbus = params.masterBus // <- my addition
val dma = LazyModule(new TLdma(params.dma))
dma.suggestName(name)
cbus.coupleTo(s"slave_named_name") {
dma.controlXing(params.controlXType) := TLFragmenter(cbus.beatBytes, cbus.blockBytes) := _
}
InModuleBody { dma.module.clock := params.mclock.map(_.getWrappedValue).getOrElse(cbus.module.clock) }
InModuleBody { dma.module.reset := params.mreset.map(_.getWrappedValue).getOrElse(cbus.module.reset) }
// this section is my problem // <-- this section is my addition
mbus.from(s"master_named_name") {
mbus.inwardNode := TLBuffer() := dma.mnode // <- what should i do here ???
}
dma
}
Mndoe - это узел, который я добавил в класс dma следующим образом:
val mnode = TLClientNode(Seq(TLClientPortParameters(Seq(TLClientParameters(name = "dmaSbusMaster")))))
Каким должно быть тело метода mbus.from (), который будет выполнять эту работу?
попытка построить этот код дает эту ошибку:
Caused by: java.lang.IllegalArgumentException: requirement failed: buffer.node (A adapter node with parent buffer inside coupler_from_master_named_name) has 1 inputs and 0 outputs; they must match (Buffer.scala:69:28)
Буду признателен за любую помощь, на форуме, посвященном выпуску github, они больше не отвечают на вопросы поддержки Так что, если кто-то может ответить здесь, это будет здорово, потому что я действительно застрял здесь.
P.S. просто добавив способ вызова метода attach:
trait HasPeripheryDma { this: BaseSubsystem =>
val dmaNodes = p(PeripheryDmaKey).map { ps =>
dma.attach(dmaAttachParams(ps, pbus, sbus))
}
}
Обновление:
Реализация тела метода mbus.from (), как показано ниже:
mbus.from(s"master_named_name") {
mbus.inwardNode := TLBuffer(BufferParams.default) := dma.mnode
}
Создает ли ответвитель из dma на SBUS, но он не связан с периферией dma. Есть идеи?