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

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

4.2. 可变延时MM主接口的LSU控制

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

查看以下教程,了解有关控制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 Host接口时,该处理很有用。

以下代码实例显示了对可变延时MM Host接口实现的两种类型的 LSU:
component void
dut(mm_host<int, dwidth<128>, awidth<32>, aspace<4>, latency<0>, waitrequest<1>> &Buff1,
    mm_host<int, dwidth<32>, awidth<32>, aspace<5>, latency<0>, waitrequest<1>> &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
  }
}

禁用静态合并

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

对于以下代码实例, Intel® HLS Compiler不会将两个负载操作静态合并成一个宽的负载操作:
component int
dut(mm_host<int, dwidth<256>, awidth<32>, aspace<1>, latency<0>, waitrequest<1>> &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,进而损害组件的吞吐量。