diff --git a/libraries/technology/mult/tech_mult_component_pkg.vhd b/libraries/technology/mult/tech_mult_component_pkg.vhd index 8d9668897ba9d69109eff6079f39ab095adb39d1..3de7059b79c324840c22af241c7ae4a5b2a20e4b 100644 --- a/libraries/technology/mult/tech_mult_component_pkg.vhd +++ b/libraries/technology/mult/tech_mult_component_pkg.vhd @@ -1,6 +1,6 @@ ------------------------------------------------------------------------------- -- --- Copyright (C) 2014 +-- Copyright (C) 2014-2023 -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands -- @@ -18,8 +18,11 @@ -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- ------------------------------------------------------------------------------- - --- Purpose: IP components declarations for various devices that get wrapped by the tech components +-- +-- Author : - +-- Changed by : D.F. Brouwer +-- Purpose: +-- IP components declarations for various devices that get wrapped by the tech components library IEEE; use IEEE.std_logic_1164.all; @@ -296,6 +299,7 @@ package tech_mult_component_pkg is ----------------------------------------------------------------------------- -- Arria 10 e1sg components ----------------------------------------------------------------------------- + component ip_arria10_e1sg_mult_add2_rtl is generic ( g_in_a_w : positive; @@ -371,9 +375,11 @@ package tech_mult_component_pkg is result_imag : out std_logic_vector(53 downto 0) -- .result_imag ); end component; + ----------------------------------------------------------------------------- -- Arria 10 e2sg components ----------------------------------------------------------------------------- + component ip_arria10_e2sg_mult_add2_rtl is generic ( g_in_a_w : positive; @@ -449,4 +455,175 @@ package tech_mult_component_pkg is result_imag : out std_logic_vector(53 downto 0) -- .result_imag ); end component; + + ----------------------------------------------------------------------------- + -- Agilex 7 (agi027) xxxx components + ----------------------------------------------------------------------------- + + component ip_agi027_xxxx_mult is + generic ( + g_in_a_w : positive := 18; -- Width of the data A port + g_in_b_w : positive := 18; -- Width of the data B port + g_out_p_w : positive := 36; -- Width of the result port + g_nof_mult : positive := 1; -- using 2 for 18x18, 4 for 9x9 may yield better results when inferring * is used + g_pipeline_input : natural := 1; -- 0 or 1 + g_pipeline_product : natural := 1; -- 0 or 1 + g_pipeline_output : natural := 1; -- >= 0 + g_representation : string := "SIGNED" -- or "UNSIGNED" + ); + port ( + clk : in std_logic; + clken : in std_logic := '1'; + in_a : in std_logic_vector(g_nof_mult * g_in_a_w - 1 downto 0); + in_b : in std_logic_vector(g_nof_mult * g_in_b_w - 1 downto 0); + out_p : out std_logic_vector(g_nof_mult * (g_in_a_w + g_in_b_w) - 1 downto 0) + ); + end component; + + component ip_agi027_xxxx_mult_rtl is + generic ( + g_in_a_w : positive := 18; + g_in_b_w : positive := 18; + g_out_p_w : positive := 36; -- c_prod_w = g_in_a_w+g_in_b_w, use smaller g_out_p_w to truncate MSbits, or larger g_out_p_w to extend MSbits + g_nof_mult : positive := 1; -- using 2 for 18x18, 4 for 9x9 may yield better results when inferring * is used + g_pipeline_input : natural := 1; -- 0 or 1 + g_pipeline_product : natural := 1; -- 0 or 1 + g_pipeline_output : natural := 1; -- >= 0 + g_representation : string := "SIGNED" -- or "UNSIGNED" + ); + port ( + rst : in std_logic; + clk : in std_logic; + clken : in std_logic := '1'; + in_a : in std_logic_vector(g_nof_mult * g_in_a_w - 1 downto 0); + in_b : in std_logic_vector(g_nof_mult * g_in_b_w - 1 downto 0); + out_p : out std_logic_vector(g_nof_mult * (g_in_a_w + g_in_b_w) - 1 downto 0) + ); + end component; + + component ip_agi027_xxxx_mult_add2_rtl is + generic ( + g_in_a_w : positive; + g_in_b_w : positive; + g_res_w : positive; -- g_in_a_w + g_in_b_w + log2(2) + g_force_dsp : boolean := true; -- when TRUE resize input width to >= 18 + g_add_sub : string := "ADD"; -- or "SUB" + g_nof_mult : integer := 2; -- fixed + g_pipeline_input : natural := 1; -- 0 or 1 + g_pipeline_product : natural := 0; -- 0 or 1 + g_pipeline_adder : natural := 1; -- 0 or 1 + g_pipeline_output : natural := 1 -- >= 0 + ); + port ( + rst : in std_logic := '0'; + clk : in std_logic; + clken : in std_logic := '1'; + in_a : in std_logic_vector(g_nof_mult * g_in_a_w - 1 downto 0); + in_b : in std_logic_vector(g_nof_mult * g_in_b_w - 1 downto 0); + res : out std_logic_vector(g_res_w - 1 downto 0) + ); + end component; + + component ip_agi027_xxxx_mult_add4_rtl is + generic ( + g_in_a_w : positive; + g_in_b_w : positive; + g_res_w : positive; -- g_in_a_w + g_in_b_w + log2(4) + g_force_dsp : boolean := true; -- when TRUE resize input width to >= 18 + g_add_sub0 : string := "ADD"; -- or "SUB" + g_add_sub1 : string := "ADD"; -- or "SUB" + g_add_sub : string := "ADD"; -- or "SUB" only available with rtl architecture + g_nof_mult : integer := 4; -- fixed + g_pipeline_input : natural := 1; -- 0 or 1 + g_pipeline_product : natural := 0; -- 0 or 1 + g_pipeline_adder : natural := 1; -- 0 or 1, first sum + g_pipeline_output : natural := 1 -- >= 0, second sum and optional rounding + ); + port ( + rst : in std_logic := '0'; + clk : in std_logic; + clken : in std_logic := '1'; + in_a : in std_logic_vector(g_nof_mult * g_in_a_w - 1 downto 0); + in_b : in std_logic_vector(g_nof_mult * g_in_b_w - 1 downto 0); + res : out std_logic_vector(g_res_w - 1 downto 0) + ); + end component; + + + component ip_agi027_xxxx_complex_mult_rtl is + generic ( + g_in_a_w : positive := 18; + g_in_b_w : positive := 18; + g_out_p_w : positive := 36; + g_conjugate_b : boolean := false; + g_pipeline_input : natural := 1; -- 0 or 1 + g_pipeline_product : natural := 0; -- 0 or 1 + g_pipeline_adder : natural := 1; -- 0 or 1 + g_pipeline_output : natural := 1 -- >= 0 + ); + port ( + rst : in std_logic := '0'; + clk : in std_logic; + clken : in std_logic := '1'; + in_ar : in std_logic_vector(g_in_a_w - 1 downto 0); + in_ai : in std_logic_vector(g_in_a_w - 1 downto 0); + in_br : in std_logic_vector(g_in_b_w - 1 downto 0); + in_bi : in std_logic_vector(g_in_b_w - 1 downto 0); + result_re : out std_logic_vector(g_out_p_w - 1 downto 0); + result_im : out std_logic_vector(g_out_p_w - 1 downto 0) + ); + end component; + + component ip_agi027_xxxx_complex_mult_rtl_canonical is + generic ( + g_in_a_w : positive; + g_in_b_w : positive; + g_out_p_w : positive; -- default use g_out_p_w = g_in_a_w+g_in_b_w = c_prod_w +-- g_conjugate_b : BOOLEAN := FALSE; + g_pipeline_input : natural := 1; -- 0 or 1 + g_pipeline_product : natural := 0; -- 0 or 1 + g_pipeline_adder : natural := 1; -- 0 or 1 + g_pipeline_output : natural := 1 -- >= 0 + ); + port ( + rst : in std_logic := '0'; + clk : in std_logic; + clken : in std_logic := '1'; + in_ar : in std_logic_vector(g_in_a_w - 1 downto 0); + in_ai : in std_logic_vector(g_in_a_w - 1 downto 0); + in_br : in std_logic_vector(g_in_b_w - 1 downto 0); + in_bi : in std_logic_vector(g_in_b_w - 1 downto 0); + result_re : out std_logic_vector(g_out_p_w - 1 downto 0); + result_im : out std_logic_vector(g_out_p_w - 1 downto 0) + ); + end component; + + component ip_agi027_xxxx_complex_mult is + port ( + dataa_real : in std_logic_vector(17 downto 0) := (others => '0'); -- complex_input.dataa_real + dataa_imag : in std_logic_vector(17 downto 0) := (others => '0'); -- .dataa_imag + datab_real : in std_logic_vector(17 downto 0) := (others => '0'); -- .datab_real + datab_imag : in std_logic_vector(17 downto 0) := (others => '0'); -- .datab_imag + clock : in std_logic := '0'; -- .clk + aclr : in std_logic := '0'; -- .aclr + ena : in std_logic := '0'; -- .ena + result_real : out std_logic_vector(35 downto 0); -- complex_output.result_real + result_imag : out std_logic_vector(35 downto 0) -- .result_imag + ); + end component; + + component ip_agi027_xxxx_complex_mult_27b is + port ( + dataa_real : in std_logic_vector(26 downto 0) := (others => '0'); -- complex_input.dataa_real + dataa_imag : in std_logic_vector(26 downto 0) := (others => '0'); -- .dataa_imag + datab_real : in std_logic_vector(26 downto 0) := (others => '0'); -- .datab_real + datab_imag : in std_logic_vector(26 downto 0) := (others => '0'); -- .datab_imag + clock : in std_logic := '0'; -- .clk + aclr : in std_logic := '0'; -- .aclr + ena : in std_logic := '0'; -- .ena + result_real : out std_logic_vector(53 downto 0); -- complex_output.result_real + result_imag : out std_logic_vector(53 downto 0) -- .result_imag + ); + end component; + end tech_mult_component_pkg;