赛灵思建议在数据流区域内使用规范形式来编写代码。函数和循环的数据流最优化都具有规范形式。
- 函数:函数内部的数据流的规范形式编码准则规定:
- 仅限在数据流区域内使用以下类型的变量:
- 局部非静态标量/阵列/指针变量。
- 局部静态
hls::stream
变量。
- 函数调用仅限正向传输数据。
- 阵列或
hls::stream
应仅含一个生产者函数和一个使用者函数。 - 函数实参(来自数据流区域外部的变量)应仅支持读取或写入,不得同时支持读取和写入。如果对同一函数实参同时执行读取和写入,那么应先读取后写入。
- 局部变量(按正向传输数据的变量)应先写入后读取。
以下代码示例演示了函数中数据流的规范形式。请注意,第一个函数 (
func1
) 读取输入,最后一个函数 (func3
) 写入输出。另请注意,一个函数创建的输出值将作为输入参数传递到下一个函数。void dataflow(Input0, Input1, Output0, Output1) { UserDataType C0, C1, C2; #pragma HLS DATAFLOW func1(read Input0, read Input1, write C0, write C1); func2(read C0, read C1, write C2); func3(read C2, write Output0, write Output1); }
- 仅限在数据流区域内使用以下类型的变量:
- 循环:循环主体内部的数据流的规范形式编码准则包含适用于以上定义的函数的编码准则以及如下准则:
- 初始值为 0。
- 循环条件是通过将循环变量与数值常量或循环主体内部不变的变量进行比较来形成的。
- 按 1 递增。
以下代码示例演示了循环中数据流的规范形式。
void dataflow(Input0, Input1, Output0, Output1) { UserDataType C0, C1, C2; for (int i = 0; i < N; ++i) { #pragma HLS DATAFLOW func1(read Input0, read Input1, write C0, write C1); func2(read C0, read C0, read C1, write C2); func3(read C2, write Output0, write Output1); } }