Skip to content
Snippets Groups Projects

Clarify g_nof_destinations_max design revision parameter and package constants...

Merged Eric Kooistra requested to merge L2SDP-964 into master
1 file
+ 46
10
Compare changes
  • Side-by-side
  • Inline
@@ -62,24 +62,49 @@ package tb_sdp_pkg is
-----------------------------------------------------------------------------
-- Beamlet output via 10GbE to CEP (= central processor)
-----------------------------------------------------------------------------
function func_sdp_compose_cep_header(ip_src_addr : std_logic_vector;
ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
dp_bsn : natural) return t_sdp_cep_header;
function func_sdp_compose_cep_header(ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
dp_bsn : natural) return t_sdp_cep_header;
function func_sdp_verify_cep_header(in_hdr, exp_hdr : t_sdp_cep_header) return boolean;
function func_sdp_compose_cep_header(ip_src_addr : std_logic_vector;
ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
nof_blocks_per_packet : natural;
nof_beamlets_per_block : natural;
dp_bsn : natural) return t_sdp_cep_header;
function func_sdp_compose_cep_header(ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
nof_blocks_per_packet : natural;
nof_beamlets_per_block : natural;
dp_bsn : natural) return t_sdp_cep_header;
function func_sdp_compose_cep_header(ip_src_addr : std_logic_vector;
ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
dp_bsn : natural) return t_sdp_cep_header;
function func_sdp_compose_cep_header(ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
dp_bsn : natural) return t_sdp_cep_header;
function func_sdp_verify_cep_header(in_hdr : t_sdp_cep_header;
exp_hdr : t_sdp_cep_header;
beamlet_index_mod : boolean) return boolean;
function func_sdp_verify_cep_header(in_hdr : t_sdp_cep_header;
exp_hdr : t_sdp_cep_header) return boolean;
-----------------------------------------------------------------------------
-- Subband equalizer (ESub)
@@ -109,8 +134,8 @@ package tb_sdp_pkg is
-----------------------------------------------------------------------------
-- Beamlet output packet
-----------------------------------------------------------------------------
-- beamlet part index [0 : 3] of X, Y, X, Y in network longword:
-- - use separate array for re and for im:
-- beamlet complex part index [0 : 3] of X, Y, X, Y in network longword:
-- - use separate array for re part and for im part:
-- . re[0 : 3] at 0, 2, 4, 6 in longword
-- . im[0 : 3] at 1, 3, 5, 7 in longword
subtype t_sdp_beamlet_part_arr is t_slv_8_arr(0 to c_sdp_nof_beamlets_per_longword * c_sdp_N_pol_bf - 1);
@@ -127,6 +152,17 @@ package tb_sdp_pkg is
function func_sdp_undo_transpose_beamlet_packet(packet_list : t_sdp_beamlet_packet_list) return t_sdp_beamlet_packet_list;
-- Read beamlet packet octets per re and im parts
procedure proc_sdp_rx_beamlet_octets(
constant c_nof_blocks_per_packet : in natural;
signal clk : in std_logic;
signal rx_beamlet_sosi : in t_dp_sosi;
signal rx_beamlet_cnt : inout natural;
signal rx_beamlet_valid : out std_logic;
signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr;
signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr;
signal rx_packet_list_re : out t_slv_8_arr;
signal rx_packet_list_im : out t_slv_8_arr);
procedure proc_sdp_rx_beamlet_octets(
signal clk : in std_logic;
signal rx_beamlet_sosi : in t_dp_sosi;
@@ -311,14 +347,16 @@ package body tb_sdp_pkg is
return true;
end func_sdp_verify_stat_header;
function func_sdp_compose_cep_header(ip_src_addr : std_logic_vector;
ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
dp_bsn : natural) return t_sdp_cep_header is
function func_sdp_compose_cep_header(ip_src_addr : std_logic_vector;
ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
nof_blocks_per_packet : natural;
nof_beamlets_per_block : natural;
dp_bsn : natural) return t_sdp_cep_header is
-- Use sim default dst and src MAC, IP, UDP port from sdp_pkg.vhd and based on gn_index
constant c_mac_15_0 : std_logic_vector(15 downto 0) := func_sdp_gn_index_to_mac_15_0(gn_index);
variable v_hdr : t_sdp_cep_header;
@@ -367,14 +405,60 @@ package body tb_sdp_pkg is
v_hdr.app.sdp_reserved := TO_UVEC(0, 32);
v_hdr.app.sdp_beamlet_scale := TO_UVEC(beamlet_scale, 16);
v_hdr.app.sdp_beamlet_index := TO_UVEC(beamlet_index, 16);
v_hdr.app.sdp_nof_blocks_per_packet := TO_UVEC(c_sdp_cep_nof_blocks_per_packet, 8);
v_hdr.app.sdp_nof_beamlets_per_block := TO_UVEC(c_sdp_cep_nof_beamlets_per_block, 16);
v_hdr.app.sdp_nof_blocks_per_packet := TO_UVEC(nof_blocks_per_packet, 8);
v_hdr.app.sdp_nof_beamlets_per_block := TO_UVEC(nof_beamlets_per_block, 16);
v_hdr.app.sdp_block_period := sdp_info.block_period;
v_hdr.app.dp_bsn := TO_UVEC(dp_bsn, 64);
return v_hdr;
end func_sdp_compose_cep_header;
function func_sdp_compose_cep_header(ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
nof_blocks_per_packet : natural;
nof_beamlets_per_block : natural;
dp_bsn : natural) return t_sdp_cep_header is
-- Use sim default dst and src MAC, IP, UDP port from sdp_pkg.vhd and based on gn_index
constant c_ip_15_0 : std_logic_vector(15 downto 0) := func_sdp_gn_index_to_ip_15_0(gn_index);
constant c_ip_src_addr : std_logic_vector(31 downto 0) := c_sdp_cep_ip_src_addr_31_16 & c_ip_15_0;
begin
return func_sdp_compose_cep_header(c_ip_src_addr,
ip_header_checksum,
sdp_info,
gn_index,
payload_error,
beamlet_scale,
beamlet_index,
nof_blocks_per_packet,
nof_beamlets_per_block,
dp_bsn);
end func_sdp_compose_cep_header;
function func_sdp_compose_cep_header(ip_src_addr : std_logic_vector;
ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
payload_error : std_logic;
beamlet_scale : natural;
beamlet_index : natural;
dp_bsn : natural) return t_sdp_cep_header is
begin
return func_sdp_compose_cep_header(ip_src_addr,
ip_header_checksum,
sdp_info,
gn_index,
payload_error,
beamlet_scale,
beamlet_index,
c_sdp_cep_nof_blocks_per_packet,
c_sdp_cep_nof_beamlets_per_block,
dp_bsn);
end func_sdp_compose_cep_header;
function func_sdp_compose_cep_header(ip_header_checksum : natural;
sdp_info : t_sdp_info; -- app header
gn_index : natural;
@@ -393,10 +477,14 @@ package body tb_sdp_pkg is
payload_error,
beamlet_scale,
beamlet_index,
c_sdp_cep_nof_blocks_per_packet,
c_sdp_cep_nof_beamlets_per_block,
dp_bsn);
end func_sdp_compose_cep_header;
function func_sdp_verify_cep_header(in_hdr, exp_hdr : t_sdp_cep_header) return boolean is
function func_sdp_verify_cep_header(in_hdr : t_sdp_cep_header;
exp_hdr : t_sdp_cep_header;
beamlet_index_mod : boolean) return boolean is
variable v_beamlet_index : natural;
begin
-- eth header
@@ -442,8 +530,11 @@ package body tb_sdp_pkg is
assert in_hdr.app.sdp_reserved = exp_hdr.app.sdp_reserved report "Wrong beamlet app.sdp_reserved" severity ERROR;
assert in_hdr.app.sdp_beamlet_scale = exp_hdr.app.sdp_beamlet_scale report "Wrong beamlet app.sdp_beamlet_scale" severity ERROR;
-- Treat beamlet_index modulo c_sdp_S_sub_bf, because the beamlet packets from different beamsets may arrive in arbitrary order
v_beamlet_index := TO_UINT(in_hdr.app.sdp_beamlet_index) mod c_sdp_S_sub_bf;
v_beamlet_index := TO_UINT(in_hdr.app.sdp_beamlet_index);
if beamlet_index_mod then
-- Treat beamlet_index modulo c_sdp_S_sub_bf, because the beamlet packets from different beamsets may arrive in arbitrary order
v_beamlet_index := v_beamlet_index mod c_sdp_S_sub_bf;
end if;
assert v_beamlet_index = TO_UINT(exp_hdr.app.sdp_beamlet_index) report "Wrong beamlet app.sdp_beamlet_index" severity ERROR;
assert in_hdr.app.sdp_nof_blocks_per_packet = exp_hdr.app.sdp_nof_blocks_per_packet report "Wrong beamlet app.sdp_nof_blocks_per_packet" severity ERROR;
assert in_hdr.app.sdp_nof_beamlets_per_block = exp_hdr.app.sdp_nof_beamlets_per_block report "Wrong beamlet app.sdp_nof_beamlets_per_block" severity ERROR;
@@ -453,6 +544,12 @@ package body tb_sdp_pkg is
return true;
end func_sdp_verify_cep_header;
function func_sdp_verify_cep_header(in_hdr : t_sdp_cep_header;
exp_hdr : t_sdp_cep_header) return boolean is
begin
return func_sdp_verify_cep_header(in_hdr, exp_hdr, false);
end func_sdp_verify_cep_header;
function func_sdp_subband_equalizer(sp_subband_ampl, sp_subband_phase, sp_esub_gain, sp_esub_phase,
cross_subband_ampl, cross_subband_phase, cross_esub_gain, cross_esub_phase : real)
return t_real_arr is -- 0:3 = ampl, phase, re, im
@@ -557,21 +654,25 @@ package body tb_sdp_pkg is
-- . Beamlets array is stored big endian in the data, so X.real index 0 first
-- in MSByte of rx_beamlet_sosi.data.
procedure proc_sdp_rx_beamlet_octets(
signal clk : in std_logic;
signal rx_beamlet_sosi : in t_dp_sosi;
signal rx_beamlet_cnt : inout natural;
signal rx_beamlet_valid : out std_logic;
signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr;
signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr;
signal rx_packet_list_re : out t_sdp_beamlet_packet_list;
signal rx_packet_list_im : out t_sdp_beamlet_packet_list) is
constant c_nof_blocks_per_packet : in natural;
signal clk : in std_logic;
signal rx_beamlet_sosi : in t_dp_sosi;
signal rx_beamlet_cnt : inout natural;
signal rx_beamlet_valid : out std_logic;
signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr; -- [0:3]
signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr; -- [0:3]
signal rx_packet_list_re : out t_slv_8_arr; -- [0:c_list_len - 1]
signal rx_packet_list_im : out t_slv_8_arr) is
constant c_nof_beamlets_per_packet : natural := c_nof_blocks_per_packet * c_sdp_cep_nof_beamlets_per_block;
constant c_nof_longwords_per_packet : natural := c_nof_beamlets_per_packet / c_sdp_nof_beamlets_per_longword;
constant c_list_len : natural := c_nof_beamlets_per_packet * c_sdp_N_pol_bf;
begin
rx_beamlet_cnt <= 0;
rx_beamlet_valid <= '0';
-- Wait until start of a beamlet packet
proc_common_wait_until_high(clk, rx_beamlet_sosi.sop);
-- c_sdp_nof_beamlets_per_longword = 2 dual pol beamlets (= XY, XY) per 64b data word
for I in 0 to (c_sdp_cep_nof_beamlets_per_packet / c_sdp_nof_beamlets_per_longword) - 1 loop
for I in 0 to c_nof_longwords_per_packet - 1 loop
proc_common_wait_until_high(clk, rx_beamlet_sosi.valid);
rx_beamlet_valid <= '1';
-- Capture rx beamlets per longword in rx_beamlet_arr, for time series view in Wave window
@@ -598,8 +699,29 @@ package body tb_sdp_pkg is
-- contains no WAIT statement.
wait until rising_edge(clk);
rx_beamlet_valid <= '0';
rx_beamlet_cnt <= (rx_beamlet_cnt + c_sdp_nof_beamlets_per_longword) mod c_sdp_cep_nof_beamlets_per_block; -- 4 blocks/packet
rx_beamlet_cnt <= (rx_beamlet_cnt + c_sdp_nof_beamlets_per_longword) mod c_sdp_cep_nof_beamlets_per_block;
end loop;
end proc_sdp_rx_beamlet_octets;
procedure proc_sdp_rx_beamlet_octets(
signal clk : in std_logic;
signal rx_beamlet_sosi : in t_dp_sosi;
signal rx_beamlet_cnt : inout natural;
signal rx_beamlet_valid : out std_logic;
signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr;
signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr;
signal rx_packet_list_re : out t_sdp_beamlet_packet_list;
signal rx_packet_list_im : out t_sdp_beamlet_packet_list) is
begin
proc_sdp_rx_beamlet_octets(
c_sdp_cep_nof_blocks_per_packet, -- 4 blocks/packet
clk,
rx_beamlet_sosi,
rx_beamlet_cnt,
rx_beamlet_valid ,
rx_beamlet_arr_re,
rx_beamlet_arr_im,
rx_packet_list_re,
rx_packet_list_im);
end proc_sdp_rx_beamlet_octets;
end tb_sdp_pkg;
Loading