1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.NUMERIC_STD.all;
package dummy_pkg is
type wordarray is array (natural range<>) of std_logic_vector(31 downto 0);
procedure p_csa (
variable A: in std_logic_vector(31 downto 0);
variable B: in std_logic_vector(31 downto 0);
variable Ci: in std_logic_vector(31 downto 0);
variable S: out std_logic_vector(31 downto 0);
variable Co: out std_logic_vector(31 downto 0)
);
function f_csa (
A : std_logic_vector(31 downto 0);
B: std_logic_vector(31 downto 0);
Ci: std_logic_vector(31 downto 0)
) return wordarray;
procedure this_works (
signal A_i : in std_logic_vector(31 downto 0);
signal B_i : in std_logic_vector(31 downto 0);
signal C_i : in std_logic_vector(31 downto 0);
signal o : out std_logic_vector(31 downto 0)
);
procedure this_doesnt_work (
signal A_i : in std_logic_vector(31 downto 0);
signal B_i : in std_logic_vector(31 downto 0);
signal C_i : in std_logic_vector(31 downto 0);
signal o : out std_logic_vector(31 downto 0)
);
end dummy_pkg;
package body dummy_pkg is
procedure p_csa (
variable A: in std_logic_vector(31 downto 0);
variable B: in std_logic_vector(31 downto 0);
variable Ci: in std_logic_vector(31 downto 0);
variable S: out std_logic_vector(31 downto 0);
variable Co: out std_logic_vector(31 downto 0)
) is
variable Co_tmp : std_logic_vector(32 downto 0);
begin
S := A xor B xor Ci;
Co_tmp := ((A and B) or (B and Ci) or (A and Ci)) & '0';
Co := Co_tmp(31 downto 0);
end procedure p_csa;
function f_csa (
A : std_logic_vector(31 downto 0);
B: std_logic_vector(31 downto 0);
Ci: std_logic_vector(31 downto 0)
) return wordarray is
variable r : wordarray(1 downto 0);
variable Co_tmp : std_logic_vector(32 downto 0);
begin
r(0) := A xor B xor Ci;
Co_tmp := ((A and B) or (B and Ci) or (A and Ci)) & '0';
r(1) := Co_tmp(31 downto 0);
return r;
end function;
procedure this_works (
signal A_i : in std_logic_vector(31 downto 0);
signal B_i : in std_logic_vector(31 downto 0);
signal C_i : in std_logic_vector(31 downto 0);
signal o : out std_logic_vector(31 downto 0)
) is
variable a : std_logic_vector(31 downto 0);
variable b : std_logic_vector(31 downto 0);
variable c : std_logic_vector(31 downto 0);
variable r0 : wordarray(1 downto 0);
variable s0 : std_logic_vector(31 downto 0);
variable c0 : std_logic_vector(31 downto 0);
begin
a := A_i;
b := B_i;
c := C_i;
r0 := f_csa(a, b, c);
s0 := r0(0);
c0 := r0(1);
o <= s0 + c0;
end procedure this_works;
procedure this_doesnt_work (
signal A_i : in std_logic_vector(31 downto 0);
signal B_i : in std_logic_vector(31 downto 0);
signal C_i : in std_logic_vector(31 downto 0);
signal o : out std_logic_vector(31 downto 0)
) is
variable a : std_logic_vector(31 downto 0);
variable b : std_logic_vector(31 downto 0);
variable c : std_logic_vector(31 downto 0);
variable s0 : std_logic_vector(31 downto 0);
variable c0 : std_logic_vector(31 downto 0);
begin
a := A_i;
b := B_i;
c := C_i;
p_csa(a, b, c, s0, c0);
o <= s0 + c0;
end procedure this_doesnt_work;
end dummy_pkg;
|