AXI4-Stream 接口 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文
重要: hls::axis(以及 ap_axiu/ap_axis)无法在内部函数或变量上使用,因为 AXI4‑Stream 协议仅在顶层函数接口上受支持。对于内部函数和变量,必须使用 hls::stream 对象,如 HLS 串流库 中所述。

AXI4‑Stream 接口可应用于任意输入实参和任意阵列或指针输出实参。由于 AXI4‑Stream 接口按顺序串流方式来传输数据,因此不可用于同时支持读写的实参。就数据布局而言,AXI4‑Stream 的数据类型会对齐到下一个字节。例如,如果数据类型大小为 12 位,则将扩展至 16 位。根据选择的是有符号接口还是无符号接口,扩展的位将采用符号位扩展或零位扩展。

如果串流数据类型为用户定义的结构体,那么默认过程是使该结构体保持处于聚合状态,并将其对齐到最大数据元素大小(最接近的字节)。此规则的唯一例外是包含 hls::stream 对象的结构体。在此特殊情况下,该结构体将解聚,并为该结构体的每个成员元素创建一个 AXI 串流。

提示: 受支持的最大端口位宽为 4096 位,对于聚合的结构体或重构的阵列也都同样如此。

以下代码示例显示了如何根据结构体类型来封装对齐。如果结构体仅包含一个字符 (char) 类型,如以下示例所示,那么它将以 1 字节对齐方式进行封装。该结构体的总大小将为 2 字节:

struct A {
  char foo;
  char bar;
};

但如果结构体所含元素具有不同数据类型,如下所示,那么它将封装并对齐到最大的数据元素的大小,在此示例中即 4 字节。元素 bar 将填充 3 字节,从而使该结构体的总大小达到 8 字节:

struct A {
  int foo;
  char bar;
};
重要: AXI4‑Stream 接口 (axis) 中包含的结构体默认情况下处于聚合状态,串流本身无法解聚。如果结构体的成员元素需要独立串流,则可将其手动编码为独立元素,从而为每个元素生成独立的 AXIS 接口。请参阅 GitHub 上的 Vitis-HLS-Introductory-Examples/Interface/Aggregation_Disaggregation/disaggregation_of_axis_port 以获取示例。