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,处在另一个时钟域。