diff --git a/libraries/io/tr_10GbE/tb/vhdl/tb_tr_10GbE.vhd b/libraries/io/tr_10GbE/tb/vhdl/tb_tr_10GbE.vhd index dec7fe15d9b3404c18595f8c0f9f8693b476937a..87578e00b2b3d4d0867ef2ce80cc299300c98f23 100644 --- a/libraries/io/tr_10GbE/tb/vhdl/tb_tr_10GbE.vhd +++ b/libraries/io/tr_10GbE/tb/vhdl/tb_tr_10GbE.vhd @@ -72,7 +72,7 @@ ARCHITECTURE tb OF tb_tr_10GbE IS CONSTANT dp_clk_period : TIME := 5 ns; -- 200 MHz CONSTANT cal_clk_period : TIME := 25 ns; -- 40 MHz CONSTANT clk_156_period : TIME := 6.4 ns; -- 156.25 MHz - CONSTANT phy_delay : TIME := sel_a_b(g_sim_level>0, clk_156_period*1, 1 ns); -- the sim_xaui only works without unit PHY delays + CONSTANT phy_delay : TIME := sel_a_b(g_sim_level>0, 0 ns, 1 ns); -- the sim_xaui and sim_10gbase_r only work with zero or tr_clk delays CONSTANT c_nof_channels : NATURAL := 1; CONSTANT c_rl : NATURAL := 1; @@ -97,18 +97,15 @@ ARCHITECTURE tb OF tb_tr_10GbE IS -- Clocks and reset SIGNAL rx_end : STD_LOGIC := '0'; + SIGNAL clk_644 : STD_LOGIC := '1'; -- 644.53125 MHz + SIGNAL clk_312 : STD_LOGIC := '1'; -- 312.5 MHz + SIGNAL clk_156 : STD_LOGIC := '1'; -- 156.25 MHz + SIGNAL rst_156 : STD_LOGIC; -- reset synchronous with clk_156 SIGNAL cal_clk : STD_LOGIC := '1'; -- calibration clock SIGNAL mm_clk : STD_LOGIC := '1'; -- memory-mapped bus clock SIGNAL mm_rst : STD_LOGIC; -- reset synchronous with mm_clk SIGNAL dp_clk : STD_LOGIC := '1'; -- data path clock SIGNAL dp_rst : STD_LOGIC; -- reset synchronous with dp_clk - SIGNAL clk_644 : STD_LOGIC := '1'; -- 644.53125 MHz - SIGNAL clk_156 : STD_LOGIC := '1'; -- 156.25 MHz - SIGNAL rst_156 : STD_LOGIC; -- reset synchronous with clk_156 - SIGNAL tx_clk : STD_LOGIC; - SIGNAL tx_rst : STD_LOGIC; -- reset synchronous with tx_clk - SIGNAL rx_clk : STD_LOGIC; - SIGNAL rx_rst : STD_LOGIC; -- reset synchronous with rx_clk -- MAC 10G control interface SIGNAL mm_init : STD_LOGIC := '1'; @@ -135,12 +132,12 @@ ARCHITECTURE tb OF tb_tr_10GbE IS SIGNAL rx_sosi_data : STD_LOGIC_VECTOR(c_tech_mac_10g_data_w-1 DOWNTO 0); -- 64 bit -- PHY XAUI serial I/O - SIGNAL xaui_tx_out_arr : t_xaui_arr(c_nof_channels-1 DOWNTO 0); - SIGNAL xaui_rx_in_arr : t_xaui_arr(c_nof_channels-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); + SIGNAL xaui_tx_arr : t_xaui_arr(c_nof_channels-1 DOWNTO 0); + SIGNAL xaui_rx_arr : t_xaui_arr(c_nof_channels-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); -- PHY 10GBASE-R serial IO - SIGNAL serial_tx_out_arr : STD_LOGIC_VECTOR(c_nof_channels-1 downto 0); - SIGNAL serial_rx_in_arr : STD_LOGIC_VECTOR(c_nof_channels-1 downto 0) := (OTHERS=>'0'); + SIGNAL serial_tx_arr : STD_LOGIC_VECTOR(c_nof_channels-1 downto 0); + SIGNAL serial_rx_arr : STD_LOGIC_VECTOR(c_nof_channels-1 downto 0) := (OTHERS=>'0'); -- Verification SIGNAL expected_sosi_arr : t_dp_sosi_arr(0 TO c_nof_pkt-1); @@ -160,8 +157,6 @@ BEGIN mm_rst <= '1', '0' AFTER mm_clk_period*10; dp_rst <= '1', '0' AFTER dp_clk_period*10; rst_156 <= '1', '0' AFTER clk_156_period*4; - tx_rst <= '1', '0' AFTER clk_156_period*10; - rx_rst <= '1', '0' AFTER clk_156_period*10; -- debug signals to ease monitoring in wave window tx_sosi_data <= tx_sosi.data(c_tech_mac_10g_data_w-1 DOWNTO 0); @@ -198,9 +193,9 @@ BEGIN tx_sosi <= c_dp_sosi_rst; WHILE mm_init/='0' LOOP - WAIT UNTIL rising_edge(tx_clk); + WAIT UNTIL rising_edge(dp_clk); END LOOP; - proc_common_wait_some_cycles(tx_clk, 10); + proc_common_wait_some_cycles(dp_clk, 10); -- Loopback txp->rxp so use promiscuous mode or use DST_MAC = c_src_mac to send to itself @@ -210,12 +205,12 @@ BEGIN -- . For I>46 the payload length is I and empty = 4 - (I mod 4) FOR I IN 0 TO c_nof_pkt-1 LOOP - proc_tech_mac_10g_tx_packet(total_header, c_pkt_length_arr(I), g_data_type, c_rl, c_nof_tx_not_valid, tx_clk, tx_en, tx_siso, tx_sosi); - proc_common_wait_some_cycles(tx_clk, 0); + proc_tech_mac_10g_tx_packet(total_header, c_pkt_length_arr(I), g_data_type, c_rl, c_nof_tx_not_valid, dp_clk, tx_en, tx_siso, tx_sosi); + proc_common_wait_some_cycles(dp_clk, 0); END LOOP; - proc_common_wait_some_cycles(tx_clk, c_pkt_length_arr(c_nof_pkt-1)/c_tech_mac_10g_symbols_per_beat); - proc_common_wait_some_cycles(tx_clk, 100); + proc_common_wait_some_cycles(dp_clk, c_pkt_length_arr(c_nof_pkt-1)/c_tech_mac_10g_symbols_per_beat); + proc_common_wait_some_cycles(dp_clk, 100); rx_end <= '1'; WAIT; END PROCESS; @@ -227,12 +222,12 @@ BEGIN rx_siso <= c_dp_siso_hold; WHILE mm_init/='0' LOOP - WAIT UNTIL rising_edge(rx_clk); + WAIT UNTIL rising_edge(dp_clk); END LOOP; -- Receive forever WHILE TRUE LOOP - proc_tech_mac_10g_rx_packet(total_header, g_data_type, rx_clk, rx_sosi, rx_siso); + proc_tech_mac_10g_rx_packet(total_header, g_data_type, dp_clk, rx_sosi, rx_siso); rx_toggle <= NOT rx_toggle; END LOOP; @@ -240,10 +235,10 @@ BEGIN END PROCESS; - p_ff_store_tx_sosi_at_eop : PROCESS(tx_clk) + p_ff_store_tx_sosi_at_eop : PROCESS(dp_clk) VARIABLE vI : NATURAL := 0; BEGIN - IF rising_edge(tx_clk) THEN + IF rising_edge(dp_clk) THEN IF tx_sosi.eop='1' THEN expected_sosi_arr(vI) <= tx_sosi; vI := vI +1; @@ -251,11 +246,11 @@ BEGIN END IF; END PROCESS; - p_ff_verify_rx_sosi_at_eop : PROCESS(rx_clk) + p_ff_verify_rx_sosi_at_eop : PROCESS(dp_clk) VARIABLE vI : NATURAL := 0; VARIABLE vLow : NATURAL := 0; BEGIN - IF rising_edge(rx_clk) THEN + IF rising_edge(dp_clk) THEN rx_sosi_reg <= rx_sosi; -- use rx_sosi_reg for verification at eop to account for once cycle latency in expected_sosi_arr() IF rx_sosi_reg.eop='1' THEN IF g_no_dut=FALSE THEN @@ -279,17 +274,11 @@ BEGIN END PROCESS; no_dut : IF g_no_dut=TRUE GENERATE - tx_clk <= clk_156; - rx_clk <= clk_156; - rx_sosi <= tx_sosi; tx_siso <= rx_siso; END GENERATE; gen_dut : IF g_no_dut=FALSE GENERATE - tx_clk <= dp_clk; - rx_clk <= dp_clk; - tx_siso <= tx_siso_arr(0); tx_sosi_arr(0) <= tx_sosi; @@ -308,9 +297,13 @@ BEGIN g_word_alignment_padding => TRUE ) PORT MAP ( - tr_clk_156 => clk_156, - tr_rst_156 => rst_156, - + -- Transceiver PLL reference clock + tr_ref_clk_644 => clk_644, -- 644.531250 MHz for 10GBASE-R + tr_ref_clk_312 => clk_312, -- 312.5 MHz for 10GBASE-R + tr_ref_clk_156 => clk_156, -- 156.25 MHz for 10GBASE-R or for XAUI + tr_ref_rst_156 => rst_156, -- for 10GBASE-R or for XAUI + + -- Calibration & reconfig clock cal_rec_clk => cal_clk, -- MM interface @@ -327,8 +320,8 @@ BEGIN mdio_miso_arr => OPEN, -- DP interface - dp_rst => tx_rst, - dp_clk => tx_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, snk_out_arr => tx_siso_arr, snk_in_arr => tx_sosi_arr, @@ -337,12 +330,12 @@ BEGIN src_out_arr => rx_sosi_arr, -- Serial XAUI interface - xaui_tx_out_arr => xaui_tx_out_arr, - xaui_rx_in_arr => xaui_rx_in_arr, + xaui_tx_arr => xaui_tx_arr, + xaui_rx_arr => xaui_rx_arr, -- Serial IO - serial_tx_out_arr => serial_tx_out_arr, - serial_rx_in_arr => serial_rx_in_arr, + serial_tx_arr => serial_tx_arr, + serial_rx_arr => serial_rx_arr, -- MDIO interface mdio_rst => OPEN, @@ -353,12 +346,12 @@ BEGIN END GENERATE; -- Loopback PHY - xaui_rx_in_arr <= TRANSPORT xaui_tx_out_arr AFTER phy_delay; -- XAUI - serial_rx_in_arr <= TRANSPORT serial_tx_out_arr AFTER phy_delay; -- 10GBASE-R + xaui_rx_arr <= TRANSPORT xaui_tx_arr AFTER phy_delay; -- XAUI + serial_rx_arr <= TRANSPORT serial_tx_arr AFTER phy_delay; -- 10GBASE-R -- Verification - tx_pkt_cnt <= tx_pkt_cnt + 1 WHEN tx_sosi.sop='1' AND rising_edge(tx_clk); - rx_pkt_cnt <= rx_pkt_cnt + 1 WHEN rx_sosi.eop='1' AND rising_edge(rx_clk); + tx_pkt_cnt <= tx_pkt_cnt + 1 WHEN tx_sosi.sop='1' AND rising_edge(dp_clk); + rx_pkt_cnt <= rx_pkt_cnt + 1 WHEN rx_sosi.eop='1' AND rising_edge(dp_clk); p_tb_end : PROCESS BEGIN