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

ID 683152
日期 6/22/2020
Public

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

文档目录

3.2. 可变延迟MM主接口的LSU控制

控制 Intel® HLS Compiler Pro Edition使用的load-store units(LSU)类型,以与可变延迟Memory Mapped (MM) Master接口互动,有助于节省设计中的面积。您还可能遇到禁用加载/存储与其他加载/存储操作静态合并的情况,以有益于设计性能。

查看以下教程,了解有关控制LSU的信息: <quartus_installdir>/hls/examples/tutorials/best_practices/lsu_control.

要想知道是否需要LSU控制,可查看组件的High-Level Design Reports,尤其是Function Memory Viewer,以查看 Intel® HLS Compiler Pro Edition推断的存储器访问码型(及其相关LSU)是否符合预期的存储器访问码型。如果不符合,则请考虑控制LSU类型,LSU合并,或两者兼顾。

控制创建的LSU类型

Intel® HLS Compiler Pro Edition创建突发合并型LSU或流水线型LSU。

通常, 当希望LSU处理连续存储器字的多个加载/存储请求时,请用突发合并LSU。突发合并LSU会尝试将请求“动态合并”为较大突发,以便更加有效地利用存储器带宽。

流水线化LSU显著减少占用FPGA面积,且无需合并即可单独处理加载/存储请求。当您的设计空间有限或对无需连续访问可变延迟MM Master接口时,该处理很有用。

如下代码实例显示针对可变延迟MM Master接口实现的两种LSU:
component void
                  dut(mm_master<int, dwidth<128>, awidth<32>, aspace<4>,
                  latency<0>> &Buff1, mm_master<int, dwidth<32>,
                  awidth<32>, aspace<5>, latency<0>> &Buff2) { int
                  Temp[SIZE]; using pipelined = lsu<style<PIPELINED>>; using
                  burst_coalesced = lsu<style<BURST_COALESCED>>; for (int i = 0;
                  i<SIZE; i++) { Temp[i] = burst_coalesced::load(&Buff1[i]); //
                  Burst-Coalesced LSU }  for (int i = 0; i<SIZE; i++) {
                    pipelined::store(&Buff2[i], 2*Temp[i]); // Pipelined LSU } }

禁用静态合并

静态合并通常都可获益,因为通过将多个加载/存储操作静态合并为更宽的加载/存储操作可减少设计中LSU的总数

但也存在静态合并导致的访问未对齐,而您可能并不希望出现这种情况。此外还会出现您打算一次仅运行其中一部分,但多个加载/存储被合并的情形。该情况下,请考虑禁用您不希望合并的加载/存储操作的静态合并。

如下代码实例中, Intel® HLS Compiler不会将两个加载操作静态合并为一个宽加载操作:
component int
                  dut(mm_master<int, dwidth<256>, awidth<32>, aspace<1>,
                  latency<0>> &Buff1, int i, bool Cond1, bool Cond2) { using
                  no_coalescing = lsu<style<PIPELINED>, static_coalescing<false>>;
                  int Val = 0; if (Cond1) { Val = no_coalescing::load(&Buff1[i]); } if (Cond2) {
                  Val = no_coalescing::load(&Buff1[i + 1]); } return Val; } 
如果合并这两个加载操作,则会创建一个不对齐的LSU,从而损害组件的吞吐量。