4. NoC 核心组件
Versal 的 NoC 不是一条“总线”,而是一张可编程的分组交换网络。要把它用对,关键不是记住拓扑图,而是理解五类核心组件各自的角色:NoC Master 发起事务,NoC Slave 接收事务,NoC 连接点(NoC Connection / NMU-NSU 端口)负责把 IP 接入网络,DDR 控制器接口与 PL/AIE 接口则决定数据从哪来、到哪去。它们之间的时钟域关系,直接决定了带宽能否跑满、是否会出现亚稳态或性能塌陷。
一、核心原理:Master/Slave 与连接点的分工
NoC 采用 AXI 事务语义,但内部是分组转发。每个事务从 NMU(NoC Master Unit)进入网络,经 NoC 交换矩阵到达 NSU(NoC Slave Unit),再由 NSU 转换为目标协议。因此:
- NoC Master:产生读写请求的 IP,如 PL 中的 AXI Master、AIE 的 DMA、PS 的 CCI/ACE 端口。它通过 NMU 接入 NoC。
- NoC Slave:接收请求的目标,如 DDRMC、PL 的 AXI Slave、AIE 的流接口、PS 寄存器。它通过 NSU 接入 NoC。
- NoC 连接点:NMU/NSU 的物理落点,决定该 IP 能走哪条路径、支持多少 Outstanding、是否可跨时钟域。
一个常见误区是把“NoC Master”当成“NoC 本身”。实际上 NoC 只是通道,Master 和 Slave 才是流量端点。连接点选错,即使带宽参数填得再大,也会因为路径拥塞或协议不匹配而跑不满。
二、方法流程:从 IP 到 NoC 的连接步骤
- 识别端点类型:确认 IP 是 Master 还是 Slave,协议是 AXI4、AXI-Stream 还是 AIE 流。
- 选择连接点:在 Vivado 的 NoC 视图中选择 NMU/NSU 落点,注意该点支持的协议、位宽和时钟域。
- 配置 QoS 与 Outstanding:为高优先级流量设置 QoS,为高延迟路径增加 Outstanding 深度。
- 处理时钟域:若 IP 时钟与 NoC 时钟不同源,必须在连接点或 IP 侧插入 CDC。
- 验证带宽与延迟:用 NoC 性能监视器或仿真确认实际吞吐。
关键参数示例:NoC 主频 1 GHz、位宽 128 bit 时,理论峰值 = 1e9 × 128 / 8 = 16 GB/s。若实际只有 6 GB/s,优先检查 Outstanding 是否不足、路径是否经过拥塞节点、CDC 是否引入气泡。
三、案例场景:AIE → DDR 的数据搬运
假设 AIE 需要把 4 MB 特征图写入 DDR,再由 PL 读取做后处理。典型连接如下:
AIE (Master) → NMU(AIE 侧) → NoC → NSU(DDR 侧) → DDRMC → DDR
PL (Master) → NMU(PL 侧) → NoC → NSU(DDR 侧) → DDRMC → DDR
这里 AIE 和 PL 是两个 Master,共享同一个 DDR Slave。若两者同时满速写入,DDR 控制器会成为瓶颈。此时应通过 QoS 给 AIE 更高优先级,或把 PL 的读取安排到不同时间段。另一个常见问题是 AIE 时钟与 NoC 时钟不同源,若未正确 CDC,会出现数据错位或吞吐骤降。
四、误区与复盘:时钟域与接口匹配
| 误区 | 现象 | 正确做法 |
|---|---|---|
| 把 PL 时钟直接接到 NoC 连接点 | 时序违例、数据偶发错误 | 使用 NoC 提供的 CDC 或异步 FIFO |
| AIE 流接口当 AXI 用 | 握手失败、吞吐极低 | AIE 侧用流接口,经 NSU 转换 |
| 忽略 DDR 控制器接口的位宽 | 带宽只有理论值一半 | 确认 NSU 到 DDRMC 的位宽匹配 |
| 所有 Master 共用一条路径 | 拥塞、延迟抖动大 | 分散连接点,利用 NoC 多路径 |
复盘要点:NoC 的性能问题,80% 出在连接点选择与时钟域处理上。先确认“谁连谁、走哪条路、时钟是否同源”,再调 QoS 和 Outstanding,往往比盲目加带宽更有效。
注意:DDR 控制器接口的 NSU 通常有固定数量,且与 DDRMC 实例绑定。若多个 Master 争用同一个 NSU,即使 NoC 内部带宽充足,也会在 NSU 处排队。规划时应把高带宽 Master 分配到独立 NSU,或至少错开访问时间。
理解这五类组件与时钟域关系后,后续配置 NoC 时就能快速判断:该把 IP 接到哪个连接点、是否需要 CDC、DDR 侧会不会成为瓶颈。这是 Versal 高速数据搬运架构中最基础也最容易踩坑的一环。