仅对英特尔可见 — GUID: ear1527014806057
Ixiasoft
10.2. 组件的结果质量较差
本小节中的信息说明可停机仲裁或超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。
条件运算符访问struct变量的两个不同数组
某些情况下,如果访问带有条件运算符的struct变量的不同数组, Intel® HLS Compiler Pro Edition会将数组合成同一RAM块。可在Function Memory Viewer中看到可停机仲裁,因为存储系统中的Load/Store站点不足。
struct MyStruct { float a; float b; } MyStruct array1[64]; MyStruct array2[64];
MyStruct value = (shouldChooseArray1) ? array1[idx] : array2[idx];
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 logic或State变量消耗。可能还会看见原本打算存储在寄存器中的一些数组被存储在大量RAM块中。

请注意被Cluster Logic和State消耗的RAM块数量。
- 流水线循环而非展开循环。
- 将局部变量存储到局部RAM块(hls_memory memory attribute)中而非较大寄存器(hls_register存储器属性)。
组件任务系统挂起或吞吐量较差
如果您的组件包含任务系统,可能需要添加launch/collect容量。
指定错误launch/collect容量可能会导致挂起或吞吐量不佳。
请参阅平衡任务系统中的容量了解详细信息。