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

大家好,我是你们的讲师。今天咱们聊聊AXI总线的基础。说实话,AXI协议在芯片设计里太常见了,几乎每个SoC都离不开它。我刚开始接触AXI时,也被那五个通道搞得晕头转向。但别怕,今天咱们把它拆开揉碎了讲清楚。

1.1 三种AXI协议:你该选哪个?

ARM公司定义了三种AXI协议,各有各的脾气。我习惯这么记:AXI4是全能选手,AXI4-Lite是精简版,AXI4-Stream是流水线狂魔。

协议类型 特点 典型应用
AXI4 支持突发传输,地址+数据分离,最多256拍 DDR控制器、高性能DMA
AXI4-Lite 不支持突发,每次只传1个数据,寄存器级访问 配置寄存器、控制状态寄存器
AXI4-Stream 没有地址通道,只有数据流,无限拍数 视频流、音频流、FIFO接口

嗯,这里要注意:AXI4-Lite虽然简单,但它的握手时序反而容易出问题。我在一个项目中遇到过,因为寄存器访问太频繁,导致AXI4-Lite的VALID-READY握手卡死,整个系统都hang住了。后来加了超时机制才解决。

1.2 五个通道:谁跟谁握手?

AXI4全功能版有五个独立的通道。说白了,就是读和写各走各的路,互不干扰。我画个图你们就明白了。

主设备 (Master) 从设备 (Slave) 写地址通道 (AW) 写数据通道 (W) 写响应通道 (B) 读地址通道 (AR) 读数据通道 (R)

看到了吗?写操作需要三个通道:AW(写地址)、W(写数据)、B(写响应)。读操作只需要两个:AR(读地址)、R(读数据)。

你想想看,为什么读操作不需要响应通道?因为读数据通道本身就带响应信号了。R通道的RRESP字段就是干这个的。

1.3 握手机制:VALID和READY的舞蹈

AXI的握手,说白了就是两个信号在跳舞:VALID(我准备好了)和READY(我准备好了)。只有两个信号同时为高,数据才算真正传输完成。

我见过很多新手在这里栽跟头。他们以为只要VALID拉高,数据就过去了。其实不是的,必须等到READY也拉高,这一拍才算完。

握手三规则:

  • 规则1:VALID不能依赖READY。发送方只要数据有效,就必须拉高VALID,不能等READY。
  • 规则2:READY可以依赖VALID。接收方可以等看到VALID再拉READY。
  • 规则3:一旦VALID拉高,必须保持到握手完成。不能中途撤掉。

为什么会这样设计?说白了就是为了防止死锁。如果双方都在等对方先表态,那就永远卡死了。

1.4 时序收敛的关键:握手机制的实现

好了,重点来了。在RTL里实现握手,时序收敛是个大问题。我给大家看一段我常用的握手代码模板。

// 写数据通道握手示例
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        w_valid <= 1'b0;
        w_data  <= 'b0;
    end else begin
        // 当握手成功或没有新数据时,可以拉低VALID
        if (w_valid && w_ready) begin
            w_valid <= 1'b0;
        end
        // 有新数据要发送
        if (new_data_available) begin
            w_data  <= new_data;
            w_valid <= 1'b1;
        end
    end
end

// 接收端逻辑
assign w_ready = fifo_not_full;  // 只要FIFO不满,就准备好接收

嗯,这里有个坑:如果w_ready组合逻辑路径太长,会严重影响时序。我曾经在一个项目中,w_ready经过了三级组合逻辑,结果频率死活上不去。后来改成寄存器输出,频率直接提升了30%。

我的经验:对于高速设计(>500MHz),建议把READY信号打一拍再输出。虽然多了一个周期延迟,但时序会好很多。这叫「寄存器化READY」。

1.5 AXI4-Stream:没有地址的快乐

AXI4-Stream就简单多了。它只有数据通道,没有地址通道。你想想看,对于视频流这种连续数据,要地址干嘛?直接一股脑传过去就行了。

它的握手和AXI4完全一样,也是VALID+READY。但多了一个TLAST信号,用来标记最后一笔数据。

注意:AXI4-Stream的TLAST必须和最后一笔数据同时有效。如果TLAST晚了一拍,接收端会以为数据还没传完,一直等下去。我调试过这种bug,花了整整两天才找到原因。

1.6 实战建议:从协议到RTL

最后,我给大家几个实在的建议:

  1. 先画时序图:写代码前,把VALID和READY的交互画清楚。我习惯用Excel画,简单直观。
  2. 注意背压:从设备拉低READY就是背压。主设备必须能处理这种情况。
  3. 小心组合环路:VALID和READY互相依赖时,容易产生组合环路。用仿真检查一下。
  4. 加断言:在验证环境里加SVA断言,检查握手协议是否违规。这能帮你提前发现80%的问题。

好了,AXI总线的基础就讲到这里。记住,握手是AXI的灵魂,时序是芯片的生命。下一节咱们会深入讲AXI的突发传输和outstanding机制,那才是真正考验时序功底的地方。

可可精品资料库