Electronic – difference between register and distributed RAM

programmable-logicramxilinx

I'm trying to understand what is purpose of distributed RAM as a concept. As far as I understand it is implemented using LUTs just as registers are. However registers seems to be much more flexible:

input bit [4:0] addr1;
input bit [4:0] addr2;
input bit [4:0] addr3;
output int res;
int register[32];
always_ff @(posedge clk) begin
    for (int i = 0; i < 32; i++) begin
        if (i == addr1 || i == addr2 || i == addr3) begin
            register[i]++;
        end
    end
    res = register[addr1] + register[addr2] + register[addr3];
end

However distributed RAM allows only limited number of accesses per cycle. Is it compiled in more optimal way?

Best Answer

I found answer on forum. A single cell can be connected either to a LUT+register making it store a single bit OR a 16x1b RAM block. So limiting memory to 2 ports allows for 16x increase in density of memory.