(六)Virtual-Channel Flow Control and Buffering
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₂N(N 为 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 资源为 6(2 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,空指针为 NULL; - Buffer 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,后向延迟Lb):
Valid/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% 吞吐。
