toDownstreamReadyAndValid method

ReadyAndValidInterface<LogicType> toDownstreamReadyAndValid(
  1. Logic clk,
  2. Logic reset
)

Converts this ReadyThenValidInterface to a ReadyAndValidInterface by adding a small FIFO to buffer data.

Implementation

ReadyAndValidInterface<LogicType> toDownstreamReadyAndValid(
  Logic clk,
  Logic reset,
) {
  final downstream = ReadyAndValidInterface<LogicType>(
    data.clone() as LogicType,
  );

  final readEnable = Logic();
  final fifo = Fifo(
    clk,
    reset,
    depth: 2,
    writeEnable: valid,
    writeData: data,
    readEnable: readEnable,
    name: 'ready_then_valid_to_ready_and_valid_fifo_${data.name}',
  );

  readEnable <= downstream.ready & downstream.valid;
  ready <= ~fifo.full;
  downstream.data <= fifo.readData;
  downstream.valid <= ~fifo.empty;

  return downstream;
}