Skip to content
Snippets Groups Projects
Commit ea8a0628 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Added p_verify_payload to verify SST, BST and XST packets payloads.

parent 17a63f45
No related branches found
No related tags found
1 merge request!182Resolve L2SDP-551
...@@ -53,16 +53,17 @@ USE work.tb_sdp_pkg.ALL; ...@@ -53,16 +53,17 @@ USE work.tb_sdp_pkg.ALL;
ENTITY tb_sdp_statistics_offload IS ENTITY tb_sdp_statistics_offload IS
GENERIC ( GENERIC (
-- All -- All
g_statistics_type : STRING := "SST"; g_statistics_type : STRING := "XST";
g_offload_time : NATURAL := 50; 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 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
-- BST -- BST
g_beamset_id : NATURAL := 1; -- < c_sdp_N_beamsets g_beamset_id : NATURAL := 1; -- < c_sdp_N_beamsets
-- XST -- XST
g_O_rn : NATURAL := 4; -- GN index of first ring node (RN) g_O_rn : NATURAL := 4; -- GN index of first ring node (RN)
g_N_rn : NATURAL := 8; -- <= c_sdp_N_rn_max = 16, number of nodes in ring g_N_rn : NATURAL := 8; -- <= c_sdp_N_rn_max = 16, number of nodes in ring
g_P_sq : NATURAL := 1; -- <= c_sdp_P_sq g_P_sq : NATURAL := 4; -- <= c_sdp_P_sq
g_nof_crosslets : NATURAL := 1; -- <= c_sdp_N_crosslets_max g_nof_crosslets : NATURAL := 3; -- <= c_sdp_N_crosslets_max
g_crosslets_direction : NATURAL := 1 -- > 0 for crosslet transport in positive direction (incrementing RN), else 0 for negative direction g_crosslets_direction : NATURAL := 1 -- > 0 for crosslet transport in positive direction (incrementing RN), else 0 for negative direction
); );
END tb_sdp_statistics_offload; END tb_sdp_statistics_offload;
...@@ -97,23 +98,33 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS ...@@ -97,23 +98,33 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
CONSTANT c_crosslets_info_rec : t_sdp_crosslets_info := (offset_arr => (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), step => 16); CONSTANT c_crosslets_info_rec : t_sdp_crosslets_info := (offset_arr => (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), step => 16);
CONSTANT c_crosslets_info_slv : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) := func_sdp_map_crosslets_info(c_crosslets_info_rec); CONSTANT c_crosslets_info_slv : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) := func_sdp_map_crosslets_info(c_crosslets_info_rec);
-- Crosslets settings
CONSTANT c_mm_nof_crosslets : STD_LOGIC_VECTOR(c_sdp_nof_crosslets_reg_w-1 DOWNTO 0) := TO_UVEC(g_nof_crosslets, c_sdp_nof_crosslets_reg_w);
CONSTANT c_mm_nof_packets : NATURAL := func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, g_P_sq, g_nof_crosslets);
-- payload data -- payload data
CONSTANT c_data_size : NATURAL := c_sdp_W_statistic_sz; CONSTANT c_packet_size : NATURAL := c_nof_statistics_per_packet * c_sdp_W_statistic_sz;
CONSTANT c_nof_data : NATURAL := c_nof_statistics_per_packet;
-- Define SST RAM size for c_nof_packets_max. -- Define statistics RAM size for c_nof_packets_max.
CONSTANT c_ram_size : NATURAL := c_nof_data * c_data_size * c_nof_packets_max; CONSTANT c_ram_size : NATURAL := c_packet_size * c_nof_packets_max;
CONSTANT c_ram_w : NATURAL := ceil_log2(c_ram_size); 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 := (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'); CONSTANT c_ram_buf : t_c_mem := (1, c_ram_w, 32, 2**c_ram_w, 'X');
-- RAM dimensions
-- . nof_statistics_per_packet = c_mm_nof_data * c_mm_data_size / 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
-- Define block timing. -- Define block timing.
CONSTANT c_bsn_init : NATURAL := 0; CONSTANT c_bsn_init : NATURAL := 0;
CONSTANT c_nof_block_per_sync : NATURAL := 3 + ceil_div(c_offload_time, c_nof_data) + c_nof_packets_max; -- Sufficient to fit more than c_nof_packets_max offload packets per sync interval. -- Sufficient c_nof_block_per_sync to fit more than c_nof_packets_max offload packets per sync interval.
CONSTANT c_nof_clk_per_block : NATURAL := c_nof_data * c_data_size; CONSTANT c_nof_block_per_sync : NATURAL := 3 + ceil_div(c_offload_time, c_packet_size) + c_nof_packets_max;
CONSTANT c_nof_valid_per_block : NATURAL := c_nof_data * c_data_size; CONSTANT c_nof_clk_per_block : NATURAL := c_packet_size;
CONSTANT c_nof_sync : NATURAL := 3;
CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync * c_nof_clk_per_block; CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync * c_nof_clk_per_block;
CONSTANT c_nof_sync : NATURAL := 3;
SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL tb_end : STD_LOGIC := '0';
...@@ -143,11 +154,11 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS ...@@ -143,11 +154,11 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL offload_sosi : t_dp_sosi; SIGNAL offload_sosi : t_dp_sosi;
SIGNAL offload_siso : t_dp_siso := c_dp_siso_rst; SIGNAL offload_siso : t_dp_siso := c_dp_siso_rst;
SIGNAL test_offload_en : STD_LOGIC := '0';
SIGNAL test_offload_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit SIGNAL test_offload_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit
SIGNAL test_offload_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL test_offload_sosi : t_dp_sosi := c_dp_sosi_rst;
SIGNAL test_offload_en : STD_LOGIC := '0'; SIGNAL test_offload_sop_cnt : NATURAL := 0;
SIGNAL test_offload_sop_cnt : NATURAL; SIGNAL test_offload_eop_cnt : NATURAL := 0;
SIGNAL test_offload_eop_cnt : NATURAL;
SIGNAL rx_hdr_fields_out : STD_LOGIC_VECTOR(1023 DOWNTO 0); 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_hdr_fields_raw : STD_LOGIC_VECTOR(1023 DOWNTO 0) := (OTHERS => '0');
...@@ -163,7 +174,11 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS ...@@ -163,7 +174,11 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL exp_xst_signal_input_A : NATURAL; SIGNAL exp_xst_signal_input_A : NATURAL;
SIGNAL exp_xst_signal_input_B : NATURAL; SIGNAL exp_xst_signal_input_B : NATURAL;
-- Signals used to change settings of sdp_info. SIGNAL rx_val : STD_LOGIC := '0';
SIGNAL rx_data : NATURAL;
SIGNAL exp_data : NATURAL;
-- Signals used to change settings of sdp_info.
SIGNAL sdp_info : t_sdp_info := ( SIGNAL sdp_info : t_sdp_info := (
TO_UVEC(601, 16), -- station_id TO_UVEC(601, 16), -- station_id
'0', -- antenna_band_index '0', -- antenna_band_index
...@@ -185,8 +200,6 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS ...@@ -185,8 +200,6 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL source_gn : NATURAL; -- source node GN SIGNAL source_gn : NATURAL; -- source node GN
SIGNAL subband_calibrated_flag : STD_LOGIC := '0'; SIGNAL subband_calibrated_flag : STD_LOGIC := '0';
SIGNAL nof_crosslets : STD_LOGIC_VECTOR(c_sdp_nof_crosslets_reg_w-1 DOWNTO 0) := (OTHERS => '0');
SIGNAL nof_packets : NATURAL;
-- 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_data : STD_LOGIC_VECTOR(c_ram_buf.dat_w-1 DOWNTO 0);
...@@ -194,9 +207,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS ...@@ -194,9 +207,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL ram_wr_en : STD_LOGIC; SIGNAL ram_wr_en : STD_LOGIC;
SIGNAL init_ram_done : STD_LOGIC := '0'; SIGNAL init_ram_done : STD_LOGIC := '0';
SIGNAL in_sync_hold : STD_LOGIC := '0';
SIGNAL in_sync_cnt : NATURAL := 0; SIGNAL in_sync_cnt : NATURAL := 0;
SIGNAL test_sync_cnt : INTEGER; SIGNAL test_sync_cnt : INTEGER := 0;
SIGNAL rx_packet_cnt : NATURAL := 0; SIGNAL rx_packet_cnt : NATURAL := 0;
SIGNAL rx_valid_cnt : NATURAL := 0; SIGNAL rx_valid_cnt : NATURAL := 0;
...@@ -209,14 +221,20 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS ...@@ -209,14 +221,20 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL dbg_c_nof_signal_inputs : NATURAL := c_nof_signal_inputs; SIGNAL dbg_c_nof_signal_inputs : NATURAL := c_nof_signal_inputs;
SIGNAL dbg_c_nof_packets_max : NATURAL := c_nof_packets_max; SIGNAL dbg_c_nof_packets_max : NATURAL := c_nof_packets_max;
SIGNAL dbg_c_beamlet_index : NATURAL := c_beamlet_index; SIGNAL dbg_c_beamlet_index : NATURAL := c_beamlet_index;
SIGNAL dbg_c_data_size : NATURAL := c_data_size; SIGNAL dbg_c_packet_size : NATURAL := c_packet_size;
SIGNAL dbg_c_nof_data : NATURAL := c_nof_data; 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_ram_size : NATURAL := c_ram_size; 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_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; SIGNAL dbg_c_crosslets_info_slv : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) := c_crosslets_info_slv;
BEGIN BEGIN
-- Check consistency of constant value dependencies
ASSERT c_ram_size = c_mm_ram_size REPORT "Wrong derivation of RAM size." SEVERITY FAILURE;
dp_rst <= '1', '0' AFTER c_dp_clk_period*7; dp_rst <= '1', '0' AFTER c_dp_clk_period*7;
dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2; dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2;
...@@ -292,36 +310,23 @@ BEGIN ...@@ -292,36 +310,23 @@ BEGIN
WAIT; WAIT;
END PROCESS; END PROCESS;
-- Crosslets settings
nof_crosslets <= TO_UVEC(g_nof_crosslets, c_sdp_nof_crosslets_reg_w);
nof_packets <= func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, g_P_sq, g_nof_crosslets);
-- Counters to time expected exp_sdp_stat_header fields per offload packet -- Counters to time expected exp_sdp_stat_header fields per offload packet
p_exp_counters : PROCESS(dp_clk) p_test_counters : PROCESS(dp_clk)
BEGIN BEGIN
IF rising_edge(dp_clk) THEN IF rising_edge(dp_clk) THEN
-- Count sync intervals using in_sosi.sync, because there is no test_offload_sosi.sync -- Count test_offload_sosi packets
IF test_offload_en = '0' THEN IF test_offload_sosi.sop = '1' THEN
in_sync_cnt <= 0; test_offload_sop_cnt <= test_offload_sop_cnt + 1; -- early count
test_offload_sop_cnt <= 0; END IF;
test_offload_eop_cnt <= 0; IF test_offload_sosi.eop = '1' THEN
ELSE test_offload_eop_cnt <= test_offload_eop_cnt + 1; -- after count
-- Count test_offload_sosi sync integration intervals
IF in_sosi.sync = '1' THEN
in_sync_cnt <= in_sync_cnt + 1;
END IF;
-- Count test_offload_sosi packets
IF test_offload_sosi.sop = '1' THEN
test_offload_sop_cnt <= test_offload_sop_cnt + 1; -- early count
END IF;
IF test_offload_sosi.eop = '1' THEN
test_offload_eop_cnt <= test_offload_eop_cnt + 1; -- after count
END IF;
END IF; END IF;
END IF; END IF;
END PROCESS; END PROCESS;
test_sync_cnt <= in_sync_cnt + 0; -- optionally adjust to fit test_offload_sosi
-- Count sync intervals using in_sosi.sync, because there is no test_offload_sosi.sync
in_sync_cnt <= in_sync_cnt + 1 WHEN rising_edge(dp_clk) AND in_sosi.sync = '1';
test_sync_cnt <= in_sync_cnt - 1; -- optionally adjust to fit test_offload_sosi
-- derive current X_sq correlator cell index -- derive current X_sq correlator cell index
cur_X_sq_cell <= (test_offload_eop_cnt / g_nof_crosslets) MOD g_P_sq; cur_X_sq_cell <= (test_offload_eop_cnt / g_nof_crosslets) MOD g_P_sq;
...@@ -428,21 +433,16 @@ BEGIN ...@@ -428,21 +433,16 @@ BEGIN
END PROCESS; END PROCESS;
-- Count number of packets in a sync interval. -- Count number of packets 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 -- There is no active test_offload_sosi.sync to restart the count, therefore
-- use in_sync_hold with test_offload_sosi.sop to start counting packets from 0, at the start of every sync interval. -- use in_sosi.sync to reset the count for the next test_offload_sosi.sync
-- interval
p_rx_packet_cnt : PROCESS(dp_clk) p_rx_packet_cnt : PROCESS(dp_clk)
BEGIN BEGIN
IF rising_edge(dp_clk) THEN IF rising_edge(dp_clk) THEN
IF test_offload_sosi.sop = '1' THEN
IF in_sync_hold = '1' THEN
in_sync_hold <= '0';
rx_packet_cnt <= 0;
ELSE
rx_packet_cnt <= rx_packet_cnt + 1;
END IF;
END IF;
IF in_sosi.sync = '1' THEN IF in_sosi.sync = '1' THEN
in_sync_hold <= '1'; rx_packet_cnt <= 0;
ELSIF test_offload_sosi.eop = '1' THEN
rx_packet_cnt <= rx_packet_cnt + 1;
END IF; END IF;
END IF; END IF;
END PROCESS; END PROCESS;
...@@ -451,12 +451,8 @@ BEGIN ...@@ -451,12 +451,8 @@ BEGIN
p_verify_nof_packets : PROCESS(dp_clk) p_verify_nof_packets : PROCESS(dp_clk)
BEGIN BEGIN
IF rising_edge(dp_clk) THEN IF rising_edge(dp_clk) THEN
IF init_ram_done = '1' THEN IF in_sosi.sync = '1' AND in_sync_cnt > 1 THEN
ASSERT rx_packet_cnt = c_mm_nof_packets REPORT "Wrong number of packets per sync interval" SEVERITY ERROR;
IF in_sosi.sync = '1' AND rx_packet_cnt > 0 THEN
ASSERT rx_packet_cnt = nof_packets-1 REPORT "Wrong number of packets per sync interval" SEVERITY ERROR;
END IF;
END IF; END IF;
END IF; END IF;
END PROCESS; END PROCESS;
...@@ -464,12 +460,147 @@ BEGIN ...@@ -464,12 +460,147 @@ BEGIN
p_verify_nof_valid_per_packet : PROCESS(dp_clk) p_verify_nof_valid_per_packet : PROCESS(dp_clk)
BEGIN BEGIN
IF rising_edge(dp_clk) THEN IF rising_edge(dp_clk) THEN
IF test_offload_sosi.sop = '1' THEN IF test_offload_sosi.eop = '1' THEN
rx_valid_cnt <= 1; rx_valid_cnt <= 0;
ELSIF test_offload_sosi.eop = '1' THEN ASSERT rx_valid_cnt = c_packet_size - 1 REPORT "Wrong number of valid per packet" SEVERITY ERROR;
ASSERT rx_valid_cnt+1 = c_nof_valid_per_block REPORT "Wrong number of valid per packet" SEVERITY ERROR; ELSIF test_offload_sosi.valid = '1' THEN
ELSE rx_valid_cnt <= rx_valid_cnt + 1;
rx_valid_cnt <= rx_valid_cnt + 1; -- test_offload_sosi.valid has no gaps END IF;
END IF;
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
VARIABLE P : NATURAL; -- Packet count
VARIABLE I, J, K, L : NATURAL; -- auxiliary index
VARIABLE U : NATURAL; -- real sUbband SST values
VARIABLE B : NATURAL; -- dual polarization Beamlet BST values
VARIABLE X : NATURAL; -- complex crosslet XST values
VARIABLE v_rx_data : NATURAL; -- received (rx) 32bit word
VARIABLE v_exp_data : NATURAL; -- expected (exp) 32bit word
BEGIN
IF rising_edge(dp_clk) THEN
rx_val <= '0';
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
--
-- g_reverse_word_order = TRUE: swaps odd and even W columns,
-- because 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
D := S; -- range c_mm_nof_data = 512 Data values, because
-- c_mm_data_size / c_sdp_W_statistic_sz = 1
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
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
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
END IF;
v_exp_data := v_exp_data + (P/2) * 2048; -- due to c_packet_size = 1024 and c_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.
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
P := rx_packet_cnt; -- range c_nof_packets_max = 1
v_exp_data := B * c_mm_data_size;
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;
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
--
-- W: 0 1 2 3 4 5 ... 572 573 574 575
-- S: 0 1 2 ... 286 287
-- X = D: 0 1 ... 143
-- I: 0 1 2 3 0 ... 0 1 2 3
-- P: J: K: Word values:
-- 0 0 0 0 1 2 3 4 5 ... 572 573 574 575
-- 1 1 576 ...
-- 2 2 1052 ...
--
-- 3 0 1 4096 ...
-- 4 1 4672 ...
-- 5 2 5244 ...
-- ...
-- 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.
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
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;
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;
END IF;
v_exp_data := v_exp_data + J * 576;
v_exp_data := v_exp_data + K * 4096;
ASSERT v_exp_data = v_rx_data REPORT "Wrong XST payload data Rx" SEVERITY ERROR;
END IF;
-- for debug in wave window
rx_val <= '1';
rx_data <= v_rx_data;
exp_data <= v_exp_data;
END IF; END IF;
END IF; END IF;
END PROCESS; END PROCESS;
...@@ -535,6 +666,7 @@ BEGIN ...@@ -535,6 +666,7 @@ BEGIN
GENERIC MAP ( GENERIC MAP (
g_statistics_type => g_statistics_type, g_statistics_type => g_statistics_type,
g_offload_time => g_offload_time, g_offload_time => g_offload_time,
g_reverse_word_order => g_reverse_word_order,
g_beamset_id => g_beamset_id, g_beamset_id => g_beamset_id,
g_P_sq => g_P_sq, g_P_sq => g_P_sq,
g_crosslets_direction => g_crosslets_direction g_crosslets_direction => g_crosslets_direction
...@@ -570,7 +702,7 @@ BEGIN ...@@ -570,7 +702,7 @@ BEGIN
sdp_info => sdp_info, sdp_info => sdp_info,
subband_calibrated_flag => subband_calibrated_flag, subband_calibrated_flag => subband_calibrated_flag,
nof_crosslets => nof_crosslets, nof_crosslets => c_mm_nof_crosslets,
crosslets_info => in_crosslets_info_slv crosslets_info => in_crosslets_info_slv
); );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment