Fragment

Specification

The Fragment bundle is the concept of transmitting a “big” thing by using multiple “small” fragments. For examples :

  • A picture transmitted with width*height transaction on a Stream[Fragment[Pixel]]

  • An UART packet received from an controller without flow control could be transmitted on a Flow[Fragment[Bits]]

  • An AXI read burst could be carried by an Stream[Fragment[AxiReadResponse]]

Signals defined by the Fragment bundle are :

Signal

Type

Driver

Description

fragment

T

Master

The “payload” of the current transaction

last

Bool

Master

High when the fragment is the last of the current packet

As you can see with this specification and precedent example, the Fragment concept doesn’t specify how transaction are transmitted (You can use Stream,Flow or any other communication protocol). It only add enough information (last) to know if the current transaction is the first one, the last one or one in the middle of a given packet.

Note

The protocol didn’t carry a ‘first’ bit because it can be generated at any place by doing ‘RegNextWhen(bus.last, bus.fire) init(True)’

Functions

For Stream[Fragment[T]] and Flow[Fragment[T]], following function are presents :

Syntax

Return

Description

x.first

Bool

Return True when the next or the current transaction is/would be the first of a packet

x.tail

Bool

Return True when the next or the current transaction is/would be not the first of a packet

x.isFirst

Bool

Return True when an transaction is present and is the first of a packet

x.isTail

Bool

Return True when an transaction is present and is the not the first/last of a packet

x.isLast

Bool

Return True when an transaction is present and is the last of a packet

For Stream[Fragment[T]], following function are also accessible :

Syntax

Return

Description

x.insertHeader(header : T)

Stream[Fragment[T]]

Add the header to each packet on x and return the resulting bus