如何将 sbus master 添加到 rocket-chip 外围设备
How to add a sbus master to rocket-chip periphery
我正在尝试为火箭芯片实现类似外围设备的 DMA。
表示挂接到 pbus 并由寄存器控制的模块。
它还有一个连接到 sbus 的主机。
我按照sifive格式附加寄存器控制外围没有任何问题。
我的问题是如何添加 sbus master ?下面是我在进入死胡同之前尝试过的方法。
附加参数 class 我已经添加了 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 class 的节点,如下所示:
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。只需添加调用附加方法的方式:
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 外围设备。有什么想法吗?
我不明白你的 "Update" 出了什么问题,但这应该有效:
mbus.coupleFrom("master_named_dma") {
_ := TLBuffer(BufferParams.default) := dma.mnode
}
我已经成功地通过对从站连接方式的逆向工程来连接 SBUS。
如果有人 can/wants 要详细说明,请随意这样做。
我在 DMA 外围添加了一个 "TLOutwardCrossingHelper" 字段,如下所示:
class TLdma(params : dmaParams) (implicit p: Parameters) extends dma(params) with HasTLControlRegMap {
val controlXingMaster : TLOutwardCrossingHelper = this.crossOut(mnode)
}
请注意,等效的 "TLInwardCrossingHelper" 定义在我们扩展的 "HasTLControlRegMap " 特征中。
然后,在附加方法中,下一行完成了工作:
_ := TLBuffer(BufferParams.default) := dma.controlXingMaster(params.controlXType)
通过这种方式,我还可以将外围设备连接到 sbus 上的耦合器。
我假设交叉对象对节点做了什么,但我不知道是什么。
我正在尝试为火箭芯片实现类似外围设备的 DMA。 表示挂接到 pbus 并由寄存器控制的模块。 它还有一个连接到 sbus 的主机。
我按照sifive格式附加寄存器控制外围没有任何问题。 我的问题是如何添加 sbus master ?下面是我在进入死胡同之前尝试过的方法。
附加参数 class 我已经添加了 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 class 的节点,如下所示:
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。只需添加调用附加方法的方式:
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 外围设备。有什么想法吗?
我不明白你的 "Update" 出了什么问题,但这应该有效:
mbus.coupleFrom("master_named_dma") {
_ := TLBuffer(BufferParams.default) := dma.mnode
}
我已经成功地通过对从站连接方式的逆向工程来连接 SBUS。 如果有人 can/wants 要详细说明,请随意这样做。
我在 DMA 外围添加了一个 "TLOutwardCrossingHelper" 字段,如下所示:
class TLdma(params : dmaParams) (implicit p: Parameters) extends dma(params) with HasTLControlRegMap {
val controlXingMaster : TLOutwardCrossingHelper = this.crossOut(mnode)
}
请注意,等效的 "TLInwardCrossingHelper" 定义在我们扩展的 "HasTLControlRegMap " 特征中。
然后,在附加方法中,下一行完成了工作:
_ := TLBuffer(BufferParams.default) := dma.controlXingMaster(params.controlXType)
通过这种方式,我还可以将外围设备连接到 sbus 上的耦合器。 我假设交叉对象对节点做了什么,但我不知道是什么。