4. AXI总线与NoC调试
在 Versal 器件中,AXI 总线负责把 PL、PS、AI Engine、DDR 控制器以及各类硬核 IP 连接起来,而 NoC(Network on Chip)则承担片内高带宽数据搬运的主干角色。调试这类系统时,问题往往不是“某个模块坏了”,而是“数据在某个接口上被卡住、被限流或走错了路径”。因此本节围绕三条主线展开:如何读懂 AXI 事务、如何利用 NoC 性能计数器量化带宽、以及如何把两者结合定位瓶颈。
一、AXI 事务分析:从握手信号看真实行为
AXI4 是五通道分离的协议:读地址 AR、读数据 R、写地址 AW、写数据 W、写响应 B。每个通道都用 VALID/READY 握手,只有两者同时为高时该拍数据才真正传输。调试时最容易被忽略的一点是:VALID 拉高但 READY 长期为低,说明下游反压;READY 一直为高而 VALID 不来,说明上游没有发起事务。这两类现象对应的瓶颈位置完全不同。
在 Versal 中,最直接的观测手段是 ILA(Integrated Logic Analyzer)。把 ILA 挂在 AXI 互联的监视端口(如 SmartConnect 的 M_AXI 或 S_AXI)上,触发条件可设为 AWVALID && !AWREADY 持续若干周期,或 RVALID && !RREADY。抓到的波形要重点看三件事:突发长度 AWLEN/ARLEN、突发类型 AWBURST/ARBURST、以及数据宽度 AxSIZE。例如一个 ARLEN=0(单拍)但地址连续递增的读序列,实际带宽会远低于 ARLEN=15(16 拍 INCR 突发),因为每次事务都要重新经历地址握手开销。
另一个关键点是 outstanding 能力。AXI 允许在未收到响应前继续发地址,AWVALID 连续多拍而 BVALID 滞后,说明写通道有多个未完成事务。若 outstanding 深度不足,长突发会被拆成多次短事务,吞吐下降。可以用下面的判断逻辑快速区分:
- 地址通道频繁握手但数据通道空闲 → 上游发起密集、下游数据通路慢;
- 数据通道持续满拍但地址通道稀疏 → 突发效率高,瓶颈可能在更下游的 NoC 或 DDR;
- 写响应
BVALID迟迟不来 → 写路径存在反压或写缓冲已满。
二、NoC 性能计数器:把带宽变成可读数字
Versal 的 NoC 由 NoC 主站(NMU)、NoC 从站(NSU)和 NoC 交换结构组成。每个 NMU/NSU 端口都带有性能计数器,可通过 report_noc 或 Vivado 的 NoC 调试视图读取。常用计数器包括:
| 计数器 | 含义 | 典型用途 |
|---|---|---|
| NMU 读/写字节数 | 该主站实际发出的读/写数据量 | 判断某主站是否达到预期带宽 |
| NSU 读/写字节数 | 该从站实际接收的数据量 | 判断从站是否成为汇聚瓶颈 |
| 事务数 / 平均突发长度 | 单位时间事务数量与平均拍数 | 识别短事务过多导致的效率损失 |
| 反压周期数 | 端口因下游未就绪而等待的周期 | 定位拥塞发生在哪一级 |
计算有效带宽的公式为:带宽 = 字节数 / 采样时间。例如在 300 MHz NoC 时钟下采样 1 ms,某 NMU 读到 240 MB,则有效读带宽约 240 MB / 1 ms = 240 GB/s。若该端口理论峰值是 32 字节/拍 × 300 MHz ≈ 9.6 GB/s,显然这个数字不合理,说明采样时间或字节数需要核对——这正是调试中常见的“单位陷阱”:计数器单位可能是字节、拍数或事务数,必须与时钟频率、位宽一起换算。
三、带宽瓶颈定位:从现象到根因
定位瓶颈的核心思路是“分段测量、逐级对比”。假设系统出现 DDR 读带宽不足,可按以下顺序排查:
- 在发起读的主站 NMU 端口测有效读带宽,记为 B1;
- 在 DDR 对应的 NSU 端口测接收带宽,记为 B2;
- 若 B1 明显小于 B2,瓶颈在主站侧(发起不足、outstanding 不够、突发太短);
- 若 B2 明显小于 B1,瓶颈在 NoC 交换或 DDR 控制器侧(拥塞、反压、DDR 刷新开销);
- 若两者接近但都低于预期,检查 DDR 控制器效率与访问模式(行命中率、bank 冲突)。
下面这张图把 AXI 事务观测点与 NoC 计数器观测点放在同一条数据路径上,便于对照定位:
四、调试实例:DDR 读带宽只有预期一半
假设一个 Versal 系统,PL 侧通过 AXI SmartConnect 经 NoC 读取 DDR,设计预期读带宽 6 GB/s,实测只有约 3 GB/s。按上述流程排查:
第一步,在 PL 主站 AXI 接口挂 ILA,触发条件设为 ARVALID && ARREADY。抓到的波形显示 ARLEN 大多为 3(4 拍突发),ARSIZE 为 4(16 字节),即每次读 64 字节。而设计本意是 256 字节突发。这说明主站 IP 的突发长度配置被限制在 4 拍。
第二步,读取 NMU 计数器,采样 1 ms,读字节数为 3.1 MB,换算约 3.1 GB/s,与实测一致,确认瓶颈在主站发起侧。
第三步,检查主站 IP 的 AXI 参数,发现 Max Burst Length 被设为 4。将其改为 16 后重新综合,ILA 显示 ARLEN=15,NMU 计数器在同样 1 ms 内读到约 6.2 MB,带宽提升到约 6.2 GB/s,达到预期。
这个实例说明:NoC 性能计数器给出的是“结果”,AXI 事务分析给出的是“原因”。两者结合,才能从 3 GB/s 这个现象,一路追到 ARLEN 配置这个根因。实际调试中,建议先看计数器确定瓶颈大致在哪一级,再用 ILA 抓该级接口的握手与突发参数,避免盲目全链路抓波形。
最后补充一个易错点:NoC 计数器的采样窗口要与业务负载稳定期对齐。若在系统启动或任务切换瞬间采样,计数器会混入大量短事务和空转周期,得到的带宽数字偏低且不可复现。建议在负载稳定后连续采样多个窗口,取中位数作为判断依据。