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 e3e4d130f10382b080aa703cbceec5b9d3d43a11..674b8baa1e4234ad4fb5d16bb92dd012d7a63276 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -106,7 +106,7 @@ ARCHITECTURE str OF sdp_statistics_offload IS CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf; -- MM access settings per packet for u_dp_block_from_mm_dc - CONSTANT c_mm_user_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type); + CONSTANT c_mm_user_size : NATURAL := c_sdp_W_statistic_sz; CONSTANT c_mm_data_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type); CONSTANT c_mm_step_size : NATURAL := func_sdp_get_stat_from_mm_step_size(g_statistics_type); CONSTANT c_mm_nof_data : NATURAL := func_sdp_get_stat_from_mm_nof_data(g_statistics_type); 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 c36f8e1ac4b5e6dc3933d580b2c0aabefa2fa854..433f50839f8cd26b48eb43b0d41ec6387d20027b 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 @@ -32,7 +32,8 @@ -- Usage: -- > as 8 -- > run -a --- e.g. view test_offload_sosi and the rx_sdp_stat_header.app fields +-- . for header: view test_offload_sosi and the rx_sdp_stat_header.app fields +-- . for payload: view rx_val, rx_data and exp_data ------------------------------------------------------------------------------- LIBRARY IEEE, common_lib, dp_lib, ring_lib; @@ -53,7 +54,7 @@ USE work.tb_sdp_pkg.ALL; ENTITY tb_sdp_statistics_offload IS GENERIC ( -- All - g_statistics_type : STRING := "XST"; + g_statistics_type : STRING := "SST"; g_offload_time : NATURAL := 50; g_reverse_word_order : BOOLEAN := TRUE; -- when TRUE then stream LSB word after MSB word. g_gn_index : NATURAL := 5; -- global node (GN) index, must be in range(O_rn, O_rn + N_rn), use > 0 to see effect of g_offload_time @@ -113,11 +114,15 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS -- RAM dimensions -- . nof_statistics_per_packet = c_mm_nof_data * c_mm_data_size / c_sdp_W_statistic_sz + CONSTANT c_mm_user_size : NATURAL := c_sdp_W_statistic_sz; CONSTANT c_mm_data_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type); CONSTANT c_mm_step_size : NATURAL := func_sdp_get_stat_from_mm_step_size(g_statistics_type); CONSTANT c_mm_nof_data : NATURAL := func_sdp_get_stat_from_mm_nof_data(g_statistics_type); CONSTANT c_mm_ram_size : NATURAL := c_mm_nof_data * c_mm_data_size * c_nof_packets_max; -- = c_ram_size + CONSTANT c_mm_nof_step : NATURAL := c_mm_step_size / c_mm_data_size; + CONSTANT c_mm_Xsq_span : NATURAL := 2**ceil_log2(c_sdp_N_crosslets_max * c_packet_size); -- XST: 2**ceil_log2(7 * 576) = 4096 + -- Define block timing. CONSTANT c_bsn_init : NATURAL := 0; -- Sufficient c_nof_block_per_sync to fit more than c_nof_packets_max offload packets per sync interval. @@ -222,10 +227,13 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS SIGNAL dbg_c_nof_packets_max : NATURAL := c_nof_packets_max; SIGNAL dbg_c_beamlet_index : NATURAL := c_beamlet_index; SIGNAL dbg_c_packet_size : NATURAL := c_packet_size; + SIGNAL dbg_c_mm_user_size : NATURAL := c_mm_user_size; SIGNAL dbg_c_mm_data_size : NATURAL := c_mm_data_size; SIGNAL dbg_c_mm_step_size : NATURAL := c_mm_step_size; SIGNAL dbg_c_mm_nof_data : NATURAL := c_mm_nof_data; SIGNAL dbg_c_mm_ram_size : NATURAL := c_mm_ram_size; + SIGNAL dbg_c_mm_nof_step : NATURAL := c_mm_nof_step; + SIGNAL dbg_c_mm_Xsq_span : NATURAL := c_mm_Xsq_span; SIGNAL dbg_c_ram_size : NATURAL := c_ram_size; SIGNAL dbg_c_crosslets_info_rec : t_sdp_crosslets_info := c_crosslets_info_rec; SIGNAL dbg_c_crosslets_info_slv : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) := c_crosslets_info_slv; @@ -470,7 +478,6 @@ BEGIN END PROCESS; p_verify_payload : PROCESS(dp_clk) - CONSTANT c_nof_step : NATURAL := c_mm_step_size / c_mm_data_size; VARIABLE W : NATURAL; -- 32bit Words VARIABLE D : NATURAL; -- Data values of c_mm_data_size VARIABLE S : NATURAL; -- Statistic values of c_sdp_W_statistic_sz @@ -487,20 +494,20 @@ BEGIN v_rx_data := TO_UINT(test_offload_sosi.data); IF test_offload_sosi.valid = '1' THEN IF g_statistics_type = "SST" THEN - -- Indices: - -- W: 0 1 2 3 4 5 ... 1022 1023 - -- U = D = S: 0 1 2 511 - -- I: 0 1 0 1 0 1 ... 0 1 - -- P: J: Words values: - -- 0 0 0 1 4 5 8 9 ... 2044 2045 - -- 1 1 2 3 6 7 10 11 ... 2046 2047 - -- 2 0 2048 2049 2052 2053 2056 2057 ... 4092 4093 - -- 3 1 2050 2051 2054 2055 2058 2059 ... 4094 4095 - -- ... ... - -- 11 1 10242 10243 10246 10247 10250 10251 ... 12286 12287 + -- Indices: + -- W: 0 1 2 3 4 5 ... 1022 1023 + -- U = D = S: 0 1 2 511 + -- I: 0 1 0 1 0 1 ... 0 1 + -- P: J: Words values: + -- 0 0 0 1 4 5 8 9 ... 2044 2045 + -- 1 1 2 3 6 7 10 11 ... 2046 2047 + -- 2 0 2048 2049 2052 2053 2056 2057 ... 4092 4093 + -- 3 1 2050 2051 2054 2055 2058 2059 ... 4094 4095 + -- ... ... + -- 11 1 10242 10243 10246 10247 10250 10251 ... 12286 12287 -- - -- g_reverse_word_order = TRUE: swaps odd and even W columns, - -- because c_sdp_W_statistic_sz = 2 + -- g_reverse_word_order = TRUE: swaps odd and even W columns, because + -- c_mm_user_size = c_sdp_W_statistic_sz = 2 W := rx_valid_cnt; -- range c_packet_size = 1024 32bit Words S := W / c_sdp_W_statistic_sz; -- range c_nof_statistics_per_packet = 512 Statistic values @@ -509,51 +516,50 @@ BEGIN U := S; -- range c_sdp_N_sub = 512 SST values I := W MOD c_sdp_W_statistic_sz; -- range c_sdp_W_statistic_sz = 2 words P := rx_packet_cnt; -- range c_nof_packets_max = 12 = c_sdp_S_pn Packets - J := P MOD c_nof_step; -- range c_nof_step = 2 = c_sdp_Q_fft + J := P MOD c_mm_nof_step; -- range c_mm_nof_step = 2 = c_sdp_Q_fft v_exp_data := S * 4; -- due to c_mm_step_size = 4 = c_sdp_W_statistic_sz * c_sdp_Q_fft; IF I = sel_a_b(g_reverse_word_order, 0, 1) THEN - v_exp_data := v_exp_data + 1; -- due to odd, even of c_sdp_W_statistic_sz = 2 + v_exp_data := v_exp_data + 1; -- due to c_mm_user_size = c_sdp_W_statistic_sz = 2 END IF; IF J = 1 THEN - v_exp_data := v_exp_data + 2; -- due to c_sdp_W_statistic_sz = 2 and c_nof_step = 2 > 1 + v_exp_data := v_exp_data + 2; -- due to c_sdp_W_statistic_sz = 2 and c_mm_nof_step = 2 > 1 END IF; - v_exp_data := v_exp_data + (P/2) * 2048; -- due to c_packet_size = 1024 and c_nof_step = 2 > 1 + v_exp_data := v_exp_data + (P/2) * 2048; -- due to c_packet_size = 1024 and c_mm_nof_step = 2 > 1 ASSERT v_exp_data = v_rx_data REPORT "Wrong SST payload data Rx" SEVERITY ERROR; ELSIF g_statistics_type = "BST" THEN - -- Indices: - -- W: 0 1 2 3 4 5 ... 1948 1949 1950 1951 - -- S: 0 1 2 ... 974 975 - -- B = D: 0 1 ... 487 - -- I: 0 1 2 3 0 ... 0 1 2 3 - -- P: Words values: - -- 0 0 1 2 3 4 5 ... 1948 1949 1950 1951 - - -- g_reverse_word_order = TRUE: swaps every c_mm_data_size = 4 D columns. - -- g_reverse_word_order occurs per c_mm_data_size = 4 words, so the - -- c_sdp_N_pol_bf = 2 beam polarizations also get swapped. + -- Indices: + -- W: 0 1 2 3 4 5 ... 1948 1949 1950 1951 + -- S: 0 1 2 ... 974 975 + -- B = D: 0 1 ... 487 + -- I: 0 1 2 3 0 ... 0 1 2 3 + -- P: Words values: + -- 0 0 1 2 3 4 5 ... 1948 1949 1950 1951 + -- + -- g_reverse_word_order = TRUE: swaps odd and even W columns, because + -- c_mm_user_size = c_sdp_W_statistic_sz = 2 W := rx_valid_cnt; -- range c_packet_size = 1952 S := W / c_sdp_W_statistic_sz; -- range c_nof_statistics_per_packet = 976 Statistic values D := S / c_sdp_N_pol_bf; -- range c_mm_nof_data = 488 Data values, because -- c_mm_data_size / c_sdp_W_statistic_sz = 2 = c_sdp_N_pol_bf B := D; -- range c_sdp_S_sub_bf = 488 dual polarization BST values - I := W MOD c_mm_data_size; -- range c_mm_data_size = 4 = c_sdp_W_statistic_sz * c_sdp_N_pol_bf + I := W MOD c_sdp_W_statistic_sz; -- range c_sdp_W_statistic_sz = 2 words P := rx_packet_cnt; -- range c_nof_packets_max = 1 - v_exp_data := B * c_mm_data_size; + v_exp_data := S * c_sdp_W_statistic_sz; IF g_reverse_word_order = FALSE THEN v_exp_data := v_exp_data + I; ELSE - v_exp_data := v_exp_data - I + c_mm_data_size-1; + v_exp_data := v_exp_data - I + c_mm_user_size-1; -- c_mm_user_size = c_sdp_W_statistic_sz = 2 END IF; ASSERT v_exp_data = v_rx_data REPORT "Wrong BST payload data Rx" SEVERITY ERROR; ELSIF g_statistics_type = "XST" THEN - -- . g_P_sq = 4 - -- . g_nof_crosslets = 3 - -- . c_sdp_N_crosslets_max = 7 --> 2**ceil_log2(7 * 576) = 4096 + -- . g_P_sq = 4 + -- . g_nof_crosslets = 3 + -- . c_sdp_N_crosslets_max = 7 --> c_mm_Xsq_span = 2**ceil_log2(7 * 576) = 4096 -- -- W: 0 1 2 3 4 5 ... 572 573 574 575 -- S: 0 1 2 ... 286 287 @@ -571,29 +577,28 @@ BEGIN -- 9 0 3 12288 ... -- 10 1 12864 ... -- 11 2 13436 ... - - -- g_reverse_word_order = TRUE: swaps every c_mm_data_size = 4 D columns. - -- g_reverse_word_order occurs per c_mm_data_size = 4 words, so the - -- c_nof_complex = 2 parts also get swapped. + -- + -- g_reverse_word_order = TRUE: swaps odd and even W columns, because + -- c_mm_user_size = c_sdp_W_statistic_sz = 2 W := rx_valid_cnt; -- range c_packet_size = 576 S := W / c_sdp_W_statistic_sz; -- range c_nof_statistics_per_packet = 288 Statistic values D := S / c_nof_complex; -- range c_mm_nof_data = 144 Data values, because -- c_mm_data_size / c_sdp_W_statistic_sz = 2 = c_nof_complex X := D; -- range c_sdp_X_sq = 144 complex XST values - I := W MOD c_mm_data_size; -- range c_mm_data_size = 4 = c_sdp_W_statistic_sz * c_nof_complex + I := W MOD c_sdp_W_statistic_sz; -- range c_sdp_W_statistic_sz = 2 words P := rx_packet_cnt; -- range c_mm_nof_packets J := P MOD g_nof_crosslets; -- range g_nof_crosslets K := P / g_nof_crosslets; -- range g_P_sq - v_exp_data := X * c_mm_data_size; + v_exp_data := S * c_sdp_W_statistic_sz; IF g_reverse_word_order = FALSE THEN v_exp_data := v_exp_data + I; ELSE - v_exp_data := v_exp_data - I + c_mm_data_size-1; + v_exp_data := v_exp_data - I + c_mm_user_size-1; -- c_mm_user_size = c_sdp_W_statistic_sz = 2 END IF; - v_exp_data := v_exp_data + J * 576; - v_exp_data := v_exp_data + K * 4096; + v_exp_data := v_exp_data + J * c_packet_size; -- c_packet_size = 576 + v_exp_data := v_exp_data + K * c_mm_Xsq_span; -- c_mm_Xsq_span = 4096 ASSERT v_exp_data = v_rx_data REPORT "Wrong XST payload data Rx" SEVERITY ERROR; END IF;