There are three ways of getting UltraRAM primitives, as follows:
°Direct instantiation: Provides you the most control but is the hardest to perform.
°XPM flow: Allows you to specify the type of RAM you want along with the behavior, but gives no access to the RTL.
°Inference RAM: Is in the middle of the two, relatively easy, and gives more control to the user on how the RAM is created.