Spinal Flow协议

Overview

用于Non-blocking传输的协议,由valid标志表示当前payload的有效性。相比于存在握手规则约束的Stream,其使用更加简单,更加方便,因此相关的方法也更少,更简单。

Stream转换

将Flow转换为Stream的函数

  • toStream(overflow: Bool, fifoSize: Int, overflowOccupancyAt: Int): Stream[T] ,返回一个Stream,并给一个输出信号overflow。在转换到Stream后,接一个FIFO,在超过一定深度后给assert overflow。
  • toStream(overflow: Bool): Stream[T] ,类似上面,但没有接一个overflow,只是没有接一个FIFO。如果有传一个overflow的引用进去,那么输出一个overflow,当下游不ready的时候拉高。

上面的第一个函数,是在转换Stream之后才加buffer。我们可以在转换为Stream之前加buffer
gg

  • queueWithOccupancy(size: Int): (Stream[T], UInt)
  • queueWithAvailability(size: Int): (Stream[T], UInt)

Repeater

给valid-payload打拍

  • m2sPipe(holdPayload : Boolean = false, flush : Bool = null): Flow[T] ,类似于Stream的m2sPipe。 stage() 和 m2sPipe() 一样。

负载控制

不像Stream可以控制上游的流量,这里引入condition来控制valid。

  • takeWhen(cond: Bool): Flow[T]
  • throwWhen(cond: Bool): Flow[T]

负载转换

类似于Stream,同样提供了简单的负载转换方法

  • translateWith[T2 <: Data](that: T2): Flow[T2]
  • translateFrom[T2 <: Data](that: Flow[T2])(dataAssignment: (T, that.payload.type) => Unit): Flow[T]

CDC处理

ccToggle(pushClock: ClockDomain, popClock: ClockDomain) : Flow[T]

返回下游Flow,处在另一个时钟域。