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 4de55d25959335102e7ca10392fc9daf5ea01253..751119c7d17c5a81dc1d7a0544e5f43001d2cf3c 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 @@ -55,8 +55,8 @@ ENTITY tb_sdp_statistics_offload IS END tb_sdp_statistics_offload; ARCHITECTURE tb OF tb_sdp_statistics_offload IS - CONSTANT c_dp_clk_period : TIME := 5 ns; -- 200 MHz - CONSTANT c_mm_clk_period : TIME := 20 ns; -- 50 MHz + CONSTANT c_dp_clk_period : TIME := 5 ns; -- 200 MHz + CONSTANT c_mm_clk_period : TIME := 20 ns; -- 50 MHz CONSTANT c_cross_clock_domain_latency : NATURAL := 20; @@ -64,29 +64,30 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS 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"; - -- used mm_adresses on mm bus "enable_mosi/miso" + -- 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" + + -- 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; - -- Define SST RAM structure + -- Define SST RAM structure. CONSTANT c_nof_data : NATURAL := 512; CONSTANT c_data_size : NATURAL := 2; CONSTANT c_step_size : NATURAL := 4; - -- Define SST RAM size for g_nof_signal_inputs_per_pn + -- Define SST RAM size for g_nof_signal_inputs_per_pn. CONSTANT c_ram_size : NATURAL := c_nof_data * c_data_size * g_nof_signal_inputs_per_pn; CONSTANT c_ram_w : NATURAL := ceil_log2(c_ram_size); --CONSTANT c_ram_buf : t_c_mem := (c_mem_ram_rd_latency, c_ram_w, 32, 2**c_ram_w, 'X'); CONSTANT c_ram_buf : t_c_mem := (1, c_ram_w, 32, 2**c_ram_w, 'X'); - -- Define block timing - CONSTANT c_nof_block_per_sync : NATURAL := 20; -- sufficient to fit more than g_nof_signal_inputs_per_pn offload packets per sync interval - CONSTANT c_nof_clk_per_block : NATURAL := c_nof_data * c_data_size; + -- Define block timing. + CONSTANT c_nof_block_per_sync : NATURAL := 20; -- Sufficient to fit more than g_nof_signal_inputs_per_pn offload packets per sync interval. + CONSTANT c_nof_clk_per_block : NATURAL := c_nof_data * c_data_size; - -- based on g_statistics_type: 'S'=0x53="SST", 'B'=0x42="BST", 'X'=0x58="XST" + -- Based on g_statistics_type: 'S'=0x53="SST", 'B'=0x42="BST", 'X'=0x58="XST". CONSTANT c_marker : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_marker_bst, sel_a_b(g_statistics_type="XST", c_sdp_marker_xst, c_sdp_marker_sst)); -- SST @@ -100,20 +101,19 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS c_sdp_N_sub)); -- SST CONSTANT c_nof_valid_per_block : NATURAL := c_nof_data * c_data_size; + CONSTANT c_nof_sync : NATURAL := 5; + CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync * c_nof_clk_per_block; - CONSTANT c_nof_sync : NATURAL := 5; - CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync * c_nof_clk_per_block; - - SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL tb_end : STD_LOGIC := '0'; - SIGNAL dp_clk : STD_LOGIC := '1'; -- digital data path clock = 200 MHz (deser factor 4); - SIGNAL dp_rst : STD_LOGIC; + SIGNAL dp_clk : STD_LOGIC := '1'; -- Digital data path clock = 200 MHz (deser factor 4); + SIGNAL dp_rst : STD_LOGIC; - SIGNAL mm_clk : STD_LOGIC := '1'; -- MM control clock = 50 MHz - SIGNAL mm_rst : STD_LOGIC; + SIGNAL mm_clk : STD_LOGIC := '1'; -- MM control clock = 50 MHz + SIGNAL mm_rst : STD_LOGIC; - SIGNAL master_mosi : t_mem_mosi := c_mem_mosi_rst; - SIGNAL master_miso : t_mem_miso; + SIGNAL master_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL master_miso : t_mem_miso; SIGNAL enable_mosi : t_mem_mosi := c_mem_mosi_rst; SIGNAL enable_miso : t_mem_miso; @@ -134,7 +134,7 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS SIGNAL rx_hdr_fields_out : STD_LOGIC_VECTOR(1023 DOWNTO 0); SIGNAL rx_hdr_fields_raw : STD_LOGIC_VECTOR(1023 DOWNTO 0) := (OTHERS => '0'); - -- signals used to change settings of sdp_info + -- Signals used to change settings of sdp_info. SIGNAL gn_index : NATURAL := 1; -- select > 0 to see effect of g_offload_time SIGNAL sdp_info : t_sdp_info := ( @@ -154,16 +154,15 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS x"0000" -- beamlet_scale ); - -- signals used for starting processes + -- Signals used for starting processes. SIGNAL ram_wr_data : STD_LOGIC_VECTOR(c_ram_buf.dat_w-1 DOWNTO 0); SIGNAL ram_wr_addr : STD_LOGIC_VECTOR(c_ram_buf.adr_w-1 DOWNTO 0); SIGNAL ram_wr_en : STD_LOGIC; SIGNAL init_ram_done : STD_LOGIC := '0'; - SIGNAL rx_request : STD_LOGIC := '0'; + SIGNAL in_sync_hold : STD_LOGIC := '0'; SIGNAL rx_prev_bsn : NATURAL := 0; SIGNAL rx_bsn : NATURAL := 0; - SIGNAL rx_data_id : NATURAL := 0; SIGNAL rx_block_cnt : NATURAL := 0; SIGNAL rx_valid_clk_cnt : NATURAL := 0; @@ -174,11 +173,11 @@ BEGIN mm_rst <= '1', '0' AFTER c_mm_clk_period*7; mm_clk <= (NOT mm_clk) OR tb_end AFTER c_mm_clk_period/2; - -- fill ram with data, data is same as address number. + -- Fill ram with data, data is same as address number. p_mm_statistics_ram : PROCESS BEGIN ram_wr_en <= '0'; - -- initialyze + -- Initialyze proc_common_wait_until_low(mm_clk, mm_rst); proc_common_wait_some_cycles(mm_clk, 10); @@ -198,7 +197,7 @@ BEGIN p_enable_trigger : PROCESS BEGIN proc_common_wait_until_high(mm_clk, init_ram_done); - -- enable common variabel delay + -- Enable common variabel delay. proc_mem_mm_bus_wr(c_reg_enable_mm_addr_enable, 1, mm_clk, enable_miso, enable_mosi); proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); WAIT; @@ -238,105 +237,110 @@ BEGIN WAIT; END PROCESS; - p_verify_header : PROCESS + p_verify_header : PROCESS(test_offload_sosi) BEGIN - proc_common_wait_until_high(mm_clk, init_ram_done); - proc_common_wait_until_high(mm_clk, test_offload_sosi.sop); - -- bsn is not fully received (bit 0-15 is missing) because 32 bit allignment not working in dp_offload_rx.vhd. - -- check fixed settings - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_dst_mac") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_dst_mac")) = x"00074306C700" - REPORT "wrong eth_dst_mac" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_type") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_type")) = x"0800" - REPORT "wrong eth_type" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_version") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_version")) = TO_UVEC(4, 4) - REPORT "wrong ip_version" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_header_length") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_header_length")) = TO_UVEC(5, 4) - REPORT "wrong ip_header_length" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_services") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_services")) = TO_UVEC(0, 8) - REPORT "wrong ip_services" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_total_length") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_total_length")) = TO_UVEC(7868, 16) - REPORT "wrong ip_total_length" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_identification") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_identification")) = TO_UVEC(0, 16) - REPORT "wrong ip_identification" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_flags") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_flags")) = TO_UVEC(2, 3) - REPORT "wrong ip_flags" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_fragment_offset") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_fragment_offset")) = TO_UVEC(0, 13) - REPORT "wrong ip_fragment_offset" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_time_to_live") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_time_to_live")) = TO_UVEC(127, 8) - REPORT "wrong ip_time_to_live" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_protocol") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_protocol")) = TO_UVEC(17, 8) - REPORT "wrong ip_protocol" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_dst_addr") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_dst_addr")) = x"C0A80001" - REPORT "wrong ip_dst_addr" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_dst_port") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_dst_port")) = TO_UVEC(0, 16) - REPORT "wrong udp_dst_port" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_total_length") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_total_length")) = TO_UVEC(7848, 16) - REPORT "wrong udp_total_length" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_version_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_version_id")) = TO_UVEC(5, 8) - REPORT "wrong sdp_version_id" SEVERITY ERROR; - - -- check settings set by mm interface in this test bench - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_src_mac") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_src_mac")) = c_eth_src_mac - REPORT "wrong eth_src_mac" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_src_addr") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_src_addr")) = c_ip_src_addr - REPORT "wrong ip_src_addr" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_src_port")) = c_udp_src_port - REPORT "wrong udp_src_port" SEVERITY ERROR; - - -- check g_statistics_type settings set by sdp_statistics_offload.vhd - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_marker") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_marker")) = TO_UVEC(c_marker, 8) - REPORT "wrong sdp_marker" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs")) = TO_UVEC(c_nof_signal_inputs, 8) - REPORT "wrong sdp_nof_signal_inputs" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet")) = TO_UVEC(c_nof_statistics_per_packet, 16) - REPORT "wrong sdp_nof_statistics_per_packet: " SEVERITY ERROR; - - -- check some values from sdp_source_info - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_observation_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_observation_id")) = sdp_info.observation_id - REPORT "wrong sdp_observation_id" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_station_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_station_id")) = sdp_info.station_id - REPORT "wrong sdp_station_id" SEVERITY ERROR; - ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_antenna_band_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_antenna_band_id"))) = sdp_info.antenna_band_index - REPORT "wrong sdp_source_info_antenna_band_id" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_nyquist_zone_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_nyquist_zone_id")) = sdp_info.nyquist_zone_index - REPORT "wrong sdp_source_info_nyquist_zone_id" SEVERITY ERROR; - ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_f_adc") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_f_adc"))) = sdp_info.f_adc - REPORT "wrong sdp_source_info_f_adc" SEVERITY ERROR; - ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_fsub_type") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_fsub_type"))) = sdp_info.fsub_type - REPORT "wrong sdp_source_info_fsub_type" SEVERITY ERROR; - ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_beam_repositioning_flag") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_beam_repositioning_flag"))) = sdp_info.beam_repositioning_flag - REPORT "wrong sdp_source_info_beam_repositioning_flag" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_gn_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_gn_id")) = TO_UVEC(gn_index, 5) - REPORT "wrong sdp_source_info_gn_id" SEVERITY ERROR; - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_block_period") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_block_period")) = sdp_info.block_period - REPORT "wrong sdp_block_period" SEVERITY ERROR; - WAIT; + 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. + -- Check fixed settings. + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_dst_mac") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_dst_mac")) = x"00074306C700" + REPORT "wrong eth_dst_mac" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_type") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_type")) = x"0800" + REPORT "wrong eth_type" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_version") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_version")) = TO_UVEC(4, 4) + REPORT "wrong ip_version" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_header_length") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_header_length")) = TO_UVEC(5, 4) + REPORT "wrong ip_header_length" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_services") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_services")) = TO_UVEC(0, 8) + REPORT "wrong ip_services" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_total_length") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_total_length")) = TO_UVEC(7868, 16) + REPORT "wrong ip_total_length" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_identification") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_identification")) = TO_UVEC(0, 16) + REPORT "wrong ip_identification" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_flags") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_flags")) = TO_UVEC(2, 3) + REPORT "wrong ip_flags" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_fragment_offset") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_fragment_offset")) = TO_UVEC(0, 13) + REPORT "wrong ip_fragment_offset" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_time_to_live") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_time_to_live")) = TO_UVEC(127, 8) + REPORT "wrong ip_time_to_live" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_protocol") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_protocol")) = TO_UVEC(17, 8) + REPORT "wrong ip_protocol" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_dst_addr") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_dst_addr")) = x"C0A80001" + REPORT "wrong ip_dst_addr" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_dst_port") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_dst_port")) = TO_UVEC(0, 16) + REPORT "wrong udp_dst_port" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_total_length") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_total_length")) = TO_UVEC(7848, 16) + REPORT "wrong udp_total_length" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_version_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_version_id")) = TO_UVEC(5, 8) + REPORT "wrong sdp_version_id" SEVERITY ERROR; + + -- Check settings set by mm interface in this test bench. + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_src_mac") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_src_mac")) = c_eth_src_mac + REPORT "wrong eth_src_mac" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_src_addr") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_src_addr")) = c_ip_src_addr + REPORT "wrong ip_src_addr" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_src_port")) = c_udp_src_port + REPORT "wrong udp_src_port" SEVERITY ERROR; + + -- Check g_statistics_type settings set by sdp_statistics_offload.vhd. + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_marker") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_marker")) = TO_UVEC(c_marker, 8) + REPORT "wrong sdp_marker" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs")) = TO_UVEC(c_nof_signal_inputs, 8) + REPORT "wrong sdp_nof_signal_inputs" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet")) = TO_UVEC(c_nof_statistics_per_packet, 16) + REPORT "wrong sdp_nof_statistics_per_packet: " SEVERITY ERROR; + + -- Check some values from sdp_source_info. + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_observation_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_observation_id")) = sdp_info.observation_id + REPORT "wrong sdp_observation_id" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_station_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_station_id")) = sdp_info.station_id + REPORT "wrong sdp_station_id" SEVERITY ERROR; + ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_antenna_band_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_antenna_band_id"))) = sdp_info.antenna_band_index + REPORT "wrong sdp_source_info_antenna_band_id" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_nyquist_zone_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_nyquist_zone_id")) = sdp_info.nyquist_zone_index + REPORT "wrong sdp_source_info_nyquist_zone_id" SEVERITY ERROR; + ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_f_adc") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_f_adc"))) = sdp_info.f_adc + REPORT "wrong sdp_source_info_f_adc" SEVERITY ERROR; + ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_fsub_type") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_fsub_type"))) = sdp_info.fsub_type + REPORT "wrong sdp_source_info_fsub_type" SEVERITY ERROR; + ASSERT SL(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_beam_repositioning_flag") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_beam_repositioning_flag"))) = sdp_info.beam_repositioning_flag + REPORT "wrong sdp_source_info_beam_repositioning_flag" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_gn_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_gn_id")) = TO_UVEC(gn_index, 5) + REPORT "wrong sdp_source_info_gn_id" SEVERITY ERROR; + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_block_period") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_block_period")) = sdp_info.block_period + REPORT "wrong sdp_block_period" SEVERITY ERROR; + + -- Check variable header info. + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")) = TO_UVEC(rx_block_cnt + c_sdp_S_pn * gn_index, 32) + REPORT "wrong block count number, received data_id not same as counted blocks" SEVERITY ERROR; + END IF; END PROCESS; - -- Count number of blocks in a sync interval, rx_request is used to start counting from 0. + -- Count number of blocks in a sync interval. + -- There is no active test_offload_sosi.sync to restart the count. Therefore capture the in_sosi.sync in in_sync_hold, and + -- use in_sync_hold with test_offload_sosi.sop to start counting blocks (packets) from 0, at the start of every sync interval. p_rx_block_cnt : PROCESS(dp_clk) BEGIN IF rising_edge(dp_clk) THEN IF test_offload_sosi.sop = '1' THEN - IF rx_request = '1' THEN + IF in_sync_hold = '1' THEN rx_block_cnt <= 0; - rx_request <= '0'; + in_sync_hold <= '0'; ELSE rx_block_cnt <= rx_block_cnt + 1; END IF; END IF; IF in_sosi.sync = '1' THEN - rx_request <= '1'; + in_sync_hold <= '1'; END IF; END IF; END PROCESS; - -- Capture rx_bsn from header + -- 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 + -- Keep rx_bsn from previous header. rx_prev_bsn <= rx_bsn WHEN rising_edge(dp_clk); - -- verify number of blocks between 2 syncs and between 2 changed bsn numbers + -- Verify number of blocks between 2 syncs and between 2 changed bsn numbers. p_verify_nof_blocks : PROCESS(dp_clk) BEGIN IF rising_edge(dp_clk) THEN @@ -346,17 +350,11 @@ BEGIN ASSERT rx_block_cnt = g_nof_signal_inputs_per_pn - 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_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; - - rx_data_id <= TO_UINT(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id"))); - IF test_offload_sosi.eop = '1' THEN - ASSERT rx_data_id = rx_block_cnt + c_sdp_S_pn * gn_index REPORT "wrong block count number, received data_id not same as counted blocks" SEVERITY ERROR; - END IF; - END IF; test_offload_siso <= c_dp_siso_rdy; END IF; @@ -379,7 +377,7 @@ BEGIN BEGIN proc_common_wait_until_low(mm_clk, mm_rst); proc_common_wait_some_cycles(mm_clk, 10); - -- write ethernet destinations via reg_hdr_dat_mosi + -- Write ethernet destinations via reg_hdr_dat_mosi. proc_mem_mm_bus_wr(c_hdr_dat_mm_addr_udp_src_port, TO_UINT(c_udp_src_port), mm_clk, hdr_dat_miso, hdr_dat_mosi); proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); @@ -404,14 +402,14 @@ BEGIN g_ram => c_ram_buf ) PORT MAP ( - -- MM write port clock domain + -- MM write port clock domain. rst_a => mm_rst, clk_a => mm_clk, wr_en_a => ram_wr_en, wr_dat_a => ram_wr_data, adr_a => ram_wr_addr, - -- DP read only port clock domain + -- DP read only port clock domain. rst_b => dp_rst, clk_b => dp_clk, adr_b => master_mosi.address(c_ram_buf.adr_w-1 DOWNTO 0),