简体   繁体   English

为什么 FifoFixer 的“失速”信号会永远变高?

[英]Why would FifoFixer's `stall` signal go high forever?

I'm attempting to do these rather large DMA transfers over the frontbus to memory.我正在尝试通过前端总线将这些相当大的 DMA 传输到内存。 The frontbus is ready and no other clients are contending for the front bus at the moment this occurs .前总线已准备就绪,此时没有其他客户端争用前总线 My AXI client connected in its 15th 2kB transfer is unable to finish the transfer because the FifoFixer 's stall signal goes high and never goes back down.我在第 15 次 2kB 传输中连接的 AXI 客户端无法完成传输,因为FifoFixer的停顿信号变高并且永远不会下降。 I'm making an effort and hoping someone can help me to understand the following lines of code (as well as the other diplomatic widgets) to understand why stall goes high, the wready signal to the AXI client goes low, and the transaction never completes.我正在努力,希望有人能帮助我理解以下代码行(以及其他外交小部件),以了解为什么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))(_||_)

The awaddr channel handshake occurs with the same aw channel id for each w channel transfer.对于每个 w 通道传输,awaddr 通道握手使用相同的 aw 通道 id 发生。 在此处输入图像描述 The Tilelink A channel handshake occurs for the first 64 bytes, and then the a_ready signal goes low forever even though the frontbus and the FifoFixer are receiving an a_ready high signal. Tilelink A 通道握手发生在前 64 个字节,然后a_ready信号永远变低,即使前端总线和 FifoFixer 正在接收a_ready高信号。

My diplomatic widget connection:我的外交小部件连接:

    ( 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 

I'm suspecting it could be the DMA engine using wready to determine the next wvalid ?我怀疑它可能是使用wready来确定下一个wvalid的 DMA 引擎? This could violate some decoupled assumption.这可能违反一些解耦假设。 It could have to do with capMaxFlight being 16, but all other transfers through the front bus complete.它可能与capMaxFlight为 16 有关,但通过前总线完成的所有其他传输。

The FifoFixer assures the d_source for the Put operation completes before starting the next A channel transfer. FifoFixer 确保 Put 操作的 d_source 在开始下一个 A 通道传输之前完成。 So, after sending the transfer in the screenshot (source 'hf ), it waits for the d channel to provide an ack for 'hf .因此,在屏幕截图(源'hf )中发送传输后,它会等待 d 通道为'hf提供 ack。 The d channel on the front bus seems to have stopped because one of the TL clients pulled d_ready down low forever.前面总线上的 d 通道似乎已经停止,因为 TL 客户端之一将d_ready拉低了。 The AXI host associated with this TL client is holding its r_ready low after requesting a read, so the FifoFixer is holding stall high.与此 TL 客户端关联的 AXI 主机在请求读取后保持其r_ready低电平,因此stall保持高电平。

While the DAG property assures deadlock-free operation, Diplomacy cannot stop two source nodes from creating a "virtual" connection between each other.虽然 DAG 属性确保无死锁操作,但外交不能阻止两个源节点在彼此之间创建“虚拟”连接。 In my case, one of the AXI source nodes was requesting data that relied on another AXI source node completing its request.在我的例子中,一个 AXI 源节点请求的数据依赖于另一个 AXI 源节点完成其请求。 This ruined the DAG property and created deadlock.这破坏了 DAG 属性并造成了死锁。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM