diff --git a/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd b/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd index 5196dec8760d16e753405a7fcd2b0e70add4cb61..c5296dcf395df3dd9f0e7735c2e4b644d0107933 100644 --- a/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd +++ b/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd @@ -799,8 +799,9 @@ BEGIN ram_st_xsq_cipo => ram_st_xsq_cipo ); + -- Use gn_id = ID MOD 32, so map ID to 0:31 range (c_disturb_W_gn_id = 5) + gn_id <= ID(c_disturb_W_gn_id-1 DOWNTO 0); - gn_id <= ID(c_disturb_W_gn_id-1 DOWNTO 0); ----------------------------------------------------------------------------- -- disturb nodes ----------------------------------------------------------------------------- diff --git a/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd b/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd index fb50b588a5d8195e86af0af60abdc43bcba33b16..87c09eda8b0fa95f9dd8a4975722bf9c3bf6de77 100644 --- a/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd +++ b/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd @@ -52,12 +52,11 @@ ENTITY disturb_info IS reg_miso : OUT t_mem_miso; -- inputs from other blocks - gn_index : IN NATURAL; f_adc : IN STD_LOGIC; fsub_type : IN STD_LOGIC; -- disturb info - disturb_info : OUT t_disturb_info + disturb_info : OUT t_disturb_info ); END disturb_info; diff --git a/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd b/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd index d9a2456e73639ff491f4f01134575cef5f1deaa8..e8764f458cc2e131c1b1313830b9c6d457083138 100644 --- a/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd +++ b/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd @@ -95,7 +95,7 @@ PACKAGE disturb_pkg is CONSTANT c_disturb_W_crosslet : NATURAL := 16; CONSTANT c_disturb_W_beamlet_sum : NATURAL := 18; CONSTANT c_disturb_W_beamlet : NATURAL := 8; - CONSTANT c_disturb_W_gn_id : NATURAL := 5; + CONSTANT c_disturb_W_gn_id : NATURAL := 5; -- Use gn_id = ID MOD 32, so map ID to 0:31 range (2**5 = 32) CONSTANT c_disturb_W_statistic : NATURAL := 64; CONSTANT c_disturb_W_statistic_sz : NATURAL := 2; -- = c_disturb_W_statistic / c_word_w CONSTANT c_disturb_W_sub_weight : NATURAL := 16; -- = w in s(w, p), s = signed @@ -183,8 +183,9 @@ PACKAGE disturb_pkg is -- https://git.astron.nl/desp/hdl/-/blob/master/boards/uniboard2b/libraries/unb2b_board/src/vhdl/ctrl_unb2b_board.vhd -- Can use same offload time for all statistics, because 1GbE mux will combine them + -- see https://support.astron.nl/confluence/display/L2M/L3+SDP+Testing+Notebook%3A+Statistics+offload --CONSTANT c_disturb_offload_time : NATURAL := 13000; -- from wave window 62855nS / 5nS = 12571 cycles. - CONSTANT c_disturb_offload_time : NATURAL := 600000; -- see L2SDP-452 + CONSTANT c_disturb_offload_time : NATURAL := 600000; -- 600000 * 5 ns = 3 ms, so gn 31 starts after 93 ms -- packet lengths, see ICD SC-SDP CONSTANT c_disturb_nof_bytes_per_statistic : NATURAL := 8; -- c_disturb_W_statistic_sz * c_word_sz = 2 * 4 = 8 diff --git a/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd b/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd index 40ae21aa8c68a9bc1c324c864f869850f8113192..76da0893816500eec9b755aa0fc7467902cc037b 100644 --- a/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd +++ b/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd @@ -409,8 +409,9 @@ ARCHITECTURE str OF disturb_station IS CONSTANT c_ring_1_if_offset : NATURAL := 2; -- RING_1 signals are indexed at c_nof_if * I + 2. CONSTANT c_nof_mac : NATURAL := 12; -- Using 9 out of 12 (this is NOT optimized away during synthesis), must match one of the MAC IP variations, e.g. 1, 3, 4, 12, 24, 48 - SIGNAL gn_index : NATURAL := 0; - SIGNAL this_rn : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); + SIGNAL gn_index : NATURAL := 0; -- range 0:31 (c_disturb_W_gn_id = 5) + SIGNAL this_rn : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); + ---------------------------------------------- -- BF ---------------------------------------------- @@ -538,16 +539,16 @@ ARCHITECTURE str OF disturb_station IS SIGNAL bst_udp_src_port : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0); SIGNAL xst_udp_src_port : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0); - SIGNAL disturb_info : t_disturb_info := c_disturb_info_rst; + SIGNAL disturb_info : t_disturb_info := c_disturb_info_rst; SIGNAL ring_info : t_ring_info; - BEGIN + gn_index <= TO_UINT(gn_id); + ----------------------------------------------------------------------------- -- SDP Info register ----------------------------------------------------------------------------- - gn_index <= TO_UINT(gn_id); -- derive MAC, IP and UDP Port cep_eth_src_mac <= c_disturb_cep_eth_src_mac_47_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & RESIZE_UVEC(this_chip_id, c_byte_w); -- Simply use chip_id since we only use 1 of the 6*4 = 24 10GbE port. cep_ip_src_addr <= c_disturb_cep_ip_src_addr_31_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & INCR_UVEC(RESIZE_UVEC(this_chip_id, c_byte_w), 1); -- +1 to avoid IP = *.*.*.0 @@ -572,7 +573,6 @@ BEGIN reg_miso => reg_disturb_info_cipo, -- inputs from other blocks - gn_index => gn_index, f_adc => c_f_adc, fsub_type => c_fsub_type, @@ -584,6 +584,9 @@ BEGIN -- Ring info ----------------------------------------------------------------------------- u_ring_info : ENTITY ring_lib.ring_info + GENERIC MAP ( + g_ring_info_O_rn_w => c_disturb_W_gn_id -- wrap O_rn to gn_index range + ) PORT MAP ( mm_rst => mm_rst, mm_clk => mm_clk, diff --git a/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd b/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd index d73b62312ae3d9e2bfd8ff35ad65fa77c925d475..eb3706b84b91e7187117f873714a51f846b0de89 100644 --- a/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd +++ b/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd @@ -72,7 +72,6 @@ ARCHITECTURE tb OF tb_disturb_info IS SIGNAL reg_miso : t_mem_miso; -- signals used to change settings of disturb_info - SIGNAL gn_index : NATURAL := 15; SIGNAL f_adc : STD_LOGIC := '0'; SIGNAL fsub_type : STD_LOGIC := '0'; @@ -225,7 +224,6 @@ BEGIN reg_mosi => reg_mosi, reg_miso => reg_miso, - gn_index => gn_index, f_adc => f_adc, fsub_type => fsub_type, diff --git a/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd b/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd index 8d69605e8dea2e6d33de389dbcc854503753b70f..d6d240b2e8f67554150a3daab9bf2d7684bbe314 100644 --- a/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd @@ -750,6 +750,7 @@ BEGIN ring_info => ring_info ); + -- Use full c_byte_w range of ID for gn_index and ring_info.O_rn gn_index <= TO_UINT(ID); this_rn <= TO_UVEC(gn_index - TO_UINT(ring_info.O_rn), c_byte_w) WHEN rising_edge(dp_clk); -- Using register to ease timing closure. 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 ed8aa99838b2caecf441bcca6ed632ee80d56b38..a5f605b3520af98c62aa61a552bad970cc807c3a 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 @@ -797,7 +797,9 @@ BEGIN ); - gn_id <= ID(c_sdp_W_gn_id-1 DOWNTO 0); + -- Use gn_id = ID MOD 32, so map ID to 0:31 range (c_sdp_W_gn_id = 5) + gn_id <= ID(c_sdp_W_gn_id-1 DOWNTO 0); + ----------------------------------------------------------------------------- -- sdp nodes ----------------------------------------------------------------------------- diff --git a/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd b/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd index ef5867134bb4f7251ee7b4fb0a0ae828cac3bdb4..11260553a0c6d9c0f8c4ebf6b505072db71ab067 100644 --- a/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd @@ -716,6 +716,7 @@ BEGIN ring_info => ring_info ); + -- Use full c_byte_w range of ID for gn_index and ring_info.O_rn gn_index <= TO_UINT(ID); this_rn <= TO_UVEC(gn_index - TO_UINT(ring_info.O_rn), c_byte_w) WHEN rising_edge(dp_clk); -- Using register to ease timing closure. diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd index b4b4601ea9be41cef8a0cf7262862d7bc412fe5f..1ef4c3b4ab9444431c638f49ef5a2d7289010c23 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd @@ -763,8 +763,9 @@ BEGIN ram_st_xsq_cipo => ram_st_xsq_cipo ); + -- Use gn_id = ID MOD 32, so map ID to 0:31 range (c_sdp_W_gn_id = 5) + gn_id <= ID(c_sdp_W_gn_id-1 DOWNTO 0); - gn_id <= ID(c_sdp_W_gn_id-1 DOWNTO 0); ----------------------------------------------------------------------------- -- sdp nodes ----------------------------------------------------------------------------- diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd index b1972f74aa3ad94953a3dcdb1587725903982b5c..e94ce343eca19537f3c2d7b261c7f9e187b5471d 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd @@ -132,11 +132,14 @@ ARCHITECTURE str OF node_sdp_beamformer IS SIGNAL scope_bf_out_sosi_arr : t_dp_sosi_integer_arr(c_sdp_N_pol_bf-1 DOWNTO 0); SIGNAL beamlet_scale : STD_LOGIC_VECTOR(c_sdp_W_beamlet_scale-1 DOWNTO 0); - SIGNAL rn_index : NATURAL RANGE 0 TO c_sdp_N_pn_max-1 := 0; + SIGNAL rn_index : NATURAL RANGE 0 TO c_sdp_N_pn_max-1 := 0; + SIGNAL ref_sync : STD_LOGIC; BEGIN - rn_index <= TO_UINT(SUB_UVEC(gn_id, ring_info.O_rn)) WHEN rising_edge(dp_clk); -- Using register to ease timing closure. + -- Use register to ease timing closure. + rn_index <= TO_UINT(SUB_UVEC(gn_id, ring_info.O_rn)) WHEN rising_edge(dp_clk); + ref_sync <= in_sosi_arr(0).sync WHEN rising_edge(dp_clk); --------------------------------------------------------------- -- Beamlet Subband Select @@ -297,7 +300,7 @@ BEGIN -- Streaming clock domain dp_rst => dp_rst, dp_clk => dp_clk, - ref_sync => mon_bf_udp_sosi.sync, + ref_sync => ref_sync, in_sosi_arr(0) => mon_bf_udp_sosi ); 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 d7467674f8b7a78d568da9ea681077fe0a62cde1..56b2b2c35ba01da8bc9f60d83683b7eed9e28b71 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd @@ -485,8 +485,8 @@ BEGIN sdp_info => sdp_info, weighted_subbands_flag => '1', -- because XSub uses in_sosi_arr = fsub_sosi_arr, so weighted subbands - nof_crosslets => nof_crosslets, - crosslets_info_rec => prev_crosslets_info_rec + nof_crosslets => nof_crosslets, -- from MM + prev_crosslets_info_rec => prev_crosslets_info_rec ); END str; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd index 2e9acfb004d6e586a1e032f21cabccc6994b5646..3873d035fc0fd618afe26587fcd3a27ea9f8de0b 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd @@ -33,9 +33,12 @@ -- The prev_crosslets_info identifies the crosslets that were calculated -- during the previous out_sosi.sync interval, so the XST for those crosslets -- are then pending to be offloaded. --- * The new_interval is active before the first out_sosi.sync and inactive --- before the next out_sosi.sync, so it can be used to know when a new --- sequence of out_sosi.sync intervals starts. +-- * The new_interval is active during the first in_sosi_arr.sync interval. The +-- out_sosi.sync is active one sop period after the in_sosi_arr.sync. Hence +-- the new_interval is active about one block before the first out_sosi.sync +-- and inactive about one block before the next out_sosi.sync, so +-- new_interval can be used to know when a new sequence of out_sosi.sync +-- intervals starts. -- Remark: -- . See L5 SDPFW Design Document: Subband Correlator -- Link: https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=L2M&title=L5+SDPFW+Design+Document%3A+Subband+Correlator diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd index 1e8aa33621e61ec599f4068f2e75a1e0be9bc327..9a81eccb020d86a917b979b79c36702519bd4a86 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd @@ -52,7 +52,6 @@ ENTITY sdp_info IS reg_miso : OUT t_mem_miso; -- inputs from other blocks - gn_index : IN NATURAL; f_adc : IN STD_LOGIC; fsub_type : IN STD_LOGIC; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd index 1f392030b12ec07086cbf4db03e3f304d44545a5..8435ef4163ca221cb5376635be90f1760e96bfe9 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd @@ -94,7 +94,7 @@ PACKAGE sdp_pkg is CONSTANT c_sdp_W_crosslet : NATURAL := 16; CONSTANT c_sdp_W_beamlet_sum : NATURAL := 18; CONSTANT c_sdp_W_beamlet : NATURAL := 8; - CONSTANT c_sdp_W_gn_id : NATURAL := 5; + CONSTANT c_sdp_W_gn_id : NATURAL := 5; -- Use gn_id = ID MOD 32, so map ID to 0:31 range (2**5 = 32) CONSTANT c_sdp_W_statistic : NATURAL := 64; CONSTANT c_sdp_W_statistic_sz : NATURAL := 2; -- = c_sdp_W_statistic / c_word_w CONSTANT c_sdp_W_sub_weight : NATURAL := 16; -- = w in s(w, p), s = signed @@ -189,8 +189,9 @@ PACKAGE sdp_pkg is -- https://git.astron.nl/desp/hdl/-/blob/master/boards/uniboard2b/libraries/unb2b_board/src/vhdl/ctrl_unb2b_board.vhd -- Can use same offload time for all statistics, because 1GbE mux will combine them + -- see https://support.astron.nl/confluence/display/L2M/L3+SDP+Testing+Notebook%3A+Statistics+offload --CONSTANT c_sdp_offload_time : NATURAL := 13000; -- from wave window 62855nS / 5nS = 12571 cycles. - CONSTANT c_sdp_offload_time : NATURAL := 600000; -- see L2SDP-452 + CONSTANT c_sdp_offload_time : NATURAL := 600000; -- 600000 * 5 ns = 3 ms, so gn 31 starts after 93 ms -- packet lengths, see ICD SC-SDP CONSTANT c_sdp_nof_bytes_per_statistic : NATURAL := 8; -- c_sdp_W_statistic_sz * c_word_sz = 2 * 4 = 8 diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd index 7455fcaf62c5127110fd4ff974b0c1d6a6187b3d..9260356e07c5ae4dc0ae0cb67188bfc601653dc5 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd @@ -65,9 +65,9 @@ ENTITY sdp_station IS dp_clk : IN STD_LOGIC; -- ID - gn_id : IN STD_LOGIC_VECTOR(c_sdp_W_gn_id-1 DOWNTO 0); - this_bck_id : IN STD_LOGIC_VECTOR(6-1 DOWNTO 0); - this_chip_id : IN STD_LOGIC_VECTOR(2-1 DOWNTO 0); + gn_id : IN STD_LOGIC_VECTOR(c_sdp_W_gn_id-1 DOWNTO 0); -- used for udp src port + this_bck_id : IN STD_LOGIC_VECTOR(6-1 DOWNTO 0); -- used for src mac / ip + this_chip_id : IN STD_LOGIC_VECTOR(2-1 DOWNTO 0); -- used for src mac / ip -- Transceiver clocks SA_CLK : IN STD_LOGIC := '0'; -- Clock 10GbE front (qsfp) and ring lines @@ -421,7 +421,7 @@ ARCHITECTURE str OF sdp_station IS CONSTANT c_ring_1_if_offset : NATURAL := 2; -- RING_1 signals are indexed at c_nof_if * I + 2. CONSTANT c_ring_nof_mac : NATURAL := 12; -- Using 9 out of 12 (this is NOT optimized away during synthesis), must match one of the MAC IP variations, e.g. 1, 3, 4, 12, 24, 48 - SIGNAL gn_index : NATURAL := 0; + SIGNAL gn_index : NATURAL := 0; -- range 0:31 (c_sdp_W_gn_id = 5) SIGNAL this_rn : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); SIGNAL sdp_info : t_sdp_info := c_sdp_info_rst; @@ -559,10 +559,11 @@ ARCHITECTURE str OF sdp_station IS BEGIN + gn_index <= TO_UINT(gn_id); + ----------------------------------------------------------------------------- -- SDP Info register ----------------------------------------------------------------------------- - gn_index <= TO_UINT(gn_id); -- derive MAC, IP and UDP Port cep_eth_src_mac <= c_sdp_cep_eth_src_mac_47_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & RESIZE_UVEC(this_chip_id, c_byte_w); -- Simply use chip_id since we only use 1 of the 6*4 = 24 10GbE port. cep_ip_src_addr <= c_sdp_cep_ip_src_addr_31_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & INCR_UVEC(RESIZE_UVEC(this_chip_id, c_byte_w), 1); -- +1 to avoid IP = *.*.*.0 @@ -587,7 +588,6 @@ BEGIN reg_miso => reg_sdp_info_cipo, -- inputs from other blocks - gn_index => gn_index, f_adc => c_f_adc, fsub_type => c_fsub_type, @@ -599,6 +599,9 @@ BEGIN -- Ring info ----------------------------------------------------------------------------- u_ring_info : ENTITY ring_lib.ring_info + GENERIC MAP ( + g_ring_info_O_rn_w => c_sdp_W_gn_id -- wrap O_rn to gn_index range + ) PORT MAP ( mm_rst => mm_rst, mm_clk => mm_clk, 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 b9815e98407b87317b19f63ed24da1f6c0b7fc98..40a078a306a943b1d30d856ab94704e7f9c16331 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -84,13 +84,13 @@ -- BST (Xh, Xl), (Yh, Yl), 2 keep X, Y parts order -- XST (Rh, Rl), (Ih, Il), 2 keep Re, Im parts order -- --- . g_P_sq and nof_used_P_sq +-- . g_P_sq and p.nof_used_P_sq -- The g_P_sq defines the number of correlator cells that is available in -- the SDPFW. Use generic to support P_sq = 1 for one node and P_sq = -- c_sdp_P_sq for multiple nodes (with ring). --- The nof_used_P_sq is the number of correlator cells that is actually +-- The p.nof_used_P_sq is the number of correlator cells that is actually -- used and that will output XST packets. Unused correlator cells yield --- zero data that should not be output. The nof_used_P_sq is the smallest +-- zero data that should not be output. The p.nof_used_P_sq is the smallest -- of g_P_sq and ring_info.N_rn/2 + 1. In this way the XST offload can work -- with g_P_sq = 1 when N_rn > 1 and also in a ring with N_rn < N_pn when -- g_P_sq = 9. @@ -158,8 +158,8 @@ ENTITY sdp_statistics_offload IS sdp_info : IN t_sdp_info; weighted_subbands_flag : IN STD_LOGIC := '0'; - nof_crosslets : IN STD_LOGIC_VECTOR(c_sdp_nof_crosslets_reg_w-1 DOWNTO 0) := (OTHERS => '0'); - crosslets_info_rec : IN t_sdp_crosslets_info := c_sdp_crosslets_info_rst + nof_crosslets : IN STD_LOGIC_VECTOR(c_sdp_nof_crosslets_reg_w-1 DOWNTO 0) := (OTHERS => '0'); -- from MM + prev_crosslets_info_rec : IN t_sdp_crosslets_info := c_sdp_crosslets_info_rst ); END sdp_statistics_offload; @@ -185,43 +185,57 @@ ARCHITECTURE str OF sdp_statistics_offload IS 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; - -- offload control + -- Parameters that are fixed per node + TYPE t_parameters IS RECORD + gn_index : NATURAL; -- index of this global node + pn_index : NATURAL; -- index of this node in antenna band + rn_index : NATURAL; -- index of this ring node + local_si_offset : NATURAL; -- index of first signal input on this node + remote_rn : NATURAL; -- index of remote ring node + remote_gn : NATURAL; -- index of remote global node + remote_pn : NATURAL; -- index of remote node in antenna band + remote_si_offset : NATURAL; -- index of first signal input on remote node + nof_cycles_dly : NATURAL; -- trigger_offload delay for this node + offset_rn : NATURAL; -- = ring_info.O_rn, GN index of first ring node + nof_rn : NATURAL; -- = ring_info.N_rn, number of GN in the ring + nof_used_P_sq : NATURAL; -- number of used correlator cells <= g_P_sq (is number of available correlator cells) + END RECORD; + + -- Input capture per sync interval + TYPE t_input IS RECORD + nof_crosslets : NATURAL RANGE 0 TO c_sdp_N_crosslets_max; -- nof_crosslets from MM + nof_packets : NATURAL; -- nof XST offload packets per integration interval dependend on nof_crosslets + bsn_at_sync : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); + integration_interval : NATURAL; + crosslets_info_rec : t_sdp_crosslets_info; + sop_cnt : NATURAL; + payload_err : STD_LOGIC; + END RECORD; + + -- Offload control TYPE t_reg IS RECORD packet_count : NATURAL RANGE 0 TO c_nof_packets_max; start_address : NATURAL RANGE 0 TO c_mm_ram_size; start_pulse : STD_LOGIC; start_sync : STD_LOGIC; dp_header_info : STD_LOGIC_VECTOR(1023 DOWNTO 0); - payload_err : STD_LOGIC; - in_sop_cnt : NATURAL; - integration_interval : NATURAL; interleave_count : NATURAL RANGE 0 TO c_sdp_Q_fft; interleave_address : NATURAL RANGE 0 TO c_mm_ram_size; crosslet_count : NATURAL RANGE 0 TO c_sdp_N_crosslets_max; instance_count : NATURAL RANGE 0 TO c_sdp_P_sq; instance_address : NATURAL RANGE 0 TO c_mm_ram_size; - nof_crosslets : NATURAL RANGE 0 TO c_sdp_N_crosslets_max; - crosslets_info_rec : t_sdp_crosslets_info; END RECORD; - CONSTANT c_reg_rst : t_reg := (0, 0, '0', '0', (OTHERS => '0'), '0', 0, 0, 0, 0, 0, 0, 0, 0, c_sdp_crosslets_info_rst); - - SIGNAL r : t_reg; - SIGNAL nxt_r : t_reg; - - SIGNAL gn_index_reg : NATURAL; -- index of this global node - SIGNAL pn_index : NATURAL; -- index of this node in antenna band - SIGNAL rn_index : NATURAL; -- index of this ring node - SIGNAL local_si_offset : NATURAL; -- index of first signal input on this node - SIGNAL remote_rn : NATURAL; -- index of remote ring node - SIGNAL remote_gn : NATURAL; -- index of remote global node - SIGNAL remote_pn : NATURAL; -- index of remote node in antenna band - SIGNAL remote_si_offset : NATURAL; -- index of first signal input on remote node - SIGNAL nof_cycles_dly : NATURAL; -- trigger_offload delay for this node - SIGNAL offset_rn : NATURAL; -- = ring_info.O_rn, GN index of first ring node - SIGNAL nof_rn : NATURAL; -- = ring_info.N_rn, number of GN in the ring - SIGNAL nof_used_P_sq : NATURAL; -- number of used correlator cells <= g_P_sq (is number of available correlator cells) - SIGNAL nof_packets : NATURAL; -- nof XST offload packets per integration interval + CONSTANT c_reg_rst : t_reg := (0, 0, '0', '0', (OTHERS => '0'), 0, 0, 0, 0, 0); + + SIGNAL p : t_parameters; + + SIGNAL reg_input : t_input; + SIGNAL prev_input : t_input; + SIGNAL hdr_input : t_input; + + SIGNAL r : t_reg; + SIGNAL nxt_r : t_reg; SIGNAL data_id_rec : t_sdp_stat_data_id; SIGNAL data_id_slv : STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0'); @@ -239,7 +253,6 @@ ARCHITECTURE str OF sdp_statistics_offload IS SIGNAL udp_sosi : t_dp_sosi; - SIGNAL bsn_at_sync : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := (OTHERS => '0'); SIGNAL dp_header_info : STD_LOGIC_VECTOR(1023 DOWNTO 0):= (OTHERS => '0'); SIGNAL r_dp_header_sop : STD_LOGIC; SIGNAL r_dp_header_rec : t_sdp_stat_header; @@ -258,8 +271,6 @@ ARCHITECTURE str OF sdp_statistics_offload IS BEGIN - bsn_at_sync <= RESIZE_UVEC(in_sosi.bsn, c_dp_stream_bsn_w) WHEN rising_edge(dp_clk) AND in_sosi.sync = '1'; - ------------------------------------------------------------------------------- -- Assemble offload header info, for data path fields that are selected by: -- c_sdp_stat_hdr_field_sel = "1"&"101"&"111011111001"&"0100"&"0100"&"000000010"&"1000000"&"0" @@ -300,17 +311,17 @@ BEGIN dp_header_info(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; dp_header_info(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" )) <= SLV(sdp_info.f_adc); dp_header_info(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" )) <= SLV(sdp_info.fsub_type); - dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_payload_error" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_payload_error" )) <= SLV(r.payload_err); + dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_payload_error" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_payload_error" )) <= SLV(hdr_input.payload_err); dp_header_info(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" )) <= SLV(sdp_info.beam_repositioning_flag); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_weighted_subbands_flag" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_source_info_weighted_subbands_flag" )) <= SLV(weighted_subbands_flag); - dp_header_info(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); - dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_integration_interval" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_integration_interval" )) <= TO_UVEC(r.integration_interval, 24); + dp_header_info(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(p.gn_index, 5); + dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_integration_interval" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_integration_interval" )) <= TO_UVEC(hdr_input.integration_interval, 24); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id" )) <= data_id_slv; dp_header_info(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); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistic" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistic" )) <= TO_UVEC(c_sdp_nof_bytes_per_statistic, 8); dp_header_info(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); dp_header_info(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; - dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "dp_bsn" )) <= bsn_at_sync; + dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "dp_bsn" )) <= hdr_input.bsn_at_sync; p_reg : PROCESS(dp_rst, dp_clk) BEGIN @@ -321,81 +332,105 @@ BEGIN END IF; END PROCESS; - -- Derive and pipeline dynamic parameters - p_parameters : PROCESS(dp_clk) + -- Derive and pipeline dynamic parameters that depend on node id and MM, but are otherwise fixed + -- . gn_index and ring_info.O_rn are in 0:31 range defined by c_sdp_W_gn_id = 5 + -- . O_rn is first GN index in ring, so O_rn <= gn_index + -- . c_sdp_offload_time = 600000 * 5 ns = 3 ms, so for max gn_index = 31 the + -- offload starts after 93 ms, to just fit within XST T_int min is 100 ms. + p_reg_parameters : PROCESS(dp_clk) BEGIN IF rising_edge(dp_clk) THEN - gn_index_reg <= gn_index; - pn_index <= func_sdp_gn_index_to_pn_index(gn_index_reg); - offset_rn <= TO_UINT(ring_info.O_rn); - rn_index <= gn_index_reg - offset_rn; - local_si_offset <= pn_index * c_sdp_S_pn; - nof_cycles_dly <= gn_index_reg * g_offload_time; - nof_rn <= TO_UINT(ring_info.N_rn); - nof_used_P_sq <= smallest(nof_rn / 2 + 1, g_P_sq); - nof_packets <= func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, nof_used_P_sq, r.nof_crosslets); - remote_rn <= func_ring_nof_hops_to_source_rn(r.instance_count, rn_index, nof_rn, g_crosslets_direction); - remote_gn <= offset_rn + remote_rn; - remote_pn <= func_sdp_gn_index_to_pn_index(remote_gn); - remote_si_offset <= remote_pn * c_sdp_S_pn; + p.gn_index <= gn_index; + p.pn_index <= func_sdp_gn_index_to_pn_index(p.gn_index); + p.offset_rn <= TO_UINT(ring_info.O_rn); + p.rn_index <= p.gn_index - p.offset_rn; + p.local_si_offset <= p.pn_index * c_sdp_S_pn; + p.nof_cycles_dly <= p.gn_index * g_offload_time; + p.nof_rn <= TO_UINT(ring_info.N_rn); + p.nof_used_P_sq <= smallest(p.nof_rn / 2 + 1, g_P_sq); + p.remote_rn <= func_ring_nof_hops_to_source_rn(r.instance_count, p.rn_index, p.nof_rn, g_crosslets_direction); + p.remote_gn <= p.offset_rn + p.remote_rn; + p.remote_pn <= func_sdp_gn_index_to_pn_index(p.remote_gn); + p.remote_si_offset <= p.remote_pn * c_sdp_S_pn; + END IF; + END PROCESS; + + -- Determine info from previous sync interval in which the statistics were + -- measured. + -- . hold nof_crosslets from MM (and related nof_packets) per sync interval + -- . capture bsn_at_sync at start of a sync interval + -- . count number of sop that occur in a sync interval, to determine the + -- actual number of sop for the previous integration_interval + -- . track whether payload errors occur in a sync interval, to determine + -- the payload_err flag for the previous integration_interval + p_input_capture : PROCESS(dp_clk) + BEGIN + IF rising_edge(dp_clk) THEN + -- Capture input + IF in_sosi.sync = '1' THEN + reg_input.nof_crosslets <= TO_UINT(nof_crosslets); + reg_input.bsn_at_sync <= in_sosi.bsn; + reg_input.integration_interval <= reg_input.sop_cnt + 1; -- size = index + 1 + reg_input.crosslets_info_rec <= prev_crosslets_info_rec; + reg_input.sop_cnt <= 0; + reg_input.payload_err <= '0'; + ELSIF in_sosi.sop = '1' THEN + reg_input.sop_cnt <= reg_input.sop_cnt + 1; + ELSIF in_sosi.eop = '1' THEN + reg_input.payload_err <= reg_input.payload_err OR in_sosi.err(0); + END IF; + reg_input.nof_packets <= func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, p.nof_used_P_sq, reg_input.nof_crosslets); + + -- Determine previous sync interval info + -- . just register when the value suits any sync interval + prev_input.nof_crosslets <= reg_input.nof_crosslets; + prev_input.nof_packets <= reg_input.nof_packets; + -- . register at sync to get value for previous sync interval + IF in_sosi.sync = '1' THEN + prev_input.bsn_at_sync <= reg_input.bsn_at_sync; + END IF; + -- . just register when the value already is for the previous sync interval + prev_input.integration_interval <= reg_input.integration_interval; + prev_input.crosslets_info_rec <= reg_input.crosslets_info_rec; + prev_input.sop_cnt <= reg_input.sop_cnt; + prev_input.payload_err <= reg_input.payload_err; + + -- Hold previous sync interval info at trigger_offload, so that + -- hdr_input can be used in p_control_packet_offload and + -- dp_header_info. + IF trigger_offload = '1' THEN + hdr_input <= prev_input; + END IF; END IF; END PROCESS; -- Assign application header data_id for different statistic types, use -- GENERATE to keep unused fields at 0 (all fields are NATURAL, so default to 0). gen_data_id_sst : IF g_statistics_type = "SST" GENERATE - data_id_rec.sst_signal_input_index <= r.packet_count + local_si_offset; + data_id_rec.sst_signal_input_index <= r.packet_count + p.local_si_offset; END GENERATE; gen_data_id_bst : IF g_statistics_type = "BST" GENERATE data_id_rec.bst_beamlet_index <= c_beamlet_id; END GENERATE; gen_data_id_xst : IF g_statistics_type = "XST" GENERATE - data_id_rec.xst_subband_index <= func_sdp_modulo_N_sub(r.crosslets_info_rec.offset_arr(r.crosslet_count)); - data_id_rec.xst_signal_input_A_index <= local_si_offset; - data_id_rec.xst_signal_input_B_index <= remote_si_offset; + data_id_rec.xst_subband_index <= func_sdp_modulo_N_sub(hdr_input.crosslets_info_rec.offset_arr(r.crosslet_count)); + data_id_rec.xst_signal_input_A_index <= p.local_si_offset; + data_id_rec.xst_signal_input_B_index <= p.remote_si_offset; END GENERATE; data_id_slv <= func_sdp_map_stat_data_id(g_statistics_type, data_id_rec); - p_control_packet_offload : PROCESS(r, in_sosi, nof_crosslets, crosslets_info_rec, trigger_offload, dp_sop, dp_header_info, nof_packets) -- in order of appearance + -- sensitivity list in order of appearance + p_control_packet_offload : PROCESS(r, trigger_offload, dp_sop, dp_header_info, reg_input) VARIABLE v : t_reg; VARIABLE v_index : NATURAL; BEGIN v := r; v.start_pulse := '0'; v.start_sync := '0'; - - -- Count number of sop in a sync interval and get payload errors and keep them till next sync. - IF in_sosi.sync = '1' THEN - v.integration_interval := r.in_sop_cnt + 1; -- count = index + 1 - v.in_sop_cnt := 0; - v.payload_err := '0'; - ELSE - IF in_sosi.eop = '1' THEN - v.payload_err := r.payload_err OR in_sosi.err(0); - END IF; - - IF in_sosi.sop = '1' THEN - v.in_sop_cnt := r.in_sop_cnt + 1; - END IF; - END IF; - - -- For XST offload capture nof_crosslets and crosslets_info_rec at in_sosi.sync, - -- to make sure they do not change during packets offload. - -- . The sdp_crosslets_subband_select.vhd in [2] takes care that - -- nof_crosslets and crosslets_info_rec are valid at the xsel_sosi.sync. The - -- mmp_dp_bsn_align_v2 in [2] then aligns the local xsel_sosi with the - -- remote data and passes on the sync. After some latency the sync - -- arrives at the sdp_statistics_offload. This latency is very short - -- compared to the sync period, so the nof_crosslets and crosslets_info_rec - -- are still valid at the in_sosi.sync. - IF in_sosi.sync = '1' THEN - v.nof_crosslets := TO_UINT(nof_crosslets); - v.crosslets_info_rec := crosslets_info_rec; - END IF; - -- The trigger_offload occurs nof_cycles_dly after the in_sosi.sync and the - -- offload will have finished before the next in_sosi.sync, because + -- The trigger_offload occurs p.nof_cycles_dly after the in_sosi.sync and + -- the offload will have finished before the next in_sosi.sync, because -- c_sdp_offload_time is such that all offload will finish within 100 ms -- and the integration interval (= sync interval) is 1 s for SST and BST -- and minimal 0.1s (= c_sdp_xst_nof_clk_per_sync_min) for XST. @@ -428,7 +463,7 @@ BEGIN v.dp_header_info := dp_header_info; -- Start next packets offload. - IF r.packet_count < nof_packets - 1 THEN + IF r.packet_count < reg_input.nof_packets - 1 THEN IF g_statistics_type = "SST" THEN -- step step step step step step -- start_address : 0, 2, 2048, 2050, 4096, 4098, 6144, 6146, 8192, 8194, 10240, 10242 @@ -448,7 +483,8 @@ BEGIN ELSIF g_statistics_type = "XST" THEN -- start_address: - -- nof_crosslets: 1, 2, 3, 4, 5, 6, 7 + -- reg_input.nof_crosslets: + -- 1, 2, 3, 4, 5, 6, 7 -- X_sq instance: -- 0 0, 576, 1152, 1728, 2304, 2880, 3456 -- 1 4096, 4672, 5248, 5824, 6400, 6976, 7552 @@ -461,7 +497,7 @@ BEGIN -- 8 32768, 33344, 33920, 34496, 35072, 35648, 36224 v.start_address := r.start_address + c_sdp_X_sq * c_nof_complex * c_sdp_W_statistic_sz; -- continue with next packet in this instance v.crosslet_count := r.crosslet_count + 1; - IF r.crosslet_count = TO_UINT(nof_crosslets) - 1 THEN + IF r.crosslet_count = reg_input.nof_crosslets - 1 THEN v.start_address := r.instance_address + 2**c_sdp_ram_st_xsq_addr_w; -- jump to first packet in next instance v.crosslet_count := 0; v.instance_count := r.instance_count + 1; @@ -498,7 +534,7 @@ BEGIN reg_enable_mosi => reg_enable_mosi, reg_enable_miso => reg_enable_miso, - delay => nof_cycles_dly, + delay => p.nof_cycles_dly, trigger => in_trigger, trigger_en => trigger_en, trigger_dly => trigger_offload @@ -522,7 +558,7 @@ BEGIN mm_clk => mm_clk, start_pulse => r.start_pulse, sync_in => r.start_sync, - bsn_at_sync => bsn_at_sync, + bsn_at_sync => hdr_input.bsn_at_sync, start_address => r.start_address, mm_mosi => master_mosi, mm_miso => master_miso, @@ -551,7 +587,7 @@ BEGIN src_out => dp_offload_snk_in ); - -- The bsn_at_sync is passed on via r.dp_header_info so that + -- The hdr_input.bsn_at_sync is passed on via r.dp_header_info so that -- u_dp_offload_tx_v3 can put it in the udp_sosi header. -- The dp_offload_snk_in.bsn that is passed on by u_dp_block_from_mm_dc is -- in fact not used, but useful to see in udp_sosi.bsn in the Wave Window. diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd index 552b5ee8f28d839ba42a1d43be788724fcc18cb0..d775dbcc8e7f00878b786be46003d6e5674fc46a 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd @@ -72,7 +72,6 @@ ARCHITECTURE tb OF tb_sdp_info IS SIGNAL reg_miso : t_mem_miso; -- signals used to change settings of sdp_info - SIGNAL gn_index : NATURAL := 15; SIGNAL f_adc : STD_LOGIC := '0'; SIGNAL fsub_type : STD_LOGIC := '0'; @@ -225,7 +224,6 @@ BEGIN reg_mosi => reg_mosi, reg_miso => reg_miso, - gn_index => gn_index, f_adc => f_adc, fsub_type => fsub_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 5298580a65d5c2f3be3ffb750a21a60821eb7e3f..279c2d3243826eeab089e3414dfea26ad4453aab 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 @@ -191,6 +191,7 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS SIGNAL rx_sdp_stat_header : t_sdp_stat_header; SIGNAL exp_sdp_stat_header : t_sdp_stat_header; + SIGNAL cur_dp_bsn : NATURAL; SIGNAL exp_dp_bsn : NATURAL; SIGNAL exp_sst_signal_input : NATURAL; SIGNAL exp_bst_beamlet_index : NATURAL; @@ -357,7 +358,8 @@ BEGIN -- verify it at rx_offload_sosi.eop. -- For all statistics - exp_dp_bsn <= c_bsn_init + 1 + rx_sync_cnt * c_nof_block_per_sync; + cur_dp_bsn <= c_bsn_init + 1 + rx_sync_cnt * c_nof_block_per_sync; -- in current sync interval + exp_dp_bsn <= cur_dp_bsn WHEN rising_edge(dp_clk) AND rx_offload_sosi.sync = '1'; -- previous sync interval -- SST exp_sst_signal_input <= rx_packet_cnt + c_sdp_S_pn * gn_index; -- BST @@ -667,7 +669,7 @@ BEGIN weighted_subbands_flag => weighted_subbands_flag, nof_crosslets => c_mm_nof_crosslets, - crosslets_info_rec => in_crosslets_info_rec + prev_crosslets_info_rec => in_crosslets_info_rec ); -- Verify crosslets_info functions diff --git a/libraries/base/ring/src/vhdl/ring_info.vhd b/libraries/base/ring/src/vhdl/ring_info.vhd index 47e8cdb9fdfbe4e9ea069b85f3067817bf23a863..e1fbd16e32ca86c5a07df79654a30f34578ea79e 100644 --- a/libraries/base/ring/src/vhdl/ring_info.vhd +++ b/libraries/base/ring/src/vhdl/ring_info.vhd @@ -38,6 +38,10 @@ USE common_lib.common_field_pkg.ALL; USE work.ring_pkg.ALL; ENTITY ring_info IS + GENERIC ( + -- Actual ring_info.O_rn field width can be less than a byte + g_ring_info_O_rn_w : NATURAL := c_byte_w + ); PORT ( -- Clocks and reset mm_rst : IN STD_LOGIC; -- reset synchronous with mm_clk @@ -58,6 +62,8 @@ ARCHITECTURE str OF ring_info IS SIGNAL mm_fields_out : STD_LOGIC_VECTOR(field_slv_out_len(c_ring_info_field_arr)-1 DOWNTO 0); + SIGNAL O_rn : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); + BEGIN u_mm_fields: ENTITY mm_lib.mm_fields @@ -81,10 +87,14 @@ BEGIN ); -- get "RW" fields from mm_fields - ring_info.O_rn <= mm_fields_out(field_hi(c_ring_info_field_arr, "O_rn") DOWNTO field_lo(c_ring_info_field_arr, "O_rn")); - ring_info.N_rn <= mm_fields_out(field_hi(c_ring_info_field_arr, "N_rn") DOWNTO field_lo(c_ring_info_field_arr, "N_rn")); + O_rn <= mm_fields_out(field_hi(c_ring_info_field_arr, "O_rn") DOWNTO field_lo(c_ring_info_field_arr, "O_rn")); + + ring_info.O_rn <= RESIZE_UVEC(O_rn(g_ring_info_O_rn_w-1 DOWNTO 0), c_byte_w); + ring_info.N_rn <= mm_fields_out(field_hi(c_ring_info_field_arr, "N_rn") DOWNTO field_lo(c_ring_info_field_arr, "N_rn")); + ring_info.use_cable_to_previous_rn <= sl(mm_fields_out(field_hi(c_ring_info_field_arr, "use_cable_to_previous_rn") DOWNTO field_lo(c_ring_info_field_arr, "use_cable_to_previous_rn"))); ring_info.use_cable_to_next_rn <= sl(mm_fields_out(field_hi(c_ring_info_field_arr, "use_cable_to_next_rn") DOWNTO field_lo(c_ring_info_field_arr, "use_cable_to_next_rn"))); + END str;