diff options
author | Tristan Gingold <tgingold@free.fr> | 2021-01-14 07:51:35 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2021-01-16 11:20:10 +0100 |
commit | c0edf6732322ed54d3d23ac168b115f09355129c (patch) | |
tree | 5da5852f5c5fd5a267dce2c135aea69347297f55 /testsuite/gna/issue1597/std_subs_pkg.vhdl | |
parent | 6aad73e7551f8792a255d842627add35a0b75f0f (diff) | |
download | ghdl-c0edf6732322ed54d3d23ac168b115f09355129c.tar.gz ghdl-c0edf6732322ed54d3d23ac168b115f09355129c.tar.bz2 ghdl-c0edf6732322ed54d3d23ac168b115f09355129c.zip |
testsuite/gna: add testcase for #1597
Diffstat (limited to 'testsuite/gna/issue1597/std_subs_pkg.vhdl')
-rw-r--r-- | testsuite/gna/issue1597/std_subs_pkg.vhdl | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/testsuite/gna/issue1597/std_subs_pkg.vhdl b/testsuite/gna/issue1597/std_subs_pkg.vhdl new file mode 100644 index 000000000..045230631 --- /dev/null +++ b/testsuite/gna/issue1597/std_subs_pkg.vhdl @@ -0,0 +1,160 @@ +------------------------------------------------ +-- Test intent : collection of useful functions and procs +-- Test scope : Basic File write of type character +-- Keywords : [function, procedure] +--! References [VH1993 3.4: ] +--! [VH2019 5.5: ] +------------------------------------------------- +-- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package subs_pkg is + + -- procedures + procedure msg(str : in string); -- output a system message string. + + -- functions + function bv2str(bv: bit_vector) return string; -- convert bit_vector to string + function slv2str(slv: std_logic_vector) return string; -- convert std_logic_vector to string + function sulv2str(sulv: std_ulogic_vector) return string; -- convert std_ulogic_vector to string + function klsfr(bv: bit_vector) return bit_vector; -- do LSFR on bit_vector 8, 16 32 + function klsfr(bv: std_logic_vector) return std_logic_vector; -- do LSFR on bit_vector 8, 16 32 + +end; + +package body subs_pkg is + + -- simple message output. + procedure msg(str : in string) is + begin + report "System Message: " & str; + end procedure; + + + -- take in bit_vector return string. + function bv2str(bv: bit_vector) return string is + variable st_out : string(1 to bv'length); + alias v : bit_vector(1 to bv'length) is bv; + begin + for i in v'range loop + if(v(i) = '0') then + st_out(i) := '0'; + else + st_out(i) := '1'; + end if; + end loop; + return st_out; + end function; + + -- take in std_logic_vector return string. + function slv2str(slv: std_logic_vector) return string is + variable st_out : string(1 to slv'length); + alias v : std_logic_vector(1 to slv'length) is slv; + begin + for i in v'range loop + case v(i) is + when 'U' => + st_out(i) := 'U'; + when 'X' => + st_out(i) := 'X'; + when '0' => + st_out(i) := '0'; + when '1' => + st_out(i) := '1'; + when 'Z' => + st_out(i) := 'Z'; + when 'W' => + st_out(i) := 'W'; + when 'L' => + st_out(i) := 'L'; + when 'H' => + st_out(i) := 'H'; + when '-' => + st_out(i) := '-'; + when others => + assert false report "STD_LOGIC_VALUE not in value set." severity failure; + end case; + end loop; + return st_out; + end function; + + -- to + function sulv2str(sulv: std_ulogic_vector) return string is + variable st_out : string(1 to sulv'length); + alias v : std_ulogic_vector(1 to sulv'length) is sulv; + begin + for i in v'range loop + case v(i) is + when 'U' => + st_out(i) := 'U'; + when 'X' => + st_out(i) := 'X'; + when '0' => + st_out(i) := '0'; + when '1' => + st_out(i) := '1'; + when 'Z' => + st_out(i) := 'Z'; + when 'W' => + st_out(i) := 'W'; + when 'L' => + st_out(i) := 'L'; + when 'H' => + st_out(i) := 'H'; + when '-' => + st_out(i) := '-'; + when others => + assert false report "STD_ULOGIC_VALUE not in value set." severity failure; + end case; + end loop; + return st_out; + --return slv2str(std_logic_vector(to_unsigned(sulv))); + end function; + + -- bitvector lsfr + function klsfr(bv: bit_vector) return bit_vector is + alias v : bit_vector(bv'high downto 0) is bv; + variable rtn : bit_vector(bv'high downto 0); + variable len : integer := bv'length; + begin + case len is + when 8 => + rtn := v(6 downto 0) & ((v(7) xor v(4)) xor (v(1) xor v(2))); + when 16 => + rtn := v(14 downto 0) & ((v(15) xor v(14)) xor (v(12) xor v(3))); + when 32 => + rtn := v(30 downto 0) & ((v(31) xor v(6)) xor (v(5) xor v(1))); + when others => + report "ERROR: LSFR size not implemented ..." severity failure; + end case; + return rtn; + end function; + + function klsfr(bv: std_logic_vector) return std_logic_vector is + alias v : std_logic_vector(bv'high downto 0) is bv; + variable rtn : std_logic_vector(bv'high downto 0); + variable len : integer := bv'length; + begin + for i in bv'range loop + if (bv(i) /= '1' and + bv(i) /= '0') then + report "klsfr got a none logic value passed ..." severity failure; + end if; + end loop; + + case len is + when 8 => + rtn := v(6 downto 0) & ((v(7) xor v(4)) xor (v(1) xor v(2))); + when 16 => + rtn := v(14 downto 0) & ((v(15) xor v(14)) xor (v(12) xor v(3))); + when 32 => + rtn := v(30 downto 0) & ((v(31) xor v(6)) xor (v(5) xor v(1))); + when others => + report "ERROR: LSFR size not implemented ..." severity failure; + end case; + return rtn; + end function; + +end package body; |