Whenever possible, write HDL to infer memories and DSP functions. Inferring offers many advantages, such as architecture independence, full parameterization, and lowest simulation runtime.
Inferable code examples are available in the Vivado Design Suite language templates. These templates are for non-parameterizable code, however parameterization can be added if required.