FPGA 专家 08:AXI 互联设计——Crossbar、仲裁与带宽
本文是
fpga/专家层第 11 篇。AXI 协议见 AXI4 深水区,Zynq 端口分工见 Zynq 数据交互,带宽瓶颈见 DDR 深水区。
一、互联做什么

- 路由:按地址解码到从机;
- 仲裁:多主争同一从口时轮询/加权/优先级排队;
- 转换:AXI3/4/Stream、位宽、时钟域(异步 FIFO)自动转接。
二、带宽真相
- 不是"全并行无冲突":同一条从口的带宽被所有打它的主共享;
- 上限 = 该从口(尤其 DDR)效率带宽;
- 大 DMA 会挤控制小事务 → 给控制口高优先级/走独立口;
- 画主×从带宽矩阵,重点核算 DDR 口;
- 高带宽流用 Stream 直连,绕开 MM crossbar。
三、ID 与死锁
| 点 | 规则 |
|---|---|
| ID 宽度 | 从口 ID ≥ ⌈log2 主数⌉ + 主最大 ID,窄了截断/错路由 |
| 响应路由 | 互联按扩展 ID 把响应回正确主 |
| 写数据交错 | 不同 ID 写数据可交错,按 ID 重组,配置要支持 |
| 死锁 | 避免环式等待;控制每主 outstanding;写/读通道独立缓冲 |
四、时序与地址规划
- register slice:端口/内部打拍提频,加 1 拍延迟;
- 拆大 crossbar 为小互联;位宽换频率;
- 地址段:不重叠、按大小对齐、集中分配、留 decode error 段;
- 多主地址域统一(DMA 主与 PS 访问同一 DDR)。
五、互联微结构:NIC/Crossbar 内部到底在做什么
理解互联内部结构,才能解释工具生成的延迟、资源和时序报告。一个 AXI 主从节点内部通常由几部分组成:地址解码器把请求按地址段路由到目标从口;仲裁器在多个主口请求同一从口时按轮询/加权/固定优先级发放许可;每通道 FIFO/命令队列暂存地址与数据,吸收速率差和时钟差;宽度转换处理 32/64/128/256 位匹配(窄主宽从时把多拍打包,宽主窄从时拆突发并管理 strobe);时钟转换插入异步 FIFO;协议转换(AXI3↔AXI4、AXI↔AXI-Lite/Stream 桥)。NIC-301/NIC-400 这类 IP 把这些开关块用开关(switch)级联成网,Vivado 的 AXI Interconnect/Clustrix NoC 则在工具阶段综合出更扁平的结构。关键认知:没有“全并行无阻塞”的免费 crossbar——任意主到任意从的全交叉需要 N×M 套数据线,资源和扇出不可接受,实际实现是时分共享内部通道加 FIFO,只有当(主,从)对互不冲突时才真正并行;两个主同时打 DDR 同一个从口时,它们串行排队,这是物理事实而非配置错误。
事务在互联内的生命周期:地址先被解码并(若目标忙)排队;获得授权后发往从口,主 ID 在这一步被加上前缀;数据通道与地址的关系因实现而异(有的先存数据,有的直通),写事务的 W 数据必须能与 AW 在从口重新汇合;响应沿相反路径,互联凭扩展 ID 解出目标主口。理解这一点就明白两类故障:ID 太窄导致前缀截断(响应回错主,表现为随机数据错乱);W 与 AW 采用不同内部路由或时序时可能乱序,互联必须保证 AXI4 的同 ID 顺序——自研互联或桥时这是头号难点。工程上读生成的产物要看三样:地址映射表(每个从口的段、掩码)、每口配置(ID 宽、数据宽、时钟域、用户信号)、时序报告中开关内部的 fanout 与寄存器切片位置。把互联当作一个有真实微结构的 IP 而不是画框图时的连线,是这一节的核心。
六、带宽建模:主×从矩阵与 DDR 口的算账方法
带宽规划的正确单位不是“所有主设备之和”,而是每个从口的汇聚负载。做法是先列出主×从矩阵,每格填该主访问该从的平均带宽和峰值带宽(突发速率×占空比):PS/CPU、H2C DMA、C2H DMA、采集引擎、算法加速器为主列;DDR 各通道、BRAM、寄存器、外设从口为从列。然后逐从口检查:打向同一从口的所有主峰值之和(按最坏同时发生)必须小于该从口的可持续带宽,DDR 口要用 专家 06 的保证带宽(理论的 60%~85%),而不是理论峰值。若矩阵显示 DMA1+DMA2+采集三者峰值之和超过 DDR 口,架构必须改变:增加 DDR 通道、让高带宽流走 Stream 直连(采集→处理→PCIe 不落 DDR)、或在业务上保证三者峰值不同时出现并写入规格。平均带宽看似够但峰值超限时,用 FIFO 削峰,深度按“超出带宽×最长叠加时间”计算。
仲裁策略要按业务语义选:简单轮询对同等主公平,但一个长突发主在占用期间别人等待,且控制事务(CPU 配寄存器)可能排在大块 DMA 之后,延迟不可控。加权轮询/带宽配额给每主设定权重,兼顾带宽分配。优先级保证控制口低延迟,但低优先级可能饿死,必须配合“老化提升”(等待越久优先级越高)或最大服务间隔保证。按通道/ID 的 QoS(AxQOS 位被某些互联使用)实现更细的区分。验证仲裁不能只跑功能,要构造最坏组合(一个 DMA 持续满速 + 控制口每秒一次寄存器读),测量控制事务的最坏延迟是否满足上层超时设定。最后把矩阵、从口上限、仲裁权重、各主 outstanding 配额、FIFO 深度汇成一张“互联带宽预算表”进入评审。这张表在 Zynq 平台还要和 HP/ACP/GP 口的物理分工合并考虑(PS 端口特性见 专家 13),是系统架构师最该亲手算的一张表。
七、死锁全谱:从通道依赖到 ID 耗尽
AXI 系统的挂死几乎都能归到资源依赖环。第一类,通道间互等:从机要求 AW、W 都到齐才处理且内部用了“收到 AW 后等 W”的状态,而 W 通道因下游缓冲满被反压,主机却在等 B 才肯发下一拍 W——若系统别处占着缓冲等这笔写完成,环就闭合。防御:从机先缓存 W(W 先到合法)、或保证主机始终排空 W;互联给 W 通道独立足够深度。第二类,读写通道资源竞争:单端口存储后端用一个仲裁器同时服务 AR 和 AW,若某主占着读通道等写通道资源(或相反),交叉主设备可能形成经典的两资源环。防御:后端为读写设独立最小保底配额,不允许一类事务无限占据公共资源。第三类,ID/标签耗尽:所有内部 ID 标签被慢从设备的事务占满(例如都打到一个挂死的从口),新事务无法发起,而完成路径也需要标签资源才能返回——某些设计中完成也占上下文,形成自环。防御:响应路径不依赖新申请资源;监控最老事务年龄并超时返回 DECERR/SLVERR 释放标签。
第四类,跨时钟域/跨协议桥的背压传播环:AXI 进异步 FIFO 后进另一个协议(PCIe、以太网),对端不排空,FIFO 满反压 AXI,AXI 上的控制通道(配置对端的寄存器)也走同一个被反压的互联——软件永远无法命令对端恢复。这是 专题 08 中反复出现的控制面/数据面共享阻塞事故;防御是控制面走独立路径(独立 AXI 口、独立 Lite 互联或带外管理通道,见 专家 05 第九节)。第五类,软件参与的环:DMA 描述符放在由 DMA 自己填充的内存且信用通过同一路径回传,或中断被该数据流的拥塞阻塞。审查方法是画出“通道—缓冲—软件”的资源分配图,沿“等待”边找环;无环则无死锁,有环则必须打破(资源排序、保底配额、超时释放、控制面隔离)。每个主从口还应有访问超时器:事务年龄超阈值后互联代答错误并复位该路径——把不可恢复的挂死降级为可上报的错误,是产品级系统与 demo 的分水岭。
八、时序与频率:register slice、NoC 与大互联的物理收敛
大型 AXI 互联常常是整片时序最差的部分:地址解码扇出到所有从口、仲裁器多输入、数据通道多路选择宽度达数百位,再加跨 die/跨时钟区域,一个几百 MHz 的目标稍不留神就违例。工具链给的标准武器是 register slice(寄存器切片/管线级):在通道上插入“VALID/READY 双握手安全”的一拍缓冲,切断长组合路径;由于 AXI 握手允许就绪反压,这种切片可以做到不丢拍(满时反压),代价是每级增加 1~2 拍延迟。可以配置在主口、从口或内部开关上。使用原则:先让工具在违例路径自动插,再针对关键路径手动加深;延迟敏感的控制面(Lite 配寄存器)尽量走少级切片的短路径,数据面可以多级;切片加延迟会改变 outstanding 需求(见 专家 10 第八节),深度公式中的往返延迟要用加完切片后的实际值重算。
结构性手段往往比堆切片更有效。拆分互联域:把没有通信需求的主从分到不同互联(控制域:PS GP + 配置寄存器;数据域:DMA/HP + DDR + Stream 桥),两域之间只在必要处用一个桥/FIFO 相连;这同时减小扇出、缩短布线、隔离死锁和时钟域。位宽换频率:数据口用 128/256 位低时钟(200/250MHz)代替 64 位高时钟(400MHz),单拍搬运字节翻倍而时序容易收敛,代价是突发拍数减半、转换器面积上升——在 FPGA 里这通常是划算交换。Stream 旁路:高带宽视频/采集/网络流根本不进 MM 互联,AXI-Stream 直连处理核与 DMA,只让描述符/控制走 MM 路径(见 专家 08 第七节)。新平台(Versal、部分高端器件)的硬 NoC 用物理走线的包交换网络承担这些流量,功耗和确定性更好,但要学习其 QoS、端口时钟和地址分配模型。签核时除了看 setup/hold 违例,还要看互联区域的拥塞和布线偏斜报告;大互联往往在实现后期(布线后)才暴露时序,架构阶段就要控制单互联规模(经验:单个软互联挂 4~8 个主、4~8 个从尚可管理,超出就考虑拆域或上 NoC)。
九、地址规划与多主地址域:一张映射表治理全片
地址空间是跨软件、RTL、DMA 的契约,混乱的地址规划会在整个项目生命周期不断制造 bug。规划规则如下。第一,集中分配、单一事实源:用工具的地址编辑器统一维护,导出头文件(C)和参数包(SystemVerilog)供软件与 RTL 共同引用,禁止手工抄地址;每次变更走评审,地址表与比特流版本绑定(20 比特流烧录与四方版本一致 manifest/门禁)。第二,对齐与粒度:寄存器块最小 4KB 对齐(一页,方便保护和未来扩展),小外设也给整页;BRAM/片上 RAM 按其大小向上取 2 幂;DDR 段按 MB/GB 边界;段间保留空洞用于扩展,避免加一个 IP 就要重排全片地址导致软件全部重编。第三,显式空洞策略:互联对未映射地址回 DECERR,而不是默认落到某个从口;软件启动自检时扫描关键地址能立刻发现地址表错误。第四,多主视图一致:理想情况下所有主设备看到同一物理地址(统一地址空间);当 PS、DMA、NPU 各有不同视图(PS 侧虚拟/物理、PL 侧物理、某些 NoC 端口有偏移)时,必须在文档中给出每种视图的转换公式,并在共享缓冲区(DDR)分配上使用双方一致的地址,这是 Zynq 系统最常见的 bug 源之一(详见 专家 13)。
第五,保护与属性:PS/MMU/MPU 侧为每段定义缓存属性(寄存器段必须 device/strongly-ordered,DDR 共享段按一致性策略配置,见 专家 12)、读写权限和(安全架构中)安全/非安全标记,防止软件误把寄存器当缓存内存批量访问或用户态驱动碰配置区。第六,预留调试段:ILA-AXI、流量发生器、性能计数器等调试 IP 挂固定地址段,量产构建可保留只读监控或综合掉。第七,版本兼容:寄存器布局在产品代际间只追加不移动,废弃字段保留并标记;DMA 描述符版本号入环。评审地址表时拿三张视图核对(软件链接脚本/设备树、RTL 参数、互联映射截图),三者地址必须逐段一致。这个工作不高深,但一个地址错配的调试代价(偶发越界写、DECERR 风暴、DMA 踩踏代码段)往往以周计,是系统工程纪律的典型代表。
十、设计清单:从框图到收敛的互联工作流
给出可直接执行的互联设计工作流。架构阶段:列出主/从清单和各自时钟、数据宽度、突发能力、ID 宽度需求;填写主×从带宽矩阵(均值+峰值);核算每个从口汇聚负载与上限;决定数据流(哪些进 MM、哪些走 Stream 旁路);画控制面与数据面分离的框图;初版地址映射(段、对齐、空洞策略)。IP 配置阶段:按公式设 ID 宽度(前缀+线程位)并留 1~2 位余量;各主 outstanding 配额与 FIFO 深度按带宽×延迟计算;仲裁策略与 QoS/老化写入配置;时钟/宽度/协议转换点显式标注;打开 DECERR/安全转换。实现阶段:先综合看互联时序,决定 register slice 级数和位置;违例严重时拆互联域或加宽降频;核对跨域点均为异步 FIFO 而非裸连;检查用户信号(侧带)是否随事务同路径传递(自研时侧带也要按 ID 对齐)。
验证阶段:多 VIP 主并发随机(混合读写、全 ID、随机反压、全突发长度与 4KB 边界序列);协议 checker 全通道常开;带宽测试在延迟注入从机模型下跑满预算;死锁测试注入慢/挂死从机、控制面与数据面竞争、复位中途到达;地址测试由每个主访问每个段并核对 DECERR;跨时钟随机相位长稳测试。上板阶段:性能计数器(各口周期利用率、队列占用峰值、最老事务年龄、错误响应计数)经 Lite 可读;挂死快照与超时器联调;压力组合按矩阵最坏叠加实测;PS/软件侧核对地址头文件一致性。维护阶段:任何新增主/从回到架构矩阵评审,不允许直接“在互联上加根线”;互联配置、地址表、生成报告纳入版本库。把这套流程走完,AXI 互联就从“工具自动连线的黑盒”变成性能、时序、死锁、地址四方面都有证据的骨干子系统——这正是专家层与入门层使用互联的本质差别。
十一、Zynq/MPSoC 互联实战:HP、ACP、GP 与平台端口
Zynq 系列的互联不是自由拓扑,而是一组特性各异的固定平台端口,选错端口是性能问题最常见的根因。GP(General Purpose)口:PS 主、PL 从(GP0/GP1 主口)和反向从口,32/64 位、带宽有限(数百 MB/s 量级)、经 OCM/SCU 路径,适合控制、寄存器配置、小数据;不要用 GP 口跑视频帧或 DMA 大缓冲,延迟和带宽都会成为瓶颈。HP(High Performance)口:PL 主→PS DDR 的 64 位(部分器件 32/64/128 可配)高带宽口,带 4KB 边界处理、较深 outstanding,是视频帧缓存、PL 加速器与 DDR 交换数据的主力;四个 HP 口可并行使用,每个口的 FIFO 深度和仲裁在 PS 配置中设定。ACP(Accelerator Coherency Port):PL 主口直接接入 SCU 一致性互连,PL 访问的内存与 CPU 缓存保持一致,适合与 CPU 紧密共享小数据结构(控制块、描述符、中等粒度工作队列),代价是每次访问可能触发 snoop,带宽低于 HP 且不确定性更大,大块流式数据不应走 ACP。HPC(MPSoC):带一致性能力的高性能口,兼顾带宽与可选一致,是 HP 与 ACP 之间的现代折中。
典型架构分工:控制面 PS GP→PL 寄存器;数据流 PL HP↔DDR;小而共享的队列可放 ACP/HPC 且软件配合缓存维护或使用非缓存映射;PS 与 PL 的中断、事件、DMA(PS 内置 DMA、PL 侧 VDMA/AXI DMA)各走规范路径。带宽核算要从端口上限开始(HP 在特定器件和频率下有明确的理论上限,查数据手册而不是按位宽自算),再叠加 DDR 保证带宽(多口汇聚仍受 DDR 限制,见 专家 06 第十一节)。MPSoC/Versal 引入 PS-PCIe、多通道 DDR 和片上 NoC/CCI,端口数量和一致性模型更复杂,但“控制走低带宽一致路径、数据走高带宽非一致 HP/Stream”的分工原则不变。PS-PL 系统启动顺序、缓存属性和地址转换的完整讨论见 专家 12、专家 13。
十二、性能调优案例:从“DMA 跑不满”到系统级收敛
用一个典型案例串起本篇方法。现象:某视频系统 C2H 方向标称 10G 以太网采集落 DDR 再经 PCIe 上传,实测只有 3.2GB/s 且偶发丢帧。第一步读计数器:以太网口接收利用率 96%、DDR 口利用率 41%、入口 FIFO 周期性水位到顶——瓶颈不是 DDR 带宽,而是 DDR 访问停顿。第二步看地址 trace:采集 DMA 与 PS 控制流量都打同一 DDR 口,且 DMA 描述符以 4KB 散点小块提交,row 冲突率高(DDR 视角的问题见 专家 06 第八节);AXI 侧表现为大量短突发、outstanding 长期低于 4。第三步改架构:描述符聚合为 64KB 块、DMA 突发拉长到 256 拍、给采集口在互联仲裁中配置老化提升保证最坏等待、控制面迁到 GP→片上 BRAM 共享区而不进 DDR 数据路径;同时发现互联从 64 位采集口到 32 位配置总线接了一个宽度转换器在同一开关上,形成时序瓶颈,拆域后频率从 210MHz 收敛到 280MHz。第四步复测:采集链路 9.1GB/s 线速、丢帧计数器 72 小时为零、PS 寄存器读最坏延迟从毫秒级降到微秒级。
案例的方法论:任何“跑不满”先建分层计数器(口利用率、队列年龄、FIFO 水位、DDR row 统计),区分没活干、被仲裁、路径窄、后端慢四类瓶颈;不要在猜测中改 RTL。常见根因清单可以直接复用:短突发/未凑 4KB、outstanding 不足、控制面和数据面共享从口、窄宽转换在关键路径、跨域 FIFO 过浅、DDR 地址映射不利于 row hit、PCIe 或软件侧慢被误归因到 FPGA。每次只改一项并复测,保留“参数—计数器读数”记录。系统级性能优化没有银弹,它是一张由带宽矩阵、仲裁、突发组织、DDR 效率、主机软件共同决定的联立方程;本篇提供的是把方程中每个变量变成可测量数字的工程方法。
十三、互联子系统交付清单与组织协作
互联位于全片架构中心,交付时应包含超越“综合通过”的完整证据。文档:主×从带宽矩阵(均值/峰值/最坏叠加)、地址映射表(三视图一致)、端口配置表(宽度/时钟/ID 宽/深度/仲裁权重)、数据流图(标出 Stream 旁路和控制面隔离路径)、时序收敛策略(切片位置、拆域、位宽换频)。RTL 与配置:互联工程文件和生成脚本入库(不是只入库生成产物)、关键参数参数化、地址表自动导出 C/SV 头。验证:VIP 多主随机回归、协议 checker 常开、带宽在延迟模型下的断言、死锁注入(慢从、挂死从、复位中途事务)、DECERR 扫描、跨时钟长稳。上板:口利用率/队列年龄/错误计数器可读、挂死快照与超时释放、启动 AXI 冒烟测试、最坏组合压力实测。运维:新增主从必须回到矩阵评审,地址段只追加不移动,互联配置随比特流版本发布。组织上,互联设计需要架构师、DDR/接口负责人、PS/软件负责人共同评审,因为它同时约束硬件时序、带宽预算和软件地址视图;把它只交给“连 Block Design 的人”是很多项目后期系统性返工的起点。做好这一层,整片设计的性能和稳定性就有了骨架;做不好,再强的单个 IP 也会被堵在拥挤的交叉开关里。
十四、常见互联误用与反模式
结合大量集成项目,几类反模式值得专门警示。反模式一,所有东西挂一个互联:控制、视频、DMA、处理器全部进同一个大 crossbar,结果是时序差、死锁面大、任何改动触发全系统重综合;正确做法是按第十节拆控制域与数据域。反模式二,用 MM 互联搬运纯流数据:采集数据经 MM 口写 DDR 再读出送 PCIe,凭空多两次 DDR 往返和一套地址管理;Stream 直连 DMA 通常是正解。反模式三,ID 宽度随手填 1:单线程思维下所有主设备 ID=1,互联扩展后一旦存在多个内部队列,同 ID 强制保序会把乱序优化全部关掉,性能断崖式下跌且很难想到根因。反模式四,从设备沉默处理异常地址:解码不到的地址既不响应也不报 DECERR,表现为整机偶发挂死;空洞必须显式报错。反模式五,软件直接使用 PL 物理地址而不加 ioremap/缓存属性配置:寄存器访问被缓存合并、写丢失,这是软件团队初接触内存映射 FPGA 时的高频事故,地址规划阶段(第九节)就要给出每段的内存类型。反模式六,无超时机制:默认所有从设备永远健康,一个自研 IP 的状态机 bug 会通过 AXI 拖死 PS 启动;口级超时器+错误代答是必备保险。把这六条印在互联设计评审模板的第一页,能在架构阶段消除项目后期最昂贵的一类系统 bug。互联设计的成熟标志,是评审会上讨论的不再是“这根线连没连上”,而是带宽矩阵、最坏延迟、死锁资源图和地址契约——当团队习惯用这些语言对话,AXI 互联就已经从工具自动生成的连线变成被工程掌控的系统骨干,而这正是专家级系统设计的分水岭。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| ID 宽度配太窄 | 响应错路由/数据乱 | 主数前缀+线程 ID 留足 |
| 主设备带宽相加规划 | DDR 口实际爆掉 | 按从口共享核算 |
| 大 DMA 饿死控制口 | 配置响应慢 | 权重/优先级/独立口 |
| 全数据流挤 MM 互联 | 时序+带宽双差 | Stream 旁路直连 |
| 地址段重叠/悬空 | DECERR/访问错设备 | 地址编辑器统一核对 |
| crossbar 违例硬收敛 | 时序爆炸 | register slice/拆分 |
相关与延伸
协议:AXI4 深水区;DDR:DDR 深水区。 平台:Zynq PS/PL 协同、Zynq 数据交互深水区。
一句话总结
AXI 互联(Interconnect/Crossbar,Zynq 内 NIC、Versal 用 NoC)做三件事:按地址解码路由、多主争同从口时仲裁排队、自动转换位宽/时钟/协议。关键认知:它不是无冲突全交叉——同一条从口(尤其 DDR)的实际带宽被所有主设备共享,规划要画主×从带宽矩阵、给控制小事务高优先级或独立口、让高带宽流走 Stream 旁路直连 DMA 而不是挤 MM 矩阵。两大硬约束:ID 宽度必须 ≥ 主设备号前缀 + 各主线程 ID(窄了互联截断 ID、响应错路由);大 crossbar 时序差用 register slice 打拍、拆小互联、位宽换频率。地址规划集中管理:从机段不重叠、按大小对齐、悬空段回 DECERR 可发现、多主地址域统一。