VHDL: Using '*' operator when implementing multipliers in design
If you just want to multiply two numbers and they suit the DSP block then the * operator should infer a DSP block.  If not, send the synthesis tool back :)

However, to take advantage of the more complex combinations of the DSP functionality often requires a direct instantiation of the block and configuring of its parameters.  Examples of things which may not map well by inference (using the Xilinx DSP48E1 as an example):


Use of pre-adder
Use of post accumulator
Use of pattern detector
Use of the logic unit


And especially combinations of the above.

The synthesis tools are not yet good enough to map completely arbitrary combinations of logic and arithmetic as efficiently as you might hope.