Xilinx XPM使用说明--XPM_MEMORY_SDPRAM
XPM_MEMORY_SDPRAM
参数化宏:简单的双端口RAM
介绍
此宏用于实例化简单双端口RAM。端口A用于从存储器执行写入操作,端口B可用于从存储器读取。
下面介绍XPM_MEMORY实例的基本读写端口使用情况。它不区分端口A和端口B。
-
所有同步信号都对 clk[a|b] 的上升沿敏感,它被假定为根据目标设备和内存原语要求运行的缓冲和切换时钟信号。
- 隐式执行读取操作以组合方式寻址 addrb。数据输出在 enb 置位的每个 clkb 周期被寄存。
-
在关联的读取操作之后,读取数据出现在 doutb 端口 READ_LATENCY_B 个clkb 周期。
-
当 ena 和 wea 在每个 clka 周期都有效时,显式执行写操作,将 dina 写入地址 addra。
-
所有读写操作都由启动clk[a|b] 周期的en[a|b] 值门控,无论输入或输出延迟如何。当 ena 在重合的 clk[a|b] 周期上被取消断言时,addra 和 wea 输入没有影响。
-
对于置位 rstb 的每个 clkb 周期,最终输出寄存器会立即同步重置为 READ_RESET_VALUE_B,而不管 READ_LATENCY_B。
-
对于regceb 有效且rstb 无效的每个clkb 周期,最终输出寄存器捕获并输出前一个流水线寄存器的值。
-
模块输入上提供的未驱动或未知值将产生未定义的内存阵列和输出端口行为。
-
当使用MEMORY INIT PARAM 时,支持的最大内存大小为4K bits。
-
不支持使用非对称字节写使能进行内存初始化。
-
在简单双端口 RAM 配置中,仅考虑 WRITE_MODE_B(尽管端口 A 具有写入权限,但使用 WRITE_MODE_B,因为输出数据将连接到端口 B,并且在传递给原语时,相同的模式值在内部应用于 WRITE_MODE_A ).
-
选择无效配置将导致DRC。为了在更大的内存(>1 Mb) 中获得更好的时序性能,请使用1 的CASCADE_HEIGHT 并具有足够的读取延迟。
注意:
-
当属性“CLOCKING_MODE”设置为“common_clock”时,所有通过端口A 和端口B 对内存的读/写操作都在clka 上执行。如果该属性设置为“independent_clock”,则端口A的读/写操作基于clka执行,端口B的读/写操作基于clkb执行。
-
当有效地址位与物理内存地址位置匹配时,写入超出范围的地址位置可能会覆盖有效地址位置。
-
如果设计注意避免地址冲突(在任何给定时间点写入地址!= 读取地址),基于独立时钟分布式RAM 的内存需要set_false_path 约束。
如果 XPM_MEMORY 需要处理必要的约束,则设置 USE_EMBEDDED_CONSTRAINT = 1。如果 USE_EMBEDDED_CONSTRAINT = 0,Vivado 可能触发 Timing-6 或 Timing-7 或两者。
或者,您也可以在 USE_EMBEDDED_CONSTRAINT = 0 时添加约束。下面提供了添加此约束的示例。如果端口 B 也具有独立时钟配置的写入权限,则也需要为 clkb 添加类似的约束。
set_false_path -from [filter [all_fanout -from [get_ports clka] -flat -endpoints_only] {IS_LEAF}] -through [get_pins -of_objects [get_cells -hier * -filter {PRIMITIVE_SUBGROUP==LUTRAM || PRIMITIVE_SUBGROUP==dram || PRIMITIVE_SUBGROUP==drom}] -filter {DIRECTION==OUT}]
- 如果 "CLOCKING_MODE" 设置为 "independent_clock" ,Vivado 可能会触发误报 CDC-1 警告,可以忽略。
- UltraRAM 的专用输入和输出寄存器的使用由基于 READ_LATENCY_B 值的综合控制。例如,如果 4 个 UltraRAM 级联并且 READ_LATENCY_B ≥ 4,则综合将尽可能多地吸收 UltraRAM 原语中的寄存器。
- 对于UltraRAM,OREG 的启用取决于READ_LATENCY_B 和WRITE_MODE_B。当 READ_FIRST 模式下 READ_LATENCY_B ≥ 3 且 WRITE_FIRST 模式下 READ_LATENCY_B ≥4 时启用 OREG。
- 对于更大的存储器 (≥2 MB),建议的读取延迟必须 > 8,因为 Vivado 综合使用的默认级联高度为 8。
Timing Diagrams
注意:当 OREG 属性设置为 TRUE 时,UltraRAM 原语不支持在睡眠断言在时钟的上升沿上被识别之前时钟周期中的写/读访问。对于 UltraRAM 配置,在睡眠断言之前的时钟周期内不允许对存储器进行写/读访问。
ECC Modes
当内存类型设置为简单双端口 RAM 时,Block RAM 和 UltraRAM 原语都支持 ECC。支持的三种 ECC 模式是:
- 既编码又解码
- 仅编码
- 仅解码
三种 ECC 模式的读写用法与上文介绍部分所述相同。请参阅 UltraScale 架构内存资源用户指南 (UG573) 的“内置纠错”部分,了解有关此功能(如错误注入和校正子位计算)的更多详细信息。
以上ECC模式中的WRITE_DATA_WIDTH_A、READ_DATA_WIDTH_B、MEMORY_SIZE属性都有限制。
- 编码和解码 WRITE_DATA_WIDTH_A 和 READ_DATA_WIDTH_B 都必须是 64 位的倍数。违反此规则将导致 XPM_Memory 中出现 DRC。
- 仅编码 WRITE_DATA_WIDTH_A 必须是 64 位的倍数,READ_DATA_WIDTH_B 必须是 72 位的倍数。 MEMORY_SIZE 必须是 READ_DATA_WIDTH_B 的倍数。违反这些规则将导致 DRC。
- 仅解码 WRITE_DATA_WIDTH_A 必须是 72 位的倍数,READ_DATA_WIDTH_B 必须是 64 位的倍数。 MEMORY_SIZE 必须是 WRITE_DATA_WIDTH_A 的倍数。违反这些规则将导致 DRC。
当启用 ECC 时,不支持以下内容:
- 不对称
- 初始化
- 复位(非零复位值或复位断言)
注意:ECC 使用 BRAM/URAM 宏中可用的硬 ECC 块,数据宽度应为倍数64/72。将 ECC IP 用于其他数据宽度组合。
自动睡眠模式
- 此功能仅适用于 MEMORY_PRIMITIVE 为 URAM 且在 UltraRAM 中进行内部控制以检查其是否可以进入睡眠模式以及何时需要唤醒。因此,无需显式控制 SLEEP 引脚即可自动实现节能。
- 当AUTO_SLEEP_TIME 为0 时,该功能被禁用。当 AUTO_SLEEP_TIME 不为零时,XPM_MEMORY 在除 rst[a|b] 之外的所有输入信号上构造等于 AUTO_SLEEP_TIME 值的流水线寄存器。
- 如果AUTO_SLEEP_TIME 太低,则UltraRAM 进入睡眠和唤醒的频率太高,这会导致消耗更多功率。
- 实现的睡眠周期数通过以下公式计算:
- 如果连续非活动周期数 < AUTO_SLEEP_TIME,则睡眠周期数 = 0。
- 如果连续非活动周期数≥AUTO_SLEEP_TIME,则连续睡眠周期数 = 连续非活动周期数 – 3。
- 非活动周期定义为任一端口都没有读/写操作的周期。
- 读取操作和数据到达dout[a|b] 之间的延迟是AUTO_SLEEP_TIME + READ_LATENCY_[A|B] 个时钟周期(假设当输出数据管道存在时REGCE 为高电平)。
- 当 READ_LATENCY_[A|B] 设置为 1 或 2 时,XPM_Memory 在行为上模拟自动睡眠功能并在 RAM 处于自动睡眠模式时在 DOUT[A|B] 上强制“x”。对于大于 2 的 READ_LATENCY_[A|B],“x”的传播不会发生在 DOUT[A| B] 因为输出寄存器在 UltraRAM 退出睡眠模式后获得时钟使能(延迟读取使能)。
-
自动睡眠模式对于较大的内存或任何活动很少的内存最有效。
不同读取延迟下自动睡眠模式的时序图如下所示。
Port Descriptions
设计输入法
Instantiation Yes
Inference No
IP and IP Integrator Catalog No
可用属性
Verilog Instantiation Template
// xpm_memory_sdpram: Simple Dual Port RAM // Xilinx Parameterized Macro, version 2022.2 xpm_memory_sdpram #( .ADDR_WIDTH_A(6), // DECIMAL .ADDR_WIDTH_B(6), // DECIMAL .AUTO_SLEEP_TIME(0), // DECIMAL .BYTE_WRITE_WIDTH_A(32), // DECIMAL .CASCADE_HEIGHT(0), // DECIMAL .CLOCKING_MODE("common_clock"), // String .ECC_MODE("no_ecc"), // String .MEMORY_INIT_FILE("none"), // String .MEMORY_INIT_PARAM("0"), // String .MEMORY_OPTIMIZATION("true"), // String .MEMORY_PRIMITIVE("auto"), // String .MEMORY_SIZE(2048), // DECIMAL .MESSAGE_CONTROL(0), // DECIMAL .READ_DATA_WIDTH_B(32), // DECIMAL .READ_LATENCY_B(2), // DECIMAL .READ_RESET_VALUE_B("0"), // String .RST_MODE_A("SYNC"), // String .RST_MODE_B("SYNC"), // String .SIM_ASSERT_CHK(0), // DECIMAL; 0=disable simulation messages, 1=enable simulation messages .USE_EMBEDDED_CONSTRAINT(0), // DECIMAL .USE_MEM_INIT(1), // DECIMAL .USE_MEM_INIT_MMI(0), // DECIMAL .WAKEUP_TIME("disable_sleep"), // String .WRITE_DATA_WIDTH_A(32), // DECIMAL .WRITE_MODE_B("no_change"), // String .WRITE_PROTECT(1) // DECIMAL ) xpm_memory_sdpram_inst ( .dbiterrb(dbiterrb), // 1-bit output: Status signal to indicate double bit error occurrence // on the data output of port B. .doutb(doutb), // READ_DATA_WIDTH_B-bit output: Data output for port B read operations. .sbiterrb(sbiterrb), // 1-bit output: Status signal to indicate single bit error occurrence // on the data output of port B. .addra(addra), // ADDR_WIDTH_A-bit input: Address for port A write operations. .addrb(addrb), // ADDR_WIDTH_B-bit input: Address for port B read operations. .clka(clka), // 1-bit input: Clock signal for port A. Also clocks port B when // parameter CLOCKING_MODE is "common_clock". .clkb(clkb), // 1-bit input: Clock signal for port B when parameter CLOCKING_MODE is // "independent_clock". Unused when parameter CLOCKING_MODE is // "common_clock". .dina(dina), // WRITE_DATA_WIDTH_A-bit input: Data input for port A write operations. .ena(ena), // 1-bit input: Memory enable signal for port A. Must be high on clock // cycles when write operations are initiated. Pipelined internally. .enb(enb), // 1-bit input: Memory enable signal for port B. Must be high on clock // cycles when read operations are initiated. Pipelined internally. .injectdbiterra(injectdbiterra), // 1-bit input: Controls double bit error injection on input data when // ECC enabled (Error injection capability is not available in // "decode_only" mode). .injectsbiterra(injectsbiterra), // 1-bit input: Controls single bit error injection on input data when // ECC enabled (Error injection capability is not available in // "decode_only" mode). .regceb(regceb), // 1-bit input: Clock Enable for the last register stage on the output // data path. .rstb(rstb), // 1-bit input: Reset signal for the final port B output register stage. // Synchronously resets output port doutb to the value specified by // parameter READ_RESET_VALUE_B. .sleep(sleep), // 1-bit input: sleep signal to enable the dynamic power saving feature. .wea(wea) // WRITE_DATA_WIDTH_A/BYTE_WRITE_WIDTH_A-bit input: Write enable vector // for port A input data port dina. 1 bit wide when word-wide writes are // used. In byte-wide write configurations, each bit controls the // writing one byte of dina to address addra. For example, to // synchronously write only bits [15-8] of dina when WRITE_DATA_WIDTH_A // is 32, wea would be 4'b0010. ); // End of xpm_memory_sdpram_inst instantiation