3. AXI读事务
大家好,我是你们的芯片验证讲师。今天我们来聊聊AXI读事务。说实话,读事务看起来比写事务简单,但坑一点都不少。我见过太多工程师在R通道的时序上翻车,尤其是乱序传输那部分,稍不留神就出问题。
咱们先理清一个概念:AXI读事务由两个通道组成——AR(读地址)通道和R(读数据)通道。这两个通道是独立的,但又有严格的依赖关系。你想想看,没有地址,数据从哪来?
3.1 AR通道:读地址的发起
AR通道负责把读地址发给从设备。它的握手信号和AW通道类似:ARVALID和ARREADY。主设备拉高ARVALID,从设备拉高ARREADY,一拍握手完成。
我个人习惯在验证时特别关注ARADDR的地址对齐问题。AXI协议要求读地址必须与突发大小对齐。举个例子,如果你用4字节的突发大小,地址必须是4的倍数。我在项目中遇到过一例,设计人员把地址写成了0x1001,结果从设备直接返回SLVERR,查了半天才发现是地址没对齐。
AR通道关键信号速查表
| 信号 | 方向 | 描述 |
|---|---|---|
| ARID | 主→从 | 读地址ID,用于标识事务 |
| ARADDR | 主→从 | 读起始地址 |
| ARLEN | 主→从 | 突发长度(实际传输次数 = ARLEN + 1) |
| ARSIZE | 主→从 | 每拍数据字节数 |
| ARBURST | 主→从 | 突发类型(FIXED/INCR/WRAP) |
| ARVALID | 主→从 | 地址有效指示 |
| ARREADY | 从→主 | 从设备准备好接收地址 |
3.2 R通道:读数据的返回
R通道比AR通道复杂得多。它不仅要传数据,还要传响应状态。R通道的信号包括RDATA、RRESP、RLAST、RID和RVALID/RREADY。
这里有个容易忽略的点:R通道的RLAST信号。它只在最后一拍数据时拉高。我刚开始做验证时,总以为RLAST和写事务的WLAST一样简单,直到有一次发现从设备在非最后一拍也拉高了RLAST,导致主设备提前结束读事务,丢了好几笔数据。
避坑指南:我曾经在调试一个DMA控制器时,发现读数据总是少一拍。追了三天波形,最后发现是RLAST的时序有问题——从设备在倒数第二拍就拉高了RLAST。记住:RLAST必须与最后一笔RDATA同时有效,不能早也不能晚。
3.3 读地址与读数据的关系
AR通道和R通道之间是什么关系?说白了,就是「一发一收」。主设备通过AR通道发出一个读请求,从设备通过R通道返回对应的数据。
但这里有个关键点:读事务的完成顺序不一定和发起顺序一致。这就是我们接下来要讲的乱序传输。
为什么会这样?因为从设备内部可能有多个处理单元,或者访问不同存储区域的速度不同。比如你同时发起了两个读请求:一个读SRAM,一个读DDR。DDR的延迟可能比SRAM大,所以SRAM的数据先回来,DDR的数据后回来。这完全合理。
3.4 乱序传输与ID管理
乱序传输是AXI协议的一大特色,也是验证中的难点。它的核心机制就是ID管理。
每个读事务都有一个ARID。从设备返回数据时,RID必须与对应的ARID一致。主设备通过RID来区分不同的事务,从而支持乱序返回。
举个例子:主设备发了三个读事务,ID分别是A、B、C。从设备可能先返回C的数据,再返回A的数据,最后返回B的数据。只要RID能正确标识,主设备就能把数据归到正确的事务中。
我的经验:在验证乱序传输时,我建议至少构造三种场景:
- 顺序返回:最简单的情况,所有事务按发起顺序返回
- 完全乱序:返回顺序与发起顺序完全相反
- 部分乱序:部分事务交错返回
这三种场景基本能覆盖90%的乱序问题。
ID管理还有一个重要规则:同一ID的事务必须保持顺序。什么意思?如果你用同一个ID发了两个读请求,从设备必须按顺序返回这两个事务的数据。不能先返回第二个,再返回第一个。这是协议强制要求的。
我见过有人踩过这个坑:设计人员为了省事,所有读事务都用同一个ID,结果从设备又支持乱序,导致数据完全错乱。嗯,这种问题查起来特别痛苦,因为波形上看不出明显错误,只有比对数据时才发现对不上。
3.5 读事务的时序图
下面我用一张SVG图来展示读事务的完整时序。这张图是我自己画的,包含了AR通道和R通道的交互过程。
从时序图可以看出,AR通道在T0到T1之间完成握手,地址0x1000被发送出去。从设备经过一段延迟后,在T3开始返回数据。这里返回了两拍数据(D0和D1),RLAST在T5拉高,表示这是最后一拍。
3.6 验证中的常见问题
最后,我总结几个读事务验证中常见的问题:
- RID不匹配:返回数据的RID与发起时的ARID不一致。这通常是因为从设备内部ID管理逻辑有bug。
- RLAST缺失或提前:RLAST没有在最后一拍拉高,或者提前拉高。这会导致主设备收错数据量。
- 乱序越界:同一ID的事务被乱序返回,违反了协议要求。
- 数据总线冲突:多个从设备同时驱动RDATA,导致数据竞争。这在多从设备系统中容易出现。
特别提醒:我曾经在一个多主多从的系统中,发现两个主设备同时读同一个从设备,结果从设备的R通道数据被覆盖了。查到最后,是从设备的仲裁逻辑没做好,两个读请求的返回数据在内部总线上打架。这种问题用断言检查最容易发现,建议大家在验证环境里加上RVALID和RDATA的互斥断言。
好了,关于AXI读事务的内容就讲到这里。记住:AR通道是问路,R通道是带路。ID就是门牌号,乱序就是快递员可以随便跑,但门牌号不能搞错。把这些概念理清了,读事务的验证就成功了一大半。