signed int range
- The conversion from "offset binary" to two's complement is done by inverting the MSB (respectively performing XOR x"8000") rather than substracting -32767. You can check, that the latter produces an overflow for full scale input of x"FFFF".
- The multiply result has 16 + coef_int'length bits, so you can't use it for an 16 bit output without causing truncation. You should rather select 16 bits from the left. If coef_int is a signed signal, you get two sign bits in result. You must use saturation logic to scale the result to the full signed range.