diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd index b7cef66bc6aeb54f78cf96ea4f055e047e1340cd..0031f7d1593008eadc92c9a16e8f6236321d4b56 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd @@ -62,6 +62,7 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS CONSTANT c_cross_clock_domain_latency : NATURAL := 20; + -- In this tb simply use fixed src addresses CONSTANT c_eth_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0) := x"123456789ABC"; CONSTANT c_ip_src_addr : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0) := x"0A090807"; CONSTANT c_udp_src_port : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0) := x"D001"; @@ -69,11 +70,6 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS -- Used mm_adresses on mm bus "enable_mosi/miso". CONSTANT c_reg_enable_mm_addr_enable : NATURAL := 0; - -- Used mm_adresses on mm bus "hdr_dat_mosi/miso". - CONSTANT c_hdr_dat_mm_addr_eth_src_mac : NATURAL := 1; - CONSTANT c_hdr_dat_mm_addr_ip_src_addr : NATURAL := 13; - CONSTANT c_hdr_dat_mm_addr_udp_src_port : NATURAL := 15; - -- header fields CONSTANT c_nof_statistics_per_packet : NATURAL := func_sdp_get_stat_nof_statistics_per_packet(g_statistics_type); CONSTANT c_udp_total_length : NATURAL := func_sdp_get_stat_udp_total_length(g_statistics_type); @@ -95,6 +91,7 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS CONSTANT c_ram_buf : t_c_mem := (1, c_ram_w, 32, 2**c_ram_w, 'X'); -- Define block timing. + CONSTANT c_bsn_init : NATURAL := 0; CONSTANT c_nof_block_per_sync : NATURAL := 80; -- Sufficient to fit more than c_nof_packets offload packets per sync interval. CONSTANT c_nof_clk_per_block : NATURAL := c_nof_data * c_data_size; CONSTANT c_nof_valid_per_block : NATURAL := c_nof_data * c_data_size; @@ -122,16 +119,18 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS SIGNAL offload_rx_hdr_dat_miso : t_mem_miso; SIGNAL in_sosi : t_dp_sosi := c_dp_sosi_rst; + + SIGNAL offload_data : STD_LOGIC_VECTOR(31 DOWNTO 0); SIGNAL offload_sosi : t_dp_sosi; SIGNAL offload_siso : t_dp_siso := c_dp_siso_rst; SIGNAL test_offload_sosi : t_dp_sosi := c_dp_sosi_rst; - SIGNAL test_offload_siso : t_dp_siso; SIGNAL rx_hdr_fields_out : STD_LOGIC_VECTOR(1023 DOWNTO 0); SIGNAL rx_hdr_fields_raw : STD_LOGIC_VECTOR(1023 DOWNTO 0) := (OTHERS => '0'); SIGNAL rx_sdp_stat_header : t_sdp_stat_header; SIGNAL exp_sdp_stat_header : t_sdp_stat_header; + SIGNAL exp_bsn : STD_LOGIC_VECTOR(63 DOWNTO 0); -- Signals used to change settings of sdp_info. SIGNAL gn_index : NATURAL := 1; -- select > 0 to see effect of g_offload_time @@ -159,9 +158,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS SIGNAL ram_wr_en : STD_LOGIC; SIGNAL init_ram_done : STD_LOGIC := '0'; + SIGNAL in_sync_cnt : NATURAL := 0; SIGNAL in_sync_hold : STD_LOGIC := '0'; - SIGNAL rx_prev_bsn : NATURAL := 0; - SIGNAL rx_bsn : NATURAL := 0; SIGNAL rx_block_cnt : NATURAL := 0; SIGNAL rx_valid_clk_cnt : NATURAL := 0; @@ -202,16 +200,11 @@ BEGIN WAIT; END PROCESS; - -- Module dp_offload_tx_v3.vhd can handle 32 data that is not aligned, dp_offload_rx can not. - -- This is the reason the first 16bit of the header are always zero. - -- This process will start counting with bit16 high, the first bit that wil be received, - -- on each dp_clk the bsn is incremented with 0x10000, if you look at b63..b16 it looks like normal counting. - -- If dp_offload_rx.vhd is fixed this can be set normal again. p_in_sosi : PROCESS BEGIN proc_common_wait_until_low(dp_clk, dp_rst); proc_common_wait_some_cycles(dp_clk, 12); - in_sosi.bsn <= TO_DP_BSN(16#10000#); + in_sosi.bsn <= TO_DP_BSN(c_bsn_init); in_sosi.valid <= '1'; WHILE TRUE LOOP FOR i IN 0 TO c_nof_block_per_sync-1 LOOP @@ -224,7 +217,7 @@ BEGIN END IF; IF j = 0 THEN in_sosi.sop <= '1'; - in_sosi.bsn <= INCR_UVEC(in_sosi.bsn, 16#10000#); -- = 2**16 = 65536 + in_sosi.bsn <= INCR_UVEC(in_sosi.bsn, 1); END IF; IF j = c_nof_clk_per_block-1 THEN in_sosi.eop <= '1'; @@ -236,7 +229,7 @@ BEGIN WAIT; END PROCESS; - p_exp_sdp_stat_header : PROCESS(sdp_info, subband_calibrated_flag, gn_index, rx_block_cnt) + p_exp_sdp_stat_header : PROCESS(sdp_info, subband_calibrated_flag, gn_index, rx_block_cnt, exp_bsn) BEGIN -- eth header exp_sdp_stat_header.eth.dst_mac <= c_sdp_stat_eth_dst_mac; @@ -298,7 +291,7 @@ BEGIN exp_sdp_stat_header.app.sdp_nof_statistics_per_packet <= TO_UVEC(c_nof_statistics_per_packet, 16); exp_sdp_stat_header.app.sdp_block_period <= sdp_info.block_period; - exp_sdp_stat_header.app.dp_bsn <= TO_SVEC(-1, 64); + exp_sdp_stat_header.app.dp_bsn <= exp_bsn; END PROCESS; rx_sdp_stat_header <= func_sdp_extract_stat_header(rx_hdr_fields_raw); @@ -309,7 +302,7 @@ BEGIN IF test_offload_sosi.eop = '1' THEN -- bsn is not fully received (bit 0-15 is missing) because 32 bit allignment not working in dp_offload_rx.vhd. - v_bool := func_sdp_verify_stat_header(g_statistics_type, rx_sdp_stat_header, exp_sdp_stat_header, sdp_info, rx_bsn); + v_bool := func_sdp_verify_stat_header(g_statistics_type, rx_sdp_stat_header, exp_sdp_stat_header, sdp_info); END IF; END PROCESS; @@ -334,10 +327,16 @@ BEGIN END IF; END PROCESS; - -- Capture rx_bsn from header. - rx_bsn <= TO_UINT(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "dp_bsn")+16)); - -- Keep rx_bsn from previous header. - rx_prev_bsn <= rx_bsn WHEN rising_edge(dp_clk); + -- Count number of sync intervals, to determine expected statistics bsn + p_rx_sync_cnt : PROCESS(dp_clk) + BEGIN + IF rising_edge(dp_clk) THEN + IF in_sosi.sync = '1' THEN + in_sync_cnt <= in_sync_cnt + 1; + END IF; + END IF; + END PROCESS; + exp_bsn <= TO_SVEC(c_bsn_init + 1 + (in_sync_cnt - 1) * c_nof_block_per_sync, 64); -- Verify number of blocks between 2 syncs and between 2 changed bsn numbers. p_verify_nof_blocks : PROCESS(dp_clk) @@ -349,13 +348,7 @@ BEGIN ASSERT rx_block_cnt = c_nof_packets-1 REPORT "wrong number of blocks between 2 sync" SEVERITY ERROR; END IF; - -- rx_prev_bsn > 0 is needed for the first time, when there is no previous BSN. - -- rx_bsn > rx_prev_bsn is needed to detect a new rx_bsn. - IF rx_prev_bsn > 0 AND rx_bsn > rx_prev_bsn THEN - ASSERT (rx_bsn - rx_prev_bsn) = c_nof_block_per_sync REPORT "wrong number of blocks between 2 bsn numbers" SEVERITY ERROR; - END IF; END IF; - test_offload_siso <= c_dp_siso_rdy; END IF; END PROCESS; @@ -423,7 +416,6 @@ BEGIN snk_out_arr(0) => offload_siso, src_out_arr(0) => test_offload_sosi, - src_in_arr(0) => test_offload_siso, hdr_fields_out_arr(0) => rx_hdr_fields_out, hdr_fields_raw_arr(0) => rx_hdr_fields_raw @@ -466,4 +458,7 @@ BEGIN ip_src_addr => c_ip_src_addr ); + -- To view the 32 bit 1GbE offload data more easily in the Wave window + offload_data <= offload_sosi.data(31 DOWNTO 0); + END tb;