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拉高),然后一拍搞定。

握手有三种情况:

  1. VALID先于READY:发送方先准备好,等待接收方
  2. READY先于VALID:接收方先准备好,等待发送方
  3. 同时有效:一拍完成传输,效率最高

你想想看,如果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的地址区间有重叠,结果写操作互相覆盖,数据全乱了。排查了三天才发现是地址映射表配错了。

地址映射的核心规则:

  1. 每个slave的地址区间必须唯一,不能重叠
  2. 地址区间必须是连续的
  3. 地址对齐要满足AxSIZE的要求
  4. 突发传输不能跨越4KB边界(AXI协议要求)

为什么不能跨越4KB边界?说白了,这是协议为了简化地址译码器设计。如果允许跨边界,每个slave都要检查地址是否落在自己的区间内,复杂度会大幅上升。

下面我用一张图来展示AXI的核心架构:

Master (发起者) Slave (响应者) 读地址通道(AR) 读数据通道(R) 写地址通道(AW) 写数据通道(W) 写响应通道(B) 每个通道都有 VALID/READY 握手 地址映射规则:唯一区间 + 连续地址 + 4KB边界对齐 每个Slave的地址区间不能重叠,突发传输不能跨越4KB边界

这张图展示了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的基础知识就回顾到这里。这些内容虽然基础,但都是排查约束冲突的根基。下一节我们会深入具体的约束规则和排查方法。