描述
FUNCTION_INSTANTIATE 编译指示化是一种最优化技巧,不仅具有维持函数层级的面积优势,还可提供另一个强大的选项:在函数的特定实例上执行针对性的局部最优化。这样可以简化围绕函数调用的控制逻辑,也可能改进时延和吞吐量。
默认情况下:
- 函数在 RTL 中作为独立层级块保留。
- 同一层级上的任一函数的所有实例都使用单一 RTL 实现(块)。
FUNCTION_INSTANTIATE 编译指示用于为函数的每个实例创建唯一的 RTL 实现,允许根据函数调用对每个实例进行局部最优化。鉴于调用函数时部分函数输入可能是常量,此编译指示可藉此简化周围控制结构,并生成进一步优化的、更小的函数块。
如不使用 FUNCTION_INSTANTIATE 编译指示,则以下代码会为 foo
中的函数的全部 3 个实例生成函数 foo_sub
的单一 RTL 实现。函数 foo_sub
的每个实例都是以相同方式实现的。这对于函数复用并无影响,并且可以减少函数的每次实例调用所需的面积,但是函数内部的控制逻辑必须更复杂,以便应对每次调用 foo_sub
时产生的变化。
char foo_sub(char inval, char incr) {
#pragma HLS function_instantiate variable=incr
return inval + incr;
}
void foo(char inval1, char inval2, char inval3,
char *outval1, char *outval2, char * outval3)
{
*outval1 = foo_sub(inval1, 1);
*outval2 = foo_sub(inval2, 2);
*outval3 = foo_sub(inval3, 3);
}
在以上代码样本中,FUNCTION_INSTANTIATE 编译指示会生成函数 foo_sub
的 3 个不同实现,每个实现都会按 incr
实参进行单独优化,从而减少面积并改善函数性能。完成 FUNCTION_INSTANTIATE 最优化后,foo_sub
能够有效转换为 3 个独立函数,每个函数都会按 incr
的指定值进行最优化。
语法
将 C 语言源代码中的编译指示置于所需位置的边界内。
#pragma HLS function_instantiate variable=<variable>
其中:
-
variable=<variable>
- 这是必需的实参,用于定义要用作为常量的函数实参。
示例
在以下示例中,布局在函数 swInt
内的 FUNCTION_INSTANTIATE
编译指示允许按 maxv
函数实参来对函数 swInt
的每个实例进行独立最优化。
void swInt(unsigned int *readRefPacked, short *maxr, short *maxc, short *maxv){
#pragma HLS function_instantiate variable=maxv
uint2_t d2bit[MAXCOL];
uint2_t q2bit[MAXROW];
#pragma HLS array partition variable=d2bit,q2bit cyclic factor=FACTOR
intTo2bit<MAXCOL/16>((readRefPacked + MAXROW/16), d2bit);
intTo2bit<MAXROW/16>(readRefPacked, q2bit);
sw(d2bit, q2bit, maxr, maxc, maxv);
}