【问题标题】:How to add a sbus master to rocket-chip periphery如何将 sbus 主机添加到火箭芯片外围设备
【发布时间】:2018-09-03 02:23:52
【问题描述】:

我正在尝试在火箭芯片上实现类似 DMA 的外围设备。 意思是连接到 pbus 并由寄存器控制的模块。 它还有一个连接到 sbus 的 master。

我遵循sifive 格式来附加寄存器控制的外围设备,没有任何问题。 我的问题是如何添加 sbus master ?,下面是我在走到死胡同之前尝试过的。

在附加参数类中我添加了 sbus:

case class dmaAttachParams(
    dma       : dmaParams,
    controlBus: TLBusWrapper,
    masterBus : TLBusWrapper, // <-- my addition 
    ....
) (implicit val p: Parameters) 

然后我修改了工厂对象中的attach方法:

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 问题论坛中,他们不再回答支持问题。因此,如果那里的人可以在这里回答,那就太好了,因为我真的被困在这里。

附:只需添加调用 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
}  

确实从 SBUS 上的 dma 创建了一个耦合器,但它没有连接到 dma 外围设备。有什么想法吗?

【问题讨论】:

    标签: chisel rocket-chip


    【解决方案1】:

    我不明白你的“更新”出了什么问题,但这应该可以:

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

    【讨论】:

    • 感谢 Henry Cock 的回复,但您的建议不起作用。就像在我的情况下,在 SBUS 上创建了一个耦合器,但它没有连接到外围。就像dma.mnode 是空的。
    【解决方案2】:

    我已经设法通过对从站连接方式进行逆向工程来连接 SBUS。 如果有人可以/想要详细说明,请随时这样做。

    我在 DMA 外围设备中添加了一个“TLOutwardCrossingHelper”字段,如下所示:

    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 上的耦合器。 我假设交叉对象对节点做了一些事情,但我不知道是什么。

    【讨论】:

      猜你喜欢
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多