AXI 协议要求保持以下关系:
- 写响应必须始终跟在它所属的写事务中的最后一个写传输之后。
- 读数据必须始终跟在与数据相关的地址之后。
- 通道握手必须符合在通道握手信号之间定义的依赖关系。
否则,协议不定义通道之间的任何关系。 这意味着,例如,写数据可以在写地址之前出现在接口上。 如果写地址通道包含比写数据通道更多的寄存器级,这种情况可能会发生。同样,写数据可能与地址在同一个周期内出现。
1. 通道握手信号之间的依赖关系
为了防止死锁情况的发生,必须遵循握手信号间存在的依赖规则。 在任何事务中:
- 发送信息的 AXI 接口的VALID信号不能依赖于接收该信息的 AXI 接口READY信号。
- 接收信息的 AXI 接口可以在检测到VALID信号之前等待,然后断言其对应的READY信号。
注意 虽然在断言READY之前等待VALID信号的断言是可以接受的,但在检测到对应的VALID之前断言READY也是可以接受的。 此外,不同通道上的握手信号之间存在依赖关系,AXI4 定义了额外的写响应依赖。
- 单头箭头指向可以在箭头起始信号之前或之后断言的信号。
- 双头箭头指向只有在箭头起始信号的断言之后才能断言的信号。
1.1 读事务依赖
下图展示了读事务握手信号的依赖关系,在一次读事务中:
- master在断言 ARVALID 之前,不必等待slave断言 ARREADY。
- slave可以在断言 ARVALID 之前等待,然后断言 ARREADY。
- slave可以在 ARVALID 被断言之前断言 ARREADY。
- slave在断言 RVALID 来指示有效数据可用之前,必须等待 ARVALID 和 ARREADY 都被断言。
- slave在断言 RVALID 之前,不必等待master断言 RREADY。
- master可以在 RVALID 被断言之前等待,然后断言 RREADY。
- master可以在 RVALID 被断言之前断言 RREADY。
1.2 写事务依赖
下图展示了写事务握手信号的依赖关系,在一次写事务中:
- master在断言 AWREADY 或 WREADY 之前,不必等待slave断言 AWVALID 或 WVALID。
- slave可以在断言 AWVALID 或 WVALID,或两者任意一个之前等待,然后断言 AWREADY。
- slave可以在 AWVALID 或 WVALID,或两者任意一个被断言之前断言 AWREADY。
- slave可以在断言 AWVALID 或 WVALID,或两者任意一个之前等待,然后断言 WREADY。
- slave可以在 AWVALID 或 WVALID,或两者任意一个被断言之前断言 WREADY。
- slave在断言 BVALID 之前,必须等待 WVALID 和 WREADY 都被断言。
- slave在断言 BVALID 之前,还必须等待 WLAST 被断言,因为写响应 BRESP 必须只在写事务的最后一个数据传输之后被信号。
- slave在断言 BVALID 之前,不必等待master断言 BREADY。
- master可以在 BVALID 被断言之前等待,然后断言 BREADY。
- master可以在 BVALID 被断言之前断言 BREADY。
1.3 AXI4 写响应依赖
AXI4 定义了额外的 AXI4 slave写响应依赖性。
注意 这个额外的依赖性反映了 AXI3 中的预期使用情况,因为预计不会有任何组件在地址被接受之前就接受所有写数据并提供写响应。通过发出写响应,slave负责对写事务与所有后续事务进行潜在冲突检查。
下图展示了所有 AXI4 要求的slave写响应握手依赖性。单头箭头指向可以在前一个信号被断言之前或之后断言的信号。双头箭头指向只有在前一个信号被断言后才必须断言的信号。
如下总结了 AXI4 slave写响应握手依赖性。这些依赖性包括:
- master在断言 AWREADY 或 WREADY 之前,不必等待slave断言 AWVALID 或 WVALID。
- slave可以在断言 AWVALID 或 WVALID,或两者任意一个之前等待,然后断言 AWREADY。
- slave可以在 AWVALID 或 WVALID,或两者任意一个被断言之前断言 AWREADY。
- slave可以在断言 AWVALID 或 WVALID,或两者任意一个之前等待,然后断言 WREADY。
- slave可以在 AWVALID 或 WVALID,或两者任意一个被断言之前断言 WREADY。
- slave在断言 BVALID 之前,必须等待 AWVALID、AWREADY、WVALID 和 WREADY 都被断言。
- slave在断言 BVALID 之前,还必须等待 WLAST 被断言,因为写响应 BRESP信号发出必须只在写事务的最后一个数据传输之后。
- master在断言 BVALID 之前,不必等待master断言 BREADY。
- master可以在 BVALID 被断言之前等待,然后断言 BREADY。
- master可以在 BVALID 被断言之前断言 BREADY。