Also, rstofer, are you talking about a system where you have an FPGA and a CPU that you're using the ram together on? What do I even do with RAM in an FPGA for the most part? Like I can see if I have a ton of registers, but is that all I'd use RAM for in an FPGA? A wire shouldn't take RAM right? A complex math function will just "become hardware" and also won't need to be ram, right?
RAM won't usually be used for registers, that is the purpose of flops at the output of logic cells.
Having RAM is one of the big things that separates CPLD (Complex Programmable Logic Devices) from FPGA and is one of the most critical resources.
Suppose your magic CPU project just screams for a VGA text display. Well, you might need about 12k x 8 of RAM/ROM. ROM is simply RAM that is initialized at startup. So that is one use for BlockRAM. Or, suppose your project needs a little central RAM - there's another use. Maybe you need code translation tables - ROMs, really, but still in BlockRAM.
Here's a REAL project: I built an FPGA implementation of the old IBM 1130 computer. It runs all of the factory software, unaltered. Internally, text type data is encoded as EBCDIC. One input device is a card reader which is assumed to feed the 1130 with Hollerith codes. I needed an ASCII->Hollerith translation table (ROM), the IBM code translated between Hollerith and EBCDIC. One output device is the line printer and it required yet another table - EBCDIC to printer code was handled by IBM but I needed ASCII. And so on.
The CPU wants 32k 16 bit words and, initially, I couldn't fit that into the FPGA. Today it is easy. BlockRAM is FAST and it is dual ported! Can you imagine how well that works with a DMA channel feeding all the peripherals from one port and the CPU running out of the other port?
The real machine ran at 400 kHz and my version runs at 50 MHz. That 27 pass Fortran compiler just smokes in comparison.
I used ROM for code translation, you might use it for sin/cos lookup. Or some other table of useful constants. Maybe you need to linearize some transfer function so you do a little lookup.
BlockRAM is a vital resource - more is always better!
There is also distributed RAM but I believe that turns out to be the flops in the logic cells.