1. AXI总线基础:AXI4、AXI4-Lite、AXI4-Stream协议概述,通道与握手信号

大家好,欢迎来到《AXI互连与HLS数据通路实战》的第一章。

咱们做数字IC设计的,天天跟总线打交道。ARM公司推出的AXI协议,现在基本是片上高性能互连的标配了。我记得刚入行那会儿,公司里还在用AHB,后来项目复杂度一上来,AHB那单通道的瓶颈实在扛不住,全公司集体转向AXI。嗯,这一转就是十年,到现在AXI已经衍生出三个兄弟:AXI4、AXI4-Lite、AXI4-Stream。

这一章,咱们就把这三个协议的核心区别、通道结构、握手信号彻底捋清楚。别嫌基础,我见过太多五年经验的工程师,写代码时VALID和READY的时序关系还搞反,导致仿真死锁。咱们从根上把它吃透。

1.1 为什么需要三种AXI?

说白了,一个协议不可能解决所有问题。AXI4、AXI4-Lite、AXI4-Stream各有各的脾气,选错了后面全是坑。

协议类型 主要特点 典型应用场景
AXI4(全功能) 支持突发传输、乱序传输、多地址 DDR控制器、DMA引擎、高性能加速器
AXI4-Lite(轻量级) 不支持突发,单次传输,寄存器级接口 配置寄存器、状态寄存器、控制接口
AXI4-Stream(流式) 无地址,纯数据流,极简握手 视频流、音频流、FIFO接口、数据通路

我个人习惯,做系统架构时先问自己三个问题:

  • 要不要传地址?要地址 → AXI4或AXI4-Lite;不要地址 → AXI4-Stream
  • 要不要一次传多个数据?要突发 → AXI4;单次读写 → AXI4-Lite
  • 对延迟敏感还是对吞吐敏感?吞吐优先 → AXI4-Stream;延迟优先 → AXI4-Lite

核心原则:AXI4-Lite只用来配寄存器,别拿它传大数据。AXI4-Stream只用来传数据流,别拿它做随机访问。AXI4是万金油,但代价是控制逻辑最复杂。

1.2 AXI4的五个独立通道

AXI4最牛的地方,就是读写分离,而且每个方向都有独立的地址通道和数据通道。一共五个通道,各管各的,互不干扰。

  • 读地址通道(AR):发送读请求的地址和控制信息
  • 读数据通道(R):返回读到的数据,以及读响应信号
  • 写地址通道(AW):发送写请求的地址和控制信息
  • 写数据通道(W):发送要写入的数据
  • 写响应通道(B):返回写操作的完成状态

你想想看,读和写完全独立,意味着可以同时进行。这在DDR控制器里特别有用——读请求还没回来,写请求已经发出去了。我在项目中遇到过,用AHB做DDR接口时,读写必须串行,带宽利用率不到50%。换成AXI4后,直接翻倍。

小技巧:AXI4的五个通道各自有独立的握手信号。设计时可以把每个通道当成独立的FIFO来思考,这样逻辑清晰很多。

1.3 AXI4-Lite:精简到极致

AXI4-Lite其实就是AXI4的阉割版。它保留了五个通道的结构,但去掉了所有突发相关的信号。每次只能传一个数据,地址必须对齐。

为什么要保留五个通道?因为要兼容AXI4的互连结构。你可以在同一个总线上混接AXI4和AXI4-Lite的从设备,互连逻辑不用改。嗯,这里要注意:AXI4-Lite的写响应通道(B)是必须的,不像AXI4-Stream可以不要。

我曾经犯过一个低级错误:用AXI4-Lite配寄存器时,把写数据通道的WSTRB信号忘了置位,结果寄存器死活写不进去。查了两天才发现,WSTRB必须全1才能写32位寄存器。这个坑,你们记住。

1.4 AXI4-Stream:没有地址的世界

AXI4-Stream是三个协议里最简单的。它只有数据通道,没有地址通道,也没有响应通道。数据从上游流到下游,像水管一样。

它的信号只有几个:

  • TVALID:上游告诉下游,数据有效
  • TREADY:下游告诉上游,可以接收
  • TDATA:数据总线
  • TLAST:标记数据包的最后一个数据
  • TKEEP/TSTRB:字节使能,类似WSTRB

为什么AXI4-Stream这么流行?因为HLS(高层次综合)生成的IP核,绝大多数数据接口都是AXI4-Stream。你写个C函数,HLS自动给你生成带VALID/READY握手的硬件接口。说白了,这就是硬件版的函数调用——数据进来,数据出去,干净利落。

警告:AXI4-Stream没有地址,所以不能随机访问。如果你需要从数据流中跳转到某个位置,必须在外部加地址映射逻辑。我见过有人试图在Stream上做随机访问,最后把设计搞得一塌糊涂。

1.5 握手信号:VALID与READY的博弈

所有AXI通道的传输,都基于VALID和READY这一对握手信号。这是整个协议的精髓,也是最容易出错的地方。

握手有三种情况:

  1. VALID先有效,READY后有效:发送方先准备好数据,等待接收方就绪。这是最常见的情况。
  2. READY先有效,VALID后有效:接收方提前告知可以接收,发送方随后发送数据。可以节省一个周期。
  3. VALID和READY同时有效:一拍完成传输,效率最高。

我个人习惯,在写RTL时,把握手逻辑写成这样:

// 握手成功条件
assign handshake_done = valid & ready;

// 数据寄存条件
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        data_reg <= '0;
    else if (handshake_done)
        data_reg <= data_in;
end

这里有个关键点:VALID不能依赖READY。也就是说,发送方不能等看到READY才置起VALID。VALID必须由发送方独立产生,READY只是决定传输是否发生。这个规则一旦违反,就会形成组合逻辑环,仿真时直接死锁。

我曾经在调试一个视频处理IP时,发现仿真跑到一半就卡住了。波形一看,VALID和READY互相等待,形成了死锁。原因就是VALID逻辑里引用了READY信号。从那以后,我写握手逻辑时都会加一条注释:VALID独立产生,READY决定传输。

1.6 通道间的依赖关系

五个通道虽然独立,但通道之间是有依赖关系的。比如写操作:

  • 写地址通道(AW)和写数据通道(W)可以同时进行,没有先后顺序
  • 但写响应通道(B)必须在写地址和写数据都完成后才能返回

读操作更简单:

  • 先发读地址(AR),然后等读数据(R)返回
  • 读数据通道可以乱序返回,但必须保证每个读请求都有对应的响应

嗯,这里要提一下乱序传输。AXI4支持ID标签,每个事务分配一个ID,从设备可以按任意顺序返回数据,主设备根据ID重新排序。这个特性在DDR控制器里特别有用——读请求A和读请求B,如果B的数据先准备好,可以先返回B,不用等A。

实战建议:刚开始学AXI时,先别碰乱序。把ID设为固定值,强制顺序传输。等把基本握手和通道逻辑跑通了,再引入ID乱序。否则调试起来,波形里全是ID匹配逻辑,头大。

1.7 本章知识体系总览

下面这张图,把AXI三个协议的关系和通道结构画清楚了。建议保存下来,后面每章都会用到。

AXI总线协议家族 AXI4(全功能) 读地址通道 (AR) 读数据通道 (R) 写地址通道 (AW) 写数据通道 (W) 写响应 (B) • 支持突发传输 • 支持乱序传输 • 读写独立并行 • 支持非对齐传输 • 支持原子操作 • 支持QoS优先级 AXI4-Lite(轻量级) • 保留5通道结构 • 不支持突发,单次传输 • 用于寄存器配置 AXI4-Stream(流式) • 无地址,纯数据流 • 仅需VALID/READY握手 • 用于视频/音频/FIFO 核心握手信号:VALID + READY 发送方 → VALID(数据有效) 接收方 → READY(可以接收) 传输条件:VALID & READY = 1

这张图把三个协议的关系和通道结构都画出来了。AXI4是大哥,功能最全;AXI4-Lite是小弟,专配寄存器;AXI4-Stream是水管工,只管流数据。三个协议共享同一套握手机制——VALID和READY,这是所有AXI设计的基石。

本章核心要点:

  • AXI4有5个独立通道,读写并行,支持突发和乱序
  • AXI4-Lite是AXI4的子集,单次传输,用于寄存器接口
  • AXI4-Stream无地址,纯数据流,极简握手
  • VALID必须独立产生,不能依赖READY
  • 握手成功条件:VALID & READY = 1

好了,这一章就到这里。内容不多,但都是基本功。下一章咱们会深入AXI4的时序细节,看看每个通道的信号到底怎么对齐,怎么处理边界情况。到时候我会拿一个真实的DMA控制器设计来拆解,保证干货满满。


可可精品资料库