【发布时间】:2022-07-23 12:07:48
【问题描述】:
我正在尝试通过前端总线将这些相当大的 DMA 传输到内存。前端总线已准备就绪此时没有其他客户端在争夺前端总线。我在第 15 次 2kB 传输中连接的 AXI 客户端无法完成传输,因为FifoFixer 的停顿信号变高并且永远不会下降。我正在努力,希望有人能帮助我理解以下代码行(以及其他外交小部件),以了解为什么 stall 变高,AXI 客户端的 wready 信号变低,以及交易永远不会完成。
val stalls = edgeIn.client.clients.filter(c => c.requestFifo && c.sourceId.size > 1).map { c =>
val a_sel = c.sourceId.contains(in.a.bits.source)
val id = RegEnable(a_id, in.a.fire() && a_sel && !a_notFIFO)
val track = flight.slice(c.sourceId.start, c.sourceId.end)
a_sel && a_first && track.reduce(_ || _) && (a_noDomain || id =/= a_id)
}
val stall = stalls.foldLeft(Bool(false))(_||_)
对于每个 w 通道传输,awaddr 通道握手使用相同的 aw 通道 ID。
Tilelink A 通道握手发生在前 64 个字节,然后 a_ready 信号永远变低,即使前端总线和 FifoFixer 正在接收 a_ready 高信号。
我的外交小部件连接:
( dmaDDRNode
:= TLBuffer(BufferParams.default)
// := TLFIFOFixer(TLFIFOFixer.all) // included in fromPort
:= TLWidthWidget(8)
:= AXI4ToTL()
:= AXI4UserYanker(capMaxFlight=Some(16)) // Might want to cap max flight # but I don't know what that cap should be - ME
:= AXI4Fragmenter()
:= AXI4IdIndexer(idBits=3)
// := AXI4Buffer()
:= dmaTop.ddrMaster)
fbus.fromPort(Some("DMA_DDR_MASTER"))() := dmaDDRNode
我怀疑它可能是使用wready 来确定下一个wvalid 的DMA 引擎?这可能违反一些解耦假设。这可能与 capMaxFlight 为 16 岁有关,但通过前总线完成的所有其他传输。
【问题讨论】:
标签: chisel rocket-chip