在使用更深的存储器配置时,可在 RTL 中使用 RAM_DECOMP 综合属性,通过改进存储器组合来降低功耗。当 RAM_DECOMP 属性被应用到存储器阵列上时,存储器逻辑将映射到更宽的块 RAM 原语阵列上。为平衡功耗与时钟频率,您可以使用 CASCADE_HEIGHT 属性和 RAM_DECOMP 属性来控制级联。这种方法需要更多的地址解码逻辑,但有助于减少为每个读取操作启用的块 RAM 数量,从而帮助降低功耗。
例如,下图显示的是 1 个 32x16K 存储器配置。
图 1. 32x16K 存储器配置
如果您应用下列属性:
ram_decomp = "power"
cascade_height = 4
将推断得出 16 个 RAMB36E2 且存储器分解方式如下:
- 基本原语为 32x1K。
- 4 个块 RAM 将通过级联创建 32x4K 配置。
- 4 个并行结构可创建 1 个 16K 深的存储器。
- 输出通过多路复用来生成输出数据。图 2. 使用 CASCADE_HEIGHT 和 RAM_DECOMP 属性生成的 32x16K 存储器配置结构示例
以下 RTL 代码示例显示了 CASCADE_HEIGHT 和 RAM_DECOMP 属性的用例。
图 3. 使用 CASCADE_HEIGHT 和 RAM_DECOMP 属性的 32x16K 存储器配置的 RTL 代码
如果仅应用 ram_decomp = "power"
属性,那么将推断得出 16 个 RAMB36E2 并且存储器分解方式如下:
- 基本原语为 32x1K。
- 8 个块 RAM 将通过级联创建 32x8K 配置。
- 2 个并行结构可创建 1 个 16K 深的存储器。
- 输出通过多路复用生成 2:1 MUX,以生成输出数据。图 4. 使用 RAM_DECOMP 属性生成的 32x16K 存储器配置的结构
以下 RTL 代码示例显示了 RAM_DECOMP 属性的用例。
图 5. 使用 RAM_DECOMP 属性的 32x16K 存储器配置的 RTL 代码
如果仅使用 RAM_DECOMP 属性,那么总体功耗节省与同时使用 RAM_DECOMP 和 CASCADE_HEIGHT 属性相似,因为每次只有 1 个块 RAM 处于活动状态。为了实现最高时钟频率,创建深度为 4 的级联块 RAM 链比深度为 8 的级联块 RAM 链效果更好。