Zynq-7000 SoC,AXI - AXI_HP访问OCM和DDR时可能发生死锁

描述

当AXI_HP源和另一个源(例如DMAC)以相互依赖的方式生成对OCM和DDR的访问时,PS AXI互连可能会出现死锁。

通过让其中一个源仅向一个目标(OCM或DDR)发出请求或将AXI_HP接口的未完成写入次数限制为一次写入,可以避免死锁。

有问题的来源包括成对的AXI_HP接口和中央互连(DMAC,IOP主控等)。 APU内存请求(CPU和ACP)没有问题。

影响: 重大的。系统可以挂起。
变通办法: 请参阅文章详细信息部分。
受影响的配置: 使用AXI_HP接口进行设计
受影响的器件版本: 请参阅(Xilinx答复47916) - Zynq-7000设计咨询主答复记录

当两个源以特定顺序访问OCM和DDR时,可能会发生死锁情况。有三个源可以影响死锁条件。源不包括来自APU(CPU和ACP接口)的内存请求。

每个访问OCM和DDR的这些源中的两个的任意组合都可能导致死锁条件:

  • AXI_HP {1,0}作为一对
  • AXI_HP {3,2}作为一对

中央互连(包括DMAC,IOP主站等)

例如,AXI_HP {1:0}包括访问OCM的AXI_HP0和访问DDR的AXI_HP1(两个主器件都在相同的HP对中)。

不会发生死锁的示例:

  • AXI_HP对不能同时访问OCM和DDR
  • 中央互连不访问OCM和DDR
  • AXI_HP0访问OCM,AXI_HP3访问DDR(不同的AXI_HP对)

因此,再次,对于发生死锁的情况,两个源必须都访问OCM和DDR。

其中一个来源必须是AXI_HP对中的一个。另一个源可以是连接到中央互连的其他AXI_HP对或主器件。


除了访问OCM和DDR的两个源中的每一个之外,它们还需要以特定的序列顺序进行访问。

以下是显示序列的具体示例:

AXI_HP大师 DMA控制器主站
AXI_HP_DDR1_1(到DDR端口1) DMA_OCM(到OCM)
AXI_HP_DDR1_2(到DDR端口1) DMA_ DDR2(到DDR端口2)
AXI_HP_OCM(到OCM)


写地址和写数据独立地在不同的通道上传输;但是,在从机上,写数据顺序必须遵循从机接受的写地址序列,即不允许重新排序。

以下是DDR可能的交易顺序:

  • AXI_HP_DDR1_1:AXI_HP的第一次写入成功。
  • DMA_DDR2:DDRC接受该事务,但无法完成,因为写入数据在DMA_OCM之后才可用
  • AXI_HP_DDR1_2:在DMA_DDR2完成之前,DDR无法处理此问题
以下是OCM看到的交易顺序:
  • AXI_HP_OCM:OCM接受该事务,但无法完成,因为写入数据在AXI_HP_DDR1_2完成之后才可用。
  • DMA_OCM:在AXI_HP_OCM完成之前,OCM无法处理此问题。

从上面可以看出,发生了死锁。

解决方法信息 :此问题有几种解决方法:

  • 确保AXI_HP0 / AXI_HP1的主对仅访问OCM或DDR的单个目标,并且来自AXI_HP2 / AXI_HP3主对的访问也仅限于OCM或DDR。
  • 一次对1个未完成事务的AXI_HP端口设置写入限制。对于写入,可以通过将0x0写入AFI_WRCHAN_ISSUINGCAP来完成。
编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-31 14:53:18 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它