1. AXI总线基础回顾:AXI协议概述、通道与握手、突发传输与地址映射
做芯片验证这些年,我接触最多的总线协议就是AXI。说实话,刚入行那会儿,我觉得AXI协议挺复杂的——五个通道、各种握手规则、乱序传输……但后来我发现,只要把几个核心概念吃透了,剩下的都是细节。今天我就带你过一遍AXI的基础,这些都是排查约束冲突的必备知识。
1.1 AXI协议概述
AXI是ARM公司推出的高性能总线协议。它属于AMBA协议家族的一员,目前主流用的是AXI3和AXI4。我个人习惯把AXI理解成「高速公路系统」——地址通道就像入口匝道,数据通道就像主车道,控制信号就是交通规则。
AXI协议有几个关键特点:
- 独立通道架构:读地址、读数据、写地址、写数据、写响应,五个通道各走各的
- 乱序传输:支持Out-of-Order传输,提高总线利用率
- 突发传输:一次地址请求可以传输多个数据
- 非对齐传输:地址不需要对齐到数据总线宽度
核心要点:AXI协议的本质是「地址与数据分离」。地址通道只负责传地址和控制信息,数据通道只负责传数据。这种分离设计让总线效率大幅提升。
我在项目中遇到过一个问题:两个master同时访问同一个slave,结果地址通道握手超时。排查了半天,发现是地址映射配置冲突了。嗯,这就是为什么我们要先打好基础。
1.2 通道与握手机制
AXI有五个独立的通道。每个通道都使用VALID/READY握手协议。说白了就是:发送方说「我有数据要发」(VALID拉高),接收方说「我准备好了」(READY拉高),然后一拍搞定。
握手有三种情况:
- VALID先于READY:发送方先准备好,等待接收方
- READY先于VALID:接收方先准备好,等待发送方
- 同时有效:一拍完成传输,效率最高
你想想看,如果VALID和READY一直互相等待,那就死锁了。我在做验证时,最怕看到的就是握手信号卡死——波形图上VALID和READY都拉高了,但就是没跳变,那八成是约束冲突了。
我的小技巧:排查握手问题时,先看VALID是否稳定拉高,再看READY是否响应。如果VALID一直高但READY始终低,问题大概率在接收方。
五个通道的具体职责:
| 通道名称 | 方向 | 传输内容 |
|---|---|---|
| 读地址通道(AR) | Master → Slave | 读地址、读长度、读大小、突发类型 |
| 读数据通道(R) | Slave → Master | 读数据、读响应、最后标识 |
| 写地址通道(AW) | Master → Slave | 写地址、写长度、写大小、突发类型 |
| 写数据通道(W) | Master → Slave | 写数据、写选通、最后标识 |
| 写响应通道(B) | Slave → Master | 写响应状态 |
1.3 突发传输与地址映射
突发传输是AXI的看家本领。一次突发传输包含一个地址阶段和多个数据阶段。地址阶段只发一次起始地址,然后数据阶段连续传多个数据。
突发传输有三个关键参数:
- AxLEN:突发长度,表示一次突发传多少个数据。AXI3支持1-16,AXI4支持1-256
- AxSIZE:数据宽度,用字节数表示。比如8'b表示64位总线
- AxBURST:突发类型,有FIXED、INCR、WRAP三种
三种突发类型的区别:
- FIXED:每次地址不变,适合访问FIFO或寄存器
- INCR:地址递增,适合访问连续内存
- WRAP:地址递增到边界后回绕,适合Cache Line访问
注意:地址映射是约束冲突的重灾区。我曾经遇到一个案例:两个master的地址区间有重叠,结果写操作互相覆盖,数据全乱了。排查了三天才发现是地址映射表配错了。
地址映射的核心规则:
- 每个slave的地址区间必须唯一,不能重叠
- 地址区间必须是连续的
- 地址对齐要满足AxSIZE的要求
- 突发传输不能跨越4KB边界(AXI协议要求)
为什么不能跨越4KB边界?说白了,这是协议为了简化地址译码器设计。如果允许跨边界,每个slave都要检查地址是否落在自己的区间内,复杂度会大幅上升。
下面我用一张图来展示AXI的核心架构:
这张图展示了AXI的核心架构。五个通道就像五条独立的高速公路,各自有各自的交通规则(握手协议)。Master和Slave之间通过这些通道进行通信。
经验之谈:做AXI验证时,我建议你先画一张地址映射表。把每个slave的基地址、地址范围、对齐要求都列清楚。这样排查约束冲突时,一眼就能看出问题。
突发传输的地址计算也很重要。对于INCR类型,每次传输的地址 = 起始地址 + N × AxSIZE。举个例子:起始地址0x1000,AxSIZE=4(32位),AxLEN=4,那么地址依次是0x1000、0x1004、0x1008、0x100C。
嗯,这里要注意:地址计算时一定要考虑对齐。如果起始地址是0x1001,AxSIZE=4,那第一次传输的地址是0x1001,第二次是0x1005,依此类推。这种非对齐传输在AXI中是允许的,但会降低效率。
我在项目中遇到过最头疼的问题,就是地址映射和突发传输的约束冲突。比如一个slave只支持32位访问,但master发了个64位的突发请求,结果slave直接报错。这种问题在验证阶段就要抓出来,否则流片回来就晚了。
好了,AXI的基础知识就回顾到这里。这些内容虽然基础,但都是排查约束冲突的根基。下一节我们会深入具体的约束规则和排查方法。