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

Support g_first_gn > 0. Add g_read_all_sub_sel to speed up sim.

parent 09dc9610
Branches
No related tags found
1 merge request!283Resolve L2SDP-696
...@@ -138,9 +138,9 @@ USE tech_pll_lib.tech_pll_component_pkg.ALL; ...@@ -138,9 +138,9 @@ USE tech_pll_lib.tech_pll_component_pkg.ALL;
ENTITY tb_lofar2_unb2c_sdp_station_bf_ring IS ENTITY tb_lofar2_unb2c_sdp_station_bf_ring IS
GENERIC ( GENERIC (
g_first_gn : NATURAL := 0; -- first global node (GN) in ring g_first_gn : NATURAL := 1; -- first global node (GN) in ring
g_nof_rn : NATURAL := 2; -- nof ring nodes (RN) in ring g_nof_rn : NATURAL := 2; -- nof ring nodes (RN) in ring
g_global_sp : NATURAL := 3; -- WG gloabl signal path (SP) index in range(g_first_gn * S_pn, (g_first_gn + g_nof_rn) * S_pn - 1), S_pn = 12 g_global_sp : NATURAL := 15; -- WG global signal path (SP) index in range [c_first_sp : c_last_sp]
g_sp_ampl : REAL := 0.5; -- WG normalized amplitude g_sp_ampl : REAL := 0.5; -- WG normalized amplitude
g_sp_phase : REAL := -110.0; -- WG phase in degrees = subband phase g_sp_phase : REAL := -110.0; -- WG phase in degrees = subband phase
g_sp_remnant_ampl : REAL := 0.1; -- WG normalized amplitude for remnant sp g_sp_remnant_ampl : REAL := 0.1; -- WG normalized amplitude for remnant sp
...@@ -156,6 +156,7 @@ ENTITY tb_lofar2_unb2c_sdp_station_bf_ring IS ...@@ -156,6 +156,7 @@ ENTITY tb_lofar2_unb2c_sdp_station_bf_ring IS
g_bf_remnant_y_gain : REAL := 0.04; -- g_beamlet Y BF weight normalized gain for remnant sp g_bf_remnant_y_gain : REAL := 0.04; -- g_beamlet Y BF weight normalized gain for remnant sp
g_bf_remnant_x_phase : REAL := 170.0; -- g_beamlet X BF weight phase rotation in degrees for remnant sp g_bf_remnant_x_phase : REAL := 170.0; -- g_beamlet X BF weight phase rotation in degrees for remnant sp
g_bf_remnant_y_phase : REAL := -135.0; -- g_beamlet Y BF weight phase rotation in degrees for remnant sp g_bf_remnant_y_phase : REAL := -135.0; -- g_beamlet Y BF weight phase rotation in degrees for remnant sp
g_read_all_sub_sel : BOOLEAN := FALSE; -- when FALSE only read subband selection for g_beamlet, to save sim time
g_read_all_SST : BOOLEAN := FALSE; -- when FALSE only read SST for g_subband, to save sim time g_read_all_SST : BOOLEAN := FALSE; -- when FALSE only read SST for g_subband, to save sim time
g_read_all_BST : BOOLEAN := FALSE -- when FALSE only read BST for g_beamlet, to save sim time g_read_all_BST : BOOLEAN := FALSE -- when FALSE only read BST for g_beamlet, to save sim time
); );
...@@ -174,6 +175,8 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS ...@@ -174,6 +175,8 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
CONSTANT c_local_sp : NATURAL := g_global_sp MOD c_sdp_S_pn; -- local SP index of g_global_sp on c_global_sp_gn CONSTANT c_local_sp : NATURAL := g_global_sp MOD c_sdp_S_pn; -- local SP index of g_global_sp on c_global_sp_gn
CONSTANT c_global_sp_unb_nr : NATURAL := c_global_sp_gn / c_quad; -- unb_nr of where g_global_sp is located CONSTANT c_global_sp_unb_nr : NATURAL := c_global_sp_gn / c_quad; -- unb_nr of where g_global_sp is located
CONSTANT c_global_sp_node_nr : NATURAL := c_global_sp_gn MOD c_quad; -- unb_nr of where g_global_sp is located CONSTANT c_global_sp_node_nr : NATURAL := c_global_sp_gn MOD c_quad; -- unb_nr of where g_global_sp is located
CONSTANT c_first_sp : NATURAL := g_first_gn * c_sdp_S_pn;
CONSTANT c_last_sp : NATURAL := c_first_sp + g_nof_rn * c_sdp_S_pn - 1;
CONSTANT c_init_bsn : NATURAL := 17; -- some recognizable value >= 0 CONSTANT c_init_bsn : NATURAL := 17; -- some recognizable value >= 0
CONSTANT c_nof_lanes : NATURAL := c_sdp_N_beamsets; CONSTANT c_nof_lanes : NATURAL := c_sdp_N_beamsets;
...@@ -205,11 +208,15 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS ...@@ -205,11 +208,15 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
CONSTANT c_beamlet_output_delta : INTEGER := 2; -- +-delta margin CONSTANT c_beamlet_output_delta : INTEGER := 2; -- +-delta margin
-- header fields -- header fields
-- . Use gn = 1 for c_cep_ip_src_addr to have fixed c_exp_ip_header_checksum
CONSTANT c_cep_eth_src_mac : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_src_mac_47_16 & func_sdp_gn_index_to_mac_15_0(c_last_gn); CONSTANT c_cep_eth_src_mac : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_src_mac_47_16 & func_sdp_gn_index_to_mac_15_0(c_last_gn);
CONSTANT c_cep_ip_src_addr : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_src_addr_31_16 & func_sdp_gn_index_to_ip_15_0(c_last_gn); CONSTANT c_cep_ip_src_addr : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_src_addr_31_16 & func_sdp_gn_index_to_ip_15_0(1);
CONSTANT c_cep_udp_src_port : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_src_port_15_8 & c_last_id; -- D0 & c_last_id CONSTANT c_cep_udp_src_port : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_src_port_15_8 & c_last_id; -- D0 & c_last_id
-- . The ip_header_checksum depends on src IP, and therefore on the c_last_gn. The expected
CONSTANT c_exp_ip_header_checksum : NATURAL := 16#5BDD#; -- value obtained from rx_sdp_cep_header.ip.header_checksum in wave window for g_nof_rn = 2. -- value is obtained from rx_sdp_cep_header.ip.header_checksum in wave window for
-- c_last_gn = 1. Therefore in this tb use func_sdp_gn_index_to_ip_15_0(1) to have fixed
-- c_exp_ip_header_checksum, independent of actual c_last_gn.
CONSTANT c_exp_ip_header_checksum : NATURAL := 16#5BDD#;
CONSTANT c_exp_beamlet_scale : NATURAL := NATURAL(g_beamlet_scale * REAL(c_sdp_unit_beamlet_scale)); -- c_sdp_unit_beamlet_scale = 2**15; CONSTANT c_exp_beamlet_scale : NATURAL := NATURAL(g_beamlet_scale * REAL(c_sdp_unit_beamlet_scale)); -- c_sdp_unit_beamlet_scale = 2**15;
CONSTANT c_exp_beamlet_index : NATURAL := 0; -- depends on beamset bset * c_sdp_S_sub_bf CONSTANT c_exp_beamlet_index : NATURAL := 0; -- depends on beamset bset * c_sdp_S_sub_bf
...@@ -411,18 +418,18 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS ...@@ -411,18 +418,18 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
-- BF -- BF
-- . beamlet subband selection -- . beamlet subband selection
SIGNAL sp_subband_select : NATURAL := 0; SIGNAL sp_subband_select : NATURAL := 0;
SIGNAL sp_subband_select_arr : t_natural_arr(0 TO c_sdp_S_sub_bf * c_sdp_N_pol-1) := (OTHERS => 0); -- Q_fft = N_pol = 2 SIGNAL sp_subband_select_arr : t_integer_arr(0 TO c_sdp_S_sub_bf * c_sdp_N_pol-1) := (OTHERS => -1); -- Q_fft = N_pol = 2
-- . beamlet X-pol -- . beamlet X-pol
SIGNAL sp_bf_x_weights_re_arr : t_integer_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0); SIGNAL sp_bf_x_weights_re_arr : t_integer_arr(c_first_sp TO c_last_sp) := (OTHERS => 0);
SIGNAL sp_bf_x_weights_im_arr : t_integer_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0); SIGNAL sp_bf_x_weights_im_arr : t_integer_arr(c_first_sp TO c_last_sp) := (OTHERS => 0);
SIGNAL sp_bf_x_weights_gain_arr : t_real_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0.0); SIGNAL sp_bf_x_weights_gain_arr : t_real_arr(c_first_sp TO c_last_sp) := (OTHERS => 0.0);
SIGNAL sp_bf_x_weights_phase_arr : t_real_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0.0); SIGNAL sp_bf_x_weights_phase_arr : t_real_arr(c_first_sp TO c_last_sp) := (OTHERS => 0.0);
-- . beamlet Y-pol -- . beamlet Y-pol
SIGNAL sp_bf_y_weights_re_arr : t_integer_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0); SIGNAL sp_bf_y_weights_re_arr : t_integer_arr(c_first_sp TO c_last_sp) := (OTHERS => 0);
SIGNAL sp_bf_y_weights_im_arr : t_integer_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0); SIGNAL sp_bf_y_weights_im_arr : t_integer_arr(c_first_sp TO c_last_sp) := (OTHERS => 0);
SIGNAL sp_bf_y_weights_gain_arr : t_real_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0.0); SIGNAL sp_bf_y_weights_gain_arr : t_real_arr(c_first_sp TO c_last_sp) := (OTHERS => 0.0);
SIGNAL sp_bf_y_weights_phase_arr : t_real_arr(0 TO g_nof_rn * c_sdp_S_pn-1) := (OTHERS => 0.0); SIGNAL sp_bf_y_weights_phase_arr : t_real_arr(c_first_sp TO c_last_sp) := (OTHERS => 0.0);
-- . BST -- . BST
SIGNAL bsts_arr2 : t_slv_64_beamlets_arr(c_sdp_N_pol_bf-1 DOWNTO 0); -- [pol_bf][blet] SIGNAL bsts_arr2 : t_slv_64_beamlets_arr(c_sdp_N_pol_bf-1 DOWNTO 0); -- [pol_bf][blet]
...@@ -665,8 +672,6 @@ BEGIN ...@@ -665,8 +672,6 @@ BEGIN
p_mm_stimuli : PROCESS p_mm_stimuli : PROCESS
VARIABLE v_gn : NATURAL; VARIABLE v_gn : NATURAL;
VARIABLE v_bsn : NATURAL; VARIABLE v_bsn : NATURAL;
VARIABLE v_sp_sst : REAL := 0.0;
VARIABLE v_bst : REAL := 0.0;
VARIABLE v_data_lo, v_data_hi : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); VARIABLE v_data_lo, v_data_hi : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
VARIABLE v_stat_data : STD_LOGIC_VECTOR(c_longword_w-1 DOWNTO 0); VARIABLE v_stat_data : STD_LOGIC_VECTOR(c_longword_w-1 DOWNTO 0);
VARIABLE v_len, v_span, v_offset, v_addr, v_sel : NATURAL; -- address ranges, indices VARIABLE v_len, v_span, v_offset, v_addr, v_sel : NATURAL; -- address ranges, indices
...@@ -674,6 +679,12 @@ BEGIN ...@@ -674,6 +679,12 @@ BEGIN
VARIABLE v_re, v_im, v_weight : INTEGER; VARIABLE v_re, v_im, v_weight : INTEGER;
VARIABLE v_re_exp, v_im_exp : REAL := 0.0; VARIABLE v_re_exp, v_im_exp : REAL := 0.0;
BEGIN BEGIN
-- Check g_global_sp
IF g_global_sp < c_first_sp OR g_global_sp > c_last_sp THEN
ASSERT FALSE REPORT "g_global_sp not in ring GN range." SEVERITY ERROR;
ASSERT FALSE REPORT "g_global_sp not in ring GN range." SEVERITY FAILURE;
END IF;
-- Wait for DUT power up after reset -- Wait for DUT power up after reset
WAIT FOR 1 us; WAIT FOR 1 us;
...@@ -920,9 +931,8 @@ BEGIN ...@@ -920,9 +931,8 @@ BEGIN
END LOOP; END LOOP;
-- Access scheme 1 for beamformer. -- Access scheme 1 for beamformer.
-- Use transport_nof_hops = 0 on last nodes to stop remote input for first node. The -- Use transport_nof_hops = 0 on last node to stop remote input for first node. No
-- alternative is to use transport_nof_hops = 1 on all nodes and let the BSN aligner -- need to also disable the remote input of the BSN aligner on the first node.
-- on the first node disable its remote input.
FOR RN IN 0 TO c_last_rn LOOP FOR RN IN 0 TO c_last_rn LOOP
v_gn := g_first_gn + RN; v_gn := g_first_gn + RN;
FOR I IN 0 TO c_nof_lanes-1 LOOP FOR I IN 0 TO c_nof_lanes-1 LOOP
...@@ -948,7 +958,7 @@ BEGIN ...@@ -948,7 +958,7 @@ BEGIN
FOR RN IN 0 TO c_last_rn LOOP FOR RN IN 0 TO c_last_rn LOOP
v_gn := g_first_gn + RN; v_gn := g_first_gn + RN;
FOR S IN 0 TO c_sdp_S_pn-1 LOOP FOR S IN 0 TO c_sdp_S_pn-1 LOOP
IF RN * c_sdp_S_pn + S = g_global_sp THEN IF v_gn * c_sdp_S_pn + S = g_global_sp THEN
-- Strong WG signal at g_global_sp -- Strong WG signal at g_global_sp
mmf_mm_bus_wr(mmf_unb_file_prefix(v_gn / c_quad, v_gn MOD c_quad) & "REG_WG", S*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(mmf_unb_file_prefix(v_gn / c_quad, v_gn MOD c_quad) & "REG_WG", S*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc
mmf_mm_bus_wr(mmf_unb_file_prefix(v_gn / c_quad, v_gn MOD c_quad) & "REG_WG", S*4 + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees mmf_mm_bus_wr(mmf_unb_file_prefix(v_gn / c_quad, v_gn MOD c_quad) & "REG_WG", S*4 + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees
...@@ -1032,15 +1042,18 @@ BEGIN ...@@ -1032,15 +1042,18 @@ BEGIN
FOR U IN 0 TO c_sdp_N_beamsets-1 LOOP FOR U IN 0 TO c_sdp_N_beamsets-1 LOOP
-- Same selection for both beamsets, so fine to use only one sp_subband_select_arr() -- Same selection for both beamsets, so fine to use only one sp_subband_select_arr()
FOR B IN 0 TO c_sdp_S_sub_bf-1 LOOP FOR B IN 0 TO c_sdp_S_sub_bf-1 LOOP
-- Same selection for all SP, so fine to only read subband selection for c_local_sp on last node IF g_read_all_sub_sel OR B = g_beamlet THEN
v_addr := v_P + B * c_sdp_N_pol + v_A * v_span + U * c_mm_span_ram_ss_ss_wide; -- Same selection for all SP, so fine to only read subband selection for c_local_sp on last node
mmf_mm_bus_rd(c_mm_file_ram_ss_ss_wide, v_addr, rd_data, tb_clk); v_addr := v_P + B * c_sdp_N_pol + v_A * v_span + U * c_mm_span_ram_ss_ss_wide;
v_sel := (TO_UINT(rd_data) - v_P) / c_sdp_N_pol; mmf_mm_bus_rd(c_mm_file_ram_ss_ss_wide, v_addr, rd_data, tb_clk);
sp_subband_select_arr(B) <= v_sel; v_sel := (TO_UINT(rd_data) - v_P) / c_sdp_N_pol;
sp_subband_select <= v_sel; -- for time series view in Wave window sp_subband_select_arr(B * c_sdp_N_pol + v_P) <= v_sel;
sp_subband_select <= v_sel; -- for time series view in Wave window
END IF;
END LOOP; END LOOP;
END LOOP; END LOOP;
proc_common_wait_some_cycles(tb_clk, 1); proc_common_wait_some_cycles(tb_clk, 1);
ASSERT sp_subband_select_arr(g_beamlet * c_sdp_N_pol + v_P) = g_subband REPORT "Wrong subband select at beamlet index." SEVERITY ERROR;
proc_common_wait_some_cycles(ext_clk, 100); -- delay for ease of view in Wave window proc_common_wait_some_cycles(ext_clk, 100); -- delay for ease of view in Wave window
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
...@@ -1058,7 +1071,7 @@ BEGIN ...@@ -1058,7 +1071,7 @@ BEGIN
-- Different BF weights for both beamlet polarizations -- Different BF weights for both beamlet polarizations
FOR A IN 0 TO c_sdp_A_pn-1 LOOP FOR A IN 0 TO c_sdp_A_pn-1 LOOP
FOR P IN 0 TO c_sdp_N_pol-1 LOOP FOR P IN 0 TO c_sdp_N_pol-1 LOOP
v_S := RN * c_sdp_S_pn + A * c_sdp_N_pol + P; v_S := v_gn * c_sdp_S_pn + A * c_sdp_N_pol + P;
-- Different BF weights for g_global_sp and the remnant sp -- Different BF weights for g_global_sp and the remnant sp
IF v_S = g_global_sp THEN IF v_S = g_global_sp THEN
-- use generic BF weight for g_global_sp in g_beamlet -- use generic BF weight for g_global_sp in g_beamlet
...@@ -1075,7 +1088,7 @@ BEGIN ...@@ -1075,7 +1088,7 @@ BEGIN
v_weight := pack_complex(re => c_bf_remnant_y_weight_re, im => c_bf_remnant_y_weight_im, w => c_sdp_W_bf_weight); v_weight := pack_complex(re => c_bf_remnant_y_weight_re, im => c_bf_remnant_y_weight_im, w => c_sdp_W_bf_weight);
END IF; END IF;
END IF; END IF;
-- Only need to set BF weight for g_beamlet, keep other beamlet BF weights at zero rst default. -- Only need to set BF weight for g_beamlet, keep other beamlet BF weights at zero rst default.
v_addr := g_beamlet; -- beamlet index v_addr := g_beamlet; -- beamlet index
v_addr := v_addr + P * c_sdp_S_sub_bf; -- antenna input polarization address offset v_addr := v_addr + P * c_sdp_S_sub_bf; -- antenna input polarization address offset
v_addr := v_addr + A * v_span; -- antenna input address offset v_addr := v_addr + A * v_span; -- antenna input address offset
...@@ -1105,7 +1118,7 @@ BEGIN ...@@ -1105,7 +1118,7 @@ BEGIN
v_im := unpack_complex_im(rd_data, c_sdp_W_bf_weight); v_im := unpack_complex_im(rd_data, c_sdp_W_bf_weight);
-- same BF weights for both beamsets and both beamlet polarizations, -- same BF weights for both beamsets and both beamlet polarizations,
-- so fine to use only one sp_bf_x_weights_*_arr() -- so fine to use only one sp_bf_x_weights_*_arr()
v_S := RN * c_sdp_S_pn + A * c_sdp_N_pol + P; v_S := v_gn * c_sdp_S_pn + A * c_sdp_N_pol + P;
IF PB = 0 THEN IF PB = 0 THEN
sp_bf_x_weights_re_arr(v_S) <= v_re; sp_bf_x_weights_re_arr(v_S) <= v_re;
sp_bf_x_weights_im_arr(v_S) <= v_im; sp_bf_x_weights_im_arr(v_S) <= v_im;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment