Skip to content
Snippets Groups Projects

Resolve L2SDP-100

Merged Pieter Donker requested to merge L2SDP-100 into master
3 files
+ 89
10
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -373,8 +373,8 @@ PACKAGE common_pkg IS
@@ -373,8 +373,8 @@ PACKAGE common_pkg IS
FUNCTION RESIZE_UVEC_32(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- = RESIZE_UVEC() with w=32 for t_slv_32_arr slv elements
FUNCTION RESIZE_UVEC_32(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- = RESIZE_UVEC() with w=32 for t_slv_32_arr slv elements
FUNCTION RESIZE_SVEC_32(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- = RESIZE_SVEC() with w=32 for t_slv_32_arr slv elements
FUNCTION RESIZE_SVEC_32(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- = RESIZE_SVEC() with w=32 for t_slv_32_arr slv elements
-- Negate vec, but avoid overflow by forcing -min to +max. Use w <= vec'LENGTH.
FUNCTION NEGATE_SVEC(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- assume negated ranges fits within -+max
FUNCTION NEGATE_SVEC(vec : STD_LOGIC_VECTOR; w : INTEGER) RETURN STD_LOGIC_VECTOR;
FUNCTION NEGATE_SVEC(vec : STD_LOGIC_VECTOR; w : INTEGER) RETURN STD_LOGIC_VECTOR; -- avoid overflow by forcing -min to +max. Use w <= vec'LENGTH
FUNCTION INCR_UVEC(vec : STD_LOGIC_VECTOR; dec : INTEGER) RETURN STD_LOGIC_VECTOR;
FUNCTION INCR_UVEC(vec : STD_LOGIC_VECTOR; dec : INTEGER) RETURN STD_LOGIC_VECTOR;
FUNCTION INCR_UVEC(vec : STD_LOGIC_VECTOR; dec : UNSIGNED) RETURN STD_LOGIC_VECTOR;
FUNCTION INCR_UVEC(vec : STD_LOGIC_VECTOR; dec : UNSIGNED) RETURN STD_LOGIC_VECTOR;
@@ -1757,6 +1757,13 @@ PACKAGE BODY common_pkg IS
@@ -1757,6 +1757,13 @@ PACKAGE BODY common_pkg IS
RETURN RESIZE_SVEC(vec, 32);
RETURN RESIZE_SVEC(vec, 32);
END;
END;
 
-- Negate vec, assume value range fits -+c_max, so no logic needed to check for c_min
 
FUNCTION NEGATE_SVEC(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS
 
BEGIN
 
-- use NUMERIC_STD to avoid range limitation of 32b INTEGER
 
RETURN STD_LOGIC_VECTOR(-SIGNED(vec)); -- negate by multiplying by -1
 
END;
 
-- Negate vec, but avoid overflow by forcing -min to +max. Use w <= vec'LENGTH.
-- Negate vec, but avoid overflow by forcing -min to +max. Use w <= vec'LENGTH.
FUNCTION NEGATE_SVEC(vec : STD_LOGIC_VECTOR; w : INTEGER) RETURN STD_LOGIC_VECTOR IS
FUNCTION NEGATE_SVEC(vec : STD_LOGIC_VECTOR; w : INTEGER) RETURN STD_LOGIC_VECTOR IS
CONSTANT c_max : INTEGER := 2**(w-1)-1;
CONSTANT c_max : INTEGER := 2**(w-1)-1;
@@ -1766,6 +1773,7 @@ PACKAGE BODY common_pkg IS
@@ -1766,6 +1773,7 @@ PACKAGE BODY common_pkg IS
VARIABLE v_val : STD_LOGIC_VECTOR(w-1 DOWNTO 0);
VARIABLE v_val : STD_LOGIC_VECTOR(w-1 DOWNTO 0);
BEGIN
BEGIN
v_val := v_vec(w-1 DOWNTO 0); -- operate on width w and resize to c_vec_w for return
v_val := v_vec(w-1 DOWNTO 0); -- operate on width w and resize to c_vec_w for return
 
-- use NUMERIC_STD to avoid range limitation of 32b INTEGER
IF SIGNED(v_val) = c_min THEN
IF SIGNED(v_val) = c_min THEN
RETURN STD_LOGIC_VECTOR(TO_SIGNED(c_max, c_vec_w)); -- most negative becomes most positive
RETURN STD_LOGIC_VECTOR(TO_SIGNED(c_max, c_vec_w)); -- most negative becomes most positive
ELSE
ELSE
Loading