diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd index 397b3b9d9d33b65619a5150c445a7dc4951a787a..a24e376463f9e324019f9151590a1944645b48b2 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -64,7 +64,7 @@ USE work.sdp_pkg.ALL; ENTITY sdp_statistics_offload IS GENERIC ( g_statistics_type : STRING := "SST"; - g_offload_time : NATURAL := 0; + g_offload_time : NATURAL := 0; -- from wave window (330320nS - 83105nS) / 50nS = 12361 cycles. g_beamset_id : NATURAL := 0 ); PORT ( @@ -76,8 +76,8 @@ ENTITY sdp_statistics_offload IS dp_rst : IN STD_LOGIC; -- from MM master multiplexer - master_mosi : IN t_mem_mosi := c_mem_mosi_rst; - master_miso : OUT t_mem_miso; + master_mosi : OUT t_mem_mosi; -- := c_mem_mosi_rst; + master_miso : IN t_mem_miso; reg_enable_mosi : IN t_mem_mosi := c_mem_mosi_rst; reg_enable_miso : OUT t_mem_miso; @@ -103,17 +103,16 @@ END sdp_statistics_offload; ARCHITECTURE str OF sdp_statistics_offload IS - CONSTANT c_version : NATURAL := 1; - CONSTANT c_marker : NATURAL := sel_a_b((g_statistics_type="BST"), 66, sel_a_b((g_statistics_type="XST"), 88, 83)); -- based on g_statistics_type: 'S'=0x53="SST", 'B'=0x42="BST", 'X'=0x58="XST" - CONSTANT c_nof_statistics_per_packet : NATURAL := 0; - CONSTANT c_data_size : NATURAL := 2; - CONSTANT c_step_size : NATURAL := 4; - CONSTANT c_nof_data : NATURAL := 512; - CONSTANT c_block_size : NATURAL := c_nof_data * c_data_size * (c_step_size / c_data_size); - CONSTANT c_nof_streams : NATURAL := 1; - CONSTANT c_nof_signal_inputs : NATURAL := sel_a_b(g_statistics_type="BST", 0, sel_a_b(g_statistics_type="XST", c_sdp_S_pn, 1)); + CONSTANT c_version : NATURAL := 1; + CONSTANT c_marker : NATURAL := sel_a_b((g_statistics_type="BST"), 66, sel_a_b((g_statistics_type="XST"), 88, 83)); -- based on g_statistics_type: 'S'=0x53="SST", 'B'=0x42="BST", 'X'=0x58="XST" + CONSTANT c_nof_statistics_per_packet : NATURAL := 0; + CONSTANT c_data_size : NATURAL := 2; + CONSTANT c_step_size : NATURAL := 4; + CONSTANT c_nof_data : NATURAL := 512; + CONSTANT c_block_size : NATURAL := c_nof_data * c_data_size * (c_step_size / c_data_size); + CONSTANT c_nof_streams : NATURAL := 1; + CONSTANT c_nof_signal_inputs : NATURAL := sel_a_b(g_statistics_type="BST", 0, sel_a_b(g_statistics_type="XST", c_sdp_S_pn, 1)); CONSTANT c_nof_statistics_per_package : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_S_sub_bf, sel_a_b(g_statistics_type="XST", (c_sdp_S_pn*c_sdp_S_pn*c_nof_complex), c_sdp_N_sub)); - CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf; TYPE t_reg IS RECORD @@ -122,16 +121,14 @@ ARCHITECTURE str OF sdp_statistics_offload IS start_pulse : STD_LOGIC; dp_header_info : STD_LOGIC_VECTOR(1023 DOWNTO 0); data_id : STD_LOGIC_VECTOR(31 DOWNTO 0); + last_mm_done : STD_LOGIC; END RECORD; - CONSTANT c_reg_rst : t_reg := (0, 0, '0', (OTHERS => '0'), (OTHERS => '0')); + CONSTANT c_reg_rst : t_reg := (0, 0, '0', (OTHERS => '0'), (OTHERS => '0'), '0'); SIGNAL r : t_reg; SIGNAL d : t_reg; - SIGNAL m_mosi : t_mem_mosi; - SIGNAL m_miso : t_mem_miso; - SIGNAL trigger : STD_LOGIC := '0'; SIGNAL nof_cycles_dly : NATURAL := 0; SIGNAL mm_done : STD_LOGIC := '0'; @@ -150,9 +147,6 @@ ARCHITECTURE str OF sdp_statistics_offload IS BEGIN - m_mosi <= master_mosi; - master_miso <= m_miso; - -- count number of sop's in a sync interval p_bsn_at_sync : PROCESS(in_sosi) BEGIN @@ -190,12 +184,11 @@ BEGIN ------------------------------------------------------------------------------- - -- Assemble offload info + -- Assemble offload header info ------------------------------------------------------------------------------- - dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_src_mac" )) <= eth_src_mac; - dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_src_port")) <= udp_src_port; - dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_src_addr" )) <= ip_src_addr; - + dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_src_mac" )) <= eth_src_mac; + dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "udp_src_port" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_src_port" )) <= udp_src_port; + dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_src_addr" )) <= ip_src_addr; dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_marker" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_marker" )) <= TO_UVEC(c_marker, 8); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_observation_id" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_observation_id" )) <= sdp_info.observation_id; dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_station_id" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_station_id" )) <= sdp_info.station_id; @@ -214,11 +207,9 @@ BEGIN dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs" )) <= TO_UVEC(c_nof_signal_inputs, 8); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_package" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_package" )) <= TO_UVEC(c_nof_statistics_per_package, 16); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_block_period" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_block_period" )) <= sdp_info.block_period; - dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "dp_bsn" )) <= bsn_at_sync; - nof_cycles_dly <= gn_index * g_offload_time; sdp_data_id <= r.data_id; @@ -231,26 +222,29 @@ BEGIN END IF; END PROCESS; - p_control_packet_offload : PROCESS(r, trigger, mm_done) BEGIN d <= r; - + d.last_mm_done <= mm_done; -- assign sdp_data_id for different statistic types IF g_statistics_type = "SST" THEN d.data_id <= x"000000" & TO_UVEC(r.block_count, 8); ELSIF g_statistics_type = "BST" THEN d.data_id <= x"0000" & TO_UVEC(c_beamlet_id, 24); ELSIF g_statistics_type = "XST" THEN - d.data_id <= x"00" & TO_UVEC(0, 8) & TO_UVEC(0, 8) & TO_UVEC(0, 8); -- TODO fill fill in right values. + d.data_id <= x"00" & TO_UVEC(0, 8) & TO_UVEC(0, 8) & TO_UVEC(0, 8); -- TODO: fill in right values for XST. ELSE d.data_id <= x"00000000"; END IF; - IF trigger = '1' OR mm_done = '1' THEN + IF trigger = '1' AND d.block_count = 0 THEN + d.start_pulse <= '1'; + END IF; + + IF mm_done = '1' AND r.last_mm_done = '0' THEN d.block_count <= r.block_count + 1; - IF (r.block_count + 1) mod 2 = 0 THEN - d.start_address <= d.block_count / 2 * c_block_size; + IF r.block_count mod 2 = 0 THEN + d.start_address <= r.block_count / 2 * c_block_size; ELSE d.start_address <= r.start_address + c_data_size; END IF; @@ -261,7 +255,7 @@ BEGIN d.dp_header_info <= dp_header_info; END IF; - IF d.block_count >= c_sdp_S_pn THEN + IF r.block_count >= c_sdp_S_pn THEN d.block_count <= 0; d.start_address <= 0; END IF; @@ -270,9 +264,6 @@ BEGIN u_mms_common_variable_delay : ENTITY common_lib.mms_common_variable_delay - GENERIC MAP ( - g_max_delay => 4 - ) PORT MAP ( mm_rst => mm_rst, mm_clk => mm_clk, @@ -295,24 +286,25 @@ BEGIN g_nof_data => c_nof_data ) PORT MAP( - rst => mm_rst, - clk => mm_clk, + rst => dp_rst, + clk => dp_clk, start_pulse => r.start_pulse, start_address => r.start_address, mm_done => mm_done, - mm_mosi => m_mosi, - mm_miso => m_miso, + mm_mosi => master_mosi, + mm_miso => master_miso, out_sosi => dp_block_from_mm_src_out, out_siso => dp_block_from_mm_src_in ); u_dp_offload_tx_v3: ENTITY dp_lib.dp_offload_tx_v3 GENERIC MAP ( - g_nof_streams => c_nof_streams, - g_data_w => c_word_w, - g_symbol_w => c_byte_w, - g_hdr_field_arr => c_sdp_stat_hdr_field_arr, - g_hdr_field_sel => c_sdp_stat_hdr_field_sel + g_nof_streams => c_nof_streams, + g_data_w => c_word_w, + g_symbol_w => c_word_w, + g_hdr_field_arr => c_sdp_stat_hdr_field_arr, + g_hdr_field_sel => c_sdp_stat_hdr_field_sel, + g_pipeline_ready => TRUE ) PORT MAP( mm_rst => mm_rst, diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd index b03f7979aab618b8831e1bd8ca58965b0e382d7e..884b9f723e99b6c22611dec739965722c91dd8fe 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd @@ -40,6 +40,7 @@ USE common_lib.common_mem_pkg.ALL; USE common_lib.tb_common_pkg.ALL; USE common_lib.tb_common_mem_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_field_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE work.sdp_pkg.ALL; @@ -47,7 +48,7 @@ USE work.sdp_pkg.ALL; ENTITY tb_sdp_statistics_offload IS GENERIC ( g_statistics_type : STRING := "SST"; - g_nof_signal_inputs_per_pn : NATURAL := 4 + g_nof_signal_inputs_per_pn : NATURAL := 12 ); END tb_sdp_statistics_offload; @@ -55,16 +56,20 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS CONSTANT c_dp_clk_period : TIME := 5 ns; -- 200 MHz CONSTANT c_mm_clk_period : TIME := 20 ns; -- 50 MHz - CONSTANT c_cross_clock_domain_latency : NATURAL := 40; - + CONSTANT c_cross_clock_domain_latency : NATURAL := 20; + CONSTANT c_eth_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0) := x"123456789ABC"; - CONSTANT c_udp_src_port : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0) := x"D001"; 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"; - -- used mm_adresses on mm bus + -- used mm_adresses on mm bus "enable_mosi/miso" CONSTANT c_mm_addr_enable : NATURAL := 0; + -- used mm_adresses on mm bus "hdr_dat_mosi/miso" + CONSTANT c_mm_addr_eth_src_mac : NATURAL := 1; + CONSTANT c_mm_addr_ip_src_addr : NATURAL := 13; + CONSTANT c_mm_addr_udp_src_port : NATURAL := 15; - -- used test ram size: c_block_size = c_nof_data * c_data_size * (c_step_size / c_data_size) => 512 * 2 * (4 / 2) = 2048 words per pair of signal inputs; + -- used test ram size: 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 = CONSTANT c_nof_data : NATURAL := 512; CONSTANT c_data_size : NATURAL := 2; @@ -73,8 +78,10 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS 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_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; + SIGNAL tb_end : STD_LOGIC := '0'; - SIGNAL tb_mm_reg_end : STD_LOGIC := '0'; SIGNAL dp_clk : STD_LOGIC := '1'; -- digital data path clock = 200 MHz (deser factor 4); SIGNAL dp_rst : STD_LOGIC; @@ -91,28 +98,39 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS SIGNAL hdr_dat_mosi : t_mem_mosi := c_mem_mosi_rst; SIGNAL hdr_dat_miso : t_mem_miso; + SIGNAL offload_rx_hdr_dat_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL offload_rx_hdr_dat_miso : t_mem_miso; + SIGNAL in_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL offload_sosi : t_dp_sosi; SIGNAL offload_siso : t_dp_siso := c_dp_siso_rst; - SIGNAL test_offload_sosi : t_dp_sosi; + SIGNAL link_offload_sosi : t_dp_sosi := c_dp_sosi_rst; + SIGNAL link_offload_siso : t_dp_siso; + + 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'); -- signals used to change settings of sdp_info - SIGNAL gn_index : NATURAL := 15; + SIGNAL gn_index : NATURAL := 1; SIGNAL f_adc : STD_LOGIC := '0'; SIGNAL fsub_type : STD_LOGIC := '0'; SIGNAL sdp_info : t_sdp_info := ( x"0001", '0', x"00000003", b"01", '0', '0', '0', '0', x"00", x"00", x"00", x"00", x"0000", x"0000"); - -- signals used for response of mm bus - SIGNAL mm_natural_response : NATURAL; - -- signals used for starting processes - SIGNAL wr_data : STD_LOGIC_VECTOR(c_ram_buf.dat_w-1 DOWNTO 0); - SIGNAL wr_addr : STD_LOGIC_VECTOR(c_ram_buf.adr_w-1 DOWNTO 0); - SIGNAL wr_en : STD_LOGIC; + SIGNAL ram_wr_data : STD_LOGIC_VECTOR(c_ram_buf.dat_w-1 DOWNTO 0); + SIGNAL ram_wr_addr : STD_LOGIC_VECTOR(c_ram_buf.adr_w-1 DOWNTO 0); + SIGNAL ram_wr_en : STD_LOGIC; SIGNAL init_ram_done: STD_LOGIC := '0'; + SIGNAL rx_bsn : NATURAL := 0; + SIGNAL rx_data_id : NATURAL := 0; + + BEGIN dp_rst <= '1', '0' AFTER c_dp_clk_period*7; dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2; @@ -123,117 +141,163 @@ BEGIN -- fill ram with data, data is same as address number. p_mm_statistics_ram : PROCESS - VARIABLE addr_cnt : NATURAL := 0; BEGIN - wr_en <= '0'; + ram_wr_en <= '0'; -- initialyze proc_common_wait_until_low(mm_clk, mm_rst); proc_common_wait_some_cycles(mm_clk, 10); FOR i IN 0 TO c_ram_buf.nof_dat-1 LOOP - wr_addr <= TO_UVEC(addr_cnt, c_ram_buf.adr_w); - wr_data <= TO_UVEC(addr_cnt, c_ram_buf.dat_w); - wr_en <= '1'; - proc_common_wait_some_cycles(dp_clk, 1); - addr_cnt := addr_cnt + 1; + ram_wr_addr <= TO_UVEC(i, c_ram_buf.adr_w); + ram_wr_data <= TO_UVEC(i, c_ram_buf.dat_w); + ram_wr_en <= '1'; + proc_common_wait_some_cycles(mm_clk, 1); END LOOP; - wr_en <= '0'; + ram_wr_en <= '0'; init_ram_done <= '1'; WAIT; END PROCESS; - p_in_sosi : PROCESS + p_enable_trigger : PROCESS BEGIN - proc_common_wait_until_high(dp_clk, init_ram_done); + proc_common_wait_until_high(mm_clk, init_ram_done); -- enable common variabel delay - proc_mem_mm_bus_wr(c_mm_addr_enable, 1, mm_clk, enable_miso, enable_mosi); + proc_mem_mm_bus_wr(c_mm_addr_enable, 1, mm_clk, enable_miso, enable_mosi); proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); - --offload_siso <= c_dp_siso_rdy; - proc_common_wait_some_cycles(mm_clk, 1); - FOR i IN 0 TO g_nof_signal_inputs_per_pn LOOP - in_sosi.sync <= '1'; - in_sosi.valid <= '1'; - in_sosi.sop <= '1'; - proc_common_wait_some_cycles(dp_clk, 1); - in_sosi.sync <= '0'; - in_sosi.sop <= '0'; - proc_common_wait_some_cycles(dp_clk, c_nof_data*c_data_size); - in_sosi.eop <= '1'; - proc_common_wait_some_cycles(dp_clk, 1); - in_sosi.eop <= '0'; - in_sosi.valid <= '0'; - proc_common_wait_some_cycles(dp_clk, 1); - END LOOP; WAIT; END PROCESS; - p_mm_reg_stimuli : PROCESS + p_in_sosi : PROCESS BEGIN - --enable_mosi <= c_mem_mosi_rst; - --hdr_dat_mosi <= c_mem_mosi_rst; + proc_common_wait_until_low(dp_clk, dp_rst); + proc_common_wait_some_cycles(dp_clk, 10); + in_sosi.valid <= '1'; + WHILE TRUE LOOP + FOR i IN 0 TO c_nof_block_per_sync-1 LOOP + FOR j IN 0 TO c_nof_clk_per_block-1 LOOP + in_sosi.sync <= '0'; + in_sosi.sop <= '0'; + in_sosi.eop <= '0'; + IF i = 0 AND j = 0 THEN + in_sosi.sync <= '1'; + END IF; + IF j = 0 THEN + in_sosi.sop <= '1'; + in_sosi.bsn <= INCR_UVEC(in_sosi.bsn, 1); + END IF; + IF j = c_nof_clk_per_block-1 THEN + in_sosi.eop <= '1'; + END IF; + proc_common_wait_some_cycles(dp_clk, 1); + END LOOP; + END LOOP; + END LOOP; + WAIT; + END PROCESS; - proc_common_wait_until_high(dp_clk, init_ram_done); - proc_common_wait_some_cycles(mm_clk, 100); + p_verify : PROCESS(test_offload_sosi, rx_hdr_fields_out, rx_hdr_fields_raw) + BEGIN + IF test_offload_sosi.sop = '1' THEN + 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"))); + 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"))); + END IF; + test_offload_siso <= c_dp_siso_rdy; + END PROCESS; - -- station_id, antenna_band_index, observation_id, nyquist_zone_index, f_adc, fsub_type, beam_repositioning_flag, subband_calibrated_flag, O_si, N_si, O_rn, N_rn, block_period, beamlet_scale - --sdp_info <= ( x"0001", '0', x"00000003", b"01", '0', '0', '0', '0', x"00", x"00", x"00", x"00", x"0000", x"0000"); - proc_common_wait_some_cycles(mm_clk, 1); - --in_sosi.sync <= '1'; + p_mm_offload : PROCESS + BEGIN + proc_common_wait_until_low(mm_clk, mm_rst); + proc_common_wait_some_cycles(mm_clk, 10); + -- write ethernet destinations via reg_hdr_dat_mosi + proc_mem_mm_bus_wr(c_mm_addr_udp_src_port, TO_UINT(c_udp_src_port), mm_clk, hdr_dat_miso, hdr_dat_mosi); + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + + proc_mem_mm_bus_wr(c_mm_addr_ip_src_addr, TO_UINT(c_ip_src_addr), mm_clk, hdr_dat_miso, hdr_dat_mosi); + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + + proc_mem_mm_bus_wr(c_mm_addr_eth_src_mac, TO_UINT(c_eth_src_mac), mm_clk, hdr_dat_miso, hdr_dat_mosi); + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + WAIT; + END PROCESS; - proc_common_wait_some_cycles(mm_clk, 100); + p_link_offload : PROCESS(offload_sosi, in_sosi) + BEGIN + offload_siso <= c_dp_siso_rst; + IF init_ram_done = '1' THEN + link_offload_sosi <= c_dp_sosi_rst; + link_offload_sosi.data <= offload_sosi.data; + link_offload_sosi.empty <= offload_sosi.empty; + link_offload_sosi.valid <= offload_sosi.valid; + link_offload_sosi.sop <= offload_sosi.sop; + link_offload_sosi.eop <= offload_sosi.eop; + + offload_siso <= c_dp_siso_rdy; + END IF; + END PROCESS; + + p_dp_end : PROCESS + BEGIN + proc_common_wait_until_high(mm_clk, init_ram_done); + proc_common_wait_some_cycles(dp_clk, 320000); tb_end <= '1'; WAIT; END PROCESS; - - u_ram: ENTITY common_lib.common_ram_crw_crw_ratio + u_ram: ENTITY common_lib.common_ram_crw_crw GENERIC MAP ( - g_ram_a => c_ram_buf, -- settings for port a - g_ram_b => c_ram_buf -- settings for port b + g_ram => c_ram_buf ) PORT MAP ( - -- MM read/write port clock domain + -- MM write port clock domain rst_a => mm_rst, clk_a => mm_clk, - wr_en_a => master_mosi.wr, - wr_dat_a => master_mosi.wrdata(c_ram_buf.dat_w-1 DOWNTO 0), - adr_a => master_mosi.address(c_ram_buf.adr_w-1 DOWNTO 0), - rd_en_a => master_mosi.rd, - rd_dat_a => master_miso.rddata(c_ram_buf.dat_w-1 DOWNTO 0), - rd_val_a => master_miso.rdval, - - -- ST write only port clock domain - rst_b => dp_rst, - clk_b => dp_clk, - wr_en_b => wr_en, - wr_dat_b => wr_data, - adr_b => wr_addr, - rd_en_b => '0', - rd_dat_b => OPEN, - rd_val_b => OPEN + wr_en_a => ram_wr_en, + wr_dat_a => ram_wr_data, + adr_a => ram_wr_addr, + + -- DP read only port clock domain + rst_b => dp_rst, + clk_b => dp_clk, + adr_b => master_mosi.address(c_ram_buf.adr_w-1 DOWNTO 0), + rd_en_b => master_mosi.rd, + rd_dat_b => master_miso.rddata(c_ram_buf.dat_w-1 DOWNTO 0), + rd_val_b => master_miso.rdval ); - p_test_offload : PROCESS(offload_sosi, in_sosi) - BEGIN - offload_siso <= c_dp_siso_rst; - IF init_ram_done = '1' THEN - test_offload_sosi <= c_dp_sosi_rst; - test_offload_sosi.data <= offload_sosi.data; - test_offload_sosi.empty <= offload_sosi.empty; - test_offload_sosi.valid <= offload_sosi.valid; - test_offload_sosi.sop <= offload_sosi.sop; - test_offload_sosi.eop <= offload_sosi.eop; - - offload_siso <= c_dp_siso_rdy; - END IF; - END PROCESS; + u_rx : ENTITY dp_lib.dp_offload_rx + GENERIC MAP ( + g_nof_streams => 1, + g_data_w => c_word_w, + g_hdr_field_arr => c_sdp_stat_hdr_field_arr, + g_remove_crc => FALSE, + g_crc_nof_words => 0 + ) + PORT MAP ( + mm_rst => mm_rst, + mm_clk => mm_clk, + + dp_rst => dp_rst, + dp_clk => dp_clk, + + reg_hdr_dat_mosi => offload_rx_hdr_dat_mosi, + reg_hdr_dat_miso => offload_rx_hdr_dat_miso, + + snk_in_arr(0) => link_offload_sosi, + snk_out_arr(0) => link_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 + ); -- SDP info u_dut: ENTITY work.sdp_statistics_offload GENERIC MAP ( g_statistics_type => "SST", - g_offload_time => 0, + g_offload_time => 500, g_beamset_id => 0 ) PORT MAP ( diff --git a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd index 553d7370c4038002aed2b45922052cddf6fff0af..d0b3fecfc1e11c954ffca87f65a8182b980102bc 100644 --- a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd @@ -42,7 +42,7 @@ ENTITY dp_block_from_mm IS rst : IN STD_LOGIC; clk : IN STD_LOGIC; start_pulse : IN STD_LOGIC; - start_address : IN NATURAL RANGE 0 TO g_step_size * g_nof_data; + start_address : IN NATURAL; mm_done : OUT STD_LOGIC; mm_mosi : OUT t_mem_mosi; mm_miso : IN t_mem_miso; @@ -82,7 +82,7 @@ BEGIN out_sosi.sop <= r.sop; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.sop can be used for output sop out_sosi.eop <= r.eop; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.eop can be used for output eop - mm_done <= d.eop; + mm_done <= r.eop; p_reg : PROCESS(rst, clk) BEGIN