在FPGA里写了reg数组,不代表综合器一定会把它映射成BRAM。读写端口数量、异步读写方式、复位行为和器件资源都可能影响综合结果。
FPGA面试:为什么一段Verilog数组代码没有推断成Block RAM?

一、面试参考回答
Block RAM通常支持特定的同步读写端口结构。若RTL写成组合异步读、多端口冲突或逐位异步复位,综合器可能改用LUT RAM或触发器。应先确认目标FPGA的BRAM原语特性,再按工具推荐模板编写同步读写逻辑,并查看综合报告中的RAMB18/RAMB36等资源使用。
二、最常见的三类推断障碍
异步读:assign dout = mem[addr]这类写法可能无法映射到只支持同步读的块RAM结构。
对整个存储数组逐元素异步复位,往往不符合BRAM硬件特性;可考虑仅复位输出有效标志或用初始化机制。
读写端口数、位宽、字节使能和读写冲突语义与目标器件原语不匹配。
三、如何确认综合到底用了什么
看综合Utilization报告的Block RAM Tile、RAMB18/RAMB36与LUTRAM资源,而不是仅看RTL代码量。
若时序允许,增加寄存输出并按器件支持的同步读取模板调整代码。
也可以使用Block Memory Generator IP,但需理解初始化、读延迟、使能和时钟约束。
不要把“数组越大就一定用BRAM”当成规律,综合映射由RTL行为、工具和目标器件共同决定。
为什么把异步读取改为时钟上升沿读取后,BRAM资源可能出现,但输出延迟也改变?

扫码关注






























