文档目录

5. 组件存储器(存储器属性)

The Intel® High Level Synthesis (HLS) Compiler可以使用FPGA存储器资源(例如,RAM块)为本地、常量和静态变量以及代码中声明的agent存储器构建硬件存储器系统。

某些情况下, Intel® HLS Compiler使用组件数据路径中的寄存器实现本地、常量和静态变量。但是,您可以使用存储器属性覆盖该实现。

存储器访问被映射到加载-存储单元(LSU),并通过其端口与硬件存储器进行交易。 Intel® HLS Compiler有时会将对组件存储器的多个存储器访问静态合并为一个更宽的存储器访问,以节省实例化LSU的数量。组件存储器的LSU始终是流水线化的LSU。

如果同一周期内需要调度两个或更多个LSU,编译器可能会创建可停顿的仲裁逻辑。在High-Level Design Reports的Component Viewer中,可停顿的仲裁逻辑显示为红色。

关于 Intel® HLS Compiler例化LSU的更多详细信息,请参阅Load-Store Unit类型。关于合并存储器访问以节省实例化LSU的详细信息,请参阅存储器访问合并和加载-存储单元

图 7. 通过 Intel® HLS Compiler推断出的基本存储器配置

下图显示了基本存储器配置:



图 8. 具有两个存储器Bank的存储器系统

存储器系统的内容可以被划分成一个或多个储存器bank,这样每个bank包含一个硬件存储器中数据的子集:



图 9. 具有两个Replicate(复制)的存储器系统

存储器bank可以包含一个或多个存储器Replicate。编译器可能会创建存储器Replicate以创建更多读端口。如果您有许多读操作,就会拥有更多读端口允许对存储器系统的并发访问。

存储器bank中的replicate包含相同的数据,您可以同时从两个replicate中读取数据。Replicate可以有两个或四个访问端口,具体取决于replicate是以与组件相同的频率(单泵)还是两倍的频率(双泵)计时。可以并发访问Replicate中的所有端口。存储器bank中的端口数取决于存储器bank中包含的replicate数。



Replicate还可以包含一个或多个专用副本(private copy),以支持多个并发循环迭代。
图 10. 具有两个专用副本的存储器系统


Intel® HLS Compiler可以控制由其构建的硬件存储器的几何结构和配置参数。编译器尝试创建无停顿的存储器访问。即,编译器尝试为存储器端口提供无争用的存储器读和写访问。如果存储器系统中的所有读写都不存在争用,则存储器系统为无停顿。

编译器会尝试创建一个最小面积且无停顿的存储器系统。如果想要不同的面积-性能权衡,请使用组件存储器属性来指定您自己的存储器系统配置并覆盖由编译器推断的存储器系统。

组件存储器属性

将组件存储器属性应用于组件中的本地、常量和静态变量,以定制组件存储器系统的片上存储器架构并降低组件的FPGA面积利用率。您还可以将存储器属性应用于agent存储器和结构体数据成员。

这些组件存储器属性由"HLS/hls.h"头文件定义,您可以将这些属性包含到代码中。

表 16.   Intel® HLS Compiler Pro版组件存储器属性总结
存储器属性 描述
hls_force_pow2_depth 指定实现变量或数组的存储器的深度为2的幂(power-of-2)。
hls_register 强制变量或数组在寄存器中通过管道传输。

寄存器变量既可以专门在触发器(FF)中实现,也可以在FF和基于RAM的FIFO混合体中实现。

hls_memory 强制将变量或数组实现为嵌入式存储器。
hls_memory_impl 强制将变量或数组实现为特定类型的嵌入式存储器。
hls_singlepump 指定实现变量或数组的存储器必须与访问存储器的组件具有相同的时钟速率。
hls_doublepump 指定实现变量或数组的存储器必须以访问存储器的组件速率的两倍计时。
hls_numbanks 指定实现变量或数组的存储器具有定义数量的存储器bank。
hls_bankwidth 指定实现变量或数组的存储器必须具有定义宽度的存储器bank。
hls_bankbits 强制将存储器系统拆分成定义数量的存储器bank,并定义用于选择存储器bank的位。
hls_simple_dual_port_memory 指定实现变量或数组的存储器不应具有同时提供读写服务的端口。
hls_merge (深度范畴) 允许将两个或多个局部变量合并,以深度方式在组件存储器中实现为单个合并存储器系统。
hls_merge (宽度范畴) 允许将两个或多个局部变量合并,以宽度方式在组件存储器中实现为单个合并存储器系统。
hls_init_on_reset 当组件reset信号置位后,强制组件内部的静态变量初始化。
hls_init_on_powerup 设置实现静态变量的组件存储器,以便在FPGA被编程时能在上电过程中进行初始化。
hls_max_concurrency
Deprecated: 此属性已弃用,并将在未来的版本中被删除。使用 hls_private_copies存储器属性取而代之。
指定实现变量或数组的存储器具有定义数量的专用副本(private copy),以允许在任何给定时间进行循环的并发迭代。
hls_max_replicates 指定实现变量或数组的存储器具有的replicate数不超过指定数量,以便能够从数据路径同时读取
hls_private_copies 指定实现变量或数组的存储器具有定义数量的专用副本(private copy),以允许在任何给定时间进行循环的并发迭代。

结构体数据类型和存储器属性

您可以将存储器属性应用于struct声明中的struct成员变量。如果还要讲存储器属性应用于struct可变量的目标例化,则实例化中的属性将覆盖生命中的属性。

以下代码实例将存储器属性应用于声明和实例化:
struct State {
 int array[100] hls_memory;
 int reg[4] hls_register;
};
component int test(..) {
 struct State S1;
 struct State S2 hls_memory;
  // some uses
}

对于此实例代码,编译器将S1拆分成两个变量,S1.array[100](在存储器中实现)和S1.reg[4](在寄存器中实现)。然而,编译器会忽略对象S2struct声明中应用的属性,因为S2对象具有实例化时应用的hls_memory属性。

存储器Bank的属性约束

存储器bank的属性限制了您如何根据存储器bank的属性将组件存储器划分到各个 bank中。

以下属性之间的关系受到约束:
  • 一次(S)访问中所需数组的字节个数。如果访问的是局部变量,则该值表示局部变量的大小(以字节为单位)。
  • hls_numbanks属性()指定的存储器bank的数量。
  • hls_bankwidth属性()指定的存储器bank的宽度(以字节为单位)。
  • hls_bankbits属性指定的所选存储器bank的位个数。即,当您指定b 0 , b 1 , ..., b n 作为所选bank的位()时,则该位有n+1个。
这些属性受到以下限制:
  • 并发访问的字节数(或局部变量的大小)等于它使用的存储器bank数量乘以存储器bank的宽度。

  • 必须是2的幂的值。
  • 需要所选bank的位以确定存储器bank的个数。

您为hls_numbanks, hls_bankwidthhls_bankbits属性指定的值必须满足这些约束。对于未指定的属性, Intel® HLS Compiler根据这些约束推断属性的值。

要了解这些属性的更多信息,请查看以下教程:
<quartus_installdir>/hls/examples/tutorials/component_memories/memory_geometry