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

Corrected use and verification of BSN field.

parent 19403eed
Branches
Tags
1 merge request!175Added t_sdp_sim. Add func_sdp_get_stat_*() functions to determine the header...
......@@ -62,6 +62,7 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
CONSTANT c_cross_clock_domain_latency : NATURAL := 20;
-- In this tb simply use fixed src addresses
CONSTANT c_eth_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0) := x"123456789ABC";
CONSTANT c_ip_src_addr : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0) := x"0A090807";
CONSTANT c_udp_src_port : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0) := x"D001";
......@@ -69,11 +70,6 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
-- Used mm_adresses on mm bus "enable_mosi/miso".
CONSTANT c_reg_enable_mm_addr_enable : NATURAL := 0;
-- Used mm_adresses on mm bus "hdr_dat_mosi/miso".
CONSTANT c_hdr_dat_mm_addr_eth_src_mac : NATURAL := 1;
CONSTANT c_hdr_dat_mm_addr_ip_src_addr : NATURAL := 13;
CONSTANT c_hdr_dat_mm_addr_udp_src_port : NATURAL := 15;
-- header fields
CONSTANT c_nof_statistics_per_packet : NATURAL := func_sdp_get_stat_nof_statistics_per_packet(g_statistics_type);
CONSTANT c_udp_total_length : NATURAL := func_sdp_get_stat_udp_total_length(g_statistics_type);
......@@ -95,6 +91,7 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
CONSTANT c_ram_buf : t_c_mem := (1, c_ram_w, 32, 2**c_ram_w, 'X');
-- Define block timing.
CONSTANT c_bsn_init : NATURAL := 0;
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;
CONSTANT c_nof_valid_per_block : NATURAL := c_nof_data * c_data_size;
......@@ -122,16 +119,18 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL offload_rx_hdr_dat_miso : t_mem_miso;
SIGNAL in_sosi : t_dp_sosi := c_dp_sosi_rst;
SIGNAL offload_data : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL offload_sosi : t_dp_sosi;
SIGNAL offload_siso : t_dp_siso := c_dp_siso_rst;
SIGNAL test_offload_sosi : t_dp_sosi := c_dp_sosi_rst;
SIGNAL test_offload_siso : t_dp_siso;
SIGNAL rx_hdr_fields_out : STD_LOGIC_VECTOR(1023 DOWNTO 0);
SIGNAL rx_hdr_fields_raw : STD_LOGIC_VECTOR(1023 DOWNTO 0) := (OTHERS => '0');
SIGNAL rx_sdp_stat_header : t_sdp_stat_header;
SIGNAL exp_sdp_stat_header : t_sdp_stat_header;
SIGNAL exp_bsn : STD_LOGIC_VECTOR(63 DOWNTO 0);
-- Signals used to change settings of sdp_info.
SIGNAL gn_index : NATURAL := 1; -- select > 0 to see effect of g_offload_time
......@@ -159,9 +158,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL ram_wr_en : STD_LOGIC;
SIGNAL init_ram_done : STD_LOGIC := '0';
SIGNAL in_sync_cnt : NATURAL := 0;
SIGNAL in_sync_hold : STD_LOGIC := '0';
SIGNAL rx_prev_bsn : NATURAL := 0;
SIGNAL rx_bsn : NATURAL := 0;
SIGNAL rx_block_cnt : NATURAL := 0;
SIGNAL rx_valid_clk_cnt : NATURAL := 0;
......@@ -202,16 +200,11 @@ BEGIN
WAIT;
END PROCESS;
-- Module dp_offload_tx_v3.vhd can handle 32 data that is not aligned, dp_offload_rx can not.
-- This is the reason the first 16bit of the header are always zero.
-- This process will start counting with bit16 high, the first bit that wil be received,
-- on each dp_clk the bsn is incremented with 0x10000, if you look at b63..b16 it looks like normal counting.
-- If dp_offload_rx.vhd is fixed this can be set normal again.
p_in_sosi : PROCESS
BEGIN
proc_common_wait_until_low(dp_clk, dp_rst);
proc_common_wait_some_cycles(dp_clk, 12);
in_sosi.bsn <= TO_DP_BSN(16#10000#);
in_sosi.bsn <= TO_DP_BSN(c_bsn_init);
in_sosi.valid <= '1';
WHILE TRUE LOOP
FOR i IN 0 TO c_nof_block_per_sync-1 LOOP
......@@ -224,7 +217,7 @@ BEGIN
END IF;
IF j = 0 THEN
in_sosi.sop <= '1';
in_sosi.bsn <= INCR_UVEC(in_sosi.bsn, 16#10000#); -- = 2**16 = 65536
in_sosi.bsn <= INCR_UVEC(in_sosi.bsn, 1);
END IF;
IF j = c_nof_clk_per_block-1 THEN
in_sosi.eop <= '1';
......@@ -236,7 +229,7 @@ BEGIN
WAIT;
END PROCESS;
p_exp_sdp_stat_header : PROCESS(sdp_info, subband_calibrated_flag, gn_index, rx_block_cnt)
p_exp_sdp_stat_header : PROCESS(sdp_info, subband_calibrated_flag, gn_index, rx_block_cnt, exp_bsn)
BEGIN
-- eth header
exp_sdp_stat_header.eth.dst_mac <= c_sdp_stat_eth_dst_mac;
......@@ -298,7 +291,7 @@ BEGIN
exp_sdp_stat_header.app.sdp_nof_statistics_per_packet <= TO_UVEC(c_nof_statistics_per_packet, 16);
exp_sdp_stat_header.app.sdp_block_period <= sdp_info.block_period;
exp_sdp_stat_header.app.dp_bsn <= TO_SVEC(-1, 64);
exp_sdp_stat_header.app.dp_bsn <= exp_bsn;
END PROCESS;
rx_sdp_stat_header <= func_sdp_extract_stat_header(rx_hdr_fields_raw);
......@@ -309,7 +302,7 @@ BEGIN
IF test_offload_sosi.eop = '1' THEN
-- bsn is not fully received (bit 0-15 is missing) because 32 bit allignment not working in dp_offload_rx.vhd.
v_bool := func_sdp_verify_stat_header(g_statistics_type, rx_sdp_stat_header, exp_sdp_stat_header, sdp_info, rx_bsn);
v_bool := func_sdp_verify_stat_header(g_statistics_type, rx_sdp_stat_header, exp_sdp_stat_header, sdp_info);
END IF;
END PROCESS;
......@@ -334,10 +327,16 @@ BEGIN
END IF;
END PROCESS;
-- Capture rx_bsn from header.
rx_bsn <= TO_UINT(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "dp_bsn")+16));
-- Keep rx_bsn from previous header.
rx_prev_bsn <= rx_bsn WHEN rising_edge(dp_clk);
-- Count number of sync intervals, to determine expected statistics bsn
p_rx_sync_cnt : PROCESS(dp_clk)
BEGIN
IF rising_edge(dp_clk) THEN
IF in_sosi.sync = '1' THEN
in_sync_cnt <= in_sync_cnt + 1;
END IF;
END IF;
END PROCESS;
exp_bsn <= TO_SVEC(c_bsn_init + 1 + (in_sync_cnt - 1) * c_nof_block_per_sync, 64);
-- Verify number of blocks between 2 syncs and between 2 changed bsn numbers.
p_verify_nof_blocks : PROCESS(dp_clk)
......@@ -349,14 +348,8 @@ BEGIN
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.
-- rx_bsn > rx_prev_bsn is needed to detect a new rx_bsn.
IF rx_prev_bsn > 0 AND rx_bsn > rx_prev_bsn THEN
ASSERT (rx_bsn - rx_prev_bsn) = c_nof_block_per_sync REPORT "wrong number of blocks between 2 bsn numbers" SEVERITY ERROR;
END IF;
END IF;
test_offload_siso <= c_dp_siso_rdy;
END IF;
END PROCESS;
p_verify_nof_valid : PROCESS(dp_clk)
......@@ -423,7 +416,6 @@ BEGIN
snk_out_arr(0) => offload_siso,
src_out_arr(0) => test_offload_sosi,
src_in_arr(0) => test_offload_siso,
hdr_fields_out_arr(0) => rx_hdr_fields_out,
hdr_fields_raw_arr(0) => rx_hdr_fields_raw
......@@ -466,4 +458,7 @@ BEGIN
ip_src_addr => c_ip_src_addr
);
-- To view the 32 bit 1GbE offload data more easily in the Wave window
offload_data <= offload_sosi.data(31 DOWNTO 0);
END tb;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment