## Flow
### 一、规范(Specification)
Flow接口是一个简单的有效(valid)/负载(payload)协议, 意味着从端口(slave)无法中断总线。
例如, 它可以用来表示来自UART控制器的数据或者向一个片上存储写数据的请求等。
| 信号 | 类型 | 驱动 | 描述 | Don't care 条件 |
| :-----: | :---: | :----: | :--------------------------: | :--------------------: |
| valid | Bool | Master | 当置高时, 说明负载通过该接口 | |
| payload | T | Master | 负载任务的内容 | valid为低时, dont care |
### 二、函数(Functions)
| 句式 | 描述 | 返回值 | 延迟 |
| :------------------------------: | :---------------------------------------------------------------------------: | :-----: | :---: |
| Flow(type : Data) | 建立一个给定类型的Flow | Flow[T] | |
| master/slave Stream(type : Data) | 建立一个给定类型的Flow, 并根据给定的IO设置初始化 | Flow[T] | |
| x.m2sPipe() | 返回一个由x通过寄存器驱动的流
valid/ready/payload路径通过一些寄存器分割。 | Flow[T] | 1 |
| x << y
y >> x | 把y连接到x | | 0 |
| x <-< y
y >-> x | 通过m2sPipe把y连接到x | | 1 |
| x.throwWhen(cond : Bool) | 返回一个连接到x的Flow, 并且当cond为true时抛弃交换任务(Transaction) | Flow[T] | 0 |
| x.toReg() | 返回一个当valid置高时加在`payload`的寄存器 | T | |
| x.setIdle() | 将Flow置为空闲状态:`valid`为`False`并且不关心负载`payload` | | |
| x.push(newPayload: T) | 给予当前Flow一个新的有效负载。`valid`被设置为`True` | | |
### 三、代码实例(code example)
```Scala
val request = Flow(Bits(8 bits))
val answer = Flow(Bits(8 bits))
val storage = Reg(Bits(8 bits)) init 0
val fsm = new StateMachine {
answer.setIdle()
val idle: State = new State with EntryPoint {
whenIsActive {
when(request.valid) {
storage := request.payload
goto(sendEcho)
}
}
}
val sendEcho: State = new State {
whenIsActive {
answer.push(storage)
goto(idle)
}
}
}
// 等价地
answer <-< request
```