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)机制实现。
流程是这样的:
- 主设备发起独占读(ARLOCK=0b01),从设备返回数据,并记录该地址被「监视」
- 主设备计算新值
- 主设备发起独占写(AWLOCK=0b01),从设备检查该地址是否被其他主设备修改过
- 如果没被修改,写成功,返回EXOKAY响应
- 如果被修改了,写失败,返回OKAY响应(注意不是EXOKAY)
你看,独占访问不会阻塞总线,其他主设备可以正常访问。只有在你真正要写的时候,才检查一下有没有冲突。这比锁定访问灵活多了。
关键区别:锁定访问是「我占着茅坑不拉屎」,独占访问是「我先看看坑里有没有人,没人我再拉」。显然独占访问更高效。
3.5 知识体系总览
说了这么多,我画了一张图帮你梳理一下本章的知识结构:
这张图把本章的知识点串起来了。你看,突发传输是基础,地址对齐影响效率,突发长度和大小决定传输量,原子访问解决多核一致性问题。每个属性都有它的用途和代价,设计时得权衡着来。
我的个人经验:刚开始学AXI时,别急着把所有属性都用上。先掌握突发传输和地址对齐,把基础打牢。原子访问这种高级特性,等遇到多核场景再深入研究也不迟。
好了,这一章的内容就到这里。记住,AXI交易属性不是孤立的知识点,它们在实际设计中是相互影响的。比如你选了一个非对齐地址,突发长度和突发大小的组合就得跟着调整。多实践、多踩坑,慢慢就熟练了。