3. AXI交易属性:突发传输、地址对齐与非对齐传输、突发长度与突发大小、原子访问

大家好,我是你们的芯片设计讲师。今天我们来聊聊AXI总线里最核心的几个交易属性。说实话,这些概念在协议手册里写得挺枯燥的,但实际项目中你天天都要跟它们打交道。我当年刚接触AXI时,就被突发长度和地址对齐坑过好几次,后来才慢慢摸透了门道。

3.1 突发传输(Burst Transmission)

突发传输,说白了就是一次握手,连续传一堆数据。你想想看,如果每次传一个数据都要重新走一遍地址握手,那效率得多低?

AXI的突发传输有三大要素:起始地址、突发长度、突发大小。这三个参数一确定,整个传输的地址序列就定死了。

核心要点:突发传输中,地址通道只发一次地址,数据通道连续传多个数据。这能大幅减少地址握手开销。

我在项目中遇到过这样一个场景:一个DMA控制器要从DDR搬移1KB数据。如果不用突发,每次传4字节就要发一次地址,总共256次地址握手。用了突发,一次地址就能搞定,效率提升了十几倍。

3.2 地址对齐与非对齐传输

地址对齐这个问题,嗯,很多新手容易搞混。我刚开始做设计时也觉得无所谓,直到有一次验证环境报错,排查了半天才发现是地址没对齐。

什么是对齐? 简单说,就是起始地址能被突发大小整除。比如突发大小是4字节,那起始地址必须是4的倍数(0x0、0x4、0x8...)。

非对齐传输呢?就是起始地址不能被突发大小整除。比如突发大小是4字节,起始地址是0x3,这就是非对齐。

AXI协议是支持非对齐传输的,但代价是什么?我告诉你——额外的数据选通周期。举个例子:

// 突发大小=4字节,起始地址=0x3
// 第一次传输:地址0x3,只传1字节(WSTRB=0b1000)
// 第二次传输:地址0x4,传4字节(WSTRB=0b1111)
// 第三次传输:地址0x8,传4字节(WSTRB=0b1111)
// ... 以此类推

看到了吗?第一次传输只传了1个有效字节,后面才对齐。这浪费了一个数据周期。

避坑指南:我曾经在一个图像处理加速器项目中,因为地址没对齐,导致带宽利用率下降了30%。后来我强制所有地址都按64字节对齐,性能立马就上来了。所以我的建议是:能对齐尽量对齐,除非你有特殊需求。

3.3 突发长度与突发大小

这两个参数是突发传输的「双胞胎」,必须一起理解。

参数 含义 取值范围 说明
突发长度(Burst Length) 一次突发中传输的数据拍数 1~16(INCR类型)
1~16(FIXED类型)
1~16(WRAP类型)
实际传输字节数 = 突发长度 × 突发大小
突发大小(Burst Size) 每拍传输的字节数 1、2、4、8、16、32、64、128字节 由ARSIZE/ AWSIZE信号指定

我个人习惯把突发长度和突发大小看作「几拍」和「每拍多大」。比如突发长度=8,突发大小=4字节,那一次突发总共传32字节。

这里有个坑:突发长度×突发大小不能超过4KB边界。为什么?因为AXI协议规定,一次突发不能跨越4KB地址边界。这是为了简化从设备的设计——每个从设备通常只负责一个4KB地址区间。

小技巧:如果你要传的数据超过4KB,别想着用一次大突发。拆成多个小突发,每个不超过4KB,这样既符合协议,也方便从设备处理。

3.4 原子访问:锁定与独占

原子访问,说白了就是「要么全做,要么不做」。在多核系统中,多个处理器可能同时访问同一块内存,这时候就需要原子操作来保证数据一致性。

AXI提供了两种原子访问机制:锁定访问和独占访问。

3.4.1 锁定访问(Locked Access)

锁定访问用ARLOCK/AWLOCK信号控制。当ARLOCK=1时,表示这是一个锁定读事务。锁定事务的特点是:在锁定事务完成之前,其他主设备不能访问该从设备。

嗯,这听起来很霸道对吧?确实,锁定访问会阻塞总线,影响其他主设备的访问。所以现在的新设计中,我很少看到有人用锁定访问了。

我曾经踩过的坑:在一个多核处理器项目中,我用锁定访问来实现互斥锁。结果发现,锁定事务期间,其他核的DMA访问全被阻塞了,系统性能直接腰斩。后来我改用独占访问,问题就解决了。

3.4.2 独占访问(Exclusive Access)

独占访问是更优雅的原子操作方式。它通过加载-链接/条件存储(Load-Linked/Store-Conditional)机制实现。

流程是这样的:

  1. 主设备发起独占读(ARLOCK=0b01),从设备返回数据,并记录该地址被「监视」
  2. 主设备计算新值
  3. 主设备发起独占写(AWLOCK=0b01),从设备检查该地址是否被其他主设备修改过
  4. 如果没被修改,写成功,返回EXOKAY响应
  5. 如果被修改了,写失败,返回OKAY响应(注意不是EXOKAY)

你看,独占访问不会阻塞总线,其他主设备可以正常访问。只有在你真正要写的时候,才检查一下有没有冲突。这比锁定访问灵活多了。

关键区别:锁定访问是「我占着茅坑不拉屎」,独占访问是「我先看看坑里有没有人,没人我再拉」。显然独占访问更高效。

3.5 知识体系总览

说了这么多,我画了一张图帮你梳理一下本章的知识结构:

AXI交易属性知识体系 AXI交易属性 突发传输 地址对齐/非对齐 突发长度与大小 原子访问 一次地址,多拍数据 减少地址握手开销 对齐:地址%大小=0 非对齐:额外WSTRB周期 长度×大小=总字节数 不能跨越4KB边界 锁定访问(阻塞式) 独占访问(非阻塞式) 核心原则:理解每个属性的用途和代价 设计时优先考虑对齐、合理选择突发参数

这张图把本章的知识点串起来了。你看,突发传输是基础,地址对齐影响效率,突发长度和大小决定传输量,原子访问解决多核一致性问题。每个属性都有它的用途和代价,设计时得权衡着来。

我的个人经验:刚开始学AXI时,别急着把所有属性都用上。先掌握突发传输和地址对齐,把基础打牢。原子访问这种高级特性,等遇到多核场景再深入研究也不迟。

好了,这一章的内容就到这里。记住,AXI交易属性不是孤立的知识点,它们在实际设计中是相互影响的。比如你选了一个非对齐地址,突发长度和突发大小的组合就得跟着调整。多实践、多踩坑,慢慢就熟练了。

可可精品资料库