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

Use X, Y order for BST. Use Im, Re order for XST.

parent aea4b9b9
No related branches found
No related tags found
1 merge request!182Resolve L2SDP-551
Pipeline #22548 passed
...@@ -507,6 +507,7 @@ PACKAGE sdp_pkg is ...@@ -507,6 +507,7 @@ PACKAGE sdp_pkg is
FUNCTION func_sdp_get_stat_nof_signal_inputs(g_statistics_type : STRING) RETURN NATURAL; FUNCTION func_sdp_get_stat_nof_signal_inputs(g_statistics_type : STRING) RETURN NATURAL;
-- nof_statistics_per_packet = mm_nof_data * mm_data_size / c_sdp_W_statistic_sz -- nof_statistics_per_packet = mm_nof_data * mm_data_size / c_sdp_W_statistic_sz
FUNCTION func_sdp_get_stat_from_mm_user_size(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL; FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_from_mm_step_size(g_statistics_type : STRING) RETURN NATURAL; FUNCTION func_sdp_get_stat_from_mm_step_size(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_from_mm_nof_data(g_statistics_type : STRING) RETURN NATURAL; FUNCTION func_sdp_get_stat_from_mm_nof_data(g_statistics_type : STRING) RETURN NATURAL;
...@@ -578,6 +579,14 @@ PACKAGE BODY sdp_pkg IS ...@@ -578,6 +579,14 @@ PACKAGE BODY sdp_pkg IS
1)); -- SST 1)); -- SST
END func_sdp_get_stat_nof_signal_inputs; END func_sdp_get_stat_nof_signal_inputs;
FUNCTION func_sdp_get_stat_from_mm_user_size(g_statistics_type : STRING) RETURN NATURAL IS
-- see sdp_statistics_offload.vhd for description
BEGIN
RETURN sel_a_b(g_statistics_type="BST", c_sdp_W_statistic_sz, -- = 2
sel_a_b(g_statistics_type="XST", c_nof_complex * c_sdp_W_statistic_sz, -- = 4
c_sdp_W_statistic_sz)); -- = 2, SST
END func_sdp_get_stat_from_mm_user_size;
FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL IS FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL IS
BEGIN BEGIN
RETURN sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_W_statistic_sz, -- = 4 RETURN sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_W_statistic_sz, -- = 4
......
...@@ -30,6 +30,61 @@ ...@@ -30,6 +30,61 @@
-- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD -- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
-- . See 2.9.4 Station Control (L3-SC) - SDP Firmware (L4-SDPFW) -- . See 2.9.4 Station Control (L3-SC) - SDP Firmware (L4-SDPFW)
-- --
-- . endianess
-- Within a 32bit MM word the values are stored with LSByte at lowest byte
-- address (so relative byte address 0) and MSByte at highest byte address
-- (so relative byte address 3). Internally in the RAM the MM words are thus
-- stored with LSByte first, which is called little endian. However,
-- externally the MM words are send with MSByte first, so in the statistics
-- offload header and offload payload the 32bit words are send with MSByte
-- first, which is called big endian.
-- The dp_offload_tx_v3 sends all multi byte header fields in big endian
-- order, hence also the 16bit, 24bit and 64bit values are send MSByte
-- first. The internet packet headers also use big endian, which is
-- therefore also called network order. Hence the entire statistics offload
-- packet is in big endian order.
-- If values are shown with first byte received left and last byte received
-- right, then big endian hex values can directly be interpreted when read
-- by a human, because they are shown in the normal order.
--
-- . g_reverse_word_order
-- The statistics consist of c_sdp_W_statistic_sz = 2 MM words that are
-- with LSWord at low (even) word address and MSWord at high (odd) word
-- address. Default the statistics offload reads the low address first, but
-- the statistics have to be send with MSWord first. Therefore the read
-- order needs to be reversed per statistic value, so g_reverse_word_order
-- = TRUE. The combination of sending the MSWord first and the MSByte first
-- results that the entire 64b statistics words are send in big endian
-- order.
--
-- Stored order:
-- word address: 0, 1, 2, 3
-- SST Ul, Uh
-- BST Xl, Xh, Yl, Yh
-- XST Rl, Rh, Il, Ih
--
-- The g_reverse_word_order = TRUE is needed to achieve have MSWord first
-- and 64bit big endian.
-- The g_user_size defines the number of words that get reversed:
-- . For the SST there is only one uint64 part, so g_user_size = 2.
-- . For the BST the X and Y polarization parts are treated as and array of
-- [N_pol_bf], so index 0 = X is send first and therefore g_user_size = 2
-- to preserve the polarization order.
-- . For the XST the Re and Im complex parts are treated as a cint64, so
-- the imaginary part is send first and therefore g_user_size = 4 to also
-- reverse the Re an Im parts. This is similar as with cint16 values that
-- are packed as Im << 16 + Re in a 32bit word. However it differs from
-- two diminensional arrays of [N_complex], because for arrays index 0
-- is send first and index 0 corresponds to Re.
--
-- The () show the parts that are contained in g_user_size and that got
-- reversed by g_reverse_word_order = TRUE compared to the stored order:
--
-- Transport order: (g_user_size)
-- SST (Uh, Ul), 2
-- BST (Xh, Xl), (Yh, Yl), 2 keep parts order
-- XST (Ih, Il, Rh, Rl), 4 also reverse parts order
--
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
LIBRARY IEEE, common_lib, mm_lib, dp_lib, ring_lib; LIBRARY IEEE, common_lib, mm_lib, dp_lib, ring_lib;
...@@ -106,7 +161,7 @@ ARCHITECTURE str OF sdp_statistics_offload IS ...@@ -106,7 +161,7 @@ ARCHITECTURE str OF sdp_statistics_offload IS
CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf; 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 -- MM access settings per packet for u_dp_block_from_mm_dc
CONSTANT c_mm_user_size : NATURAL := c_sdp_W_statistic_sz; CONSTANT c_mm_user_size : NATURAL := func_sdp_get_stat_from_mm_user_size(g_statistics_type);
CONSTANT c_mm_data_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type); 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_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_nof_data : NATURAL := func_sdp_get_stat_from_mm_nof_data(g_statistics_type);
......
...@@ -114,14 +114,14 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS ...@@ -114,14 +114,14 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
-- RAM dimensions -- RAM dimensions
-- . nof_statistics_per_packet = c_mm_nof_data * c_mm_data_size / c_sdp_W_statistic_sz -- . 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_user_size : NATURAL := func_sdp_get_stat_from_mm_user_size(g_statistics_type);
CONSTANT c_mm_data_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type); 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_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_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_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_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 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. -- Define block timing.
CONSTANT c_bsn_init : NATURAL := 0; CONSTANT c_bsn_init : NATURAL := 0;
...@@ -514,13 +514,13 @@ BEGIN ...@@ -514,13 +514,13 @@ BEGIN
D := S; -- range c_mm_nof_data = 512 Data values, because D := S; -- range c_mm_nof_data = 512 Data values, because
-- c_mm_data_size / c_sdp_W_statistic_sz = 1 -- c_mm_data_size / c_sdp_W_statistic_sz = 1
U := S; -- range c_sdp_N_sub = 512 SST values 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 I := W MOD c_mm_user_size; -- range c_mm_user_size = c_sdp_W_statistic_sz = 2 words
P := rx_packet_cnt; -- range c_nof_packets_max = 12 = c_sdp_S_pn Packets P := rx_packet_cnt; -- range c_nof_packets_max = 12 = c_sdp_S_pn Packets
J := P MOD c_mm_nof_step; -- range c_mm_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; 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 IF I = sel_a_b(g_reverse_word_order, 0, 1) THEN
v_exp_data := v_exp_data + 1; -- due to c_mm_user_size = c_sdp_W_statistic_sz = 2 v_exp_data := v_exp_data + 1; -- due to c_mm_user_size = 2
END IF; END IF;
IF J = 1 THEN IF J = 1 THEN
v_exp_data := v_exp_data + 2; -- due to c_sdp_W_statistic_sz = 2 and c_mm_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
...@@ -545,14 +545,14 @@ BEGIN ...@@ -545,14 +545,14 @@ BEGIN
D := S / c_sdp_N_pol_bf; -- range c_mm_nof_data = 488 Data values, because 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 -- 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 B := D; -- range c_sdp_S_sub_bf = 488 dual polarization BST values
I := W MOD c_sdp_W_statistic_sz; -- range c_sdp_W_statistic_sz = 2 words I := W MOD c_mm_user_size; -- range c_mm_user_size = c_sdp_W_statistic_sz = 2 words
P := rx_packet_cnt; -- range c_nof_packets_max = 1 P := rx_packet_cnt; -- range c_nof_packets_max = 1
v_exp_data := S * c_sdp_W_statistic_sz; v_exp_data := S * c_mm_user_size; -- c_mm_user_size = 2
IF g_reverse_word_order = FALSE THEN IF g_reverse_word_order = FALSE THEN
v_exp_data := v_exp_data + I; v_exp_data := v_exp_data + I;
ELSE ELSE
v_exp_data := v_exp_data - I + c_mm_user_size-1; -- c_mm_user_size = c_sdp_W_statistic_sz = 2 v_exp_data := v_exp_data - I + c_mm_user_size-1;
END IF; END IF;
ASSERT v_exp_data = v_rx_data REPORT "Wrong BST payload data Rx" SEVERITY ERROR; ASSERT v_exp_data = v_rx_data REPORT "Wrong BST payload data Rx" SEVERITY ERROR;
...@@ -586,16 +586,16 @@ BEGIN ...@@ -586,16 +586,16 @@ BEGIN
D := S / c_nof_complex; -- range c_mm_nof_data = 144 Data values, because 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 -- c_mm_data_size / c_sdp_W_statistic_sz = 2 = c_nof_complex
X := D; -- range c_sdp_X_sq = 144 complex XST values X := D; -- range c_sdp_X_sq = 144 complex XST values
I := W MOD c_sdp_W_statistic_sz; -- range c_sdp_W_statistic_sz = 2 words I := W MOD c_mm_user_size; -- range c_mm_user_size = c_nof_complex * c_sdp_W_statistic_sz = 4 words
P := rx_packet_cnt; -- range c_mm_nof_packets P := rx_packet_cnt; -- range c_mm_nof_packets
J := P MOD g_nof_crosslets; -- range g_nof_crosslets J := P MOD g_nof_crosslets; -- range g_nof_crosslets
K := P / g_nof_crosslets; -- range g_P_sq K := P / g_nof_crosslets; -- range g_P_sq
v_exp_data := S * c_sdp_W_statistic_sz; v_exp_data := D * c_mm_user_size;
IF g_reverse_word_order = FALSE THEN IF g_reverse_word_order = FALSE THEN
v_exp_data := v_exp_data + I; v_exp_data := v_exp_data + I;
ELSE ELSE
v_exp_data := v_exp_data - I + c_mm_user_size-1; -- c_mm_user_size = c_sdp_W_statistic_sz = 2 v_exp_data := v_exp_data - I + c_mm_user_size-1; -- c_mm_user_size = 4
END IF; END IF;
v_exp_data := v_exp_data + J * c_packet_size; -- c_packet_size = 576 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 v_exp_data := v_exp_data + K * c_mm_Xsq_span; -- c_mm_Xsq_span = 4096
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment