Vitis 核开发套件可以为一个或多个自由运行的内核提供支持。自由运行的内核没有控制信号端口,并且无法手动启动或停止。自由运行的内核的无控制信号功能会产生如下特征:
- 自由运行的内核没有存储器输入或输出端口,因此它只能通过串流来与主机或其它内核(包括常规内核或其它自由运行的内核)进行交互。
- 如果通过二进制容器 (xclbin) 对 FPGA 进行编程,那么自由运行的内核会在 FPGA 上开始运行,因此无需从主机代码开始。
- 当内核一旦开始接收到来自平台 I/O 或其它内核的串流数据后,就会立即开始处理这些数据,一旦这些数据不可用,内核就会停止处理。
自由运行的内核的主要优势在于其不遵循 C 语言语义,即所有函数都应执行相同的次数。这种建模样式更类似于 RTL 设计,如以下示例中所示。编译器对内核进行建模,以在先前函数调用完成后自动重启。此功能类似于软件代码中的 while(1)
循环,但是无需在内核代码中指定循环。如果内核在 INTERFACE 编译指示中使用 mode=ap_ctrl_none
模式,则可以实现此操作。这将在 AXI4-Lite 接口上无控制信号的情况下创建内核。这种建模方法被称为自由运行的内核,因为它没有任何控制握手。内核将自动启动并持续运行。
重要: 自由运行的内核展现出围绕内核使用
while(1)
循环的行为。因此,您不应在源代码中显式定义 while(1)
循环,以免行为出现不确定性。此外,内核仅支持串流接口 (axis
)。它不应使用 m_axi
或 s_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;
}
}
提示: 自由运行的内核不支持软件仿真。