---
# System prepended metadata

title: '[Design Practice Sharing] Developing a Sparse to Continuous Stream Converter IP - - Part II : Functional Specification'

---

# [Design Practice Sharing] Developing a Sparse to Continuous Stream Converter IP - - Part II : Functional Specification


## 1. Overview

This IP is designed to convert AXI-Stream sparse format data into a continuous, gap-free AXI-Stream format suitable for high-throughput applications, such as interfacing AXI-MM data with Xilinx CPM QDMA IPs.

---

## 2. Design Objectives

### 2.1 Primary Goals

Convert sparse AXI-MM data (with TSTRB marking) into continuous AXI-Stream output.

Handle unaligned start addresses.

Repack data across beats using a cascade mechanism.

Support final beat invalid byte marking.

Maintain data order and integrity.

#### Example:

![image](https://hackmd.io/_uploads/SyLNvVXxlx.png)



### 2.2 Additional Design Options

Support for AXIM narrow transfers (i.e., fewer than full bus width bytes per beat), using TSTRB to mark valid bytes.

---

## 3. External Interfaces

### 3.1 AXI-Stream Input (Sparse Format)

| Signal        | Direction | Width    | Description                       |
| ------------- | --------- | -------- | --------------------------------- |
| `axim_tvalid` | Input     | 1 bit    | Indicates valid data on input bus |
| `axim_tready` | Output    | 1 bit    | Ready to accept input data        |
| `axim_tlast`  | Input     | 1 bit    | Indicates last transfer in packet |
| `axim_tstrb`  | Input     | N/8 bits | Byte-wise valid strobe mask       |
| `axim_tdata`  | Input     | N bits   | Input data                        |

> *N: Data bus width (e.g., 32/64/128 bits)*

### 3.2 AXI-Stream Output (Continuous Format)

| Signal             | Direction | Width     | Description                                  |
| ------------------ | --------- | --------- | -------------------------------------------- |
| `axis_tvalid`      | Output    | 1 bit     | Output data is valid                         |
| `axis_tready`      | Input     | 1 bit     | Downstream is ready to receive data          |
| `axis_tlast`       | Output    | 1 bit     | Marks the last beat of a packet              |
| `axis_tfirst`      | Output    | 1 bit     | Marks the first beat of a packet             |
| `axis_tstrb`       | Output    | N/8 bits  | Output byte-wise valid indicator             |
| `axis_tdata`       | Output    | N bits    | Output data                                  |
| `axis_start_addr`  | Output    | log2(N/8) | Start address offset of first valid byte     |
| `axis_invalid_cnt` | Output    | log2(N/8) | Number of invalid bytes in final output beat |

> *N: Data bus width (e.g., 32/64/128 bits)*


---

## 4. Functional Behavior

### 4.1 Data Cascade

* If input beat doesn’t fill a full output beat, it is buffered.
* Next input is merged to complete a full AXIS beat.
* Remaining bytes (if any) are stored and cascaded to the next.

### 4.2 Alignment and Shifting

* Based on start address offset, data is shifted to LSB.
* Maintains order of bytes during merging.

### 4.3 Final Beat Handling

* Last beat may contain fewer than full bytes.
* Invalid count is emitted via `axis_invalid_cnt`.

---

## 5. Verification Considerations

* Aligned vs unaligned start cases.
* Multi-beat repacking with cascade.
* Partial final beats and invalid count.
* TSTRB correctness under all cases.
* Handshake (TVALID/TREADY) backpressure compliance.

---

## 6. Target Application

* Designed to connect AXI-MM sources to streaming interfaces such as **Xilinx CPM QDMA**.
* Suitable for PCIe DMA scenarios requiring high throughput and strict data alignment.

---





