Vitis Utility Library is an open-sourced Vitis library of common patterns of streaming and storage access. It aims to assist developers to efficiently access memory in DDR, HBM or URAM, and perform data distribution, collection, reordering, insertion, and discarding along stream-based transfer.
Memory Access
- AXI Burst Read and Write: Reading data from AXI master port, and emit to stream (of possibly different width). Padding and vectoring could be removed in reading and added in writing.
- Low Initiation Interval Access to URAM Array: URAMs are 72 bit fixed, and currently very large buffers needs extra registers and forwarding-paths to be read/written every cycle. By providing an API for this, users can focus on the function design and avoid mixing challenge of different level in the same code.
Dynamic Routing within Streams
- Distribution and Collection:
Three different algorithms are supported:
- Round-robin: Data will be send/received through as many streams as possible in round-robin order.
- Load-balancing: Data will be send to or received from PU based on load, the result will be out of order. The assumption here is a PU has lower rate than the input, while the cluster of PUs has statistically matching rate with the input.
- Tag-select: Basically it implements the
if-then-else
orswitch-case
semantic, using a tag from input. This module can be used to pass different type/category of data to heterogeneous PUs.
- Discarding Data: Consumes all the data from input and discard it. With some post-bitstream configuration, we may have some data generated but not used, this module ensures such data can be discarded without blocking the execution.
- Stream Synchronization: We have made end flag driven pipeline a common practice in our libraries, and it is often necessary to synchronize two streams into one flag signal.
Data Reshaping
- Stream Combine: Fuse multiple streams into one. For example, fuse three synchronized R, G, B streams into one (R,G,B) tuple stream. The dynamic version allows some streams to be skipped(discarded) while allowing two static directions (align to LSB or MSB).
- Stream Shuffle: Shuffle synchronized streams with dynamic configuration. For example, synchronized R, G, B streams can be dynamically shuffle to R, B, G or B, G, R.