diff --git a/libraries/technology/mac_10g/tb_tech_mac_10g.vhd b/libraries/technology/mac_10g/tb_tech_mac_10g.vhd index ef1dcdca81f10e9c040c510383665b22d20112b0..43f1a6ee17b11be49a0792c0485a13c78d415e42 100644 --- a/libraries/technology/mac_10g/tb_tech_mac_10g.vhd +++ b/libraries/technology/mac_10g/tb_tech_mac_10g.vhd @@ -115,6 +115,7 @@ ARCHITECTURE tb OF tb_tech_mac_10g IS SIGNAL rx_sosi_data : STD_LOGIC_VECTOR(c_tech_mac_10g_data_w-1 DOWNTO 0); -- 64 bit -- 10G MAC XGMII interface + SIGNAL xgmii_link_status : STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0); -- 2 bit SIGNAL xgmii_tx_data : STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit SIGNAL xgmii_rx_data : STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit @@ -249,6 +250,11 @@ BEGIN END IF; END PROCESS; + no_dut : IF c_st_loopback=TRUE GENERATE + rx_sosi <= tx_sosi; + tx_siso <= rx_siso; + END GENERATE; + gen_dut : IF c_st_loopback=FALSE GENERATE dut : ENTITY work.tech_mac_10g GENERIC MAP ( @@ -258,35 +264,31 @@ BEGIN ) PORT MAP ( -- MM - mm_clk => mm_clk, - mm_rst => mm_rst, - csr_mosi => mm_mosi, -- CSR = control status register - csr_miso => mm_miso, + mm_clk => mm_clk, + mm_rst => mm_rst, + csr_mosi => mm_mosi, -- CSR = control status register + csr_miso => mm_miso, -- ST - tx_clk_312 => tx_ref_clk_312, - tx_clk_156 => tx_ref_clk_156, -- 156.25 MHz local reference - tx_rst => tx_rst, - tx_snk_in => tx_sosi, -- 64 bit data - tx_snk_out => tx_siso, + tx_clk_312 => tx_ref_clk_312, + tx_clk_156 => tx_ref_clk_156, -- 156.25 MHz local reference + tx_rst => tx_rst, + tx_snk_in => tx_sosi, -- 64 bit data + tx_snk_out => tx_siso, - rx_clk_312 => rx_phy_clk_312, - rx_clk_156 => rx_phy_clk_156, -- 156.25 MHz from rx phy - rx_rst => rx_rst, - rx_src_out => rx_sosi, -- 64 bit data - rx_src_in => rx_siso, + rx_clk_312 => rx_phy_clk_312, + rx_clk_156 => rx_phy_clk_156, -- 156.25 MHz from rx phy + rx_rst => rx_rst, + rx_src_out => rx_sosi, -- 64 bit data + rx_src_in => rx_siso, -- XGMII - xgmii_tx_data => xgmii_tx_data, -- 72 bit - xgmii_rx_data => xgmii_rx_data -- 72 bit + xgmii_link_status => xgmii_link_status, + xgmii_tx_data => xgmii_tx_data, -- 72 bit + xgmii_rx_data => xgmii_rx_data -- 72 bit ); END GENERATE; - no_dut : IF c_st_loopback=TRUE GENERATE - rx_sosi <= tx_sosi; - tx_siso <= rx_siso; - END GENERATE; - -- Loopback XGMII xgmii_rx_data <= TRANSPORT xgmii_tx_data AFTER phy_delay; diff --git a/libraries/technology/mac_10g/tech_mac_10g.vhd b/libraries/technology/mac_10g/tech_mac_10g.vhd index 5fe23c99e97e8146575382b45599ef415900ff2f..5e2370274f34669c2b07d7e52f474e9028107fcc 100644 --- a/libraries/technology/mac_10g/tech_mac_10g.vhd +++ b/libraries/technology/mac_10g/tech_mac_10g.vhd @@ -74,27 +74,28 @@ ENTITY tech_mac_10g IS ); PORT ( -- MM - mm_clk : IN STD_LOGIC; - mm_rst : IN STD_LOGIC; - csr_mosi : IN t_mem_mosi; -- CSR = control status register - csr_miso : OUT t_mem_miso; + mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + csr_mosi : IN t_mem_mosi; -- CSR = control status register + csr_miso : OUT t_mem_miso; -- ST - tx_clk_312 : IN STD_LOGIC := '0'; -- 312.5 MHz - tx_clk_156 : IN STD_LOGIC; -- 156.25 MHz local reference - tx_rst : IN STD_LOGIC; - tx_snk_in : IN t_dp_sosi; -- 64 bit data - tx_snk_out : OUT t_dp_siso; + tx_clk_312 : IN STD_LOGIC := '0'; -- 312.5 MHz + tx_clk_156 : IN STD_LOGIC; -- 156.25 MHz local reference + tx_rst : IN STD_LOGIC; + tx_snk_in : IN t_dp_sosi; -- 64 bit data + tx_snk_out : OUT t_dp_siso; - rx_clk_312 : IN STD_LOGIC := '0'; -- 312.5 MHz - rx_clk_156 : IN STD_LOGIC; -- 156.25 MHz from rx phy - rx_rst : IN STD_LOGIC; - rx_src_out : OUT t_dp_sosi; -- 64 bit data - rx_src_in : IN t_dp_siso; + rx_clk_312 : IN STD_LOGIC := '0'; -- 312.5 MHz + rx_clk_156 : IN STD_LOGIC; -- 156.25 MHz from rx phy + rx_rst : IN STD_LOGIC; + rx_src_out : OUT t_dp_sosi; -- 64 bit data + rx_src_in : IN t_dp_siso; -- XGMII - xgmii_tx_data : OUT STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit - xgmii_rx_data : IN STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0) -- 72 bit + xgmii_link_status : OUT STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0); -- 2 bit + xgmii_tx_data : OUT STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit + xgmii_rx_data : IN STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0) -- 72 bit ); END tech_mac_10g; @@ -134,7 +135,7 @@ BEGIN PORT MAP (mm_clk, mm_rst, csr_mosi, csr_miso, tx_clk_156, tx_rst, tx_mac_snk_in, tx_mac_snk_out, rx_clk_156, rx_rst, rx_mac_src_out, rx_mac_src_in, - xgmii_tx_data, xgmii_rx_data); + xgmii_link_status, xgmii_tx_data, xgmii_rx_data); END GENERATE; gen_ip_arria10 : IF g_technology=c_tech_arria10 GENERATE @@ -142,7 +143,7 @@ BEGIN PORT MAP (mm_clk, mm_rst, csr_mosi, csr_miso, tx_clk_312, tx_clk_156, tx_rst, tx_mac_snk_in, tx_mac_snk_out, rx_clk_312, rx_clk_156, rx_rst, rx_mac_src_out, rx_mac_src_in, - xgmii_tx_data, xgmii_rx_data); + xgmii_link_status, xgmii_tx_data, xgmii_rx_data); END GENERATE; diff --git a/libraries/technology/mac_10g/tech_mac_10g_arria10.vhd b/libraries/technology/mac_10g/tech_mac_10g_arria10.vhd index 229731dba55b47210d7e4ed34150997268db6159..4539cfd73055c63835bedae12c9ed68a245d338f 100644 --- a/libraries/technology/mac_10g/tech_mac_10g_arria10.vhd +++ b/libraries/technology/mac_10g/tech_mac_10g_arria10.vhd @@ -35,27 +35,28 @@ USE work.tech_mac_10g_component_pkg.ALL; ENTITY tech_mac_10g_arria10 IS PORT ( -- MM - mm_clk : IN STD_LOGIC; - mm_rst : IN STD_LOGIC; - csr_mosi : IN t_mem_mosi; -- CSR = control status register - csr_miso : OUT t_mem_miso; + mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + csr_mosi : IN t_mem_mosi; -- CSR = control status register + csr_miso : OUT t_mem_miso; -- ST - tx_clk_312 : IN STD_LOGIC; - tx_clk_156 : IN STD_LOGIC; - tx_rst : IN STD_LOGIC; - tx_snk_in : IN t_dp_sosi; - tx_snk_out : OUT t_dp_siso; + tx_clk_312 : IN STD_LOGIC; + tx_clk_156 : IN STD_LOGIC; + tx_rst : IN STD_LOGIC; + tx_snk_in : IN t_dp_sosi; + tx_snk_out : OUT t_dp_siso; - rx_clk_312 : IN STD_LOGIC; - rx_clk_156 : IN STD_LOGIC; - rx_rst : IN STD_LOGIC; - rx_src_out : OUT t_dp_sosi; - rx_src_in : IN t_dp_siso; + rx_clk_312 : IN STD_LOGIC; + rx_clk_156 : IN STD_LOGIC; + rx_rst : IN STD_LOGIC; + rx_src_out : OUT t_dp_sosi; + rx_src_in : IN t_dp_siso; -- XGMII - xgmii_tx_data : OUT STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit - xgmii_rx_data : IN STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0) -- 72 bit + xgmii_link_status : OUT STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0); -- 2 bit + xgmii_tx_data : OUT STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit + xgmii_rx_data : IN STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0) -- 72 bit ); END tech_mac_10g_arria10; @@ -135,7 +136,7 @@ BEGIN avalon_st_rxstatus_data => OPEN, avalon_st_rxstatus_error => OPEN, - link_fault_status_xgmii_rx_data => OPEN, + link_fault_status_xgmii_rx_data => xgmii_link_status, -- 0=ok, 1=local fault, 2=remote fault unidirectional_en => OPEN, unidirectional_remote_fault_dis => OPEN diff --git a/libraries/technology/mac_10g/tech_mac_10g_component_pkg.vhd b/libraries/technology/mac_10g/tech_mac_10g_component_pkg.vhd index 598f8ce6a0861db48a2e94339240d65561229302..a3c31889b101bed51b1e18c59061c90f1d5a7c65 100644 --- a/libraries/technology/mac_10g/tech_mac_10g_component_pkg.vhd +++ b/libraries/technology/mac_10g/tech_mac_10g_component_pkg.vhd @@ -32,6 +32,10 @@ PACKAGE tech_mac_10g_component_pkg IS FUNCTION func_tech_mac_10g_csr_addr_w(c_technology : NATURAL) RETURN NATURAL; + CONSTANT c_tech_mac_10g_link_status_w : NATURAL := 2; + + TYPE t_tech_mac_10g_xgmii_status_arr IS ARRAY(INTEGER RANGE <>) OF STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0); + CONSTANT c_tech_mac_10g_data_w : NATURAL := c_xgmii_data_w; -- = 64 CONSTANT c_tech_mac_10g_symbol_w : NATURAL := c_byte_w; -- = 8 bit diff --git a/libraries/technology/mac_10g/tech_mac_10g_stratixiv.vhd b/libraries/technology/mac_10g/tech_mac_10g_stratixiv.vhd index b087325a7b99301b00211c63ce21a1b48c67662d..ea4e4d48ddafed21483796416898fd91e7f3b8b0 100644 --- a/libraries/technology/mac_10g/tech_mac_10g_stratixiv.vhd +++ b/libraries/technology/mac_10g/tech_mac_10g_stratixiv.vhd @@ -33,28 +33,29 @@ USE technology_lib.technology_pkg.ALL; USE work.tech_mac_10g_component_pkg.ALL; ENTITY tech_mac_10g_stratixiv IS - PORT ( - -- MM - mm_clk : IN STD_LOGIC; - mm_rst : IN STD_LOGIC; - csr_mosi : IN t_mem_mosi; -- CSR = control status register - csr_miso : OUT t_mem_miso; + PORT ( + -- MM + mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + csr_mosi : IN t_mem_mosi; -- CSR = control status register + csr_miso : OUT t_mem_miso; -- ST - tx_clk : IN STD_LOGIC; - tx_rst : IN STD_LOGIC; - tx_snk_in : IN t_dp_sosi; - tx_snk_out : OUT t_dp_siso; - - rx_clk : IN STD_LOGIC; - rx_rst : IN STD_LOGIC; - rx_src_out : OUT t_dp_sosi; - rx_src_in : IN t_dp_siso; - + tx_clk : IN STD_LOGIC; + tx_rst : IN STD_LOGIC; + tx_snk_in : IN t_dp_sosi; + tx_snk_out : OUT t_dp_siso; + + rx_clk : IN STD_LOGIC; + rx_rst : IN STD_LOGIC; + rx_src_out : OUT t_dp_sosi; + rx_src_in : IN t_dp_siso; + -- XGMII - xgmii_tx_data : OUT STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit - xgmii_rx_data : IN STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0) -- 72 bit - ); + xgmii_link_status : OUT STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0); -- 2 bit + xgmii_tx_data : OUT STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0); -- 72 bit + xgmii_rx_data : IN STD_LOGIC_VECTOR(c_xgmii_w-1 DOWNTO 0) -- 72 bit + ); END tech_mac_10g_stratixiv; @@ -75,53 +76,53 @@ BEGIN tx_snk_out.xon <= '1'; u_ip_mac_10g : ip_stratixiv_mac_10g - PORT MAP ( - csr_clk_clk => mm_clk, - csr_reset_reset_n => mm_rst_n, - - csr_address => csr_mosi.address(c_mac_10g_csr_addr_w-1 DOWNTO 0), -- 13 bit - csr_read => csr_mosi.rd, - csr_write => csr_mosi.wr, - csr_writedata => csr_mosi.wrdata(c_word_w-1 DOWNTO 0), -- 32 bit - csr_readdata => csr_miso.rddata(c_word_w-1 DOWNTO 0), -- 32 bit - csr_waitrequest => csr_miso.waitrequest, - - tx_clk_clk => tx_clk, - tx_reset_reset_n => tx_rst_n, - - avalon_st_tx_ready => tx_snk_out.ready, - avalon_st_tx_startofpacket => tx_snk_in.sop, - avalon_st_tx_endofpacket => tx_snk_in.eop, - avalon_st_tx_valid => tx_snk_in.valid, - avalon_st_tx_data => tx_snk_in.data(c_xgmii_data_w-1 DOWNTO 0), -- 64 bit - avalon_st_tx_empty => tx_snk_in.empty(c_tech_mac_10g_empty_w-1 DOWNTO 0), -- 3 bit - avalon_st_tx_error => tx_snk_in.err(c_tech_mac_10g_tx_error_w-1 DOWNTO 0), -- 1 bit - avalon_st_pause_data => (OTHERS=>'0'), - - xgmii_tx_data => xgmii_tx_data, -- 72 bit - - avalon_st_txstatus_valid => OPEN, - avalon_st_txstatus_data => OPEN, - avalon_st_txstatus_error => OPEN, - - rx_clk_clk => rx_clk, - rx_reset_reset_n => rx_rst_n, - - xgmii_rx_data => xgmii_rx_data, -- 72 bit - - avalon_st_rx_ready => rx_src_in.ready, - avalon_st_rx_startofpacket => rx_src_out.sop, - avalon_st_rx_endofpacket => rx_src_out.eop, - avalon_st_rx_valid => rx_src_out.valid, - avalon_st_rx_data => rx_src_out.data(c_xgmii_data_w-1 DOWNTO 0), -- 64 bit - avalon_st_rx_empty => rx_src_out.empty(c_tech_mac_10g_empty_w-1 DOWNTO 0), -- 3 bit - avalon_st_rx_error => rx_src_out.err(c_tech_mac_10g_rx_error_w-1 DOWNTO 0), -- 6 bit - - avalon_st_rxstatus_valid => OPEN, - avalon_st_rxstatus_data => OPEN, - avalon_st_rxstatus_error => OPEN, - - link_fault_status_xgmii_rx_data => OPEN - ); + PORT MAP ( + csr_clk_clk => mm_clk, + csr_reset_reset_n => mm_rst_n, + + csr_address => csr_mosi.address(c_mac_10g_csr_addr_w-1 DOWNTO 0), -- 13 bit + csr_read => csr_mosi.rd, + csr_write => csr_mosi.wr, + csr_writedata => csr_mosi.wrdata(c_word_w-1 DOWNTO 0), -- 32 bit + csr_readdata => csr_miso.rddata(c_word_w-1 DOWNTO 0), -- 32 bit + csr_waitrequest => csr_miso.waitrequest, + + tx_clk_clk => tx_clk, + tx_reset_reset_n => tx_rst_n, + + avalon_st_tx_ready => tx_snk_out.ready, + avalon_st_tx_startofpacket => tx_snk_in.sop, + avalon_st_tx_endofpacket => tx_snk_in.eop, + avalon_st_tx_valid => tx_snk_in.valid, + avalon_st_tx_data => tx_snk_in.data(c_xgmii_data_w-1 DOWNTO 0), -- 64 bit + avalon_st_tx_empty => tx_snk_in.empty(c_tech_mac_10g_empty_w-1 DOWNTO 0), -- 3 bit + avalon_st_tx_error => tx_snk_in.err(c_tech_mac_10g_tx_error_w-1 DOWNTO 0), -- 1 bit + avalon_st_pause_data => (OTHERS=>'0'), + + xgmii_tx_data => xgmii_tx_data, -- 72 bit + + avalon_st_txstatus_valid => OPEN, + avalon_st_txstatus_data => OPEN, + avalon_st_txstatus_error => OPEN, + + rx_clk_clk => rx_clk, + rx_reset_reset_n => rx_rst_n, + + xgmii_rx_data => xgmii_rx_data, -- 72 bit + + avalon_st_rx_ready => rx_src_in.ready, + avalon_st_rx_startofpacket => rx_src_out.sop, + avalon_st_rx_endofpacket => rx_src_out.eop, + avalon_st_rx_valid => rx_src_out.valid, + avalon_st_rx_data => rx_src_out.data(c_xgmii_data_w-1 DOWNTO 0), -- 64 bit + avalon_st_rx_empty => rx_src_out.empty(c_tech_mac_10g_empty_w-1 DOWNTO 0), -- 3 bit + avalon_st_rx_error => rx_src_out.err(c_tech_mac_10g_rx_error_w-1 DOWNTO 0), -- 6 bit + + avalon_st_rxstatus_valid => OPEN, + avalon_st_rxstatus_data => OPEN, + avalon_st_rxstatus_error => OPEN, + + link_fault_status_xgmii_rx_data => xgmii_link_status -- 0=ok, 1=local fault, 2=remote fault + ); END str;