3、AXI互联架构设计:单主单从、多主多从、AXI Interconnect与AXI Crossbar的选择
做原型验证这几年,我接触最多的就是AXI互联结构。说白了,就是怎么把各个IP核通过AXI总线高效地连起来。很多刚入行的朋友一上来就问:“我用Interconnect还是Crossbar?” 嗯,这个问题其实没有标准答案,得看你的场景。
今天我们就从最简单的单主单从开始,一步步聊到多主多从,最后再掰扯清楚Interconnect和Crossbar到底该怎么选。
3.1 单主单从:最基础的连接
单主单从,就是一个Master(比如CPU)连一个Slave(比如DDR控制器)。这种结构最简单,不需要任何仲裁逻辑。
核心要点: 单主单从模式下,地址映射是1:1的,不存在访问冲突。你只需要关注时序收敛和带宽匹配。
我在项目中遇到过这样的情况:有人觉得单主单从太简单,随便连一下就行。结果原型验证时发现,Master的读请求和Slave的响应之间插了太多寄存器,导致延迟超标。嗯,这里要注意——即使是一对一连接,也要仔细算好每一拍的延迟。
| 参数 | 单主单从 | 注意事项 |
|---|---|---|
| 地址映射 | 1:1 | 无需地址译码 |
| 仲裁 | 不需要 | 无竞争 |
| 数据通道 | 直连 | 注意时序 |
| 适用场景 | 简单系统 | CPU+本地SRAM |
3.2 多主多从:真正的挑战来了
当系统里有多个Master(比如CPU、GPU、DMA)和多个Slave(DDR、SRAM、外设)时,事情就变得复杂了。你想想看,多个Master同时访问同一个Slave怎么办?谁先谁后?
这就引出了两个核心问题:仲裁和地址译码。
3.2.1 仲裁策略
我个人习惯把仲裁策略分成三类:
- 固定优先级:谁优先级高谁先上。简单,但低优先级可能饿死。
- 轮询(Round-Robin):大家轮流来。公平,但延迟不确定。
- 加权轮询:给高带宽Master更多机会。灵活,但实现复杂。
我的经验: 在原型验证中,我建议先用轮询。为什么?因为调试方便。固定优先级容易掩盖问题,加权轮询又太复杂。轮询是最容易定位bug的。
3.2.2 地址译码
多从设备时,每个Master发出来的地址需要被译码,才能知道它要访问哪个Slave。这个译码逻辑通常放在Interconnect或Crossbar里。
我曾经踩过一个坑:地址译码的边界条件没写对,导致某个Slave的地址区间被另一个Slave“吃掉”了。原型验证时,CPU写DDR的数据莫名其妙写到了SRAM里。嗯,从那以后,我每次都会写一个地址映射检查脚本,跑仿真时自动验证。
3.3 AXI Interconnect vs AXI Crossbar
好,到了最核心的部分。Interconnect和Crossbar到底有什么区别?我直接说结论:
AXI Interconnect:共享总线结构,所有Master共享一套数据通道。
AXI Crossbar:全交叉结构,每个Master到每个Slave都有独立通道。
你想想看,Interconnect就像一条单车道,所有车(Master)都挤在这条道上。Crossbar呢,就像多条独立车道,每辆车都有自己的路。
| 特性 | AXI Interconnect | AXI Crossbar |
|---|---|---|
| 资源消耗 | 低 | 高 |
| 并发能力 | 低(一次只能处理一个事务) | 高(可同时处理多个事务) |
| 延迟 | 中等(有仲裁开销) | 低(直连路径) |
| 实现复杂度 | 简单 | 复杂 |
| 适用场景 | 低带宽、少Master | 高带宽、多Master |
3.3.1 什么时候用Interconnect?
我个人建议:当你的系统里Master数量不超过3个,且带宽要求不高时,用Interconnect就够了。比如一个CPU加一个DMA,访问几个低速外设。
注意: Interconnect虽然省资源,但它的瓶颈很明显。如果两个Master同时发起长burst传输,后面的Master会被堵死。我在一个项目里就吃过这个亏——CPU和GPU同时访问DDR,结果GPU的带宽被CPU的cache line fill占满了,帧率直接掉了一半。
3.3.2 什么时候用Crossbar?
当你有多个高带宽Master(比如CPU、GPU、NPU)时,Crossbar几乎是必须的。它能提供真正的并行访问。
我记得有一次做AI芯片的原型验证,系统里有4个Master和6个Slave。一开始图省事用了Interconnect,结果性能死活上不去。换成Crossbar后,带宽直接翻了3倍。嗯,资源消耗确实大了,但FPGA上资源够用的话,Crossbar是更稳妥的选择。
3.4 知识结构图
下面这张图总结了AXI互联架构的核心选择逻辑:
3.5 实战建议
最后,我总结几条实战中的建议:
- 先评估资源:FPGA的LUT和BRAM是有限的。Crossbar虽然好,但资源消耗大。我一般会先算一下每个Slave需要的带宽,再决定。
- 考虑可扩展性:如果未来可能要加Master,建议一开始就用Crossbar。不然改起来很痛苦。
- 注意时钟域:多主多从系统里,时钟域交叉是常见问题。我习惯在Interconnect/Crossbar的边界处加异步FIFO。
- 验证要全面:多主并发访问的case一定要覆盖到。我曾经漏了一个“所有Master同时写同一个Slave”的场景,结果原型验证时死机了。
小技巧: 在原型验证阶段,可以用AXI Monitor来抓取总线上的事务。这样能快速定位是哪个Master出了问题。我每次都会在Interconnect/Crossbar的每个端口上挂一个Monitor,调试效率高很多。
好了,关于AXI互联架构的选择,今天就聊到这里。记住一句话:没有最好的互联结构,只有最合适的。根据你的系统需求、资源预算和验证复杂度,做出合理的选择就行。