diff --git a/libraries/io/tr_10GbE/src/vhdl/tr_10GbE.vhd b/libraries/io/tr_10GbE/src/vhdl/tr_10GbE.vhd index a58b424ed326d679bca404650dc4e9f153d88a94..b81a7627776e117f087e78529b33836bce25993f 100644 --- a/libraries/io/tr_10GbE/src/vhdl/tr_10GbE.vhd +++ b/libraries/io/tr_10GbE/src/vhdl/tr_10GbE.vhd @@ -30,7 +30,7 @@ -- -- -LIBRARY IEEE, common_lib, dp_lib, diag_lib, tr_xaui_lib, technology_lib, tech_mac_10g_lib; +LIBRARY IEEE, common_lib, dp_lib, diag_lib, technology_lib, tech_mac_10g_lib, tech_eth_10g_lib, tr_xaui_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; @@ -54,13 +54,15 @@ ENTITY tr_10GbE IS g_word_alignment_padding : BOOLEAN := FALSE ); PORT ( - tr_clk_644 : IN STD_LOGIC := '0'; - tr_clk_312 : IN STD_LOGIC := '0'; - tr_clk_156 : IN STD_LOGIC := '0'; - tr_rst_156 : IN STD_LOGIC := '0'; - - cal_rec_clk : IN STD_LOGIC; - + -- Transceiver PLL reference clock + tr_ref_clk_644 : IN STD_LOGIC := '0'; -- 644.531250 MHz for 10GBASE-R + tr_ref_clk_312 : IN STD_LOGIC := '0'; -- 312.5 MHz for 10GBASE-R + tr_ref_clk_156 : IN STD_LOGIC := '0'; -- 156.25 MHz for 10GBASE-R or for XAUI + tr_ref_rst_156 : IN STD_LOGIC := '0'; -- for 10GBASE-R or for XAUI + + -- Calibration & reconfig clock + cal_rec_clk : IN STD_LOGIC := '0'; -- for XAUI; + -- MM interface mm_rst : IN STD_LOGIC; mm_clk : IN STD_LOGIC; @@ -85,12 +87,12 @@ ENTITY tr_10GbE IS src_out_arr : OUT t_dp_sosi_arr(g_nof_macs-1 DOWNTO 0); -- Serial XAUI IO - xaui_tx_out_arr : OUT t_xaui_arr(g_nof_macs-1 DOWNTO 0); - xaui_rx_in_arr : IN t_xaui_arr(g_nof_macs-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); + xaui_tx_arr : OUT t_xaui_arr(g_nof_macs-1 DOWNTO 0); + xaui_rx_arr : IN t_xaui_arr(g_nof_macs-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); -- Serial IO - serial_tx_out_arr : OUT STD_LOGIC_VECTOR(g_nof_macs-1 downto 0); - serial_rx_in_arr : IN STD_LOGIC_VECTOR(g_nof_macs-1 downto 0) := (OTHERS=>'0'); + serial_tx_arr : OUT STD_LOGIC_VECTOR(g_nof_macs-1 downto 0); + serial_rx_arr : IN STD_LOGIC_VECTOR(g_nof_macs-1 downto 0) := (OTHERS=>'0'); -- MDIO interface mdio_rst : OUT STD_LOGIC; @@ -103,20 +105,21 @@ END tr_10GbE; ARCHITECTURE str OF tr_10GbE IS - CONSTANT c_mac_mm_addr_w : NATURAL := 13; - CONSTANT c_fifo_margin : NATURAL := g_pkt_len; - SIGNAL tr_clk : STD_LOGIC; - SIGNAL tr_rst : STD_LOGIC; - SIGNAL tx_clk_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); - SIGNAL tx_rst_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); - - SIGNAL rx_clk_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); - SIGNAL rx_rst_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); - - SIGNAL reg_mac_mosi_arr : t_mem_mosi_arr(g_nof_macs-1 DOWNTO 0); - SIGNAL reg_mac_miso_arr : t_mem_miso_arr(g_nof_macs-1 DOWNTO 0); + SIGNAL tx_rst_arr_out : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); + SIGNAL rx_clk_arr_out : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); + SIGNAL rx_rst_arr_out : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); + + SIGNAL eth_ref_clk_644 : STD_LOGIC; + SIGNAL eth_ref_clk_312 : STD_LOGIC; + SIGNAL eth_ref_clk_156 : STD_LOGIC; + SIGNAL eth_ref_rst_156 : STD_LOGIC; + + SIGNAL eth_tx_clk_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); + SIGNAL eth_tx_rst_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); + SIGNAL eth_rx_clk_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); + SIGNAL eth_rx_rst_arr : STD_LOGIC_VECTOR(g_nof_macs-1 DOWNTO 0); SIGNAL dp_fifo_dc_tx_src_out_arr : t_dp_sosi_arr(g_nof_macs-1 DOWNTO 0); SIGNAL dp_fifo_dc_tx_src_in_arr : t_dp_siso_arr(g_nof_macs-1 DOWNTO 0); @@ -130,20 +133,45 @@ ARCHITECTURE str OF tr_10GbE IS SIGNAL dp_fifo_dc_rx_src_out_arr : t_dp_sosi_arr(g_nof_macs-1 DOWNTO 0); SIGNAL dp_fifo_dc_rx_src_in_arr : t_dp_siso_arr(g_nof_macs-1 DOWNTO 0); - SIGNAL mac_xgmii_tx_dc_arr : t_xgmii_dc_arr(g_nof_macs-1 DOWNTO 0); - SIGNAL mac_xgmii_rx_dc_arr : t_xgmii_dc_arr(g_nof_macs-1 DOWNTO 0); - BEGIN --------------------------------------------------------------------------------------- -- Clocks and reset --------------------------------------------------------------------------------------- - -- tx_clk_arr = tr_clk_156 = tr_clk - tr_clk <= tr_clk_156; - tr_rst <= tr_rst_156; - - tx_clk_arr <= (OTHERS=>tr_clk_156); + -- Apply the clocks from top level down such that they have their rising_edge() aligned without any delta-delay + u_tech_eth_10g_clocks : ENTITY tech_eth_10g_lib.tech_eth_10g_clocks + GENERIC MAP ( + g_technology => g_technology, + g_nof_channels => 1 + ) + PORT MAP ( + -- Input clocks + -- . Reference + tr_ref_clk_644 => tr_ref_clk_644, + tr_ref_clk_312 => tr_ref_clk_312, + tr_ref_clk_156 => tr_ref_clk_156, + tr_ref_rst_156 => tr_ref_rst_156, + + -- . XAUI + tx_rst_arr => tx_rst_arr_out, + rx_clk_arr => rx_clk_arr_out, + rx_rst_arr => rx_rst_arr_out, + + -- Output clocks + -- . Reference + eth_ref_clk_644 => eth_ref_clk_644, + eth_ref_clk_312 => eth_ref_clk_312, + eth_ref_clk_156 => eth_ref_clk_156, + eth_ref_rst_156 => eth_ref_rst_156, + + -- . Data + eth_tx_clk_arr => eth_tx_clk_arr, + eth_tx_rst_arr => eth_tx_rst_arr, + + eth_rx_clk_arr => eth_rx_clk_arr, + eth_rx_rst_arr => eth_rx_rst_arr + ); --------------------------------------------------------------------------------------- -- TX FIFO: dp_clk -> tx_clk @@ -158,8 +186,8 @@ BEGIN PORT MAP ( wr_rst => dp_rst, wr_clk => dp_clk, - rd_rst => tx_rst_arr(i), - rd_clk => tx_clk_arr(i), + rd_rst => eth_tx_rst_arr(i), + rd_clk => eth_tx_clk_arr(i), snk_out => snk_out_arr(i), snk_in => snk_in_arr(i), @@ -182,8 +210,8 @@ BEGIN g_fifo_size => g_pkt_len+c_fifo_margin ) PORT MAP ( - rst => tx_rst_arr(i), - clk => tx_clk_arr(i), + rst => eth_tx_rst_arr(i), + clk => eth_tx_clk_arr(i), snk_out => dp_fifo_dc_tx_src_in_arr(i), snk_in => dp_fifo_dc_tx_src_out_arr(i), @@ -195,84 +223,60 @@ BEGIN --------------------------------------------------------------------------------------- - -- DP-MAC connect + -- ETH MAC + PHY --------------------------------------------------------------------------------------- - gen_tech_mac_10g : FOR i IN 0 TO g_nof_macs-1 GENERATE - u_tech_mac_10g : ENTITY tech_mac_10g_lib.tech_mac_10g - GENERIC MAP ( - g_technology => g_technology, - g_pre_header_padding => g_word_alignment_padding - ) - PORT MAP ( - -- MM - mm_clk => mm_clk, - mm_rst => mm_rst, - csr_mosi => reg_mac_mosi_arr(i), -- CSR = control status register - csr_miso => reg_mac_miso_arr(i), - - -- ST - tx_clk_156 => tx_clk_arr(i), -- 156.25 MHz local reference - tx_rst => tx_rst_arr(i), - tx_snk_in => dp_fifo_fill_tx_src_out_arr(i), -- 64 bit data - tx_snk_out => dp_fifo_fill_tx_src_in_arr(i), - - rx_clk_156 => rx_clk_arr(i), -- 156.25 MHz - rx_rst => rx_rst_arr(i), - rx_src_out => mac_10g_src_out_arr(i), -- 64 bit data - rx_src_in => mac_10g_src_in_arr(i), - - -- XGMII - xgmii_tx_data => mac_xgmii_tx_dc_arr(i), -- 72 bit - xgmii_rx_data => mac_xgmii_rx_dc_arr(i) -- 72 bit - ); - END GENERATE; - - --------------------------------------------------------------------------------------- - -- XGMII-XAUI connect - --------------------------------------------------------------------------------------- - u_tr_xaui : ENTITY tr_xaui_lib.tr_xaui + u_tech_eth_10g : ENTITY tech_eth_10g_lib.tech_eth_10g GENERIC MAP ( - g_technology => g_technology, - g_sim => g_sim, - g_sim_level => g_sim_level, - g_use_xgmii => TRUE, -- Use XGMII direct - g_nof_xaui => g_nof_macs, - g_use_mdio => g_use_mdio, - g_mdio_epcs_dis => g_mdio_epcs_dis + g_technology => g_technology, + g_sim => g_sim, + g_sim_level => g_sim_level, -- 0 = use IP; 1 = use fast serdes model + g_nof_channels => g_nof_macs, + g_link_status_check => "11", + g_pre_header_padding => g_word_alignment_padding ) PORT MAP ( - -- Transceiver PLL reference clock - tr_clk => tr_clk, -- = tr_clk_156 = tx_clk_arr - tr_rst => tr_rst, -- = tr_rst_156 - + -- Transceiver PLL reference clock + tr_ref_clk_644 => eth_ref_clk_644, -- 644.531250 MHz for 10GBASE-R + tr_ref_clk_312 => eth_ref_clk_312, -- 312.5 MHz for 10GBASE-R + tr_ref_clk_156 => eth_ref_clk_156, -- 156.25 MHz for 10GBASE-R or for XAUI + tr_ref_rst_156 => eth_ref_rst_156, -- for 10GBASE-R or for XAUI + -- Calibration & reconfig clock - cal_rec_clk => cal_rec_clk, - - -- MM clock for register of optional MDIO master - mm_clk => mm_clk, - mm_rst => mm_rst, - - -- Streaming TX interfaces - tx_clk_arr => tx_clk_arr, - tx_rst_arr => tx_rst_arr, - - -- Streaming RX interfaces - rx_clk_arr_out => rx_clk_arr, - rx_clk_arr_in => rx_clk_arr, - rx_rst_arr => rx_rst_arr, - - -- Direct XGMII interface - xgmii_tx_dc_arr => mac_xgmii_tx_dc_arr, - xgmii_rx_dc_arr => mac_xgmii_rx_dc_arr, - - --Serial I/O - xaui_tx_arr => xaui_tx_out_arr, - xaui_rx_arr => xaui_rx_in_arr, - - -- XAUI PHY IP MM control/status - xaui_mosi => xaui_mosi, - xaui_miso => xaui_miso + cal_rec_clk => cal_rec_clk, -- for XAUI; + + -- XAUI clocks + tx_clk_arr_in => eth_tx_clk_arr, -- 156.25 MHz, externally connect tr_ref_clk_156 to tx_clk_arr or connect rx_clk_arr to tx_clk_arr + tx_rst_arr_out => tx_rst_arr_out, + rx_clk_arr_out => rx_clk_arr_out, + rx_clk_arr_in => eth_rx_clk_arr, -- externally connect to rx_clk_arr_out to avoid clock delta-delay + rx_rst_arr_out => rx_rst_arr_out, + + -- MM + mm_clk => mm_clk, + mm_rst => mm_rst, + + mac_mosi => reg_mac_mosi, -- MAG_10G (CSR), aggregated for all g_nof_channels + mac_miso => reg_mac_miso, + + xaui_mosi => xaui_mosi, -- XAUI control + xaui_miso => xaui_miso, + + -- ST + tx_snk_in_arr => dp_fifo_fill_tx_src_out_arr, -- 64 bit data @ 156 MHz + tx_snk_out_arr => dp_fifo_fill_tx_src_in_arr , + + rx_src_out_arr => mac_10g_src_out_arr, -- 64 bit data @ 156 MHz + rx_src_in_arr => mac_10g_src_in_arr, + + -- PHY serial IO + -- . 10GBASE-R (single lane) + serial_tx_arr => serial_tx_arr, + serial_rx_arr => serial_rx_arr, + + -- . XAUI (four lanes) + xaui_tx_arr => xaui_tx_arr, + xaui_rx_arr => xaui_rx_arr ); --------------------------------------------------------------------------- @@ -287,8 +291,8 @@ BEGIN ) PORT MAP ( -- Transceiver PLL reference clock - tr_clk => tr_clk, - tr_rst => tr_rst, + tr_clk => eth_ref_clk_156, + tr_rst => eth_ref_rst_156, -- MM clock for register of optional MDIO master mm_clk => mm_clk, @@ -317,8 +321,8 @@ BEGIN g_use_empty => TRUE ) PORT MAP ( - wr_rst => rx_rst_arr(i), - wr_clk => rx_clk_arr(i), + wr_rst => eth_rx_rst_arr(i), + wr_clk => eth_rx_clk_arr(i), rd_rst => dp_rst, rd_clk => dp_clk, @@ -347,19 +351,4 @@ BEGIN ); END GENERATE; - ----------------------------------------------------------------------------- - -- MM bus muxes - ----------------------------------------------------------------------------- - u_common_mem_mux : ENTITY common_lib.common_mem_mux - GENERIC MAP ( - g_nof_mosi => g_nof_macs, - g_mult_addr_w => c_mac_mm_addr_w - ) - PORT MAP ( - mosi => reg_mac_mosi, - miso => reg_mac_miso, - mosi_arr => reg_mac_mosi_arr, - miso_arr => reg_mac_miso_arr - ); - END str;