AXI Interconnect 微架构:互连内部全数据通路拆解
更新时间:2026-09-25。上一篇 AXI Crossbar 与 Interconnect 站在协议行为层面讲清了「解码、仲裁、MUX」三大件,本篇往 RTL 里再走一层,回答这些模块在互连内部具体摆在什么位置、彼此怎么连线、时序在哪里切断。单接口的握手细节可先读 AXI4 协议基础,单级流水的时序器件细节见 AXI 寄存器切片。
本文要回答的问题
- 一笔 AW 从主机端口到从机端口,中间依次穿过哪些模块?读通路和写通路有什么不一样?
- address decoder 的输入输出是什么,one-hot 片选和 DECERR 怎么产生?
- 五通道(AW/W/B/AR/R)的 arbiter 和 MUX 各有几级,为什么不能共用一个 grant?
- upsizer/downsizer 应该放在仲裁前还是仲裁后?register slice 的时序切割点怎么选?
- 加流水降延迟还是去流水省面积,权衡的判据是什么?一个 2x2 互连到底由多少模块拼成?
一、从端口到端口:一笔事务穿过互连的全数据通路
先建立全局视图。一个典型 AXI Interconnect 的数据通路不是「一块大 crossbar」,而是沿事务流向串起来的若干级:主机侧先做解码与接收,中间做仲裁与 MUX,再做宽度/时钟转换,从机侧做输出寄存。五个通道各有一条这样的链路,其中 AW/AR/W 是前向(主机→从机),B/R 是反向(从机→主机),方向相反但模块同构。
这张图对应综合后的真实形态:decoder 是纯组合比较逻辑,arbiter 是带状态的时序逻辑(要记住上一拍 grant 给谁才能轮询),MUX 是纯组合数据选通,register slice 是一级标准 AXISkid 缓冲,width converter 内部还带拼包/拆包计数器。反向的 B、R 链路把这张图倒过来走:从机先穿过输入 slice、仲裁(多个从机的响应同时回一个主机时同样要仲裁)、MUX、位宽还原,再回到主机。
理解了「每通道一条、前向反向同构」,后面所有模块都可以挂到这条流水线上定位。
二、地址解码器:主机出口的第一道组合逻辑
decoder 位于每个主机端口,输入是 AxADDR[31:0](高位参与解码,低位不管)和一张地址映射表,输出是一根 one-hot 片选向量 cs[N-1:0] 加一个错误标记。映射表通常参数化成 (base, mask) 数组,每个从机占一行:
几个实现细节直接影响后端:比较器只比地址高位,低位宽度由最小从机块大小决定(例如外设按 1MB 对齐就只比高 12 位),省掉的比较器面积相当可观;比较结果必须保证 one-hot——地址映射表在参数解析阶段就检查区间重叠,重叠的映射直接报 elaboration 错误,而不是留到仿真;一根 cs 都不亮时,事务不能被丢弃(VALID 已拉起,协议要求必须给响应),互连内部造一个虚拟从机回 DECERR,这个伪从机在 2x2 实例里也要占一个 decode slot。
decoder 是纯组合的,它的输出 cs 直接喂给后级 arbiter 的请求向量:主机 i 的 request[k] = AxVALID_i & cs_i[k]。所以 decoder 到 arbiter 之间的组合路径是地址加法/比较串仲裁判决,常常是频率瓶颈之一,这也是后面 register slice 插入点的候选。
顺带一提地址译码的两种参数风格:一种是全译码,基址和粒度全部展开成比较器,地址表改动要重新综合;另一种是寄存器可配置的基址窗口,每个从机只给有限个对齐档位选择,省比较器但灵活性差。地址图固化的 SoC 用前者,需要兼容多版板子地址分配的平台型设计才值得付后者的面积。
三、五通道各级 arbiter 与 MUX:矩阵是怎么展开的
把视野放到「多主机 × 多从机」,仲裁结构是一个矩阵:每个从机端口、每个通道各有一个 arbiter。M 个主机、N 个从机的互连,仅前向地址与数据通道就有 N×3 个 arbiter(AW/AR/W),反向 B/R 各 M 个(响应回主机侧也可能冲突)。每个 arbiter 的输出 grant 驱动同位置的一个 MUX。
三条必须守死的微架构规则:
- 五通道 grant 互相独立。AW 通道此刻 grant 主机0、W 通道可以 grant 主机1——这正是 AXI 读写并行、写地址写数据分离的价值。共用 grant 等于退化回 AHB,还会死锁。
- 同端口 AW 与 W 的接受顺序要受控。grant 可以不同,但「哪笔 AW 先被从机收下」决定了后续 W 的归属,二者失配就是写数据错乱(下一节展开)。
- 仲裁策略在 arbiter 内部封装,常见是 round-robin 或加权 round-robin,需要一根周期更新的 pointer 寄存器,判决逻辑见 Round-Robin 仲裁器。固定优先级只允许在明确有 QoS 等级的端口用,否则必须加老化,判据见 AXI QoS 服务质量。
MUX 本身只是宽位宽的与或阵列,但注意它要 MUX 的不止数据:AxID(已经过 ID 扩展)、AxLEN/AxSIZE/AxBURST、WSTRB、WLAST、乃至前向的 valid 全部要随 grant 一起切;反向的 ready 则要按 grant 的反方向选通回各主机。valid 跟着数据走、ready 跟着 grant 回,这是 MUX 级最容易写错的一对信号,握手原理见 valid/ready 握手。
四、W 通道路由:在途写表把 AW 与 W 绑定
W beat 不带地址,这是互连数据通路里唯一「通道间有状态耦合」的地方。微架构上靠一张在途写表(write steering table):表的每一项记录 (主机号, 目标从机, 剩余 beat 数或 WLAST 标记)。AW 在从机端口被 grant 并握手成功的那一拍分配表项,该主机随后的 W beat 按表项里的目标从机送进对应从机的 W arbiter,WLAST 握手后释放。
表里有两个绕不开的设计决策。其一是深度:表项数至少要等于该主机端口允许的 outstanding 写事务数,表满时必须反压 AW(不给 AWREADY),而不是拒收 W,否则 W 会先于 AW 到达造成无表可查。outstanding 深度与 ID 并行度的计算见 outstanding 与 ID 保序。其二是释放路径:正常靠 WLAST,异常路径——DECERR、总线超时、ARESETn——都必须扫表释放,表项泄漏的表现是跑几小时后某台主机的 AW 永久拿不到 ready。超时机制见 AXI 错误响应与总线超时。
AXI4 删掉 WID 后,同一主机同端口的 W 严格按 AW 发出顺序匹配,所以表项对同一主机可做成 FIFO 而不是全相联,这能省下不少比较器——这是协议变化直接换来的面积。
五、位宽转换:upsizer/downsizer 的位置与拆包拼包
数据宽度转换器解决「主机总线位宽 ≠ 从机总线位宽」。窄→宽(upsizer)要攒够若干窄 beat 拼成一个宽 beat,宽→窄(downsizer)要把一个宽 beat 拆成多拍发出并重新生成 WSTRB 和长度。它内部就是一个小型拼包缓冲加计数器,打包原理可对照 Stream 位宽适配器。
位置选择有讲究:
- 放在主机侧、仲裁之前:每个主机端口配一个,数量等于主机数;转换后内部统一走宽总线,arbiter/MUX 只需要一套位宽。
- 放在从机侧、仲裁之后:每个从机端口配一个,数量等于从机数;内部总线跟随主机位宽。
工程上几乎总是把内部数据通路统一成系统最宽位宽(例如 128 位),转换器贴着窄的那一端放,让仲裁矩阵只出现一个位宽参数。否则 arbiter 和 MUX 要为每对主从位宽组合参数化,面积和验证成本都爆炸。
downsizer 有个协议细节:宽 beat 拆分后 burst 长度、AxSIZE 都要改写,且拆分出的子序列不能跨 4KB 边界,所以转换器要和 burst 边界检查联动,规则见 burst 类型与 4KB 边界。upsizer 的攒包缓冲在窄 beat 不凑齐整包时(最后一包)要能按 WLAST 提前吐出,靠 WSTRB 标识有效字节,死等整包会把最后一笔写挂住。
跨时钟域的异步 FIFO 与位宽转换是两类模块,不要混写:CDC 只解决时钟,组合位置同理贴端口,原理见 异步 FIFO 做 CDC。
六、Register slice:时序切割点与面积/延迟权衡
register slice 是两端口各自带 valid/ready 的一级缓冲(常见全满 skid 或半满最简实现),对协议透明,代价是每级加一拍延迟、加一份数据寄存器面积。它在数据通路上的插入位置就是时序切割点,候选有三处,切割的路径各不相同:
| 插入点 | 切断的关键组合路径 | 主要收益 |
|---|---|---|
| decoder 之后 | 地址比较 → 仲裁判决 → grant MUX | 解频率瓶颈,最常见 |
| arbiter/MUX 之后 | grant MUX → 从机端口 setup | 保护长走线、跨 die 边界 |
| 从机侧输出级 | 互连内部 → 从机输入 | 隔离从机慢路径,利于后端收敛 |
插入不是越多越好。每级 slice 让一笔事务的地址延迟 +1 拍,对深度依赖的 outstanding 场景(发一笔等一笔的固件轮询)延迟线性叠加;每个 slice 的数据寄存器按内部总线位宽全量复制,128 位总线上一级全满 slice 就是两百多个 FF,M+N 个端口各插两级,面积账单不小。
下面的时序对比展示了同一个握手在无 slice 与有 slice 时的差异:入口侧第 2 拍完成握手后,无 slice 时出口同拍可见;插入一级 slice 后出口推迟到第 3 拍,即一拍的时序切割代价。

还要分清延迟和吞吐:register slice 增加的是事务首拍的穿越延迟,稳态下只要上下游都能连续握手,满负荷的 skid slice 可以做到每个时钟都通过一个 beat,不损失带宽;真正产生气泡的是下游反压与上游valid 交错的场景,半满实现此时会多吃一拍。因此评判一个 slice 配置不能只看延迟周期数,要结合流量模型看有效带宽。
工程判据可以归纳成一句话:先不报 slice 综合一版,用时序报告定位真正违例的那条通道、那一级路径,只在切割点插级。AXI 五通道独立,完全可以只给 W 数据通道插两级(位宽大、走线长)而地址通道零级(位宽窄、对延迟敏感)。单级 slice 的内部结构与时序分析见 AXI 寄存器切片。反过来,若频率有余量而面积紧张,可配置的「直通模式」把 slice 旁路成导线,商用互连 IP 普遍提供这个档位。
七、2x2 互连实例:完整模块组成清单
最后落到一个具体实例:两台主机(CPU、DMA)、两台从机(DDR、外设),内部统一 128 位,主机 64 位、外设 32 位,全配置按前述规则只在关键路径插 slice。逐个模块清点:
模块清单(按类别统计,含五通道):
| 类别 | 数量 | 说明 |
|---|---|---|
| decoder | 2 | 每主机一个,含 2 从机 + DECERR 共 3 个比较槽 |
| upsizer | 2 | 64→128,贴主机;DMA 若已 128 位则该级旁路 |
| 从机侧 arbiter | 6 | 每从机 AW/AR/W 各一个,共 2×3 |
| 主机侧 arbiter | 4 | 每主机 B/R 各一个,共 2×2 |
| MUX | 10 | 与上述 arbiter 一一对应 |
| 在途写表 | 2 | 每主机一份,深度 = 其 outstanding 上限 |
| downsizer | 1 | 128→32,贴外设;DDR 侧无 |
| register slice | 按需 | 示例:W 通道 2 级、AW/AR 各 1 级、B/R 零级 |
| 伪 DECERR 从机 | 1 | decoder 空白地址的响应来源 |
如果把 DMA 也升级为 128 位,它的 upsizer 直接综合成导线,不产生任何逻辑,参数化互连靠这种方式覆盖配置而不必维护多套 RTL。
实例落地时还有一个集成顺序的经验值得记下来:先按地址表验证 decoder 命中与伪 DECERR 响应,再逐通道检查 arbiter 授权,最后才开 upsizer/downsizer 的随机反压测试。倒过来做——一开始就全开位宽转换和多主竞争——一旦波形失配,你无法判断问题在译码、仲裁还是转换器的拍序对齐上,triag 一个简单配置错误可能要翻几个小时波形。分层接线、分层验证,是这类由标准积木拼出来的数据通路最省事的调试姿势。
读这个清单能验证前面的全部结论:面积大头是 10 个宽 MUX 和 slice 寄存器,arbiter 数量由「从机数×前向通道数 + 主机数×反向通道数」决定,转换器贴着窄端口,slice 按通道差异化配置。把 2x2 换成 MxN,只需把表中数量换成公式项,模块种类一个都不多——这就是规则化数据通路的好处。更大规模(十几主十几从以上)时 M×N 的矩阵面积和走线撑不住,架构转向 片上网络 NoC,但单级 router 内部的 decoder/arbiter/寄存器切片与本篇完全同构。换言之,互连从 crossbar 演进到 NoC,替换的只是拓扑组织,基本积木的设计与验证方法可以原样沿用,这也是先吃透本篇这些小模块的长期价值。
这一篇在知识体系里的位置
协议行为层:AXI Crossbar 与 Interconnect、AXI4 协议基础、outstanding 与 ID 保序。子模块深挖:Round-Robin 仲裁器、AXI 寄存器切片、Stream 位宽适配器、异步 FIFO 做 CDC。向上演进与选型:片上网络 NoC 路由、AMBA 总线选型。验证这种结构用 AMBA AXI UVM 环境。
总结
AXI Interconnect 的内部数据通路 = 每主机一个 decoder 出 one-hot 片选,每个从机每个通道各一个 arbiter 加 MUX 且五通道 grant 独立,W 通道靠在途写表按 AW 顺序绑定路由,位宽转换器贴着窄端口把内部总线统一成最宽位宽,register slice 只插在时序报告指出的切割点上用一拍延迟换频率;一个 2x2 互连就是 2 decoder、10 个 arbiter/MUX、若干转换器与按需 slice 的规则化拼装,面积花在宽 MUX 和寄存器、延迟花在 slice 级数上。