FPGA中BRAM与URAM资源分配策略与性能优化
在Xilinx UltraScale+系列FPGA中,片上存储器分为BRAM(Block RAM)和URAM(Ultra RAM)两类。BRAM容量18/36Kb,URAM容量288Kb,但URAM延迟略高且占用更多布线资源。合理分配两者是平衡容量、时序与功耗的关键。本文总结BRAM与URAM的选型原则与优化策略。
一、BRAM vs URAM 关键参数对比
特性 BRAM (36Kb) URAM (288Kb)
单块容量 36 Kbits(可配2×18Kb) 288 Kbits
最大频率 通常 ~500 MHz ~450 MHz(略低)
读延迟 1 cycle(简单双口) 2~3 cycles(需流水)
物理尺寸 小 大(布线更拥塞)
级联能力 通过级联逻辑(CASCADE) 内部自带级联链
典型用途 小FIFO、寄存器堆、系数表 大缓存、行缓冲、帧缓冲
二、分配策略:何时用BRAM,何时用URAM
1. 优先用BRAM的场景
• 深度 ≤ 1024 的单口/简单双口RAM
• 需要1-cycle读延迟(如查找表、状态机寄存器堆)
• 小FIFO(深度 ≤ 512)
• 资源充足时优先BRAM,因其布线灵活、时序易收敛
2. 必须或优先用URAM的场景
• 深度 ≥ 4096 的大缓存(如视频行缓冲、雷达回波缓存)
• 需要级联成大容量(URAM自带级联,BRAM级联需额外逻辑)
• 芯片BRAM已用尽(BRAM数量通常远少于URAM)
3. 避免用URAM的场景
• 小深度(<512):URAM浪费容量且延迟高
• 高频设计(>450MHz):URAM时序更难收敛
• 需要大量独立小RAM:URAM粒度大,利用率低
三、Verilog例化对比
BRAM(简单双口,深度512,位宽32)
// 用XPM(Xilinx Parameterized Macro)例化
xpm_memory_sdpram #(
.MEMORY_SIZE(512 * 32),
.MEMORY_PRIMITIVE("block"), // block = BRAM
.READ_LATENCY(1)
) u_bram (
.clka(clk), .ena(1'b1), .wea(wr_en),
.addra(wr_addr), .dina(wr_data),
.clkb(clk), .enb(1'b1),
.addrb(rd_addr), .doutb(rd_data)
);
URAM(深度8192,位宽64)
xpm_memory_sdpram #(
.MEMORY_SIZE(8192 * 64),
.MEMORY_PRIMITIVE("ultra"), // ultra = URAM
.READ_LATENCY(3) // URAM需至少2~3 cycle
) u_uram (
.clka(clk), .ena(1'b1), .wea(wr_en),
.addra(wr_addr), .dina(wr_data),
.clkb(clk), .enb(1'b1),
.addrb(rd_addr), .doutb(rd_data)
);
四、性能优化技巧
1. 利用URAM内部级联(减少外部MUX)
URAM支持Cascade Input/Output,多个URAM可自动拼接成更大深度,无需外部MUX。在XPM中设置MEMORY_SIZE超过单块容量即可自动级联。
2. BRAM拆分与合并
• 小位宽(≤18bit)用单块BRAM,大位宽(≥36bit)用两块拼(MEMORY_PRIMITIVE="block"自动处理)
• 若需同时读写不同地址,用真双口(True Dual Port)BRAM,避免冲突
3. 时序优化
• BRAM读延迟固定1 cycle,URAM建议设为2~3 cycle,并在读地址路径上加一级FF
• 在XDC中对URAM路径放宽约束:
set_max_delay -from [get_cells -hier u_uram_inst] -to [all_registers] 2.5
4. 功耗优化
• 禁用未使用的BRAM/URAM端口(ena=0)
• 对URAM使用Sleep Mode(sleep=1)在空闲时降功耗
五、资源分配决策树
需求:深度D × 位宽W
D × W ≤ 36Kb 且 读延迟要求1 cycle?
└─→ 用BRAM
D × W > 36Kb 且 D ≥ 4096?
└─→ 用URAM(级联)
D × W 中等(1024~4096)?
├─ BRAM充足 → BRAM(级联)
└─ BRAM紧缺 → URAM
高频 (>450MHz) 且 深度适中?
└─→ 优先BRAM
六、常见坑与调试
现象 原因 解决
URAM读数据延迟不符合预期 未设足够READ_LATENCY 至少设2,最好3
BRAM级联后时序违例 级联链过长 在级联路径中间插FF
URAM利用率低(<50%) 深度太小,浪费容量 合并多个小RAM或改用BRAM
综合报"Unable to pack into URAM" 位宽或深度不匹配URAM原生配置 检查URAM原生位宽(72bit)×深度(4096)
七、结语
BRAM与URAM的分配本质是容量、延迟、资源利用率的三方权衡。小容量/低延迟用BRAM,大容量/高深度用URAM。通过XPM统一例化并设置正确的MEMORY_PRIMITIVE与READ_LATENCY,可让工具自动选择最优实现,同时保留手动微调空间。掌握此策略,你的FPGA设计将在存储密集型应用中既高效又稳健。





