流量控制(Flow Control),也叫流控,它是控制组件之间发送和接收信息的过程。在总线中,流控的基本单位称为flit。
在标准同步接口中(比如AXI协议接口),握手信号如果直接采用寄存器打拍的方式容易导致信号在不同的方向上出现偏离。因此,引入了更复杂的FIFO结构替代了寄存器方式来给握手信号打拍,方便后端时序收敛。但是,各种各样的FIFO设计要么引入气泡,要么浪费容量或引入不需要的握手逻辑组合链。为了避免控制电路中的组合逻辑路径,在一个时钟周期内,数据被搬进或搬出FIFO是不允许的,因此存在FIFO气泡。
现在许多NoC设计采用基于credit的流量控制(比如CHI协议接口)。在这种方式中,源端会跟踪目的端有多少资源可以使用。只有源端收到目的端发送的credit,源端才可以发送flit给出去。显然,目的端必须保证发出多少个credit,就必须能收下多少个flit。
下图为一个简单的基于credit流控示例图,源端的up/down counter会对收到的credit进行计数,表示下游Sink目的端可以收多少数据。因此Sink必须有足够的buffer来存放数据。因此,组件之间的数据转发简化为只需要看valid信号就行了。源端每次发送一个数据,就需要up/down counter的计数值减1。
图1 基于credit的流控示例图