The correct truncation of the 24 bit product to a 12 bit result depends on the meaning of your fixed point number format. Unfortunately you didn't tell about. Cutting of the less significant bits is correct for a fractional (representing -1 to +1) format. If you are intending a simple right justified integer format, the 12 most significant bits have to be eliminated by saturation logic, positive values have to be limited to +2047 (0x7ff) and negative to -2048 (0x800). Obviously, the number of result bits must fit the register size before assigning it, a general HDL programming fact, not specific to arithmetics.
As a hint: Cause standard libraries don't provide this kind of operations, it's meaningful to define functions that perform it.