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

ID 683152
日期 12/04/2023
Public
文档目录

10.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

Loops Do Not Achieve II=1

如果指定目标fMAX,编译器可能会保守地增加II以实现您的目标fMAX

如果指定目标fMAX并且要求II=1,您应该使用#pragma ii 1在需要 II=1的循环上。要了解更多详情,请参阅平衡目标fMAX和目标II

不正确的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存储器属性)中而非较大寄存器(hls_register存储器属性)。

组件任务系统挂起或吞吐量较差

如果您的组件包含任务系统,可能需要添加launch/collect容量。

指定错误launch/collect容量可能会导致挂起或吞吐量不佳。

请参阅平衡任务系统中的容量了解详细信息。