inline
- 内联(Inline):打破物理边界的利器与代价 既然 HLS 把子函数当黑盒,这就带来一个问题:它无法做全局优化。 比如,如果在小黑盒的末尾有一个乘法,在大黑盒里拿到结果后马上跟了一个加法。因为有函数边界的阻挡,HLS 可能会强行在这两个操作中间插入寄存器(断开操作链接)。
这时候,inline(内联指令) 就派上用场了。 如图 2.11 所示,一旦你在子函数上加了 inline:
HLS 会直接抹除函数的物理边界。
所有的子逻辑全部暴露给顶层,融合成一坨巨大的组合逻辑。
好处: HLS 获得了“上帝视角”,它可以跨界进行资源共享和操作链接(Operation Chaining),从而缩短延迟(Latency),省下一些边界上的寄存器。
坏处与警告: 就像之前提到的“循环完全展开”一样,如果你的顶层逻辑极度复杂,你还把所有子模块都 inline 进来,这会生成一个无比庞大的数据流图。Vivado HLS 会被这海量的约束关系搞得内存溢出、耗费几个小时都综合不出来,甚至导致布线失败。
一句话总结: 层次化结构(不内联)是帮 EDA 工具减负,让代码结构模块化,但可能损失一点点跨界优化的性能;内联(Inline)是帮硬件提速,让逻辑融会贯通,但极容易让综合工具崩溃。合理的架构设计,就是在两者之间找平衡。