Skip to content
Snippets Groups Projects
Commit c275baa1 authored by Pieter Donker's avatar Pieter Donker
Browse files

L2SDP-200, processed review comments 2.

parent 0d5503a7
No related branches found
No related tags found
2 merge requests!100Removed text for XSub that is now written in Confluence Subband correlator...,!67Resolve L2SDP-200
......@@ -78,10 +78,10 @@ PACKAGE sdp_pkg is
CONSTANT c_sdp_W_adc : NATURAL := 14;
CONSTANT c_sdp_W_fir_coef : NATURAL := 16;
CONSTANT c_sdp_W_subband : NATURAL := 18;
CONSTANT c_sdp_P_pfb : NATURAL := c_sdp_S_pn/c_sdp_Q_fft;
CONSTANT c_sdp_P_pfb : NATURAL := c_sdp_S_pn / c_sdp_Q_fft;
CONSTANT c_sdp_S_sub_bf : NATURAL := 488;
CONSTANT c_sdp_f_adc_MHz : NATURAL := 200;
CONSTANT c_sdp_T_adc : TIME := (10**6/c_sdp_f_adc_MHz) * 1 ps;
CONSTANT c_sdp_T_adc : TIME := (10**6 / c_sdp_f_adc_MHz) * 1 ps;
CONSTANT c_sdp_T_sub : TIME := c_sdp_N_fft * c_sdp_T_adc;
CONSTANT c_sdp_W_sub_weight : NATURAL := 16;
CONSTANT c_sdp_W_sub_magnitude : NATURAL := 2;
......
......@@ -25,9 +25,10 @@
-- Purpose:
-- . SDP statistics offload
-- Description:
--
-- https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=L2M&title=L5+SDPFW+Design+Document%3A+Subband+filterbank
-- https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank
-- . See figure 4.3
-- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
-- . See 2.9.4 Station Control (L3-SC) - SDP Firmware (L4-SDPFW)
--
-------------------------------------------------------------------------------
......@@ -109,7 +110,6 @@ ARCHITECTURE str OF sdp_statistics_offload IS
sel_a_b(g_statistics_type="XST", (c_sdp_S_pn * c_sdp_S_pn * c_nof_complex),
c_sdp_N_sub)); -- SST
CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
TYPE t_reg IS RECORD
......@@ -140,19 +140,10 @@ ARCHITECTURE str OF sdp_statistics_offload IS
--SIGNAL sdp_data_id : STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
p_bsn_at_sync : PROCESS(in_sosi)
BEGIN
IF in_sosi.sync = '1' THEN
bsn_at_sync(63 DOWNTO 0) <= in_sosi.bsn(63 DOWNTO 0);
END IF;
END PROCESS;
-- get payload errors and keep them till next sync
p_payload_error : PROCESS(in_sosi)
BEGIN
END PROCESS;
bsn_at_sync <= RESIZE_UVEC(in_sosi.bsn, 64) WHEN rising_edge(dp_clk) AND in_sosi.sync = '1';
-------------------------------------------------------------------------------
-- Assemble offload header info
-------------------------------------------------------------------------------
......@@ -200,7 +191,10 @@ BEGIN
d.interval_cnt <= 0;
d.payload_err <= '0';
ELSE
d.payload_err <= r.payload_err OR in_sosi.err(0);
IF in_sosi.eop = '1' THEN
d.payload_err <= r.payload_err OR in_sosi.err(0);
END IF;
IF in_sosi.sop = '1' THEN
d.interval_cnt <= r.interval_cnt + 1;
END IF;
......
......@@ -27,7 +27,7 @@
-- Description:
--
-- https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank
-- see Figure 4.8
-- . See figure 4.8
--
-- Remark:
-- .
......@@ -71,16 +71,18 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
CONSTANT c_hdr_dat_mm_addr_ip_src_addr : NATURAL := 13;
CONSTANT c_hdr_dat_mm_addr_udp_src_port : NATURAL := 15;
-- SST RAM size and structure: c_nof_clk_per_block = c_nof_data * c_data_size * (c_step_size / c_data_size) => 512 * 2 * (4 / 2) = 2048 words per pair of signal inputs;
-- with 12 signal input, 6 pairs (blocks) we will fill 2 blocks for testing 2 * 2048 = 4096 words
-- Define SST RAM structure
CONSTANT c_nof_data : NATURAL := 512;
CONSTANT c_data_size : NATURAL := 2;
CONSTANT c_step_size : NATURAL := 4;
-- Define SST RAM size for g_nof_signal_inputs_per_pn
CONSTANT c_ram_size : NATURAL := c_nof_data * c_data_size * g_nof_signal_inputs_per_pn;
CONSTANT c_ram_w : NATURAL := ceil_log2(c_ram_size);
--CONSTANT c_ram_buf : t_c_mem := (c_mem_ram_rd_latency, c_ram_w, 32, 2**c_ram_w, 'X');
CONSTANT c_ram_buf : t_c_mem := (1, c_ram_w, 32, 2**c_ram_w, 'X');
-- Define block timing
CONSTANT c_nof_block_per_sync : NATURAL := 20; -- sufficient to fit more than g_nof_signal_inputs_per_pn offload packets per sync interval
CONSTANT c_nof_clk_per_block : NATURAL := c_nof_data * c_data_size;
......@@ -158,6 +160,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL ram_wr_en : STD_LOGIC;
SIGNAL init_ram_done : STD_LOGIC := '0';
SIGNAL rx_request : STD_LOGIC := '0';
SIGNAL rx_prev_bsn : NATURAL := 0;
SIGNAL rx_bsn : NATURAL := 0;
SIGNAL rx_data_id : NATURAL := 0;
SIGNAL rx_block_cnt : NATURAL := 0;
......@@ -210,7 +214,7 @@ BEGIN
proc_common_wait_until_low(dp_clk, dp_rst);
proc_common_wait_some_cycles(dp_clk, 10);
in_sosi.valid <= '1';
in_sosi.bsn <= x"0000000000010000";
in_sosi.bsn <= TO_DP_BSN(16#10000#);
proc_common_wait_some_cycles(dp_clk, 1);
WHILE TRUE LOOP
FOR i IN 0 TO c_nof_block_per_sync-1 LOOP
......@@ -223,7 +227,7 @@ BEGIN
END IF;
IF j = 0 THEN
in_sosi.sop <= '1';
in_sosi.bsn <= INCR_UVEC(in_sosi.bsn, 65536);
in_sosi.bsn <= INCR_UVEC(in_sosi.bsn, 16#10000#); -- = 2**16 = 65536
END IF;
IF j = c_nof_clk_per_block-1 THEN
in_sosi.eop <= '1';
......@@ -310,44 +314,56 @@ BEGIN
WAIT;
END PROCESS;
-- Count number of blocks in a sync interval, rx_request is used to start counting from 0.
p_rx_block_cnt : PROCESS(dp_clk, test_offload_sosi)
BEGIN
IF rising_edge(dp_clk) THEN
IF test_offload_sosi.sop = '1' THEN
IF rx_request = '1' THEN
rx_block_cnt <= 0;
rx_request <= '0';
ELSE
rx_block_cnt <= rx_block_cnt + 1;
END IF;
END IF;
IF in_sosi.sync = '1' THEN
rx_request <= '1';
END IF;
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);
-- verify number of blocks between 2 syncs and between 2 changed bsn numbers
p_verify_nof_blocks : PROCESS(rx_bsn, rx_block_cnt, dp_clk, in_sosi.sync, test_offload_sosi, rx_hdr_fields_raw)
VARIABLE v_bsn : NATURAL;
VARIABLE v_block_cnt : NATURAL;
p_verify_nof_blocks : PROCESS(dp_clk, in_sosi, rx_block_cnt, rx_prev_bsn, rx_bsn, rx_hdr_fields_raw, test_offload_sosi)
BEGIN
v_bsn := rx_bsn;
v_block_cnt := rx_block_cnt;
IF rising_edge(dp_clk) THEN
IF init_ram_done = '1' THEN
IF in_sosi.sync = '1' AND rx_block_cnt > 0 THEN
ASSERT rx_block_cnt = g_nof_signal_inputs_per_pn REPORT "wrong number of blocks between 2 sync" SEVERITY ERROR;
ASSERT rx_block_cnt = g_nof_signal_inputs_per_pn - 1 REPORT "wrong number of blocks between 2 sync" SEVERITY ERROR;
END IF;
v_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));
IF rx_bsn > 0 AND v_bsn > rx_bsn THEN
ASSERT (v_bsn - rx_bsn) = c_nof_block_per_sync REPORT "wrong number of blocks between 2 bsn numbers" SEVERITY ERROR;
-- 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;
rx_data_id <= TO_UINT(rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")));
IF test_offload_sosi.eop = '1' THEN
ASSERT rx_data_id = rx_block_cnt REPORT "block count number in sdp_data_id not same as counted blocks" SEVERITY ERROR;
END IF;
IF test_offload_sosi.sop = '1' AND rx_block_cnt = g_nof_signal_inputs_per_pn THEN
v_block_cnt := 0;
ELSIF test_offload_sosi.eop = '1' THEN
v_block_cnt := v_block_cnt + 1;
ASSERT rx_data_id = rx_block_cnt REPORT "wrong block count number, received data_id not same as counted blocks" SEVERITY ERROR;
END IF;
END IF;
test_offload_siso <= c_dp_siso_rdy;
rx_bsn <= v_bsn;
rx_block_cnt <= v_block_cnt;
END IF;
END PROCESS;
p_verify_valid : PROCESS(dp_clk)
p_verify_nof_valid : PROCESS(dp_clk)
BEGIN
IF rising_edge(dp_clk) THEN
IF test_offload_sosi.sop = '1' THEN
......@@ -379,7 +395,7 @@ BEGIN
p_dp_end : PROCESS
BEGIN
proc_common_wait_until_high(mm_clk, init_ram_done);
proc_common_wait_some_cycles(dp_clk, c_nof_sync * c_nof_clk_per_sync); -- will show 4 sync periods
proc_common_wait_some_cycles(dp_clk, c_nof_sync * c_nof_clk_per_sync); -- will show some sync periods
tb_end <= '1';
WAIT;
END PROCESS;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment