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

Use c_revision_select.use_bdo_transpose. Add p_verify_rx_beamlet_list.

parent 1e126f8c
No related branches found
No related tags found
1 merge request!348Use use_bdo_transpose = true in c_bf revision. Test use_bdo_transpose = false...
......@@ -121,7 +121,11 @@
-- # Manually add missing signals and constants using objects in GUI
-- > add wave -position insertpoint \
-- sim:/tb_lofar2_unb2c_sdp_station_bf/sp_ssts_arr2 \
-- sim:/tb_lofar2_unb2c_sdp_station_bf/bsts_arr2
-- sim:/tb_lofar2_unb2c_sdp_station_bf/bsts_arr2 \
-- sim:/tb_lofar2_unb2c_sdp_station_bf/rx_packet_list_re \
-- sim:/tb_lofar2_unb2c_sdp_station_bf/rx_packet_list_im \
-- sim:/tb_lofar2_unb2c_sdp_station_bf/rx_reordered_list_re \
-- sim:/tb_lofar2_unb2c_sdp_station_bf/rx_reordered_list_im
-- > run -a
-- View beamlet output as radix-decimal
-- Takes about 1h 1 m when g_read_all_* = FALSE
......@@ -151,6 +155,7 @@ use unb2c_board_lib.unb2c_board_pkg.all;
use lofar2_sdp_lib.sdp_pkg.all;
use lofar2_sdp_lib.tb_sdp_pkg.all;
use tech_pll_lib.tech_pll_component_pkg.all;
use lofar2_unb2c_sdp_station_lib.lofar2_unb2c_sdp_station_pkg.all;
entity tb_lofar2_unb2c_sdp_station_bf is
generic (
......@@ -178,21 +183,22 @@ end tb_lofar2_unb2c_sdp_station_bf;
architecture tb of tb_lofar2_unb2c_sdp_station_bf is
-- Revision parameters
constant c_design_name : string := "lofar2_unb2c_sdp_station_bf";
constant c_revision_select : t_lofar2_unb2c_sdp_station_config := func_sel_revision_rec(c_design_name);
constant c_sim : boolean := true;
constant c_unb_nr : natural := 0; -- UniBoard 0
constant c_node_nr : natural := 0;
constant c_gn_index : natural := c_unb_nr * 4 + c_node_nr; -- this node GN
constant c_init_bsn : natural := 17; -- some recognizable value >= 0
constant c_bsn_latency : natural := 5; -- used to time stimuli_done
constant c_use_transpose : boolean := false;
constant c_use_bdo_transpose : boolean := c_revision_select.use_bdo_transpose;
constant c_id : std_logic_vector(7 downto 0) := TO_UVEC(c_gn_index, 8);
constant c_version : std_logic_vector(1 downto 0) := "00";
constant c_fw_version : t_unb2c_board_fw_version := (1, 0);
constant c_mac_15_0 : std_logic_vector(15 downto 0) := TO_UVEC(c_unb_nr, 8) & TO_UVEC(c_node_nr, 8);
constant c_ip_15_0 : std_logic_vector(15 downto 0) := TO_UVEC(c_unb_nr, 8) & TO_UVEC(c_node_nr + 1, 8); -- +1 to avoid IP = *.*.*.0
constant c_eth_clk_period : time := 8 ns; -- 125 MHz XO on UniBoard
constant c_ext_clk_period : time := 5 ns;
constant c_mm_clk_period : time := 10 ns; -- 100 MHz internal mm_clk
......@@ -355,12 +361,17 @@ architecture tb of tb_lofar2_unb2c_sdp_station_bf is
constant c_mm_file_reg_sdp_info : string := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_SDP_INFO";
constant c_mm_file_reg_hdr_dat : string := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_HDR_DAT"; -- c_sdp_N_beamsets = 2 beamsets
-- Tb BSN moments
constant c_stimuli_done_bsn : natural := c_init_bsn + c_bsn_latency + c_nof_block_per_sync * 3;
constant c_verify_rx_beamlet_list_bsn : natural := c_stimuli_done_bsn - c_nof_block_per_sync;
-- Tb
signal stimuli_done : std_logic := '0';
signal tb_almost_end : std_logic := '0';
signal tb_end : std_logic := '0';
signal tb_clk : std_logic := '0';
signal rd_data : std_logic_vector(c_32 - 1 downto 0);
signal rd_data_bsn : std_logic_vector(c_32 - 1 downto 0);
signal dest_rst : std_logic := '1'; -- use separate destination rst for Rx 10GbE in tb
signal pps_rst : std_logic := '1'; -- use separate reset to release the PPS generator
......@@ -447,8 +458,8 @@ architecture tb of tb_lofar2_unb2c_sdp_station_bf is
signal rx_beamlet_eop_cnt : natural := 0;
-- [0 : 3] = X, Y, X, Y
signal rx_beamlet_arr_re : t_sdp_beamlet_longword_list;
signal rx_beamlet_arr_im : t_sdp_beamlet_longword_list;
signal rx_beamlet_arr_re : t_sdp_beamlet_part_arr;
signal rx_beamlet_arr_im : t_sdp_beamlet_part_arr;
signal rx_beamlet_cnt : natural;
signal rx_beamlet_valid : std_logic;
......@@ -458,9 +469,17 @@ architecture tb of tb_lofar2_unb2c_sdp_station_bf is
signal rx_reordered_list_re : t_sdp_beamlet_packet_list;
signal rx_reordered_list_im : t_sdp_beamlet_packet_list;
-- [0 : 488 * 2 - 1] = [0 : 975]
-- Recover original beamlet order per block, either by using c_use_bdo_transpose
-- = false or by using c_use_bdo_transpose and func_sdp_bdo_transpose_packet().
-- List: [0 : 488 * 2 - 1] = [0 : 975]
-- . X part at even indices
-- . Y part at odd indices
signal prev_rx_beamlet_list_re : t_sdp_beamlet_block_list;
signal prev_rx_beamlet_list_im : t_sdp_beamlet_block_list;
signal rx_beamlet_list_re : t_sdp_beamlet_block_list;
signal rx_beamlet_list_im : t_sdp_beamlet_block_list;
signal rx_beamlet_list_val : std_logic;
signal verify_rx_beamlet_list : std_logic := '0';
signal rx_beamlet_x_output_re : integer;
signal rx_beamlet_x_output_im : integer;
......@@ -516,7 +535,7 @@ begin
------------------------------------------------------------------------------
u_lofar_unb2c_sdp_station_bf : entity lofar2_unb2c_sdp_station_lib.lofar2_unb2c_sdp_station
generic map (
g_design_name => "lofar2_unb2c_sdp_station_bf",
g_design_name => c_design_name,
g_design_note => "",
g_sim => c_sim,
g_sim_unb_nr => c_unb_nr,
......@@ -683,7 +702,9 @@ begin
---- Set and check BF per beamset
------------------------------------------------------------------------------
for bset in 0 to c_sdp_N_beamsets - 1 loop
----------------------------------------------------------------------------
-- MM beamlet_scale
----------------------------------------------------------------------------
-- . write
v_offset := bset * c_mm_span_reg_bf_scale;
mmf_mm_bus_wr(c_mm_file_reg_bf_scale, v_offset + 0, c_exp_beamlet_scale, tb_clk);
......@@ -695,6 +716,9 @@ begin
proc_common_wait_some_cycles(tb_clk, 1);
assert TO_UINT(rd_beamlet_scale) = c_exp_beamlet_scale report "Wrong MM read beamlet_scale for beamset " & natural'image(bset) severity ERROR;
----------------------------------------------------------------------------
-- Set CEP beamlets output MAC,IP,UDP port
----------------------------------------------------------------------------
-- CEP beamlet output header
-- c_sdp_cep_hdr_field_arr : t_common_field_arr(c_sdp_cep_nof_hdr_fields-1 DOWNTO 0) := (
-- 40 "eth_dst_mac" ), "RW", 48, field_default(c_sdp_cep_eth_dst_mac) ),
......@@ -1018,7 +1042,7 @@ begin
----------------------------------------------------------------------------
-- read BSN low, this is the wait until condition
mmf_mm_wait_until_value(c_mm_file_reg_bsn_scheduler_wg, 0,
"UNSIGNED", rd_data, ">=", c_init_bsn + c_bsn_latency + c_nof_block_per_sync * 3,
"UNSIGNED", rd_data_bsn, ">=", c_stimuli_done_bsn,
c_sdp_T_sub, tb_clk);
-- Stimuli done, now verify results at end of test
......@@ -1369,41 +1393,61 @@ 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_transpose_packet(c_sdp_cep_nof_blocks_per_packet,
rx_reordered_list_re <= func_sdp_bdo_transpose_packet(c_sdp_cep_nof_blocks_per_packet,
c_sdp_cep_nof_beamlets_per_block,
rx_packet_list_re);
rx_reordered_list_im <= func_sdp_transpose_packet(c_sdp_cep_nof_blocks_per_packet,
rx_reordered_list_im <= func_sdp_bdo_transpose_packet(c_sdp_cep_nof_blocks_per_packet,
c_sdp_cep_nof_beamlets_per_block,
rx_packet_list_im);
end process;
p_rx_beamlet_list : process
constant c_N : natural := c_sdp_cep_nof_beamlets_per_block * c_sdp_N_pol_bf;
begin
-- Wait until p_rx_reordered_list has updated
rx_beamlet_list_val <= '0';
-- Wait until after p_rx_reordered_list has updated
proc_common_wait_until_hi_lo(ext_clk, rx_beamlet_sosi.eop);
wait until rising_edge(ext_clk);
-- Copy first block from rx_packet_list into rx_beamlet_list of one block.
if c_use_transpose then
-- transposed beamlet output order
rx_beamlet_list_re <= rx_reordered_list_re(0 to c_sdp_cep_nof_beamlets_per_block * c_sdp_N_pol_bf - 1);
rx_beamlet_list_im <= rx_reordered_list_im(0 to c_sdp_cep_nof_beamlets_per_block * c_sdp_N_pol_bf - 1);
-- Use same rx_beamlet_list to show all 4 blocks of a packet in time, to
-- ease viewing the blocks in the wave window.
for blk in 0 to c_sdp_cep_nof_blocks_per_packet - 1 loop
-- Copy block blk from rx_packet_list into rx_beamlet_list of one block.
if c_use_bdo_transpose then
-- undone transposed beamlet output order
rx_beamlet_list_re <= rx_reordered_list_re(blk * c_N to (blk + 1) * c_N - 1);
rx_beamlet_list_im <= rx_reordered_list_im(blk * c_N to (blk + 1) * c_N - 1);
else
-- identity beamlet output order
-- . X at even indices
-- . Y at odd indices
rx_beamlet_list_re <= rx_packet_list_re(0 to c_sdp_cep_nof_beamlets_per_block * c_sdp_N_pol_bf - 1);
rx_beamlet_list_im <= rx_packet_list_im(0 to c_sdp_cep_nof_beamlets_per_block * c_sdp_N_pol_bf - 1);
rx_beamlet_list_re <= rx_packet_list_re(blk * c_N to (blk + 1) * c_N - 1);
rx_beamlet_list_im <= rx_packet_list_im(blk * c_N to (blk + 1) * c_N - 1);
end if;
rx_beamlet_list_val <= '1';
wait until rising_edge(ext_clk);
end loop;
end process;
-- Verify that beamlet values remain stable in time
p_verify_rx_beamlet_list : process
-- Verify that beamlet values remain stable in time, so same beamlet value in each time block
verify_rx_beamlet_list <= '1' when unsigned(rd_data_bsn) > c_verify_rx_beamlet_list_bsn else '0';
p_verify_rx_beamlet_list : process(ext_clk)
begin
-- . After some time all rx blocks should have same beamlet values, so
if rising_edge(ext_clk) then
-- Wait until p_rx_beamlet_list is valid
if rx_beamlet_list_val = '1' then
-- Maintain previous x_beamlet_list for comparision
prev_rx_beamlet_list_re <= rx_beamlet_list_re;
prev_rx_beamlet_list_im <= rx_beamlet_list_im;
-- After some time all rx blocks should have same beamlet values, so
-- then rx_beamlet_list then does not change in time and the other
-- blocks should be the same as the first block.
-- TODO
if verify_rx_beamlet_list = '1' then
assert rx_beamlet_list_re = prev_rx_beamlet_list_re report "Wrong: rx_beamlet_list_re differs from previous block" severity ERROR;
assert rx_beamlet_list_im = prev_rx_beamlet_list_im report "Wrong: rx_beamlet_list_im differs from previous block" severity ERROR;
end if;
end if;
end if;
end process;
-- get rx_beamlet for comparision with c_exp_beamlet
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment