目标是写一个multi-ports(多读多写)的RAM,且因为声明空间较大不能浪费LUT资源去做,需要用BRAM实现
遇到的第一个问题是无法使用xilinx IP核,因为端口数量限制以及IP核必然会输出延迟1 Tclk;
手写过程中发现综合非常慢,原因在于由于单元内复杂的读写逻辑,vivado自动选择了LUT资源去综合,即使使用ram_extract和ram_ram_style试图强行限制到block ram中也没用。
综合过程中查看runme日志发现了各种问题,最典型的就是
”因为以下几种原因无法map to RAM:1. xxx
2. xxx etc.“
查看AMD论坛得知是HDL限制了使用BRAM声明的RAM不能在一个always块中进行一个以上的读写,比如reg [1:0] ram [1023:0]; 那么在同一个always块中哪怕只进行一个赋值和一个读取都会导致无法map到BRAM上。
解决方案是分开很多个always块写。想办法让每个always块中只有一个对ram进行读写的操作。ram[0] <= ram[1]这样都是不可以的!
以上理论上就已经可以解决问题。但如果读写逻辑足够复杂,还会遇到下一个问题:“Can not mapped to RAM because it is too sparse”。这个在AMD论坛上也暂时没看到什么好的方案,根据工作人员的回复推断是逻辑太复杂导致MUX过多,BRAM的存储单元布局没法装下被MUX导致如此分散的RAM。接下来尝试优化读写逻辑。