Chapter 6: Virtual-Channel Flow Control and Buffering本文版权归作者所有任何形式的转载都请注明出处虚通道Virtual Channel, VC的作用类似于多车道最显著的作用是避免死锁——比如请求和响应分作两路 VC可以消除资源依赖的环路。常见做法有时分复用或扩展物理通道。其中时分复用只需要扩展握手信号Data 通道只留一条即 1 Cycle 传递 1 包 flit。此外Buffer 也需要复制多份若为信用流控Credit 计数器也要复制多份。上述多 VC 的信用流控模型可以优化Data 通路增加isHead和isTail标识valid和update分别增加VCid标识其中VCid位宽为 log₂NN 为 VC 数量。Buffer Sharing 优化时分复用可能造成带宽利用率不足即某些 VC 可能闲置VC 数量越多这种可能性越大。举例说明若存在 VC0/VC1每个 VC 拥有一个深度为 4 的 FIFO则 VC0 VC1 的整体 Buffer 资源数为 8。若 VC0 繁忙、VC1 长期空闲则 VC1 的 4 深度 FIFO 长期浪费VC0 只有 4 个资源可用。对整体资源数 8 重新调配VC0/VC1 各有深度为 2 的 Private FIFO其余 4 个资源作为 Shared Buffer。此时若 VC0 繁忙、VC1 长期空闲VC0 可使用的 Buffer 资源为 62 Private 4 Shared。Sender 侧Credit 计数需要统计 Private 和 Shared即当(creditCounter[i] 0) OR (creditShared 0)时可以发送对应VC[i]的 flit。Receiver 侧接收 flit 后会先占用 Private若 Private 满则占用 Shared每有 VC 出队flit 包按Input → Shared → Private → Output次序移动。显然Shared Buffer 需要保序所以需要在 Buffer 内对每个 VC 的 flit 实现串链。Buffer 结构每个 VC 记录头指针pH和尾指针pT空指针为 NULLBuffer Memory 存储 flit 包用Available表示 Buffer Entry 是否空闲Linked List 用于存储next_pointer。最小硬件开销方案每个 VC 只拥有 1 个 Private 寄存器所有 VC 共同共享一个 Shared 寄存器。即对于 N 个 VC 场景只需N 1个寄存器即可实现。每个 VC 拥有 1 个 Private 寄存器即可在不插入额外延迟的前提下若只有单个 VC 活跃即可满足 100% 吞吐。当有 M 个 VC 活跃时在未发生阻塞的前提下每个 VC 可获得 1/M 的带宽。只有当某些 VC 发生阻塞时Shared 寄存器才会被占用而其余未阻塞 VC 的吞吐仍能保持 1/M。若存在链路延迟前向延迟Lf后向延迟LbValid/Ready 流控每个 Private FIFO 深度至少为Lf Lb 1才能保证不丢包Shared FIFO 深度至少为Lf Lb 1保证单个 VC 的 100% 吞吐。若 Private FIFO 深度小于Lf Lb 1当 Private FIFO 满时就需要 Shared FIFO 有剩余空间才能拉高ready此时引入了各 VC 之间的依赖存在死锁风险。Credit 流控每个 Private FIFO 深度为 1 即可保证不丢包Shared FIFO 深度至少为Lf Lb - 1保证单个 VC 的 100% 吞吐。
(六)Virtual-Channel Flow Control and Buffering
发布时间:2026/6/15 5:39:11
Chapter 6: Virtual-Channel Flow Control and Buffering本文版权归作者所有任何形式的转载都请注明出处虚通道Virtual Channel, VC的作用类似于多车道最显著的作用是避免死锁——比如请求和响应分作两路 VC可以消除资源依赖的环路。常见做法有时分复用或扩展物理通道。其中时分复用只需要扩展握手信号Data 通道只留一条即 1 Cycle 传递 1 包 flit。此外Buffer 也需要复制多份若为信用流控Credit 计数器也要复制多份。上述多 VC 的信用流控模型可以优化Data 通路增加isHead和isTail标识valid和update分别增加VCid标识其中VCid位宽为 log₂NN 为 VC 数量。Buffer Sharing 优化时分复用可能造成带宽利用率不足即某些 VC 可能闲置VC 数量越多这种可能性越大。举例说明若存在 VC0/VC1每个 VC 拥有一个深度为 4 的 FIFO则 VC0 VC1 的整体 Buffer 资源数为 8。若 VC0 繁忙、VC1 长期空闲则 VC1 的 4 深度 FIFO 长期浪费VC0 只有 4 个资源可用。对整体资源数 8 重新调配VC0/VC1 各有深度为 2 的 Private FIFO其余 4 个资源作为 Shared Buffer。此时若 VC0 繁忙、VC1 长期空闲VC0 可使用的 Buffer 资源为 62 Private 4 Shared。Sender 侧Credit 计数需要统计 Private 和 Shared即当(creditCounter[i] 0) OR (creditShared 0)时可以发送对应VC[i]的 flit。Receiver 侧接收 flit 后会先占用 Private若 Private 满则占用 Shared每有 VC 出队flit 包按Input → Shared → Private → Output次序移动。显然Shared Buffer 需要保序所以需要在 Buffer 内对每个 VC 的 flit 实现串链。Buffer 结构每个 VC 记录头指针pH和尾指针pT空指针为 NULLBuffer Memory 存储 flit 包用Available表示 Buffer Entry 是否空闲Linked List 用于存储next_pointer。最小硬件开销方案每个 VC 只拥有 1 个 Private 寄存器所有 VC 共同共享一个 Shared 寄存器。即对于 N 个 VC 场景只需N 1个寄存器即可实现。每个 VC 拥有 1 个 Private 寄存器即可在不插入额外延迟的前提下若只有单个 VC 活跃即可满足 100% 吞吐。当有 M 个 VC 活跃时在未发生阻塞的前提下每个 VC 可获得 1/M 的带宽。只有当某些 VC 发生阻塞时Shared 寄存器才会被占用而其余未阻塞 VC 的吞吐仍能保持 1/M。若存在链路延迟前向延迟Lf后向延迟LbValid/Ready 流控每个 Private FIFO 深度至少为Lf Lb 1才能保证不丢包Shared FIFO 深度至少为Lf Lb 1保证单个 VC 的 100% 吞吐。若 Private FIFO 深度小于Lf Lb 1当 Private FIFO 满时就需要 Shared FIFO 有剩余空间才能拉高ready此时引入了各 VC 之间的依赖存在死锁风险。Credit 流控每个 Private FIFO 深度为 1 即可保证不丢包Shared FIFO 深度至少为Lf Lb - 1保证单个 VC 的 100% 吞吐。