diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd index 7591f6531af916cf51ce06c973176e4b035a9744..79ddb76d29827419df36a485a4d9312be53887f8 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd @@ -76,8 +76,9 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload IS CONSTANT c_wpfb_sim : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync); -- MM - CONSTANT c_mm_file_reg_bsn_source_v2 : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2"; - CONSTANT c_mm_file_reg_stat_enable_xst : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_STAT_ENABLE_XST"; + CONSTANT c_mm_file_reg_bsn_source_v2 : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2"; + CONSTANT c_mm_file_reg_stat_enable_xst : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_STAT_ENABLE_XST"; + CONSTANT c_mm_file_reg_bsn_scheduler_xsub : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SCHEDULER_XSUB"; -- Tb SIGNAL tb_end : STD_LOGIC := '0'; @@ -213,11 +214,17 @@ BEGIN mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 2, 0, tb_clk); -- Init BSN = 0 mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 1, c_nof_clk_per_sync, tb_clk); -- nof_block_per_sync mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 0, 16#00000001#, tb_clk); -- Enable BSN immediately + + ---------------------------------------------------------------------------- + -- Enable xsub + ---------------------------------------------------------------------------- + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_xsub, 0, 1, tb_clk); -- first write low then high part + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_xsub, 1, 0, tb_clk); -- assume v_bsn < 2**31-1 ---------------------------------------------------------------------------- -- Offload enable ---------------------------------------------------------------------------- - mmf_mm_bus_wr(c_mm_file_reg_stat_enable_xst_0, 0, 1, tb_clk); + mmf_mm_bus_wr(c_mm_file_reg_stat_enable_xst, 0, 1, tb_clk); -- wait for udp offload is done proc_common_wait_until_high(ext_clk, eth_done); diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd index 242ba7702d0f1fcbf9c818dadc65a3c2df4740b5..9f8ecfbddf90215cb723d7c0cb500d708250ddba 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd @@ -876,7 +876,10 @@ BEGIN dp_rst => dp_rst, in_sosi_arr => fsub_sosi_arr, - + + xst_udp_sosi => udp_tx_sosi_arr(1), + xst_udp_siso => udp_tx_siso_arr(1), + mm_rst => mm_rst, mm_clk => mm_clk, @@ -892,7 +895,13 @@ BEGIN reg_stat_enable_mosi => reg_stat_enable_xst_mosi, reg_stat_enable_miso => reg_stat_enable_xst_miso, reg_stat_hdr_dat_mosi => reg_stat_hdr_dat_xst_mosi, - reg_stat_hdr_dat_miso => reg_stat_hdr_dat_xst_miso + reg_stat_hdr_dat_miso => reg_stat_hdr_dat_xst_miso, + + sdp_info => sdp_info, + gn_id => gn_id, + stat_eth_src_mac => stat_eth_src_mac, + stat_ip_src_addr => stat_ip_src_addr, + stat_udp_src_port => xst_udp_src_port ); END GENERATE; @@ -909,17 +918,17 @@ BEGIN g_scope_selected_beamlet => g_scope_selected_subband ) PORT MAP( - dp_clk => dp_clk, - dp_rst => dp_rst, + dp_clk => dp_clk, + dp_rst => dp_rst, - in_sosi_arr => fsub_sosi_arr, - bf_udp_sosi => bf_udp_sosi_arr(beamset_id), - bf_udp_siso => bf_udp_siso_arr(beamset_id), - bst_udp_sosi => udp_tx_sosi_arr(1+ beamset_id), - bst_udp_siso => udp_tx_siso_arr(1+ beamset_id), + in_sosi_arr => fsub_sosi_arr, + bf_udp_sosi => bf_udp_sosi_arr(beamset_id), + bf_udp_siso => bf_udp_siso_arr(beamset_id), + bst_udp_sosi => udp_tx_sosi_arr(2+ beamset_id), + bst_udp_siso => udp_tx_siso_arr(2+ beamset_id), - mm_rst => mm_rst, - mm_clk => mm_clk, + mm_rst => mm_rst, + mm_clk => mm_clk, ram_ss_ss_wide_mosi => ram_ss_ss_wide_mosi_arr(beamset_id), ram_ss_ss_wide_miso => ram_ss_ss_wide_miso_arr(beamset_id), @@ -936,19 +945,18 @@ BEGIN reg_stat_enable_mosi => reg_stat_enable_bst_mosi_arr(beamset_id), reg_stat_enable_miso => reg_stat_enable_bst_miso_arr(beamset_id), reg_stat_hdr_dat_mosi => reg_stat_hdr_dat_bst_mosi_arr(beamset_id), - reg_stat_hdr_dat_miso => reg_stat_hdr_dat_bst_miso_arr(beamset_id), - sdp_info => sdp_info, - gn_id => gn_id, - - eth_src_mac => cep_eth_src_mac, - ip_src_addr => cep_ip_src_addr, - udp_src_port => cep_udp_src_port, - - stat_eth_src_mac => stat_eth_src_mac, - stat_ip_src_addr => stat_ip_src_addr, - stat_udp_src_port => bst_udp_src_port, + reg_stat_hdr_dat_miso => reg_stat_hdr_dat_bst_miso_arr(beamset_id), + + sdp_info => sdp_info, + gn_id => gn_id, + eth_src_mac => cep_eth_src_mac, + ip_src_addr => cep_ip_src_addr, + udp_src_port => cep_udp_src_port, + stat_eth_src_mac => stat_eth_src_mac, + stat_ip_src_addr => stat_ip_src_addr, + stat_udp_src_port => bst_udp_src_port, - hdr_fields_out => bf_10GbE_hdr_fields_out_arr(beamset_id) + hdr_fields_out => bf_10GbE_hdr_fields_out_arr(beamset_id) ); END GENERATE; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd index b092c86600935ac6382007d03fe8b3c7b1d3a269..191577e824056e530783ed46a88fcb65a9133d2b 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd @@ -71,8 +71,7 @@ ENTITY node_sdp_correlator IS gn_id : IN STD_LOGIC_VECTOR(c_sdp_W_gn_id-1 DOWNTO 0); stat_eth_src_mac : IN STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0); stat_ip_src_addr : IN STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0); - stat_udp_src_port : IN STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0); - + stat_udp_src_port : IN STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0) ); END node_sdp_correlator; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd index a555228a82a5f992771144e1e013fc25b8d6dfa2..4b600fa39e7bf008d5eb54321e3ec511585141c0 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -20,7 +20,7 @@ ------------------------------------------------------------------------------- -- --- Author: P. Donker +-- Author: P. Donker, R van der Walle -- Purpose: -- . SDP statistics offload @@ -91,15 +91,15 @@ ARCHITECTURE str OF sdp_statistics_offload IS CONSTANT c_nof_streams : NATURAL := 1; - CONSTANT c_data_size : NATURAL := sel_a_b(g_statistics_type="XST", 4, 2); -- XST = 4, SST, BST = 2 - CONSTANT c_nof_data_per_step : NATURAL := sel_a_b(g_statistics_type="XST", 4, 2); -- XST = 4, SST, BST = 2; + CONSTANT c_data_size : NATURAL := 2; + CONSTANT c_nof_data_per_step : NATURAL := 2; CONSTANT c_step_size : NATURAL := sel_a_b(g_statistics_type="BST", c_data_size, sel_a_b(g_statistics_type="XST", c_data_size, c_data_size * c_nof_data_per_step)); -- SST CONSTANT c_nof_data : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_N_pol * c_sdp_S_sub_bf, - sel_a_b(g_statistics_type="XST", (c_sdp_S_pn * c_sdp_S_pn), + sel_a_b(g_statistics_type="XST", c_sdp_S_pn * c_sdp_S_pn * c_nof_complex, c_sdp_N_sub)); -- SST CONSTANT c_block_size : NATURAL := c_nof_data * c_step_size; @@ -155,7 +155,7 @@ ARCHITECTURE str OF sdp_statistics_offload IS BEGIN bsn_at_sync <= RESIZE_UVEC(in_sosi.bsn, 64) WHEN rising_edge(dp_clk) AND in_sosi.sync = '1'; - selected_crosslet <= crosslets_info(c_sdp_crosslets_index_w-1 DOWNTO 0) + selected_crosslet <= crosslets_info(c_sdp_crosslets_index_w-1 DOWNTO 0); ------------------------------------------------------------------------------- -- Assemble offload header info @@ -220,7 +220,7 @@ BEGIN ELSIF g_statistics_type = "BST" THEN v.data_id := x"0000" & TO_UVEC(c_beamlet_id, 16); ELSIF g_statistics_type = "XST" THEN - v.data_id := x"0" & "000" & RESIZE_UVEC(selected_crosslet, 9) & TO_UVEC(r.block_count * c_sdp_P_pn, 8) & TO_UVEC(r.block_count * c_sdp_P_pn, 8); -- RW TODO: define for P_sq > 1 + v.data_id := x"0" & "000" & RESIZE_UVEC(selected_crosslet, 9) & TO_UVEC(r.block_count * c_sdp_S_pn, 8) & TO_UVEC(r.block_count * c_sdp_S_pn, 8); -- RW TODO: define for P_sq > 1 ELSE v.data_id := x"00000000"; END IF; @@ -230,10 +230,10 @@ BEGIN -- Use trigger to start first packet v.start_pulse := '1'; v.start_address := 0; - v.block_count := 1; + v.block_count := 0; ELSIF done = '1' THEN -- Use done to start next packets - IF r.block_count < c_nof_packets THEN + IF r.block_count < c_nof_packets-1 THEN IF r.block_count MOD c_nof_data_per_step = 0 THEN v.start_address := r.block_count / c_nof_data_per_step * c_block_size; -- jump to first packet in next block ELSE @@ -276,7 +276,7 @@ BEGIN g_data_size => c_data_size, g_step_size => c_step_size, g_nof_data => c_nof_data, - g_reverse_word_order => TRUE -- default word order is MSB after LSB, we need to stream LSB after MSB. + g_reverse_word_order => FALSE -- default word order is MSB after LSB, we need to stream LSB after MSB. ) PORT MAP( dp_rst => dp_rst, 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 ad26814881b3aa41ff5e9114e3f3128ca294f5d8..4ef9345bff9b94039db3d69fa3c588b873bd1a8c 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 @@ -73,10 +73,15 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS CONSTANT c_hdr_dat_mm_addr_udp_src_port : NATURAL := 15; -- Define SST RAM structure. - CONSTANT c_nof_data : NATURAL := 512; CONSTANT c_data_size : NATURAL := 2; - CONSTANT c_step_size : NATURAL := 4; - + CONSTANT c_nof_data_per_step : NATURAL := 2; + CONSTANT c_step_size : NATURAL := sel_a_b(g_statistics_type="BST", c_data_size, + sel_a_b(g_statistics_type="XST", c_data_size, + c_data_size * c_nof_data_per_step)); -- SST + + CONSTANT c_nof_data : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_N_pol * c_sdp_S_sub_bf, + sel_a_b(g_statistics_type="XST", c_sdp_S_pn * c_sdp_S_pn * c_nof_complex, + c_sdp_N_sub)); -- SST -- 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); @@ -84,7 +89,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_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_block_per_sync : NATURAL := 80; -- 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". @@ -241,7 +246,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. -- 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" + 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"001B217176B9" 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; @@ -251,7 +256,7 @@ BEGIN 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) + 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(4156, 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; @@ -263,11 +268,11 @@ BEGIN 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" + 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"0A6300FE" 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) + 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(5001, 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) + 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(4136, 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; @@ -346,7 +351,7 @@ BEGIN IF init_ram_done = '1' THEN IF in_sosi.sync = '1' AND rx_block_cnt > 0 THEN - ASSERT rx_block_cnt = g_nof_signal_inputs_per_pn - 1 REPORT "wrong number of blocks between 2 sync" SEVERITY ERROR; + 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. @@ -365,7 +370,7 @@ BEGIN IF test_offload_sosi.sop = '1' THEN rx_valid_clk_cnt <= 1; ELSIF test_offload_sosi.eop = '1' THEN - ASSERT rx_valid_clk_cnt = c_nof_valid_per_block REPORT "wrong number of clock counts while valid" SEVERITY ERROR; + ASSERT rx_valid_clk_cnt+1 = c_nof_valid_per_block REPORT "wrong number of clock counts while valid" SEVERITY ERROR; ELSE rx_valid_clk_cnt <= rx_valid_clk_cnt + 1; END IF; @@ -409,8 +414,8 @@ BEGIN adr_a => ram_wr_addr, -- DP read only port clock domain. - rst_b => dp_rst, - clk_b => dp_clk, + rst_b => mm_rst, + clk_b => mm_clk, adr_b => master_mosi.address(c_ram_buf.adr_w-1 DOWNTO 0), rd_en_b => master_mosi.rd, rd_dat_b => master_miso.rddata(c_ram_buf.dat_w-1 DOWNTO 0), @@ -480,4 +485,4 @@ BEGIN ip_src_addr => c_ip_src_addr ); -END tb; \ No newline at end of file +END tb;