函数内联会移除函数层级。函数可使用 INLINE 指令进行内联。内联函数可支持函数中的组件以更高效的方式与调用函数中的逻辑共享或利用该逻辑进行最优化,从而改善面积。Vitis HLS 也会自动执行此类型的函数内联。小型函数可自动内联。
内联支持对函数共享进行更有效的控制。对于要共享的函数,必须在相同层级内使用。在此代码示例中,foo_top
函数会对 foo
进行 2 次调用,并调用 foo_sub
函数。
foo_sub (p, q) {
int q1 = q + 10;
foo(p1,q); // foo_3
...
}
void foo_top { a, b, c, d} {
...
foo(a,b); //foo_1
foo(a,c); //foo_2
foo_sub(a,d);
...
}
将函数 foo_sub
内联并使用 ALLOCATION 指令指定仅使用 foo
函数的 1 个实例,这样生成的设计仅含 1 个 foo 函数的实例:面积为以上示例的三分之一。
foo_sub (p, q) {
#pragma HLS INLINE
int q1 = q + 10;
foo(p1,q); // foo_3
...
}
void foo_top { a, b, c, d} {
#pragma HLS ALLOCATION instances=foo limit=1 function
...
foo(a,b); //foo_1
foo(a,c); //foo_2
foo_sub(a,d);
...
}
INLINE 指令可选择使用 recursive
选项来允许位于指定函数下层的所有函数以递归方式进行内联。如果对顶层函数使用 recursive
选项,那么将移除设计中的所有函数层级。
可选择对函数应用 INLINE off
选项以阻止对这些函数进行内联。该选项可用于阻止 Vitis HLS 自动进行函数内联。
INLINE 指令是大幅修改代码结构而不对源代码执行任何实际修改的强大方法,并可提供强大的架构探索方法。