跳转至

NoC 路由算法、基于信用的流控(Credit Flow Control)与拓扑深度剖析

1. NoC 典型物理拓扑与权衡

在现代异构多核与 AI 芯片中,片上网络(NoC)根据 IP 数量与物理布局选用不同拓扑:

flowchart TD
    subgraph Mesh_Topology ["1. 2D Mesh 拓扑 (可扩展性高 / 物理布局规整)"]
        R00["R(0,0): CPU0"] --- R01["R(0,1): CPU1"] --- R02["R(0,2): DDR0"]
        R10["R(1,0): GPU"]  --- R11["R(1,1): NPU"]  --- R12["R(1,2): DDR1"]
        R20["R(2,0): PCIe"] --- R21["R(2,1): DMA"]  --- R22["R(2,2): Periph"]

        R00 --- R10 --- R20
        R01 --- R11 --- R21
        R02 --- R12 --- R22
    end

拓扑性能与成本对比矩阵

拓扑类型 节点连接度(Degree) 网络直径(Diameter) 典型跳数(Average Hops) 面积布线开销 适用场景
Crossbar $N$ 1 1 $O(N^2)$ 极高 8 个节点以内的紧耦合 Cluster
2D Mesh 4 $2 \times (\sqrt{N} - 1)$ $\frac{2}{3}\sqrt{N}$ $O(N)$ 极低,适合平面布线 16~128 核大型 SoC / 服务器芯片
Ring(环形) 2 $N / 2$ $N / 4$ 极低(环状走线) 8~16 核桌面与移动端 CPU
Fat-Tree(胖树) 随着树高增加 $2 \times \text{Depth}$ $\log N$ 根节点处布线密集 多级分层异构处理器

2. 路由算法:X-Y 确定性路由与自适应路由

2.1 X-Y 维度确定性路由(Dimension-Order Routing, DOR)

  • 算法规则:设源节点为 $(X_s, Y_s)$,目标节点为 $(X_d, Y_d)$。报文必须先沿水平 X 轴移动至 $X_d$,当且仅当 $X_s == X_d$ 时,方可沿垂直 Y 轴移动至 $Y_d$。
  • 数学证明无死锁:DOR 算法严格禁止了 $Y \to X$ 的拐角动作(在 8 种可能拐角中只允许 4 种),切断了形成通道依赖环路(Channel Dependency Graph)的数学条件,天然具备零死锁保证

2.2 自适应路由(Adaptive Routing)与重排缓冲

  • 机制:当 X 轴发生拥塞(下级 Router 满)时,报文可动态拐入 Y 轴绕行。
  • 代价:同一事务流的多个 Flit 可能经过不同物理路径到达,导致报文乱序(Out-of-Order)。网络出口必须配备重排缓冲区(Reorder Buffer, ROB)以恢复 AXI/CHI 的顺序语义。

3. 基于信用额度的流控制(Credit-Based Flow Control)机制

在 NoC 高频管道(如 1GHz+)中,传统的 VALID/READY 反压信号由于走线延时无法在一个周期内跨 Router 回传。工业级 NoC 统一采用 Credit 流控

sequenceDiagram
    participant Sender as 上游路由器 (Sender)
    participant Receiver as 下游路由器 (Receiver)

    Note over Sender: 初始化: Sender 获知 Receiver 具有 3 个可用槽位 (Credit = 3)

    Sender->>Receiver: 发送 Flit 0 (消耗 1 个 Credit -> 剩余 Credit = 2)
    Sender->>Receiver: 发送 Flit 1 (消耗 1 个 Credit -> 剩余 Credit = 1)
    Sender->>Receiver: 发送 Flit 2 (消耗 1 个 Credit -> 剩余 Credit = 0)

    Note over Sender: Credit 耗尽: Sender 立即暂停发送, 绝不发生下级 Buffer 溢出!

    Receiver->>Receiver: 消费并转发 Flit 0 (释放 1 个接收缓冲槽位)
    Receiver-->>Sender: 沿反向专用信用线归还 1 个 Credit (Credit Return Signal)

    Note over Sender: Sender 收到信用点: Credit 恢复为 1, 恢复发送 Flit 3!

满带宽运行所需的最小 Credit 缓冲深度计算公式

$$\text{Buffer Depth}_{\min} = \text{Round-Trip Latency (Cycles)} \times \text{Flit Injection Rate}$$ - 算例:若 Flit 发送经过 2 拍到达 Receiver,Receiver 消费产生 Credit 经过 2 拍返回,总往返延迟为 8 周期。为了保持链路每周期传输 1 个 Flit 不发生饥饿停顿,Receiver 的虚拟通道缓冲深度至少必须配置为 8 个 Flit 槽位