diff --git a/libraries/io/eth/tb/vhdl/tb_eth.vhd b/libraries/io/eth/tb/vhdl/tb_eth.vhd index 058afe95d11c089a72246f976554fdbf974cfd9e..e2079f1f5016e1e51ed6b99531ecd1bdad1c3218 100644 --- a/libraries/io/eth/tb/vhdl/tb_eth.vhd +++ b/libraries/io/eth/tb/vhdl/tb_eth.vhd @@ -20,6 +20,26 @@ -- ------------------------------------------------------------------------------- +-- Purpose: Testbench for eth +-- Description: +-- +-- The p_lcu_transmitter transmits packets and the p_eth_control loops them +-- back to p_lcu_receiver: +-- +-- ------- ------- +-- /---| |<---| |<--- p_lcu_transmitter +-- p_eth_control | | DUT | | LCU | +-- \-->|(ETH)|--->|(TSE)|---> p_lcu_receiver +-- ------- ------- +-- +-- The tb is self checking based on: +-- . proc_tse_rx_packet() for expected header and data type +-- . tx_pkt_cnt=rx_pkt_cnt > 0 must be true at the tb_end. +-- Usage: +-- > as 10 +-- > run -all + + LIBRARY IEEE, common_lib, dp_lib, tech_tse_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; @@ -48,9 +68,6 @@ END tb_eth; ARCHITECTURE tb OF tb_eth IS - -- as 10 - -- run 100 us - CONSTANT sys_clk_period : TIME := 10 ns; -- 100 MHz CONSTANT eth_clk_period : TIME := 8 ns; -- 125 MHz CONSTANT cable_delay : TIME := 12 ns; @@ -186,6 +203,7 @@ ARCHITECTURE tb OF tb_eth IS CONSTANT c_dut_control_tx_en : NATURAL := 2**c_eth_mm_reg_control_bi.tx_en; -- Clocks and reset + SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL eth_clk : STD_LOGIC := '0'; -- tse reference clock SIGNAL sys_clk : STD_LOGIC := '0'; -- system clock SIGNAL st_clk : STD_LOGIC; -- stream clock @@ -238,6 +256,10 @@ ARCHITECTURE tb OF tb_eth IS SIGNAL lcu_rxp : STD_LOGIC; SIGNAL lcu_led : t_tse_led; + -- Verification + SIGNAL tx_pkt_cnt : NATURAL := 0; + SIGNAL rx_pkt_cnt : NATURAL := 0; + BEGIN -- run 50 us @@ -427,6 +449,8 @@ BEGIN -- proc_tse_tx_packet(tx_total_header, 104, g_data_type, c_tx_ready_latency, c_nof_tx_not_valid, st_clk, lcu_tx_en, lcu_tx_siso, lcu_tx_sosi); -- proc_tse_tx_packet(tx_total_header, 105, g_data_type, c_tx_ready_latency, c_nof_tx_not_valid, st_clk, lcu_tx_en, lcu_tx_siso, lcu_tx_sosi); + FOR I IN 0 TO 1500 * 5 LOOP WAIT UNTIL rising_edge(st_clk); END LOOP; + tb_end <= '1'; WAIT; END PROCESS; @@ -493,7 +517,7 @@ BEGIN tse_led => eth_led ); - lcu : ENTITY work.tse + lcu : ENTITY tech_tse_lib.tech_tse PORT MAP ( -- Clocks and reset mm_rst => mm_rst, @@ -528,4 +552,26 @@ BEGIN tse_led => lcu_led ); + -- Verification + tx_pkt_cnt <= tx_pkt_cnt + 1 WHEN lcu_tx_sosi.sop='1' AND rising_edge(st_clk); + rx_pkt_cnt <= rx_pkt_cnt + 1 WHEN lcu_rx_sosi.eop='1' AND rising_edge(st_clk); + + p_tb_end : PROCESS + BEGIN + WAIT UNTIL tb_end='1'; + + -- Verify that all transmitted packets have been received + IF tx_pkt_cnt=0 THEN + REPORT "No packets were transmitted." SEVERITY ERROR; + ELSIF rx_pkt_cnt=0 THEN + REPORT "No packets were received." SEVERITY ERROR; + ELSIF tx_pkt_cnt/=rx_pkt_cnt THEN + REPORT "Not all transmitted packets were received." SEVERITY ERROR; + END IF; + + -- Stop the simulation + ASSERT FALSE REPORT "Simulation finished." SEVERITY FAILURE; + WAIT; + END PROCESS; + END tb;