Today I learned that in order to assign a negative
sfixed (signed fixed-point) signal or variable to another signal or variable, I have to use
process variable x0: sfixed(7 downto -8) := to_sfixed(1, 7, -8); constant val: sfixed(7 downto -8) := to_sfixed(10, 7, -8); begin -- does not work: x0 := -val; -- this does work: x0 := resize(-val, x0); end process;
So, it seems, internally this is an actual multiplication and not a manipulation on the signed value.
This holds for GHDL 3.0 using the VHDL-2008 standard. No idea yet what other tools do with this.