diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd index 7acfa22c2a95eaf984df88565b77e331c9692f48..b1d36877af2397afbdd34f62447c0b6d8560f1bb 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd @@ -246,14 +246,21 @@ architecture tb of tb_lofar2_unb2c_sdp_station_bf is x"1400" -- block_period = 5120 ); - -- Expected transposed indices order by func_reorder_transpose_packet(). - -- Yields same c_reorder_transpose_indices order as: + -- Expected transposed indices order by func_sdp_bdo_transpose_packet(). + -- Yields same c_transpose_indices order as func_reorder_transpose_packet(): -- > python applications/lofar2/libraries/sdp/src/python/test_func_sdp_bdo_transpose_packet.py - constant c_nof_ch : natural := c_sdp_cep_nof_beamlets_per_packet * c_sdp_N_pol_bf; - constant c_reorder_transpose_indices : t_natural_arr(0 to c_nof_ch - 1) := - func_reorder_transpose_indices(c_sdp_cep_nof_blocks_per_packet, - c_sdp_cep_nof_beamlets_per_block, - c_sdp_N_pol_bf); + constant c_nof_ch : natural := c_sdp_cep_nof_beamlets_per_packet * c_sdp_N_pol_bf; + -- Use c_transpose_indices and c_transpose_indices_inv for view in Objects window. + -- The c_transpose_indices is used in sdp_beamformer_output, therefore use + -- c_transpose_indices_inv for func_reorder_transpose_packet() in the tb. + constant c_transpose_indices : t_natural_arr(0 to c_nof_ch - 1) := + func_reorder_transpose_indices(c_sdp_cep_nof_blocks_per_packet, + c_sdp_cep_nof_beamlets_per_block, + c_sdp_N_pol_bf); + constant c_transpose_indices_inv : t_natural_arr(0 to c_nof_ch - 1) := + func_reorder_transpose_indices(c_sdp_cep_nof_beamlets_per_block, + c_sdp_cep_nof_blocks_per_packet, + c_sdp_N_pol_bf); -- WG constant c_bsn_start_wg : natural := c_init_bsn + 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values @@ -1404,11 +1411,12 @@ begin -- Wait until end of a beamlet packet wait until rising_edge(ext_clk); -- to avoid Modelsim warning: (vcom-1090) proc_common_wait_until_hi_lo(ext_clk, rx_beamlet_sosi.eop); -- to reduce simulation effort - rx_reordered_list_re <= func_sdp_bdo_transpose_packet(c_sdp_cep_nof_blocks_per_packet, - c_sdp_cep_nof_beamlets_per_block, + -- Inverse tranpose + rx_reordered_list_re <= func_sdp_bdo_transpose_packet(c_sdp_cep_nof_beamlets_per_block, + c_sdp_cep_nof_blocks_per_packet, rx_packet_list_re); - rx_reordered_list_im <= func_sdp_bdo_transpose_packet(c_sdp_cep_nof_blocks_per_packet, - c_sdp_cep_nof_beamlets_per_block, + rx_reordered_list_im <= func_sdp_bdo_transpose_packet(c_sdp_cep_nof_beamlets_per_block, + c_sdp_cep_nof_blocks_per_packet, rx_packet_list_im); end process; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd index d12b7783bb7d960b402db1a5896280f4e4c1409a..688042034a72ccd9de6c174478ae02b121eb4516 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd @@ -92,18 +92,31 @@ architecture str of sdp_beamformer_output is constant c_fifo_size : natural := true_log_pow2(c_sdp_cep_payload_nof_longwords) * c_sdp_N_beamsets; -- 2048 -- Reorder c_nof_ch = c_nof_ch_sel = c_nof_ch_in - constant c_nof_ch : natural := c_sdp_S_sub_bf * c_sdp_cep_nof_blocks_per_packet; + constant c_nof_blocks_per_packet : natural := c_sdp_cep_nof_blocks_per_packet; -- = 4 + constant c_nof_data_per_block : natural := c_sdp_S_sub_bf; -- = 488 dual pol beamlets + constant c_nof_words_per_data : natural := 1; -- 1 dual pol beamlet data per 32b word + constant c_nof_ch : natural := c_nof_blocks_per_packet * c_nof_data_per_block * c_nof_words_per_data; -- = 1952 + + -- Use c_transpose_indices and c_transpose_indices_inv for debug view in Objects window. + -- Use c_transpose_indices for func_reorder_transpose() in this sdp_beamformer_output, + -- a tb can then use c_transpose_indices_inv to undo the transpose. + constant c_transpose_indices : t_natural_arr(0 to c_nof_ch - 1) := + func_reorder_transpose_indices(c_nof_blocks_per_packet, + c_nof_data_per_block, + c_nof_words_per_data); + constant c_transpose_indices_inv : t_natural_arr(0 to c_nof_ch - 1) := + func_reorder_transpose_indices(c_nof_data_per_block, + c_nof_blocks_per_packet, + c_nof_words_per_data); -- Dynamic reorder block size control input - -- . The data consists of 1 word = 1 ch, because 1 word contains 1 dual pol - -- beamlet. - -- . The input packet has nof_ch = nof_data_per_block * nof_blocks_per_packet - -- of data per packet. + -- . The data consists of 1 word = 1 ch, because 1 word contains 1 dual pol beamlet. + -- . The input packet has nof_ch of data per packet. -- . The transposed output packet will have blocks with nof_blocks_per_packet -- data per block and nof_data_per_block blocks per packet. signal nof_ch : natural := c_nof_ch; - signal nof_data_per_block : natural := c_sdp_S_sub_bf; - signal nof_blocks_per_packet : natural := c_sdp_cep_nof_blocks_per_packet; + signal nof_blocks_per_packet : natural := c_nof_blocks_per_packet; + signal nof_data_per_block : natural := c_nof_data_per_block; signal select_copi : t_mem_copi := c_mem_copi_rst; signal select_cipo : t_mem_cipo := c_mem_cipo_rst; signal r_identity : t_reorder_identity; @@ -175,11 +188,11 @@ begin -- first block. v_ref_time := NOW; -- Offset the v_ref_time to the second block of the - -- c_sdp_cep_nof_blocks_per_packet = 4 blocks that will be merged. + -- c_nof_blocks_per_packet = 4 blocks that will be merged. v_ref_time := v_ref_time + c_sdp_block_period * 1 ns; end if; - elsif NOW > v_ref_time + 1 * c_sdp_cep_nof_blocks_per_packet * c_sdp_block_period * 1 ns and - NOW < v_ref_time + 4 * c_sdp_cep_nof_blocks_per_packet * c_sdp_block_period * 1 ns then + elsif NOW > v_ref_time + 1 * c_nof_blocks_per_packet * c_sdp_block_period * 1 ns and + NOW < v_ref_time + 4 * c_nof_blocks_per_packet * c_sdp_block_period * 1 ns then -- Disturb BSN to cause merged payload error. Expected results for the -- merged blocks: -- . index 0 : First merged block bsn ok and payload_error = '0'. @@ -231,7 +244,7 @@ begin ----------------------------------------------------------------------------- u_dp_packet_merge : entity dp_lib.dp_packet_merge generic map( - g_nof_pkt => c_sdp_cep_nof_blocks_per_packet, + g_nof_pkt => c_nof_blocks_per_packet, g_bsn_increment => 1 ) port map( @@ -322,12 +335,12 @@ begin end process; p_reorder_transpose : process(dp_rst, select_cipo, - nof_data_per_block, nof_blocks_per_packet, r_transpose) + nof_blocks_per_packet, nof_data_per_block, r_transpose) variable v : t_reorder_transpose; begin if select_cipo.waitrequest = '0' then -- Read from reorder_col_select page - v := func_reorder_transpose(nof_data_per_block, nof_blocks_per_packet, r_transpose); + v := func_reorder_transpose(nof_blocks_per_packet, nof_data_per_block, r_transpose); else -- No read, new reorder_col_select page not available yet v := c_reorder_transpose_rst; diff --git a/libraries/base/reorder/src/vhdl/reorder_pkg.vhd b/libraries/base/reorder/src/vhdl/reorder_pkg.vhd index dc310b6389743f9de0405c259dd663fc69335bd1..f0cb42898d035654193a9ca67e049645b14b190a 100644 --- a/libraries/base/reorder/src/vhdl/reorder_pkg.vhd +++ b/libraries/base/reorder/src/vhdl/reorder_pkg.vhd @@ -136,6 +136,12 @@ package reorder_pkg is transpose : t_reorder_transpose) return t_reorder_transpose; + -- Variant with nof_words_per_data = 1 + function func_reorder_transpose(nof_blocks_per_packet : natural; + nof_data_per_block : natural; + transpose : t_reorder_transpose) + return t_reorder_transpose; + -- Alternative implementation using a look up list: -- func_reorder_transpose_look_up() = func_reorder_transpose() function func_reorder_transpose_look_up(nof_blocks_per_packet : natural; @@ -144,12 +150,6 @@ package reorder_pkg is transpose : t_reorder_transpose) return t_reorder_transpose; - -- Variant with nof_words_per_data = 1 - function func_reorder_transpose(nof_blocks_per_packet : natural; - nof_data_per_block : natural; - transpose : t_reorder_transpose) - return t_reorder_transpose; - ----------------------------------------------------------------------------- -- Reorder identity -- . so no reordering, same out as in, but delayed due to dual page @@ -358,6 +358,17 @@ package body reorder_pkg is return v; end; + function func_reorder_transpose(nof_blocks_per_packet : natural; + nof_data_per_block : natural; + transpose : t_reorder_transpose) + return t_reorder_transpose is + begin + return func_reorder_transpose(nof_blocks_per_packet, + nof_data_per_block, + 1, + transpose); + end; + function func_reorder_transpose_look_up(nof_blocks_per_packet : natural; nof_data_per_block : natural; nof_words_per_data : natural; @@ -388,17 +399,6 @@ package body reorder_pkg is return v; end; - function func_reorder_transpose(nof_blocks_per_packet : natural; - nof_data_per_block : natural; - transpose : t_reorder_transpose) - return t_reorder_transpose is - begin - return func_reorder_transpose(nof_blocks_per_packet, - nof_data_per_block, - 1, - transpose); - end; - function func_reorder_identity(nof_ch_per_packet : natural; identity : t_reorder_identity) return t_reorder_identity is