解聚示例 - 2023.2 简体中文

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

解聚 AXIS 接口

这是 axis 接口的 DISAGGREGATE 编译指示或指令的示例。GitHub 上的 disaggregation_of_axis_port 提供了如下所示示例。

表 1. 解聚 AXIS 接口上的结构体
HLS 源代码 已综合的 IP 模块
#define N 10

struct A {
  char c;
  int i;
};

void dut(A in[N], A out[N]) {
#pragma HLS interface axis port=in
#pragma HLS interface axis port=out
#pragma HLS disaggregate variable=in
#pragma HLS disaggregate variable=out
  int sum = 0;
  for (unsigned i=0; i<N; i++) {
    out[i].c = in[i].c;
    out[i].i = in[i].i;
  }
} 
module dut (
ap_local_block,
ap_local_deadlock,
ap_clk,
ap_rst_n,
ap_start,
ap_done,
ap_idle,
ap_ready,
in_c_TVALID,
in_i_TVALID,
out_c_TREADY,
out_i_TREADY,
in_c_TDATA,
in_c_TREADY,
in_i_TDATA,
in_i_TREADY,
out_c_TDATA,
out_c_TVALID,
out_i_TDATA,
out_i_TVALID
);

在以上解聚示例中,结构体实参 inout 均映射到 AXIS 接口,然后进行解聚。这导致 Vitis HLS 为每个实参创建 2 条 AXI 串流:in_cin_iout_cout_i。结构体 A 的每个成员都各成一条独立串流。

生成的模块的 RTL 接口显示在上表右侧,其中成员元素 ci 均为独立 AXI 串流端口,每个端口都有自己的 TVALID、TREADY 和 TDATA 信号。

Vitis HLS 将在 log 日志文件中发出以下消息:
INFO: [HLS 214-210] Disaggregating variable 'in' (example.cpp:19:0)
INFO: [HLS 214-210] Disaggregating variable 'out' (example.cpp:19:0)

解聚 HLS::STREAM

这是搭配 hls::stream 类型一起使用的 DISAGGREGATE 编译指示或指令的示例。

表 2. HLS::STREAM 的结构体(已解聚)
HLS 源代码 已综合的 IP 模块
#define N 1024

struct A {,
  hls::stream<int> s_in;
  long arr[N];
};

long dut(struct A &d) {
  long sum = 0;
  while(!d.s_in.empty())
    sum += d.s_in.read();
  for (unsigned i=0; i<N; i++)
    sum += d.arr[i]; 
  return sum;
}
module dut (
ap_local_block,
ap_local_deadlock,
ap_clk,
ap_rst,
ap_start,
ap_done,
ap_idle,
ap_ready,
d_s_in_dout,
d_s_in_empty_n,
d_s_in_read,
d_arr_ce0, 
d_arr_q0,
ap_return
);

如果在用于接口中的结构内部使用 hls::stream 对象,则会导致 Vitis HLS 编译器将该结构体端口自动解聚。如以上示例所示,生成的 RTL 接口将为 hls::stream 对象 s_in 包含独立的 RTL 端口(名为 d_s_in_*),并为阵列 arr 包含独立的 RTL 端口(名为 d_arr_*)。

Vitis HLS 将在 log 日志文件中发出以下消息:
INFO: [HLS 214-210] Disaggregating variable 'd'
INFO: [HLS 214-241] Aggregating fifo (hls::stream) variable 'd_s_in' with compact=bit mode in 32-bits