Intel®高层次综合编译器专业版: 最佳实践指南

ID 683152
日期 6/22/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

9.2. 组件获得不良结果

尽管有许多原因导致设计获得较差的结果质量(QoR),但不良存储器配置也是常见的重要因素。在High Level Design Reports中查看Function Memory Viewer报告,并找出可关停的仲裁节点和意外的RAM使用率。

本小节中的信息说明可停机仲裁或超RAM使用率的一些常见源。

组件使用的FPGA资源超出预期

默认情况下, Intel® HLS Compiler Pro Edition尝试通过最大化最大操作频率(fMAX)将组件优化为最大吞吐量。

有一种减少面积消耗的方法是,使用--clock i++命令选项或或hls_scheduler_target_fmax_mhz组件属性,设置目标fMAX值放松fMAX需求。通常HLS编译器可达到的fMAX会高于设置,所以即使将目标fMAX设置到低于所需值时,您的设计可能仍能达到可接受的fMAX值,实现设计占用较少面积的目的。

要了解更多有关fMAX目标值控制的的信息,可参阅以下教程: <quartus_installdir>/hls/examples/tutorials/best_practices/set_component_target_fmax

不正确的Bank位

如果访问并行数组(单维度或多维度数组)中的部分,可能需要配置存储器bank选择位。

请参阅存储器体系结构最佳实践获得有关如何有效配置存储系统的信息。

条件运算符访问struct变量的两个不同数组

某些情况下,如果访问带有条件运算符的struct变量的不同数组, Intel® HLS Compiler Pro Edition会将数组合成同一RAM块。可在Function Memory Viewer中看到可停机仲裁,因为存储系统中的Load/Store站点不足。

例如,以下代码显示一个struct变量的数组,有条件运算符导致停机仲裁,以及避免陷入停机仲裁的解决方法。
struct MyStruct { float a; float b; } MyStruct array1[64]; MyStruct array2[64];
以下条件运算符使用struct变量的数组,导致停机仲裁:
MyStruct value = (shouldChooseArray1) ?
                  array1[idx] : array2[idx];
通过删除运算符,并使用if声明取而代之可避免条件运算符造成的停机仲裁。
MyStruct value;
                  if (shouldChooseArray1) { value = array1[idx]; } else { value = array2[idx];
                }

集群逻辑

您的设计可能会消耗比预期更多的RAM块,尤其是如果将许多数组变量存储在大型寄存器中。

可使用hls_use_stall_enable_clusters组件属性防止编译器插入无停机集群退出FIFO。

高级设计报告 (report.html)中的Area Analysis of System报告有助于找出该问题。

特意将3个矩阵存储在RAM块中,但矩阵的RAM块不足该组件中消耗的RAM块的一半。

如果进一步查看报告,可能会看到大部分RAM块被Cluster logicState变量消耗。可能还会看见原本打算存储在寄存器中的一些数组被存储在大量RAM块中。

请注意被Cluster LogicState消耗的RAM块数量。

某些情况下,可使用如下方法减少RAM块的使用:
  • 流水线循环而非展开循环。
  • 将局部变量存储到局部RAM块(hls_memory memory attribute)中而非较大寄存器(hls_register存储器属性)。