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 79ddb76d29827419df36a485a4d9312be53887f8..a3a44d2dc0893d3abfd2d7b6f3c4b426ca1fb190 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 @@ -91,7 +91,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload IS CONSTANT c_eth_check_nof_packets : NATURAL := 1; -- received packets in 1 sync period CONSTANT c_eth_header_size : NATURAL := 19; -- words CONSTANT c_eth_crc_size : NATURAL := 1; -- word - CONSTANT c_eth_packet_size : NATURAL := c_eth_header_size + c_eth_crc_size + (c_sdp_W_statistic / c_word_w) * c_sdp_S_pn * c_sdp_S_pn; -- 20 + 2 * 12 * 12 = 308 + CONSTANT c_eth_packet_size : NATURAL := c_eth_header_size + c_eth_crc_size + (c_sdp_W_statistic / c_word_w) * c_sdp_S_pn * c_sdp_S_pn * c_nof_complex; -- 20 + 2 * 12 * 12 * 2 = 596 CONSTANT c_eth_check_nof_valid : NATURAL := c_eth_check_nof_packets * c_eth_packet_size; CONSTANT c_eth_runtime_timeout : TIME := 2 * c_nof_clk_per_sync * c_ext_clk_period; -- eth statistics should be done at the second sync interval diff --git a/applications/lofar2/libraries/sdp/hdllib.cfg b/applications/lofar2/libraries/sdp/hdllib.cfg index 7068a9f4104a54a404540a09e830491c0ded6074..c4922d48959a7f833f7a037362781c0d9727b380 100644 --- a/applications/lofar2/libraries/sdp/hdllib.cfg +++ b/applications/lofar2/libraries/sdp/hdllib.cfg @@ -23,11 +23,13 @@ synth_files = test_bench_files = tb/vhdl/tb_sdp_info.vhd tb/vhdl/tb_sdp_statistics_offload.vhd + tb/vhdl/tb_tb_sdp_statistics_offload.vhd tb/vhdl/tb_sdp_crosslets_subband_select.vhd regression_test_vhdl = tb/vhdl/tb_sdp_info.vhd tb/vhdl/tb_sdp_statistics_offload.vhd + tb/vhdl/tb_tb_sdp_statistics_offload.vhd tb/vhdl/tb_sdp_crosslets_subband_select.vhd [modelsim_project_file] 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 4b600fa39e7bf008d5eb54321e3ec511585141c0..287331749627f658af4d5ffdb785c249e7f54fb2 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -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 => FALSE -- default word order is MSB after LSB, we need to stream LSB after MSB. + g_reverse_word_order => TRUE -- 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 4ef9345bff9b94039db3d69fa3c588b873bd1a8c..42f947700310ff1af936a0e5aa16a945c31765b9 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 @@ -49,8 +49,9 @@ USE work.sdp_pkg.ALL; ENTITY tb_sdp_statistics_offload IS GENERIC ( g_statistics_type : STRING := "SST"; - g_nof_signal_inputs_per_pn : NATURAL := 12; - g_offload_time : NATURAL := 500 + g_offload_time : NATURAL := 500; + g_beamset_id : NATURAL := 0; + g_P_sq : NATURAL := c_sdp_P_sq ); END tb_sdp_statistics_offload; @@ -82,14 +83,20 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS 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_nof_packets : NATURAL := sel_a_b(g_statistics_type="BST", 1, + sel_a_b(g_statistics_type="XST", g_P_sq, + c_sdp_S_pn)); -- SST + + + -- Define SST RAM size for c_nof_packets. + CONSTANT c_ram_size : NATURAL := c_nof_data * c_data_size * c_nof_packets; 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 := (1, c_ram_w, 32, 2**c_ram_w, 'X'); -- Define block timing. - 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_block_per_sync : NATURAL := 80; -- Sufficient to fit more than c_nof_packets 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". @@ -101,10 +108,12 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS sel_a_b(g_statistics_type="XST", c_sdp_S_pn, 1)); -- SST - CONSTANT c_nof_statistics_per_packet : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_S_sub_bf, + CONSTANT c_nof_statistics_per_packet : 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 + CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf; + CONSTANT c_nof_valid_per_block : NATURAL := c_nof_data * c_data_size; CONSTANT c_nof_sync : NATURAL := 5; CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync * c_nof_clk_per_block; @@ -314,8 +323,14 @@ BEGIN REPORT "wrong sdp_block_period" SEVERITY ERROR; -- Check variable header info. - ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")) = TO_UVEC(rx_block_cnt + c_sdp_S_pn * gn_index, 32) - REPORT "wrong block count number, received data_id not same as counted blocks" SEVERITY ERROR; + IF g_statistics_type = "SST" THEN + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")) = TO_UVEC(rx_block_cnt + c_sdp_S_pn * gn_index, 32) + REPORT "wront SST sdp_data_id" SEVERITY ERROR; + ELSIF g_statistics_type = "BST" THEN + ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")) = TO_UVEC(c_beamlet_id, 32) + REPORT "wront BST sdp_data_id" SEVERITY ERROR; + --ELSIF g_statistics_type = "XST" THEN --TODO: RW define check + END IF; END IF; END PROCESS; @@ -351,7 +366,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 = c_nof_packets-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. @@ -453,9 +468,10 @@ BEGIN -- SDP info u_dut: ENTITY work.sdp_statistics_offload GENERIC MAP ( - g_statistics_type => "SST", + g_statistics_type => g_statistics_type, g_offload_time => g_offload_time, - g_beamset_id => 0 + g_beamset_id => g_beamset_id, + g_P_sq => g_P_sq ) PORT MAP ( mm_clk => mm_clk, diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_statistics_offload.vhd new file mode 100644 index 0000000000000000000000000000000000000000..e0506591d517a9df01f03904a3c1bec1c98a1c28 --- /dev/null +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_statistics_offload.vhd @@ -0,0 +1,51 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2021 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- Author : R vd Walle +-- Purpose: Verify multiple variations of tb_sdp_statistics_offload +-- Description: +-- Usage: +-- > as 3 +-- > run -all +------------------------------------------------------------------------------- + +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY tb_tb_sdp_statistics_offload IS +END tb_tb_sdp_statistics_offload; + +ARCHITECTURE tb OF tb_tb_sdp_statistics_offload IS + SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end' +BEGIN + +-- g_statistics_type : STRING := "SST"; +-- g_offload_time : NATURAL := 500; +-- g_beamset_id : NATURAL := 0; +-- g_P_sq : NATURAL := c_sdp_P_sq + + u_sst : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("SST"); + u_bst_0 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST"); + u_bst_1 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST", 500, 1); + u_xst_1 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 500, 0, 1); + u_xst_P_sq : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST"); + +END tb; diff --git a/libraries/dsp/st/src/vhdl/st_xsq.vhd b/libraries/dsp/st/src/vhdl/st_xsq.vhd index 997e13c1b253434c103dca1bc505447b0bfa37ab..4378a4c7507b12ec38b0467b1f2ac923b9c2f998 100644 --- a/libraries/dsp/st/src/vhdl/st_xsq.vhd +++ b/libraries/dsp/st/src/vhdl/st_xsq.vhd @@ -185,9 +185,11 @@ BEGIN u_mem_mux_select : entity common_lib.common_mem_mux generic map ( g_nof_mosi => c_nof_complex, - g_mult_addr_w => c_nof_word_w + g_mult_addr_w => c_nof_word_w, + g_rd_latency => 1 ) port map ( + clk => mm_clk, mosi => remapped_ram_st_xsq_mosi, miso => ram_st_xsq_miso, mosi_arr => ram_st_xsq_mosi_arr,