diff --git a/libraries/base/common_mult/src/vhdl/common_complex_mult.vhd b/libraries/base/common_mult/src/vhdl/common_complex_mult.vhd index 6216cc238200fb9299f40479e4cb71aea268e95d..3d505da97f18d4754bcc9f9a4e5a1be91fb944db 100644 --- a/libraries/base/common_mult/src/vhdl/common_complex_mult.vhd +++ b/libraries/base/common_mult/src/vhdl/common_complex_mult.vhd @@ -47,6 +47,8 @@ USE technology_lib.technology_select_pkg.ALL; ENTITY common_complex_mult IS GENERIC ( + g_sim : BOOLEAN := FALSE; + g_sim_level : NATURAL := 0; -- 0: Simulate variant passed via g_variant for given g_technology g_technology : NATURAL := c_tech_select_default; g_variant : STRING := "IP"; g_in_a_w : POSITIVE; @@ -109,6 +111,8 @@ BEGIN u_complex_mult : ENTITY tech_mult_lib.tech_complex_mult GENERIC MAP( + g_sim => g_sim, + g_sim_level => g_sim_level, g_technology => g_technology, g_variant => g_variant, g_in_a_w => g_in_a_w, diff --git a/libraries/technology/mult/tech_complex_mult.vhd b/libraries/technology/mult/tech_complex_mult.vhd index 6c7908a0070d2e8a9d3deaa3ccebb6bd1cf5ce4b..a5698bd82355f3a8dea337b958f57b6cdc3bf748 100644 --- a/libraries/technology/mult/tech_complex_mult.vhd +++ b/libraries/technology/mult/tech_complex_mult.vhd @@ -36,6 +36,8 @@ LIBRARY ip_arria10_complex_mult_rtl_lib; ENTITY tech_complex_mult IS GENERIC ( + g_sim : BOOLEAN := TRUE; + g_sim_level : NATURAL := 0; -- 0: Simulate variant passed via g_variant for given g_technology g_technology : NATURAL := c_tech_select_default; g_variant : STRING := "IP"; g_in_a_w : POSITIVE; @@ -78,9 +80,13 @@ ARCHITECTURE str of tech_complex_mult is SIGNAL mult_re : STD_LOGIC_VECTOR(c_dsp_prod_w-1 DOWNTO 0); SIGNAL mult_im : STD_LOGIC_VECTOR(c_dsp_prod_w-1 DOWNTO 0); + -- sim_model=1 + SIGNAL result_re_undelayed : STD_LOGIC_VECTOR(g_in_b_w+g_in_a_w-1 DOWNTO 0); + SIGNAL result_im_undelayed : STD_LOGIC_VECTOR(g_in_b_w+g_in_a_w-1 DOWNTO 0); + begin - gen_ip_stratixiv_ip : IF (g_technology=c_tech_stratixiv AND g_variant="IP") GENERATE + gen_ip_stratixiv_ip : IF (g_sim=FALSE OR (g_sim=TRUE AND g_sim_level=0)) AND (g_technology=c_tech_stratixiv AND g_variant="IP") GENERATE -- Adapt DSP input widths ar <= RESIZE_SVEC(in_ar, c_dsp_dat_w); @@ -107,7 +113,7 @@ begin END GENERATE; - gen_ip_stratixiv_rtl : IF (g_technology=c_tech_stratixiv AND g_variant="RTL") GENERATE + gen_ip_stratixiv_rtl : IF (g_sim=FALSE OR (g_sim=TRUE AND g_sim_level=0)) AND (g_technology=c_tech_stratixiv AND g_variant="RTL") GENERATE u0 : ip_stratixiv_complex_mult_rtl GENERIC MAP( g_in_a_w => g_in_a_w, @@ -132,7 +138,7 @@ begin ); END GENERATE; - gen_ip_arria10_ip : IF (g_technology=c_tech_arria10 AND g_variant="IP") GENERATE + gen_ip_arria10_ip : IF (g_sim=FALSE OR (g_sim=TRUE AND g_sim_level=0)) AND (g_technology=c_tech_arria10 AND g_variant="IP") GENERATE -- Adapt DSP input widths ar <= RESIZE_SVEC(in_ar, c_dsp_dat_w); @@ -159,7 +165,7 @@ begin END GENERATE; - gen_ip_arria10_rtl : IF (g_technology=c_tech_arria10 AND g_variant="RTL") GENERATE + gen_ip_arria10_rtl : IF (g_sim=FALSE OR (g_sim=TRUE AND g_sim_level=0)) AND (g_technology=c_tech_arria10 AND g_variant="RTL") GENERATE u0 : ip_arria10_complex_mult_rtl GENERIC MAP( g_in_a_w => g_in_a_w, @@ -184,6 +190,50 @@ begin ); END GENERATE; + ------------------------------------------------------------------------------- + -- Model: forward concatenated inputs to the 'result' output + -- + -- Example: + -- ______ + -- Input B.real (in_br) = 0x1111 --> | | + -- .imag (in_bi) = 0xBBBB --> | | + -- | mult | --> Output result.real = 0x00000000 + -- Input A.real (in_ar) = 0x0000 --> | | .imag = 0xBBBBAAAA + -- .imag (in_ai) = 0xAAAA --> |______| + -- + -- Note: this model is synthsizable as well. + -- + ------------------------------------------------------------------------------- + gen_sim_level_1 : IF g_sim=TRUE AND g_sim_level=1 GENERATE --FIXME: g_sim required? This is synthesizable. + + result_re_undelayed <= in_br & in_ar; + result_im_undelayed <= in_bi & in_ai; + + u_common_pipeline_re : entity common_lib.common_pipeline + generic map ( + g_pipeline => 3, + g_in_dat_w => g_in_b_w+g_in_a_w, + g_out_dat_w => g_out_p_w + ) + port map ( + clk => clk, + in_dat => result_re_undelayed, + out_dat => result_re + ); + + u_common_pipeline_im : entity common_lib.common_pipeline + generic map ( + g_pipeline => 3, + g_in_dat_w => g_in_b_w+g_in_a_w, + g_out_dat_w => g_out_p_w + ) + port map ( + clk => clk, + in_dat => result_im_undelayed, + out_dat => result_im + ); + + END GENERATE; end str;