-------------------------------------------------------------------------------- -- Copyright 2000 Xilinx, Inc. All rights reserved. -------------------------------------------------------------------------------- -- -- Description: Utility functions for testbenches in Xilinx Reed-Solomon -- Tutorials -- -------------------------------------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.ALL; PACKAGE utils_pkg IS -- ------------------------------------------------------------------------ -- -- FUNCTION PROTOTYPES: -- ------------------------------------------------------------------------ -- FUNCTION select_val(i0 : INTEGER; i1 : INTEGER; sel : INTEGER) RETURN INTEGER; FUNCTION std_logic_vector_to_natural(in_val:IN STD_LOGIC_VECTOR) RETURN NATURAL; FUNCTION natural_to_std_logic_vector(in_val:IN NATURAL; length: IN NATURAL) RETURN STD_LOGIC_VECTOR; FUNCTION int_2_string(in_val : INTEGER) RETURN STRING; FUNCTION bitsneededtorepresent( a_value : INTEGER ) RETURN INTEGER; END utils_pkg; PACKAGE BODY utils_pkg IS -- Return one off i0 or i1 FUNCTION select_val(i0 : INTEGER; i1 : INTEGER; sel : INTEGER) RETURN INTEGER IS BEGIN IF sel = 0 THEN RETURN i0; ELSE RETURN i1; END IF; -- sel END select_val; -- Convert STD_LOGIC_VECTOR to NATURAL -- STD_LOGIC_VECTOR must have a descending range FUNCTION std_logic_vector_to_natural(in_val:IN STD_LOGIC_VECTOR) RETURN NATURAL IS VARIABLE result : NATURAL := 0; VARIABLE failure : BOOLEAN := FALSE; BEGIN FOR i IN in_val'RANGE LOOP result := result * 2; IF (in_val(i) = '1' OR in_val(i) = 'H') THEN result := result + 1; ELSIF (in_val(i) /= '0' AND in_val(i) /= 'L') THEN failure := TRUE; END IF; END LOOP; IF failure THEN -- Provide warning except at time 0. This is because there are loads of -- X's at time 0. --IF NOW /= 0 PS THEN ASSERT FALSE REPORT "std_logic_vector_to_natural: There is a non-numeric bit in the argument."& " It has been converted to 0." SEVERITY WARNING; --END IF; END IF; RETURN result; END std_logic_vector_to_natural; -- Convert NATURAL to STD_LOGIC_VECTOR(length-1 DOWNTO 0) FUNCTION natural_to_std_logic_vector(in_val:IN NATURAL; length: IN NATURAL) RETURN STD_LOGIC_VECTOR IS VARIABLE temp : NATURAL := in_val; VARIABLE result : STD_LOGIC_VECTOR(length-1 DOWNTO 0) := (OTHERS => '0'); CONSTANT bit_val : STD_LOGIC_VECTOR(0 TO 1) := (0=> '0', 1=>'1'); BEGIN FOR i IN result'REVERSE_RANGE LOOP result(i) := bit_val(temp REM 2); temp := temp/2; EXIT WHEN temp = 0; END LOOP; RETURN result; END natural_to_std_logic_vector; FUNCTION int_2_string(in_val : INTEGER) RETURN STRING IS VARIABLE digit : INTEGER; VARIABLE length : INTEGER := 0; VARIABLE posn : INTEGER; VARIABLE value : INTEGER := in_val; CONSTANT str : STRING(1 TO 10) := "0123456789"; VARIABLE ret_value : STRING(1 TO 6); BEGIN ASSERT (value >= 0) REPORT "Function int_2_string must receive a positive integer." SEVERITY ERROR; IF (value = 0) THEN RETURN "0"; ELSIF (value < 10) THEN length := 1; ELSIF (value < 100) THEN length := 2; ELSIF (value < 1000) THEN length := 3; ELSIF (value < 10000) THEN length := 4; ELSIF (value < 100000) THEN length := 5; ELSIF (value < 1000000) THEN length := 6; ELSE ASSERT (false) REPORT "Function int_2_string must receive an integer < 1,000,000." SEVERITY ERROR; END IF; IF (length > 0) THEN posn := length; WHILE (value /= 0) LOOP digit := value MOD 10; ret_value(posn) := str(digit+1); value := value/10; posn := posn - 1; END LOOP; END IF; RETURN ret_value(1 TO length); END int_2_string; FUNCTION bitsneededtorepresent( a_value : INTEGER ) RETURN INTEGER IS VARIABLE return_value : INTEGER := 1; BEGIN FOR i IN 30 DOWNTO 0 LOOP IF a_value >= 2**i THEN return_value := i+1; EXIT; END IF; END LOOP; RETURN return_value; END bitsneededtorepresent; END utils_pkg;