Как добавить мастер sbus к периферии чип-ракеты - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь реализовать 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. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Мне удалось подключить SBUS путем обратного инжиниринга способа подключения подчиненного. Если кто-то может / хочет уточнить, не стесняйтесь.

Я добавил поле «TLOutwardCrossingHelper» к периферии DMA, например:

class TLdma(params : dmaParams) (implicit p: Parameters) extends dma(params) with HasTLControlRegMap {
  val controlXingMaster : TLOutwardCrossingHelper = this.crossOut(mnode)
}  

обратите внимание, что эквивалентный "TLInwardCrossingHelper" определен в признаке "HasTLControlRegMap", который мы расширяем.

Затем, в методе attach, следующая строка выполнила работу:

_ := TLBuffer(BufferParams.default) := dma.controlXingMaster(params.controlXType)

Таким образом, я смог подключить периферию к соединителю на sbus. Я предполагаю, что объект пересечения что-то делает с узлом, но я не знаю что.

0 голосов
/ 04 сентября 2018

Я не понимаю, что не так в вашем "Обновлении", но это должно работать:

mbus.coupleFrom("master_named_dma") {
    _ := TLBuffer(BufferParams.default) := dma.mnode
}  
...