本文主要是介绍HLS进阶技巧——反压fifo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Vitis HLS设计中,由于只能获取到fifo
的empty
、full
信号,而不像RTL设计中还能拿到write/read count,所以在dataflow
中,只能通过empty
、full
信号来进行数据驱动。反压fifo
是通过fifo
的full
信号来控制程序的运行。下面介绍两种笔者涉及到的反压技巧,以便大家在自己的设计中举一反三。
技巧1
下图所示为dataflow
中一个最基本的结构,在反压设计中,backPressStrm
如果指定depth=2
,那么Producer
写入两个数后,如果Consumer
没读取,则Producer
会hang住等待Consumer
中backPressStrm
的读取,所以Consumer
通过合理的控制实现了反压的应用。
伪码
{
#pragma HLS inline off
#pragma HLS dataflowhls::stream<bool> backPressStrm;
#pragma HLS stream variable = backPressStrm depth = 2hls::stream<DT> dataStrm; // DT 数据类型
#pragma HLS stream variable = dataStrm depth = N // N 按照实际需要Producer(backPressStrm, dataStrm );Consumer(backPressStrm, dataStrm );
}
技巧2
下图所示中,是一个Producer
和多个Consumer
的结构。
Producer
每次写数据前,先通过none-blocking write (nb_write
)的方式写backPressStrm
,如果成功则将固定深度N
的数据写入dataStrm
中,否则直接返回进入下一个通路。可以实现任意数据量分配给Consumer
模块。
Consumer
则每次从dataStrm
读取N
个数后要读一次backPressStrm
。
这篇关于HLS进阶技巧——反压fifo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!