Flow
Specification
The Flow interface is a simple valid/payload protocol which mean the slave can’t halt the bus.
It could be used, for example, to represent data coming from an UART controller, requests to write an on-chip memory, etc.
| Signal | Type | Driver | Description | Don’t care when | 
|---|---|---|---|---|
| valid | Bool | Master | When high => payload present on the interface | |
| payload | T | Master | Content of the transaction | valid is low | 
Functions
| Syntax | Description | Return | Latency | 
|---|---|---|---|
| Flow(type : Data) | Create a Flow of a given type | Flow[T] | |
| master/slave Flow(type : Data) | Create a Flow of a given type Initialized with corresponding in/out setup | Flow[T] | |
| x.m2sPipe() | Return a Flow drived by x through a register stage that cut valid/payload paths | Flow[T] | 1 | 
| x << y y >> x | Connect y to x | 0 | |
| x <-< y y >-> x | Connect y to x through a m2sPipe | 1 | |
| x.throwWhen(cond : Bool) | Return a Flow connected to x When cond is high, transaction are dropped | Flow[T] | 0 | 
| x.toReg() | Return a register which is loaded with  | T | |
| x.setIdle() | Set the Flow in an Idle state:  | ||
| x.push(newPayload: T) | Assign a new valid payload to the Flow.  | 
Code example
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)
    }
  }
}
// equivalently
answer <-< request