Intel® 高层次综合编译器专业版Pro版: 参考手册

ID 683349
日期 12/04/2023
Public
文档目录

4.3. 管道

使用外部存储器将数据移入和移出静态对象库或任务函数,这样可能会限制您设计的性能。管道通过使用器件上的FIFO缓冲区进行通信,来提供一种高效且低延迟的传递数据机制。

管道类似于流,但更简单。您可以在组件中使用管道,或者允许任务相互通信,但管道仅支持ready/validdata 信号,而流支持其它的边带信号,例如startofpacketendofpacket

与流不同,您可以使用模板创建管道数组,并可以尽数迭代数组以写入或读取设计中的管道。

与流一样,写入管道的数据会保留在管道中,直到其被读取或组件被重置。

管道的存储器模型允许您使用它们对静态对象库中运行函数的任务函数,或者运行中的任务函数的数据进行发送和接收。

管道属性

管道具有以下关键属性:
FIFO ordering
数据只能按照FIFO顺序访问(读取)。管道中无存储器地址或指针的概念,这就意味着无法通过管道进行随机数据访问。
Capacity
管道具有容量。即,在需要读取管道中任何数据之前,可以向一个初始为空的管道写入固定数量的数据,以便为更多数据腾出空间。

满管会对写入站点施加背压。

管道访问器(Accessor)

数据通过API写入管道,该API提交管道数据类型的单个字,随后该字由从管道读取数据的API返回。

访问管道的API可以是阻塞类型,也可以是非阻塞类型:
Blocking API calls
阻塞写入API调用,直到管道具有足够的容量来提交数据。

阻塞读取API调用处于等待状态,直到管道包含要读取的数据。

Nonblocking API calls
非阻塞API调用立即执行并返回指示操作是否成功的状态。

您可以将阻塞和非阻塞访问混合到同一管道。例如,您可以使用阻塞管道write()调用将数据写入管道,并使用非阻塞read()调用从另一端读取该数据,反之亦然。

管道中的数据持久性

通过组件写入管道的数据会保留在管道中,直到其被读取或组件被重置。

通过任务写入管道的数据将保留在管道中,直到另一个任务从管道读取或包含该任务的组件被重置。

管道中的数据顺序始终遵循FIFO顺序。

FPGA器件重置或重新编程后不会保留管道中的数据。

使用管道的限制

使用管道有以下限制:
Multiple pipe call sites
一个组件或任务函数可以多次从同一管道读取数据,但多个组件或任务函数不能从同一管道读取数据。同样,一个组件或任务函数可以多次写入同一管道,但多个组件或任务函数不能写入同一管道。
Feedback and feed-forward pipes
组件或任务函数应使用单独的管道进行管道读取和管道写入。在同一个函数内写入和读取同一个管道可能会导致性能不佳。
Pipe accesses in loops
如果您使用循环结构等待从管道来的数据,则请勿使用非阻塞管道。也就是说,避免使用以下非阻塞管道访问代码模式:
bool success = false;
while (!success) {
  my_pipe::write(rd_src_buf[i], success); 
  // can also be a nonblocking read
}
使用阻塞访问与该代码模式取而代之,因为在硬件中该代码模式下的阻塞访问比该代码模式下的非阻塞访问更高效。