自由运行的内核 - 2022.1 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文

Vitis 核开发套件可以为一个或多个自由运行的内核提供支持。自由运行的内核没有控制信号端口,并且无法手动启动或停止。自由运行的内核的无控制信号功能会产生如下特征:

  • 自由运行的内核没有存储器输入或输出端口,因此它只能通过串流来与主机或其它内核(包括常规内核或其它自由运行的内核)进行交互。
  • 如果通过二进制容器 (xclbin) 对 FPGA 进行编程,那么自由运行的内核会在 FPGA 上开始运行,因此无需从主机代码开始。
  • 当内核一旦开始接收到来自平台 I/O 或其它内核的串流数据后,就会立即开始处理这些数据,一旦这些数据不可用,内核就会停止处理。

自由运行的内核的主要优势在于其不遵循 C 语言语义,即所有函数都应执行相同的次数。这种建模样式更类似于 RTL 设计,如以下示例中所示。编译器对内核进行建模,以在先前函数调用完成后自动重启。此功能类似于软件代码中的 while(1) 循环,但是无需在内核代码中指定循环。如果内核在 INTERFACE 编译指示中使用 mode=ap_ctrl_none 模式,则可以实现此操作。这将在 AXI4-Lite 接口上无控制信号的情况下创建内核。这种建模方法被称为自由运行的内核,因为它没有任何控制握手。内核将自动启动并持续运行。

重要: 自由运行的内核展现出围绕内核使用 while(1) 循环的行为。因此,您不应在源代码中显式定义 while(1) 循环,以免行为出现不确定性。

此外,内核仅支持串流接口 (axis)。它不应使用 m_axis_axilite 接口,如以下示例中所示。

void increment(hls::stream<ap_axiu<32, 0, 0, 0> >& input, 
   hls::stream<ap_axiu<32, 0, 0, 0> >& output){

#pragma HLS interface ap_ctrl_none port = return
   ap_axiu<32, 0, 0, 0> v = input.read();
   v.data = v.data + 1;
   output.write(v);
   if (v.last){
      break;
   }
}
提示: 自由运行的内核不支持软件仿真。