diff --git a/libraries/technology/eth_10g/hdllib.cfg b/libraries/technology/eth_10g/hdllib.cfg index f481d799cb336c57b006e0e3d86f6cd649109113..27b2b3357bd3b1b93cfcfe4cd8b4078cf63074c9 100644 --- a/libraries/technology/eth_10g/hdllib.cfg +++ b/libraries/technology/eth_10g/hdllib.cfg @@ -1,10 +1,16 @@ hdl_lib_name = tech_eth_10g hdl_library_clause_name = tech_eth_10g_lib -hdl_lib_uses_synth = technology tech_pll tech_mac_10g tech_10gbase_r tech_xaui common dp +hdl_lib_uses_synth = technology tech_pll tech_mac_10g common dp ip_stratixiv_eth_10g ip_arria10_eth_10g ip_arria10_e3sge3_eth_10g ip_arria10_e1sg_eth_10g hdl_lib_uses_sim = hdl_lib_technology = +hdl_lib_disclose_library_clause_names = + ip_stratixiv_eth_10g ip_stratixiv_eth_10g_lib + ip_arria10_eth_10g ip_arria10_eth_10g_lib + ip_arria10_e3sge3_eth_10g ip_arria10_e3sge3_eth_10g_lib + ip_arria10_e1sg_eth_10g ip_arria10_e1sg_eth_10g_lib synth_files = + tech_eth_10g_component_pkg.vhd tech_eth_10g_stratixiv.vhd tech_eth_10g_arria10.vhd tech_eth_10g_arria10_e3sge3.vhd diff --git a/libraries/technology/eth_10g/tech_eth_10g_arria10.vhd b/libraries/technology/eth_10g/tech_eth_10g_arria10.vhd index 96ccbd8db5c066bf176f94f4afdb511486b59d9b..ad241ac9c543c89b78b79bab675038a0bfb5dd80 100644 --- a/libraries/technology/eth_10g/tech_eth_10g_arria10.vhd +++ b/libraries/technology/eth_10g/tech_eth_10g_arria10.vhd @@ -83,7 +83,7 @@ -- [3:2] = xgmii_link_status_arr(I) -- -LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_10gbase_r_lib, tech_mac_10g_lib; +LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_mac_10g_lib, ip_arria10_eth_10g_lib; USE IEEE.STD_LOGIC_1164.ALL; USE technology_lib.technology_pkg.ALL; USE common_lib.common_pkg.ALL; @@ -91,6 +91,7 @@ USE common_lib.common_mem_pkg.ALL; USE common_lib.common_interface_layers_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE tech_mac_10g_lib.tech_mac_10g_component_pkg.ALL; +USE work.tech_eth_10g_component_pkg.ALL; ENTITY tech_eth_10g_arria10 IS GENERIC ( @@ -134,181 +135,45 @@ END tech_eth_10g_arria10; ARCHITECTURE str OF tech_eth_10g_arria10 IS - - -- Enable or disable the conditions that must be ok to release tx_snk_out_arr xon - CONSTANT c_check_link_status : BOOLEAN := g_direction/="TX_ONLY"; - CONSTANT c_check_xgmii_tx_ready : BOOLEAN := g_direction/="RX_ONLY"; - - SIGNAL i_tx_snk_out_arr : t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); - - -- MAG_10G control status registers - SIGNAL mac_mosi_arr : t_mem_mosi_arr(g_nof_channels-1 DOWNTO 0); - SIGNAL mac_miso_arr : t_mem_miso_arr(g_nof_channels-1 DOWNTO 0); - - -- XON control - SIGNAL mac_snk_out_arr : t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); - - -- XGMII - SIGNAL xgmii_link_status_arr : t_tech_mac_10g_xgmii_status_arr(g_nof_channels-1 DOWNTO 0); -- 2 bit, from MAC_10g - SIGNAL xgmii_tx_ready_arr : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- 1 bit, from PHY 10gbase_r - SIGNAL xgmii_tx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_rx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_internal_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - - -- Link status monitor - CONSTANT c_mem_reg_eth10g_adr_w : NATURAL := 1; - CONSTANT c_mem_reg_eth10g_dat_w : NATURAL := 32; - CONSTANT c_mem_reg_eth10g_nof_data : NATURAL := 1; - CONSTANT c_mem_reg_eth10g : t_c_mem := (c_mem_reg_rd_latency, c_mem_reg_eth10g_adr_w , c_mem_reg_eth10g_dat_w , c_mem_reg_eth10g_nof_data, 'X'); - - SIGNAL reg_eth10g_mosi_arr : t_mem_mosi_arr(g_nof_channels-1 DOWNTO 0); - SIGNAL reg_eth10g_miso_arr : t_mem_miso_arr(g_nof_channels-1 DOWNTO 0); - - SIGNAL mm_reg_eth10g_arr : t_slv_32_arr(g_nof_channels-1 DOWNTO 0); BEGIN - tx_snk_out_arr <= i_tx_snk_out_arr; - - gen_mac : FOR I IN 0 TO g_nof_channels-1 GENERATE - - i_tx_snk_out_arr(I).ready <= mac_snk_out_arr(I).ready; -- pass on MAC cycle accurate backpressure - - p_xon_flow_control : PROCESS(clk_156) - VARIABLE v_xgmii_link_status : STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0) := "00"; - VARIABLE v_xgmii_tx_ready : STD_LOGIC := '1'; - BEGIN - IF rising_edge(clk_156) THEN - i_tx_snk_out_arr(I).xon <= '0'; - - -- First gather all conditions that are enabled to affect xon. The default value is such that it enables xon when the condition is not checked. - IF c_check_link_status =TRUE THEN v_xgmii_link_status := xgmii_link_status_arr(I); END IF; -- check both remote fault [1] and local fault [0] - IF c_check_xgmii_tx_ready=TRUE THEN v_xgmii_tx_ready := xgmii_tx_ready_arr(I); END IF; - - -- Now apply the conditions to xon - IF v_xgmii_tx_ready='1' AND v_xgmii_link_status="00" THEN - i_tx_snk_out_arr(I).xon <= '1'; -- XON when Tx PHY is ready and XGMII is ok - END IF; - END IF; - END PROCESS; - - u_tech_mac_10g : ENTITY tech_mac_10g_lib.tech_mac_10g - GENERIC MAP ( - g_technology => c_tech_arria10, - g_pre_header_padding => g_pre_header_padding - ) - PORT MAP ( - -- MM - mm_clk => mm_clk, - mm_rst => mm_rst, - csr_mosi => mac_mosi_arr(I), - csr_miso => mac_miso_arr(I), - - -- ST - tx_clk_312 => clk_312, - tx_clk_156 => clk_156, - tx_rst => rst_156, - tx_snk_in => tx_snk_in_arr(I), -- 64 bit data - tx_snk_out => mac_snk_out_arr(I), - - rx_clk_312 => clk_312, - rx_clk_156 => clk_156, - rx_rst => rst_156, - rx_src_out => rx_src_out_arr(I), -- 64 bit data - rx_src_in => rx_src_in_arr(I), - - -- XGMII - xgmii_link_status => xgmii_link_status_arr(I), - xgmii_tx_data => xgmii_tx_dc_arr(I), - xgmii_rx_data => xgmii_internal_dc_arr(I) - ); - END GENERATE; - - xgmii_internal_dc_arr <= xgmii_tx_dc_arr WHEN g_direction="TX_ONLY" ELSE xgmii_rx_dc_arr; - - u_tech_10gbase_r: ENTITY tech_10gbase_r_lib.tech_10gbase_r - GENERIC MAP ( - g_technology => c_tech_arria10, - g_sim => g_sim, - g_sim_level => g_sim_level, - g_nof_channels => g_nof_channels + u_ip_arria10_eth_10g : ip_arria10_eth_10g + GENERIC MAP( + g_sim => g_sim, + g_sim_level => g_sim_level, + g_nof_channels => g_nof_channels, + g_direction => g_direction, + g_pre_header_padding => g_pre_header_padding ) - PORT MAP ( + PORT MAP( -- Transceiver PLL reference clock - tr_ref_clk_644 => tr_ref_clk_644, - - -- XGMII clocks - clk_156 => clk_156, - rst_156 => rst_156, + tr_ref_clk_644 => tr_ref_clk_644, - -- XGMII interface - xgmii_tx_ready_arr => xgmii_tx_ready_arr, - xgmii_rx_ready_arr => OPEN, - xgmii_tx_dc_arr => xgmii_tx_dc_arr, - xgmii_rx_dc_arr => xgmii_rx_dc_arr, + -- Data clocks + clk_312 => clk_312, + clk_156 => clk_156, + rst_156 => rst_156, - -- PHY serial IO - tx_serial_arr => serial_tx_arr, - rx_serial_arr => serial_rx_arr - ); - - - gen_reg_eth10g : FOR I IN 0 TO g_nof_channels-1 GENERATE - mm_reg_eth10g_arr(I) <= RESIZE_UVEC(xgmii_link_status_arr(I) & xgmii_tx_ready_arr(I) & i_tx_snk_out_arr(I).xon, c_mem_reg_eth10g_dat_w); - - u_reg_map : ENTITY common_lib.common_reg_r_w_dc - GENERIC MAP ( - g_cross_clock_domain => TRUE, - g_in_new_latency => 0, - g_readback => FALSE, - g_reg => c_mem_reg_eth10g, - g_init_reg => (OTHERS => '0') - ) - PORT MAP ( - -- Clocks and reset - mm_rst => mm_rst, - mm_clk => mm_clk, - st_rst => rst_156, - st_clk => clk_156, - - -- Memory Mapped Slave in mm_clk domain - sla_in => reg_eth10g_mosi_arr(I), - sla_out => reg_eth10g_miso_arr(I), - - -- MM registers in st_clk domain - reg_wr_arr => OPEN, - reg_rd_arr => OPEN, - in_new => '1', - in_reg => mm_reg_eth10g_arr(I), - out_reg => OPEN - ); - END GENERATE; - - - ----------------------------------------------------------------------------- - -- MM bus mux - ----------------------------------------------------------------------------- - u_common_mem_mux_mac : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_channels, - g_mult_addr_w => func_tech_mac_10g_csr_addr_w(c_tech_arria10) - ) - PORT MAP ( - mosi => mac_mosi, - miso => mac_miso, - mosi_arr => mac_mosi_arr, - miso_arr => mac_miso_arr - ); + -- MM + mm_clk => mm_clk, + mm_rst => mm_rst, - u_common_mem_mux_eth10g : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_channels, - g_mult_addr_w => c_mem_reg_eth10g_adr_w - ) - PORT MAP ( - mosi => reg_eth10g_mosi, - miso => reg_eth10g_miso, - mosi_arr => reg_eth10g_mosi_arr, - miso_arr => reg_eth10g_miso_arr - ); + mac_mosi => mac_mosi, + mac_miso => mac_miso, + + reg_eth10g_mosi => reg_eth10g_mosi, + reg_eth10g_miso => reg_eth10g_miso, + + -- ST + tx_snk_in_arr => tx_snk_in_arr, + tx_snk_out_arr => tx_snk_out_arr, + + rx_src_out_arr => rx_src_out_arr, + rx_src_in_arr => rx_src_in_arr, + + -- Serial + serial_tx_arr => serial_tx_arr, + serial_rx_arr => serial_rx_arr + ); END str; diff --git a/libraries/technology/eth_10g/tech_eth_10g_arria10_e1sg.vhd b/libraries/technology/eth_10g/tech_eth_10g_arria10_e1sg.vhd index 992f4025968a6a107ff1ffda6143fd3895a2772d..d69f01970ec5fa76ae6e40caa81728f243813fa5 100644 --- a/libraries/technology/eth_10g/tech_eth_10g_arria10_e1sg.vhd +++ b/libraries/technology/eth_10g/tech_eth_10g_arria10_e1sg.vhd @@ -83,7 +83,7 @@ -- [3:2] = xgmii_link_status_arr(I) -- -LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_10gbase_r_lib, tech_mac_10g_lib; +LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_mac_10g_lib, ip_arria10_e1sg_eth_10g_lib; USE IEEE.STD_LOGIC_1164.ALL; USE technology_lib.technology_pkg.ALL; USE common_lib.common_pkg.ALL; @@ -91,6 +91,7 @@ USE common_lib.common_mem_pkg.ALL; USE common_lib.common_interface_layers_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE tech_mac_10g_lib.tech_mac_10g_component_pkg.ALL; +USE work.tech_eth_10g_component_pkg.ALL; ENTITY tech_eth_10g_arria10_e1sg IS GENERIC ( @@ -137,187 +138,48 @@ END tech_eth_10g_arria10_e1sg; ARCHITECTURE str OF tech_eth_10g_arria10_e1sg IS - - -- Enable or disable the conditions that must be ok to release tx_snk_out_arr xon - CONSTANT c_check_link_status : BOOLEAN := TRUE; --g_direction/="TX_ONLY"; - CONSTANT c_check_xgmii_tx_ready : BOOLEAN := TRUE; --g_direction/="RX_ONLY"; - - SIGNAL i_tx_snk_out_arr : t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); - - -- MAG_10G control status registers - SIGNAL mac_mosi_arr : t_mem_mosi_arr(g_nof_channels-1 DOWNTO 0); - SIGNAL mac_miso_arr : t_mem_miso_arr(g_nof_channels-1 DOWNTO 0); - - -- XON control - SIGNAL mac_snk_out_arr : t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); - - -- XGMII - SIGNAL xgmii_link_status_arr : t_tech_mac_10g_xgmii_status_arr(g_nof_channels-1 DOWNTO 0); -- 2 bit, from MAC_10g - SIGNAL xgmii_tx_ready_arr : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- 1 bit, from PHY 10gbase_r - SIGNAL xgmii_tx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_rx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_internal_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - - -- Link status monitor - CONSTANT c_mem_reg_eth10g_adr_w : NATURAL := 1; - CONSTANT c_mem_reg_eth10g_dat_w : NATURAL := 32; - CONSTANT c_mem_reg_eth10g_nof_data : NATURAL := 1; - CONSTANT c_mem_reg_eth10g : t_c_mem := (c_mem_reg_rd_latency, c_mem_reg_eth10g_adr_w , c_mem_reg_eth10g_dat_w , c_mem_reg_eth10g_nof_data, 'X'); - - SIGNAL reg_eth10g_mosi_arr : t_mem_mosi_arr(g_nof_channels-1 DOWNTO 0); - SIGNAL reg_eth10g_miso_arr : t_mem_miso_arr(g_nof_channels-1 DOWNTO 0); - - SIGNAL mm_reg_eth10g_arr : t_slv_32_arr(g_nof_channels-1 DOWNTO 0); BEGIN - tx_snk_out_arr <= i_tx_snk_out_arr; - - gen_mac : FOR I IN 0 TO g_nof_channels-1 GENERATE - - i_tx_snk_out_arr(I).ready <= mac_snk_out_arr(I).ready; -- pass on MAC cycle accurate backpressure - - p_xon_flow_control : PROCESS(clk_156) - VARIABLE v_xgmii_link_status : STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0) := "00"; - VARIABLE v_xgmii_tx_ready : STD_LOGIC := '1'; - BEGIN - IF rising_edge(clk_156) THEN - i_tx_snk_out_arr(I).xon <= '0'; - - -- First gather all conditions that are enabled to affect xon. The default value is such that it enables xon when the condition is not checked. - IF c_check_link_status =TRUE THEN v_xgmii_link_status := xgmii_link_status_arr(I); END IF; -- check both remote fault [1] and local fault [0] - IF c_check_xgmii_tx_ready=TRUE THEN v_xgmii_tx_ready := xgmii_tx_ready_arr(I); END IF; - - -- Now apply the conditions to xon - IF v_xgmii_tx_ready='1' AND v_xgmii_link_status="00" THEN - i_tx_snk_out_arr(I).xon <= '1'; -- XON when Tx PHY is ready and XGMII is ok - END IF; - END IF; - END PROCESS; - - u_tech_mac_10g : ENTITY tech_mac_10g_lib.tech_mac_10g - GENERIC MAP ( - g_technology => c_tech_arria10_e1sg, - g_pre_header_padding => g_pre_header_padding - ) - PORT MAP ( - -- MM - mm_clk => mm_clk, - mm_rst => mm_rst, - csr_mosi => mac_mosi_arr(I), - csr_miso => mac_miso_arr(I), - - -- ST - tx_clk_312 => clk_312, - tx_clk_156 => clk_156, - tx_rst => rst_156, - tx_snk_in => tx_snk_in_arr(I), -- 64 bit data - tx_snk_out => mac_snk_out_arr(I), - - rx_clk_312 => clk_312, - rx_clk_156 => clk_156, - rx_rst => rst_156, - rx_src_out => rx_src_out_arr(I), -- 64 bit data - rx_src_in => rx_src_in_arr(I), - - -- XGMII - xgmii_link_status => xgmii_link_status_arr(I), - xgmii_tx_data => xgmii_tx_dc_arr(I), - xgmii_rx_data => xgmii_internal_dc_arr(I) - ); - END GENERATE; - - xgmii_internal_dc_arr <= xgmii_tx_dc_arr WHEN g_direction="TX_ONLY" ELSE xgmii_rx_dc_arr; - - u_tech_10gbase_r: ENTITY tech_10gbase_r_lib.tech_10gbase_r - GENERIC MAP ( - g_technology => c_tech_arria10_e1sg, - g_sim => g_sim, - g_sim_level => g_sim_level, - g_nof_channels => g_nof_channels + u_ip_arria10_e1sg_eth_10g : ip_arria10_e1sg_eth_10g + GENERIC MAP( + g_sim => g_sim, + g_sim_level => g_sim_level, + g_nof_channels => g_nof_channels, + g_direction => g_direction, + g_pre_header_padding => g_pre_header_padding ) - PORT MAP ( - mm_clk => mm_clk, - mm_rst => mm_rst, + PORT MAP( + -- Transceiver PLL reference clock + tr_ref_clk_644 => tr_ref_clk_644, + + -- Data clocks + clk_312 => clk_312, + clk_156 => clk_156, + rst_156 => rst_156, - reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi => reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi, - reg_ip_arria10_e1sg_phy_10gbase_r_24_miso => reg_ip_arria10_e1sg_phy_10gbase_r_24_miso, + -- MM + mm_clk => mm_clk, + mm_rst => mm_rst, - -- Transceiver PLL reference clock - tr_ref_clk_644 => tr_ref_clk_644, - - -- XGMII clocks - clk_156 => clk_156, - rst_156 => rst_156, + mac_mosi => mac_mosi, + mac_miso => mac_miso, - -- XGMII interface - xgmii_tx_ready_arr => xgmii_tx_ready_arr, - xgmii_rx_ready_arr => OPEN, - xgmii_tx_dc_arr => xgmii_tx_dc_arr, - xgmii_rx_dc_arr => xgmii_rx_dc_arr, + reg_eth10g_mosi => reg_eth10g_mosi, + reg_eth10g_miso => reg_eth10g_miso, + + reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi => reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi, + reg_ip_arria10_e1sg_phy_10gbase_r_24_miso => reg_ip_arria10_e1sg_phy_10gbase_r_24_miso, - -- PHY serial IO - tx_serial_arr => serial_tx_arr, - rx_serial_arr => serial_rx_arr - ); - - - gen_reg_eth10g : FOR I IN 0 TO g_nof_channels-1 GENERATE - mm_reg_eth10g_arr(I) <= RESIZE_UVEC(xgmii_link_status_arr(I) & xgmii_tx_ready_arr(I) & i_tx_snk_out_arr(I).xon, c_mem_reg_eth10g_dat_w); - - u_reg_map : ENTITY common_lib.common_reg_r_w_dc - GENERIC MAP ( - g_cross_clock_domain => TRUE, - g_in_new_latency => 0, - g_readback => FALSE, - g_reg => c_mem_reg_eth10g, - g_init_reg => (OTHERS => '0') - ) - PORT MAP ( - -- Clocks and reset - mm_rst => mm_rst, - mm_clk => mm_clk, - st_rst => rst_156, - st_clk => clk_156, - - -- Memory Mapped Slave in mm_clk domain - sla_in => reg_eth10g_mosi_arr(I), - sla_out => reg_eth10g_miso_arr(I), - - -- MM registers in st_clk domain - reg_wr_arr => OPEN, - reg_rd_arr => OPEN, - in_new => '1', - in_reg => mm_reg_eth10g_arr(I), - out_reg => OPEN - ); - END GENERATE; - - - ----------------------------------------------------------------------------- - -- MM bus mux - ----------------------------------------------------------------------------- - u_common_mem_mux_mac : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_channels, - g_mult_addr_w => func_tech_mac_10g_csr_addr_w(c_tech_arria10) - ) - PORT MAP ( - mosi => mac_mosi, - miso => mac_miso, - mosi_arr => mac_mosi_arr, - miso_arr => mac_miso_arr - ); + -- ST + tx_snk_in_arr => tx_snk_in_arr, + tx_snk_out_arr => tx_snk_out_arr, - u_common_mem_mux_eth10g : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_channels, - g_mult_addr_w => c_mem_reg_eth10g_adr_w - ) - PORT MAP ( - mosi => reg_eth10g_mosi, - miso => reg_eth10g_miso, - mosi_arr => reg_eth10g_mosi_arr, - miso_arr => reg_eth10g_miso_arr - ); + rx_src_out_arr => rx_src_out_arr, + rx_src_in_arr => rx_src_in_arr, + + -- Serial + serial_tx_arr => serial_tx_arr, + serial_rx_arr => serial_rx_arr + ); END str; diff --git a/libraries/technology/eth_10g/tech_eth_10g_arria10_e3sge3.vhd b/libraries/technology/eth_10g/tech_eth_10g_arria10_e3sge3.vhd index 6c32d7e75d1af2ef1df31257bbb702e21de596be..81fa70a6d098ffa5ac9b7d8c26ca9a6d6e4147e7 100644 --- a/libraries/technology/eth_10g/tech_eth_10g_arria10_e3sge3.vhd +++ b/libraries/technology/eth_10g/tech_eth_10g_arria10_e3sge3.vhd @@ -83,7 +83,7 @@ -- [3:2] = xgmii_link_status_arr(I) -- -LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_10gbase_r_lib, tech_mac_10g_lib; +LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_mac_10g_lib, ip_arria10_e3sge3_eth_10g_lib; USE IEEE.STD_LOGIC_1164.ALL; USE technology_lib.technology_pkg.ALL; USE common_lib.common_pkg.ALL; @@ -91,6 +91,7 @@ USE common_lib.common_mem_pkg.ALL; USE common_lib.common_interface_layers_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE tech_mac_10g_lib.tech_mac_10g_component_pkg.ALL; +USE work.tech_eth_10g_component_pkg.ALL; ENTITY tech_eth_10g_arria10_e3sge3 IS GENERIC ( @@ -137,187 +138,48 @@ END tech_eth_10g_arria10_e3sge3; ARCHITECTURE str OF tech_eth_10g_arria10_e3sge3 IS - - -- Enable or disable the conditions that must be ok to release tx_snk_out_arr xon - CONSTANT c_check_link_status : BOOLEAN := g_direction/="TX_ONLY"; - CONSTANT c_check_xgmii_tx_ready : BOOLEAN := g_direction/="RX_ONLY"; - - SIGNAL i_tx_snk_out_arr : t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); - - -- MAG_10G control status registers - SIGNAL mac_mosi_arr : t_mem_mosi_arr(g_nof_channels-1 DOWNTO 0); - SIGNAL mac_miso_arr : t_mem_miso_arr(g_nof_channels-1 DOWNTO 0); - - -- XON control - SIGNAL mac_snk_out_arr : t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); - - -- XGMII - SIGNAL xgmii_link_status_arr : t_tech_mac_10g_xgmii_status_arr(g_nof_channels-1 DOWNTO 0); -- 2 bit, from MAC_10g - SIGNAL xgmii_tx_ready_arr : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- 1 bit, from PHY 10gbase_r - SIGNAL xgmii_tx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_rx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_internal_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - - -- Link status monitor - CONSTANT c_mem_reg_eth10g_adr_w : NATURAL := 1; - CONSTANT c_mem_reg_eth10g_dat_w : NATURAL := 32; - CONSTANT c_mem_reg_eth10g_nof_data : NATURAL := 1; - CONSTANT c_mem_reg_eth10g : t_c_mem := (c_mem_reg_rd_latency, c_mem_reg_eth10g_adr_w , c_mem_reg_eth10g_dat_w , c_mem_reg_eth10g_nof_data, 'X'); - - SIGNAL reg_eth10g_mosi_arr : t_mem_mosi_arr(g_nof_channels-1 DOWNTO 0); - SIGNAL reg_eth10g_miso_arr : t_mem_miso_arr(g_nof_channels-1 DOWNTO 0); - - SIGNAL mm_reg_eth10g_arr : t_slv_32_arr(g_nof_channels-1 DOWNTO 0); BEGIN - tx_snk_out_arr <= i_tx_snk_out_arr; - - gen_mac : FOR I IN 0 TO g_nof_channels-1 GENERATE - - i_tx_snk_out_arr(I).ready <= mac_snk_out_arr(I).ready; -- pass on MAC cycle accurate backpressure - - p_xon_flow_control : PROCESS(clk_156) - VARIABLE v_xgmii_link_status : STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0) := "00"; - VARIABLE v_xgmii_tx_ready : STD_LOGIC := '1'; - BEGIN - IF rising_edge(clk_156) THEN - i_tx_snk_out_arr(I).xon <= '0'; - - -- First gather all conditions that are enabled to affect xon. The default value is such that it enables xon when the condition is not checked. - IF c_check_link_status =TRUE THEN v_xgmii_link_status := xgmii_link_status_arr(I); END IF; -- check both remote fault [1] and local fault [0] - IF c_check_xgmii_tx_ready=TRUE THEN v_xgmii_tx_ready := xgmii_tx_ready_arr(I); END IF; - - -- Now apply the conditions to xon - IF v_xgmii_tx_ready='1' AND v_xgmii_link_status="00" THEN - i_tx_snk_out_arr(I).xon <= '1'; -- XON when Tx PHY is ready and XGMII is ok - END IF; - END IF; - END PROCESS; - - u_tech_mac_10g : ENTITY tech_mac_10g_lib.tech_mac_10g - GENERIC MAP ( - g_technology => c_tech_arria10_e3sge3, - g_pre_header_padding => g_pre_header_padding - ) - PORT MAP ( - -- MM - mm_clk => mm_clk, - mm_rst => mm_rst, - csr_mosi => mac_mosi_arr(I), - csr_miso => mac_miso_arr(I), - - -- ST - tx_clk_312 => clk_312, - tx_clk_156 => clk_156, - tx_rst => rst_156, - tx_snk_in => tx_snk_in_arr(I), -- 64 bit data - tx_snk_out => mac_snk_out_arr(I), - - rx_clk_312 => clk_312, - rx_clk_156 => clk_156, - rx_rst => rst_156, - rx_src_out => rx_src_out_arr(I), -- 64 bit data - rx_src_in => rx_src_in_arr(I), - - -- XGMII - xgmii_link_status => xgmii_link_status_arr(I), - xgmii_tx_data => xgmii_tx_dc_arr(I), - xgmii_rx_data => xgmii_internal_dc_arr(I) - ); - END GENERATE; - - xgmii_internal_dc_arr <= xgmii_tx_dc_arr WHEN g_direction="TX_ONLY" ELSE xgmii_rx_dc_arr; - - u_tech_10gbase_r: ENTITY tech_10gbase_r_lib.tech_10gbase_r - GENERIC MAP ( - g_technology => c_tech_arria10_e3sge3, - g_sim => g_sim, - g_sim_level => g_sim_level, - g_nof_channels => g_nof_channels + u_ip_arria10_e3sge3_eth_10g : ip_arria10_e3sge3_eth_10g + GENERIC MAP( + g_sim => g_sim, + g_sim_level => g_sim_level, + g_nof_channels => g_nof_channels, + g_direction => g_direction, + g_pre_header_padding => g_pre_header_padding ) - PORT MAP ( - mm_clk => mm_clk, - mm_rst => mm_rst, + PORT MAP( + -- Transceiver PLL reference clock + tr_ref_clk_644 => tr_ref_clk_644, - reg_ip_arria10_e3sge3_phy_10gbase_r_24_mosi => reg_ip_arria10_e3sge3_phy_10gbase_r_24_mosi, - reg_ip_arria10_e3sge3_phy_10gbase_r_24_miso => reg_ip_arria10_e3sge3_phy_10gbase_r_24_miso, + -- Data clocks + clk_312 => clk_312, + clk_156 => clk_156, + rst_156 => rst_156, - -- Transceiver PLL reference clock - tr_ref_clk_644 => tr_ref_clk_644, - - -- XGMII clocks - clk_156 => clk_156, - rst_156 => rst_156, + -- MM + mm_clk => mm_clk, + mm_rst => mm_rst, - -- XGMII interface - xgmii_tx_ready_arr => xgmii_tx_ready_arr, - xgmii_rx_ready_arr => OPEN, - xgmii_tx_dc_arr => xgmii_tx_dc_arr, - xgmii_rx_dc_arr => xgmii_rx_dc_arr, + mac_mosi => mac_mosi, + mac_miso => mac_miso, - -- PHY serial IO - tx_serial_arr => serial_tx_arr, - rx_serial_arr => serial_rx_arr - ); - - - gen_reg_eth10g : FOR I IN 0 TO g_nof_channels-1 GENERATE - mm_reg_eth10g_arr(I) <= RESIZE_UVEC(xgmii_link_status_arr(I) & xgmii_tx_ready_arr(I) & i_tx_snk_out_arr(I).xon, c_mem_reg_eth10g_dat_w); - - u_reg_map : ENTITY common_lib.common_reg_r_w_dc - GENERIC MAP ( - g_cross_clock_domain => TRUE, - g_in_new_latency => 0, - g_readback => FALSE, - g_reg => c_mem_reg_eth10g, - g_init_reg => (OTHERS => '0') - ) - PORT MAP ( - -- Clocks and reset - mm_rst => mm_rst, - mm_clk => mm_clk, - st_rst => rst_156, - st_clk => clk_156, - - -- Memory Mapped Slave in mm_clk domain - sla_in => reg_eth10g_mosi_arr(I), - sla_out => reg_eth10g_miso_arr(I), - - -- MM registers in st_clk domain - reg_wr_arr => OPEN, - reg_rd_arr => OPEN, - in_new => '1', - in_reg => mm_reg_eth10g_arr(I), - out_reg => OPEN - ); - END GENERATE; - - - ----------------------------------------------------------------------------- - -- MM bus mux - ----------------------------------------------------------------------------- - u_common_mem_mux_mac : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_channels, - g_mult_addr_w => func_tech_mac_10g_csr_addr_w(c_tech_arria10) - ) - PORT MAP ( - mosi => mac_mosi, - miso => mac_miso, - mosi_arr => mac_mosi_arr, - miso_arr => mac_miso_arr - ); + reg_eth10g_mosi => reg_eth10g_mosi, + reg_eth10g_miso => reg_eth10g_miso, + + reg_ip_arria10_e3sge3_phy_10gbase_r_24_mosi => reg_ip_arria10_e3sge3_phy_10gbase_r_24_mosi, + reg_ip_arria10_e3sge3_phy_10gbase_r_24_miso => reg_ip_arria10_e3sge3_phy_10gbase_r_24_miso, - u_common_mem_mux_eth10g : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_channels, - g_mult_addr_w => c_mem_reg_eth10g_adr_w - ) - PORT MAP ( - mosi => reg_eth10g_mosi, - miso => reg_eth10g_miso, - mosi_arr => reg_eth10g_mosi_arr, - miso_arr => reg_eth10g_miso_arr - ); + -- ST + tx_snk_in_arr => tx_snk_in_arr, + tx_snk_out_arr => tx_snk_out_arr, + + rx_src_out_arr => rx_src_out_arr, + rx_src_in_arr => rx_src_in_arr, + + -- Serial + serial_tx_arr => serial_tx_arr, + serial_rx_arr => serial_rx_arr + ); -END str; +END str; \ No newline at end of file diff --git a/libraries/technology/eth_10g/tech_eth_10g_component_pkg.vhd b/libraries/technology/eth_10g/tech_eth_10g_component_pkg.vhd new file mode 100644 index 0000000000000000000000000000000000000000..e27377a639f20404f57bf2685197b70c19373a74 --- /dev/null +++ b/libraries/technology/eth_10g/tech_eth_10g_component_pkg.vhd @@ -0,0 +1,226 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2014 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- 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 + +LIBRARY IEEE, technology_lib, common_lib, dp_lib; +USE IEEE.std_logic_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE common_lib.common_interface_layers_pkg.ALL; +USE technology_lib.technology_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; + +PACKAGE tech_eth_10g_component_pkg IS + + + ------------------------------------------------------------------------------ + -- ip_stratixiv + ------------------------------------------------------------------------------ + COMPONENT ip_stratixiv_eth_10g IS + GENERIC ( + g_sim : BOOLEAN := FALSE; + g_sim_level : NATURAL := 0; -- 0 = use XAUI IP; 1 = use fast serdes model + g_nof_channels : NATURAL := 1; + g_direction : STRING := "TX_RX"; -- "TX_RX", "TX_ONLY", "RX_ONLY" + g_pre_header_padding : BOOLEAN := FALSE + ); + PORT ( + -- Transceiver PLL reference clock + tr_ref_clk_156 : IN STD_LOGIC; -- 156.25 MHz for XAUI + tr_ref_rst_156 : IN STD_LOGIC; + + -- Calibration & reconfig clock + cal_rec_clk : IN STD_LOGIC; + + -- Data clocks + tx_clk_arr_in : IN STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- 156.25 MHz, externally connect tr_ref_clk_156 to tx_clk_arr_in or connect rx_clk_arr to tx_clk_arr_in + tx_rst_arr_out : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); + rx_clk_arr_out : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); + rx_clk_arr_in : IN STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- externally connect to rx_clk_arr_out to avoid clock delta-delay + rx_rst_arr_out : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); + + -- MM + mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + + mac_mosi : IN t_mem_mosi; -- MAG_10G (CSR) + mac_miso : OUT t_mem_miso; + + xaui_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- XAUI control + xaui_miso : OUT t_mem_miso; + + -- ST + tx_snk_in_arr : IN t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ 156 MHz tx_clk_arr_in + tx_snk_out_arr : OUT t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + rx_src_out_arr : OUT t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ 156 MHz rx_clk_arr_in + rx_src_in_arr : IN t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + -- XAUI serial IO + xaui_tx_arr : OUT t_xaui_arr(g_nof_channels-1 DOWNTO 0); + xaui_rx_arr : IN t_xaui_arr(g_nof_channels-1 DOWNTO 0) + ); + END COMPONENT; + + + ------------------------------------------------------------------------------ + -- ip_arria10 + ------------------------------------------------------------------------------ + + COMPONENT ip_arria10_eth_10g IS + GENERIC ( + g_sim : BOOLEAN := FALSE; + g_sim_level : NATURAL := 0; -- 0 = use IP; 1 = use fast serdes model + g_nof_channels : NATURAL := 1; + g_direction : STRING := "TX_RX"; -- "TX_RX", "TX_ONLY", "RX_ONLY" + g_pre_header_padding : BOOLEAN := FALSE + ); + PORT ( + -- Transceiver PLL reference clock + tr_ref_clk_644 : IN STD_LOGIC := '0'; -- 644.531250 MHz for 10GBASE-R + + -- Data clocks + clk_312 : IN STD_LOGIC := '0'; + clk_156 : IN STD_LOGIC := '0'; + rst_156 : IN STD_LOGIC := '0'; + + -- MM + mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + + mac_mosi : IN t_mem_mosi; -- MAG_10G (CSR) + mac_miso : OUT t_mem_miso; + + reg_eth10g_mosi : IN t_mem_mosi; -- ETH10G (link status register) + reg_eth10g_miso : OUT t_mem_miso; + + -- ST + tx_snk_in_arr : IN t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ clk_156 + tx_snk_out_arr : OUT t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + rx_src_out_arr : OUT t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ clk_156 + rx_src_in_arr : IN t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + -- Serial + serial_tx_arr : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); + serial_rx_arr : IN STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0) + ); + END COMPONENT; + + ------------------------------------------------------------------------------ + -- ip_arria10_e3sge3 + ------------------------------------------------------------------------------ + COMPONENT ip_arria10_e3sge3_eth_10g IS + GENERIC ( + g_sim : BOOLEAN := FALSE; + g_sim_level : NATURAL := 0; -- 0 = use IP; 1 = use fast serdes model + g_nof_channels : NATURAL := 1; + g_direction : STRING := "TX_RX"; -- "TX_RX", "TX_ONLY", "RX_ONLY" + g_pre_header_padding : BOOLEAN := FALSE + ); + PORT ( + -- Transceiver PLL reference clock + tr_ref_clk_644 : IN STD_LOGIC := '0'; -- 644.531250 MHz for 10GBASE-R + + -- Data clocks + clk_312 : IN STD_LOGIC := '0'; + clk_156 : IN STD_LOGIC := '0'; + rst_156 : IN STD_LOGIC := '0'; + + -- MM + mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + + mac_mosi : IN t_mem_mosi; -- MAG_10G (CSR) + mac_miso : OUT t_mem_miso; + + reg_eth10g_mosi : IN t_mem_mosi; -- ETH10G (link status register) + reg_eth10g_miso : OUT t_mem_miso; + + reg_ip_arria10_e3sge3_phy_10gbase_r_24_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_ip_arria10_e3sge3_phy_10gbase_r_24_miso : OUT t_mem_miso; + + -- ST + tx_snk_in_arr : IN t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ clk_156 + tx_snk_out_arr : OUT t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + rx_src_out_arr : OUT t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ clk_156 + rx_src_in_arr : IN t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + -- Serial + serial_tx_arr : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); + serial_rx_arr : IN STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0) + ); + END COMPONENT; + ------------------------------------------------------------------------------ + -- ip_arria10_e1sg + ------------------------------------------------------------------------------ + + COMPONENT ip_arria10_e1sg_eth_10g IS + GENERIC ( + g_sim : BOOLEAN := FALSE; + g_sim_level : NATURAL := 0; -- 0 = use IP; 1 = use fast serdes model + g_nof_channels : NATURAL := 1; + g_direction : STRING := "TX_RX"; -- "TX_RX", "TX_ONLY", "RX_ONLY" + g_pre_header_padding : BOOLEAN := FALSE + ); + PORT ( + -- Transceiver PLL reference clock + tr_ref_clk_644 : IN STD_LOGIC := '0'; -- 644.531250 MHz for 10GBASE-R + + -- Data clocks + clk_312 : IN STD_LOGIC := '0'; + clk_156 : IN STD_LOGIC := '0'; + rst_156 : IN STD_LOGIC := '0'; + + -- MM + mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + + mac_mosi : IN t_mem_mosi; -- MAG_10G (CSR) + mac_miso : OUT t_mem_miso; + + reg_eth10g_mosi : IN t_mem_mosi; -- ETH10G (link status register) + reg_eth10g_miso : OUT t_mem_miso; + + reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_ip_arria10_e1sg_phy_10gbase_r_24_miso : OUT t_mem_miso; + + -- ST + tx_snk_in_arr : IN t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ clk_156 + tx_snk_out_arr : OUT t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + rx_src_out_arr : OUT t_dp_sosi_arr(g_nof_channels-1 DOWNTO 0); -- 64 bit data @ clk_156 + rx_src_in_arr : IN t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); + + -- Serial + serial_tx_arr : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); + serial_rx_arr : IN STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0) + ); + END COMPONENT; + +END tech_eth_10g_component_pkg; + +PACKAGE BODY tech_eth_10g_component_pkg IS + +END tech_eth_10g_component_pkg; diff --git a/libraries/technology/eth_10g/tech_eth_10g_stratixiv.vhd b/libraries/technology/eth_10g/tech_eth_10g_stratixiv.vhd index 74f7b2b5ee747f0e40daa4c0aa8d336bc37afb7c..c52a5b4d6591555cdf44002915bb2289f5d3b6d7 100644 --- a/libraries/technology/eth_10g/tech_eth_10g_stratixiv.vhd +++ b/libraries/technology/eth_10g/tech_eth_10g_stratixiv.vhd @@ -75,7 +75,7 @@ -- 4) Device A stops sending frames, continuously generates Idle. -- -LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_xaui_lib, tech_mac_10g_lib; +LIBRARY IEEE, common_lib, dp_lib, technology_lib, tech_mac_10g_lib, ip_stratixiv_eth_10g_lib; USE IEEE.STD_LOGIC_1164.ALL; USE technology_lib.technology_pkg.ALL; USE common_lib.common_pkg.ALL; @@ -83,6 +83,7 @@ USE common_lib.common_mem_pkg.ALL; USE common_lib.common_interface_layers_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE tech_mac_10g_lib.tech_mac_10g_component_pkg.ALL; +USE work.tech_eth_10g_component_pkg.ALL; ENTITY tech_eth_10g_stratixiv IS GENERIC ( @@ -133,155 +134,51 @@ END tech_eth_10g_stratixiv; ARCHITECTURE str OF tech_eth_10g_stratixiv IS - -- Enable or disable the conditions that must be ok to release tx_snk_out_arr xon - CONSTANT c_check_link_status : BOOLEAN := g_direction/="TX_ONLY"; - CONSTANT c_check_rx_channelaligned : BOOLEAN := g_direction/="TX_ONLY"; - CONSTANT c_check_xgmii_tx_ready : BOOLEAN := g_direction/="RX_ONLY"; - - -- MAG_10G control status registers - SIGNAL mac_mosi_arr : t_mem_mosi_arr(g_nof_channels-1 DOWNTO 0); - SIGNAL mac_miso_arr : t_mem_miso_arr(g_nof_channels-1 DOWNTO 0); - - -- ST - SIGNAL i_tx_rst_arr_out : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); - SIGNAL i_rx_rst_arr_out : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); - - SIGNAL txc_tx_ready_arr : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- tx_ready in tx_clk_arr_in domain, can be used for xon flow control - SIGNAL rxc_rx_ready_arr : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- rx_ready in rx_clk_arr domain, typically leave not connected - - SIGNAL txc_rx_channelaligned_arr : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- rx_channelaligned in tx_clk_arr_in domain, from PHY XAUI, indicates - -- that all 4 RX channels are aligned when asserted - - -- XON control - SIGNAL mac_snk_out_arr : t_dp_siso_arr(g_nof_channels-1 DOWNTO 0); - - -- XGMII - SIGNAL xgmii_link_status_arr : t_tech_mac_10g_xgmii_status_arr(g_nof_channels-1 DOWNTO 0); -- 2 bit, from MAC_10g - SIGNAL xgmii_tx_ready_arr : STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- 1 bit, from PHY XAUI - SIGNAL xgmii_tx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_rx_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - SIGNAL xgmii_internal_dc_arr : t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit - BEGIN - -- Clocks and reset - tx_rst_arr_out <= i_tx_rst_arr_out; - rx_rst_arr_out <= i_rx_rst_arr_out; - - i_tx_rst_arr_out <= NOT txc_tx_ready_arr WHEN g_direction/="RX_ONLY" ELSE i_rx_rst_arr_out; -- in case of RX_ONLY use the rx rst also for tx to have an active rst release, clock domain crossing issues can be ignored - i_rx_rst_arr_out <= NOT rxc_rx_ready_arr WHEN g_direction/="TX_ONLY" ELSE i_tx_rst_arr_out; -- in case of TX_ONLY use the tx rst also for rx to have an active rst release, clock domain crossing issues can be ignored - - xgmii_tx_ready_arr <= txc_tx_ready_arr; - - gen_mac : FOR I IN 0 TO g_nof_channels-1 GENERATE - - tx_snk_out_arr(I).ready <= mac_snk_out_arr(I).ready; -- pass on MAC cycle accurate backpressure - - p_xon_flow_control : PROCESS(tx_clk_arr_in) - VARIABLE v_xgmii_link_status : STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0) := "00"; - VARIABLE v_txc_rx_channelaligned : STD_LOGIC := '1'; - VARIABLE v_xgmii_tx_ready : STD_LOGIC := '1'; - BEGIN - IF rising_edge(tx_clk_arr_in(I)) THEN - tx_snk_out_arr(I).xon <= '0'; - - -- First gather all conditions that are enabled to affect xon. The default value is such that it enables xon when the condition is not checked. - IF c_check_link_status =TRUE THEN v_xgmii_link_status := xgmii_link_status_arr(I); END IF; -- check both remote fault [1] and local fault [0] - IF c_check_rx_channelaligned=TRUE THEN v_txc_rx_channelaligned := txc_rx_channelaligned_arr(I); END IF; -- check that all 4 RX channels are aligned - IF c_check_xgmii_tx_ready =TRUE THEN v_xgmii_tx_ready := xgmii_tx_ready_arr(I); END IF; - - -- Now apply the conditions to xon - IF v_xgmii_tx_ready='1' AND v_txc_rx_channelaligned='1' AND v_xgmii_link_status="00" THEN - tx_snk_out_arr(I).xon <= '1'; -- XON when Tx PHY is ready and XGMII is ok - END IF; - END IF; - END PROCESS; - - u_tech_mac_10g : ENTITY tech_mac_10g_lib.tech_mac_10g - GENERIC MAP ( - g_technology => c_tech_stratixiv, - g_pre_header_padding => g_pre_header_padding - ) - PORT MAP ( - -- MM - mm_clk => mm_clk, - mm_rst => mm_rst, - csr_mosi => mac_mosi_arr(I), - csr_miso => mac_miso_arr(I), - - -- ST - tx_clk_156 => tx_clk_arr_in(I), - tx_rst => i_tx_rst_arr_out(I), - tx_snk_in => tx_snk_in_arr(I), -- 64 bit data - tx_snk_out => mac_snk_out_arr(I), - - rx_clk_156 => rx_clk_arr_in(I), - rx_rst => i_rx_rst_arr_out(I), - rx_src_out => rx_src_out_arr(I), -- 64 bit data - rx_src_in => rx_src_in_arr(I), - - -- XGMII - xgmii_link_status => xgmii_link_status_arr(I), - xgmii_tx_data => xgmii_tx_dc_arr(I), - xgmii_rx_data => xgmii_internal_dc_arr(I) - ); - END GENERATE; - - xgmii_internal_dc_arr <= xgmii_tx_dc_arr WHEN g_direction="TX_ONLY" ELSE xgmii_rx_dc_arr; - - u_tech_xaui: ENTITY tech_xaui_lib.tech_xaui - GENERIC MAP ( - g_technology => c_tech_stratixiv, - g_sim => g_sim, - g_sim_level => g_sim_level, - g_nof_xaui => g_nof_channels -- Up to 3 (hard XAUI only) supported + u_ip_stratixiv_eth_10g : ip_stratixiv_eth_10g + GENERIC MAP( + g_sim => g_sim, + g_sim_level => g_sim_level, + g_nof_channels => g_nof_channels, + g_direction => g_direction, + g_pre_header_padding => g_pre_header_padding ) - PORT MAP ( - -- Transceiver PLL reference clock - tr_clk => tr_ref_clk_156, - tr_rst => tr_ref_rst_156, + PORT MAP( + -- Transceiver PLL reference clock + tr_ref_clk_156 => tr_ref_clk_156, + tr_ref_rst_156 => tr_ref_rst_156, - -- Calibration & reconfig clock - cal_rec_clk => cal_rec_clk, + -- Calibration & reconfig clock + cal_rec_clk => cal_rec_clk, - -- MM interface - mm_clk => mm_clk, - mm_rst => mm_rst, + -- Data clocks + tx_clk_arr_in => tx_clk_arr_in, + tx_rst_arr_out => tx_rst_arr_out, + rx_clk_arr_out => rx_clk_arr_out, + rx_clk_arr_in => rx_clk_arr_in, + rx_rst_arr_out => rx_rst_arr_out, - xaui_mosi => xaui_mosi, - xaui_miso => xaui_miso, - - -- XGMII interface - tx_clk_arr => tx_clk_arr_in, - rx_clk_arr_out => rx_clk_arr_out, - rx_clk_arr_in => rx_clk_arr_in, - - txc_tx_ready_arr => txc_tx_ready_arr, -- tx_ready in tx_clk_arr_in domain, can be used for xon flow control - rxc_rx_ready_arr => rxc_rx_ready_arr, -- rx_ready in rx_clk_arr domain, typically leave not connected + -- MM + mm_clk => mm_clk, + mm_rst => mm_rst, - txc_rx_channelaligned_arr => txc_rx_channelaligned_arr, -- rx_channelaligned in tx_clk_arr_in domain, indicates that all 4 RX channels are aligned when asserted + mac_mosi => mac_mosi, + mac_miso => mac_miso, - xgmii_tx_dc_arr => xgmii_tx_dc_arr, - xgmii_rx_dc_arr => xgmii_rx_dc_arr, + xaui_mosi => xaui_mosi, + xaui_miso => xaui_miso, - -- XAUI serial IO - xaui_tx_arr => xaui_tx_arr, - xaui_rx_arr => xaui_rx_arr + -- ST + tx_snk_in_arr => tx_snk_in_arr, + tx_snk_out_arr => tx_snk_out_arr, + + rx_src_out_arr => rx_src_out_arr, + rx_src_in_arr => rx_src_in_arr, + + -- XAUI serial IO + xaui_tx_arr => xaui_tx_arr, + xaui_rx_arr => xaui_rx_arr ); - - ----------------------------------------------------------------------------- - -- MM bus mux - ----------------------------------------------------------------------------- - u_common_mem_mux : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_channels, - g_mult_addr_w => func_tech_mac_10g_csr_addr_w(c_tech_stratixiv) - ) - PORT MAP ( - mosi => mac_mosi, - miso => mac_miso, - mosi_arr => mac_mosi_arr, - miso_arr => mac_miso_arr - ); END str;