4、AXI传输特性:突发传输、乱序传输、交织传输、原子访问
好,咱们今天来聊聊AXI总线的几个核心传输特性。说实话,这几个特性是AXI高性能的基石。你想想看,如果没有它们,AXI跟那些老掉牙的并行总线也没什么区别。
我个人习惯把这四个特性分成两组来理解:突发和乱序是提升吞吐量的,交织和原子访问是解决一致性问题的。当然,它们之间也有千丝万缕的联系。
4.1 突发传输(Burst)
突发传输,说白了就是一次握手,传一堆数据。我刚开始做验证的时候,总觉得这玩意儿不就是个计数器嘛,有啥好研究的?后来踩了坑才明白,这里面的门道深着呢。
AXI的突发传输有三个关键参数:
- AxLEN:突发长度,表示一次突发传输的数据拍数。注意,实际传输的拍数是
AxLEN + 1。 - AxSIZE:每一拍的数据字节数,必须是2的幂次方,且不能超过数据总线宽度。
- AxBURST:突发类型,有FIXED、INCR、WRAP三种。
这里我重点说说WRAP突发。很多新手搞不清楚它的地址回绕规则。我举个例子:
// 假设:AxSIZE = 4 (4字节), AxLEN = 3 (4拍), 起始地址 = 0x34
// 地址对齐到 4 * 4 = 16 字节边界,即 0x30
// 传输地址序列:
// 拍0: 0x34
// 拍1: 0x38
// 拍2: 0x3C
// 拍3: 0x30 (回绕到边界)
嗯,这里要注意:WRAP突发的起始地址不能正好在回绕边界上,否则就退化成INCR了。我在项目中遇到过有人这么用,结果仿真死活不对,查了半天才发现是地址配错了。
核心要点:突发传输的地址计算,一定要考虑地址对齐和边界回绕。验证的时候,建议用随机约束把边界情况都覆盖到。
4.2 乱序传输(Out-of-Order)
乱序传输,这是AXI最骚的操作之一。为什么需要乱序?你想想看,如果总线只能按顺序处理事务,那效率得多低啊。
AXI通过ID标签来实现乱序。每个事务都有一个ID,从设备返回的响应必须携带相同的ID。主设备根据ID来匹配请求和响应。
我个人习惯把ID比作快递单号。你寄了三个包裹,快递员可以按任意顺序送达,你只要看单号就知道哪个包裹到了。
乱序传输有几个关键规则:
- 同一ID的事务必须保序。也就是说,如果你用同一个ID发了两个写请求,那它们的写响应必须按顺序返回。
- 不同ID的事务可以乱序。这是提升性能的关键。
- 读和写使用独立的ID空间。读ID和写ID可以相同,但互不影响。
实战技巧:我曾经在一个项目中,为了最大化乱序效果,给每个master分配了多个ID。比如一个DMA控制器,我给它配了8个读ID和8个写ID。这样它就可以同时发起多个未完成的事务,总线利用率直接拉满。
4.3 交织传输(Interleaving)
交织传输,很多人把它跟乱序搞混。其实它们不一样。乱序说的是事务级别的乱序,交织说的是数据传输阶段的交叉。
具体来说,交织传输允许来自不同事务的数据拍在数据总线上交替传输。比如:
// 事务A: 读地址0x100, 长度4
// 事务B: 读地址0x200, 长度4
// 数据总线上的可能顺序:
// 拍0: A的数据拍0
// 拍1: B的数据拍0
// 拍2: A的数据拍1
// 拍3: B的数据拍1
// ... 以此类推
交织传输的好处是,它可以让数据总线保持忙碌,不会因为某个慢速从设备而阻塞整个总线。
但是,交织传输对从设备的设计要求很高。从设备必须能够缓存多个事务的数据,并且能正确地将数据拍与对应的事务关联起来。
注意:AXI协议并没有强制要求从设备支持交织传输。实际上,很多从设备实现的是非交织模式,即一个事务的所有数据拍连续传输完,再传输下一个事务的数据。如果你的主设备支持交织,但从设备不支持,那就要小心了——可能会造成数据混乱。
4.4 原子访问(Atomic Access)
原子访问,这是多核系统中保证数据一致性的关键机制。AXI通过独占访问(Exclusive Access)和锁定访问(Locked Access)来实现原子操作。
独占访问是最常用的。它的工作流程是这样的:
- 主设备发起一个独占读请求(ARLOCK=01)。
- 从设备返回数据,并记录这个地址被"监视"了。
- 主设备根据读到的数据进行计算。
- 主设备发起一个独占写请求(AWLOCK=01),携带计算后的新数据。
- 从设备检查这个地址是否被其他主设备修改过:
- 如果没有被修改,写操作成功,返回OKAY响应。
- 如果被修改了,写操作失败,返回EXOKAY响应。
嗯,这里要注意:独占访问必须成对出现,即一个独占读后面必须跟一个独占写。如果只读不写,或者只写不读,那就不叫原子操作了。
我曾在项目中遇到过一个问题:某个CPU核执行原子操作时,独占读和独占写之间插入了其他事务,导致独占写总是失败。后来发现是总线仲裁器的问题,它没有保证独占访问的原子性。
避坑指南:我曾经在验证一个多核系统时,发现原子操作偶尔会失败。查了三天,最后发现是缓存一致性问题——某个核的独占读命中了缓存,但缓存行已经被另一个核修改了。解决方案是:在独占读之前,先执行缓存行无效化操作。
4.5 四种特性的关系与对比
为了让你更直观地理解这四种特性,我画了一张图:
从这张图可以看出:
- 突发和乱序是"量"的提升,让总线能处理更多数据。
- 交织和原子访问是"质"的保障,确保数据正确性和一致性。
- 它们不是互斥的,而是可以同时使用的。比如,你可以发起一个突发长度为16的独占读请求,并且给它分配一个独立的ID,让它与其他事务乱序执行。
| 特性 | 作用域 | 关键信号 | 对性能的影响 |
|---|---|---|---|
| 突发传输 | 单个事务 | AxLEN, AxSIZE, AxBURST | 减少握手开销,提升吞吐量 |
| 乱序传输 | 多个事务 | AxID, 写响应ID | 提高并发度,降低延迟 |
| 交织传输 | 数据总线 | WID, RID | 提高数据总线利用率 |
| 原子访问 | 内存一致性 | AxLOCK, 响应信号 | 保证正确性,可能降低性能 |
我的建议:在设计AXI系统时,不要盲目追求所有特性。先搞清楚你的应用场景。如果是单master系统,乱序和交织基本用不上。如果是多核系统,原子访问是必须的。突发传输嘛,任何时候都用得上,建议默认开启。
好了,关于AXI的四个传输特性,我就讲到这里。记住,理论是死的,应用是活的。多在实际项目中体会,才能真正理解它们的精髓。
可可精品资料库