From 586a148114a210a18c8ddc9dd3b9dcb3645f317d Mon Sep 17 00:00:00 2001 From: donker <donker@astron.nl> Date: Mon, 15 Mar 2021 18:45:22 +0100 Subject: [PATCH] L2SDP-206, succelfull compile with Fmax > 200MHz --- .../tb/vhdl/tb_lofar2_unb2b_filterbank.vhd | 2 +- .../sdp/src/vhdl/sdp_statistics_offload.vhd | 71 ++++++++++++------- .../base/dp/src/vhdl/dp_block_from_mm.vhd | 44 +++++++----- .../jesd204b/ip_arria10_e1sg_jesd204b.vhd | 7 +- 4 files changed, 72 insertions(+), 52 deletions(-) diff --git a/applications/lofar2/designs/lofar2_unb2b_filterbank/tb/vhdl/tb_lofar2_unb2b_filterbank.vhd b/applications/lofar2/designs/lofar2_unb2b_filterbank/tb/vhdl/tb_lofar2_unb2b_filterbank.vhd index 0bf899960c..b8aaf32595 100644 --- a/applications/lofar2/designs/lofar2_unb2b_filterbank/tb/vhdl/tb_lofar2_unb2b_filterbank.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_filterbank/tb/vhdl/tb_lofar2_unb2b_filterbank.vhd @@ -195,7 +195,7 @@ BEGIN ------------------------------------------------------------------------------ -- External PPS ------------------------------------------------------------------------------ - proc_common_gen_pulse(1, c_pps_period, '1', pps_rst, ext_clk, pps); + proc_common_gen_pulse(5, c_pps_period, '1', pps_rst, ext_clk, pps); jesd204b_sysref <= pps; ext_pps <= pps; 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 92aaa44f89..db4e7fcded 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -126,14 +126,17 @@ ARCHITECTURE str OF sdp_statistics_offload IS CONSTANT c_reg_rst : t_reg := (0, 0, '0', (OTHERS => '0'), (OTHERS => '0'), 0, '0', 0, 0); - SIGNAL r : t_reg; - SIGNAL d : t_reg; + SIGNAL r : t_reg; + SIGNAL nxt_r : t_reg; SIGNAL trigger : STD_LOGIC := '0'; SIGNAL mm_done : STD_LOGIC := '0'; SIGNAL dp_block_from_mm_src_out : t_dp_sosi; SIGNAL dp_block_from_mm_src_in : t_dp_siso; + SIGNAL dp_offload_snk_in : t_dp_sosi; + SIGNAL dp_offload_snk_out : t_dp_siso; + SIGNAL dp_header_info : STD_LOGIC_VECTOR(1023 DOWNTO 0):= (OTHERS => '0'); SIGNAL bsn_at_sync : STD_LOGIC_VECTOR(63 DOWNTO 0) := (OTHERS => '0'); @@ -175,69 +178,71 @@ BEGIN IF dp_rst='1' THEN r <= c_reg_rst; ELSIF rising_edge(dp_clk) THEN - r <= d; + r <= nxt_r; END IF; END PROCESS; p_control_packet_offload : PROCESS(r, gn_index, in_sosi, trigger, mm_done, dp_header_info) + VARIABLE v: t_reg; BEGIN - d <= r; - d.start_pulse <= '0'; - d.nof_cycles_dly <= gn_index * g_offload_time; + v := r; + v.start_pulse := '0'; + v.nof_cycles_dly := gn_index * g_offload_time; -- Count number of sop's in a sync interval and get payload errors and keep them till next sync. IF in_sosi.sync = '1' THEN - d.integration_interval <= r.interval_cnt; - d.interval_cnt <= 0; - d.payload_err <= '0'; + v.integration_interval := r.interval_cnt; + v.interval_cnt := 0; + v.payload_err := '0'; ELSE IF in_sosi.eop = '1' THEN - d.payload_err <= r.payload_err OR in_sosi.err(0); + v.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; + v.interval_cnt := r.interval_cnt + 1; END IF; END IF; -- assign sdp_data_id for different statistic types IF g_statistics_type = "SST" THEN - d.data_id <= x"000000" & TO_UVEC(r.block_count + c_sdp_S_pn * gn_index, 8); + v.data_id := x"000000" & TO_UVEC(r.block_count + c_sdp_S_pn * gn_index, 8); ELSIF g_statistics_type = "BST" THEN - d.data_id <= x"0000" & TO_UVEC(c_beamlet_id, 16); + v.data_id := x"0000" & TO_UVEC(c_beamlet_id, 16); 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 in right values for XST. + v.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"; + v.data_id := x"00000000"; END IF; -- Issue start_pulse per packet offload IF trigger = '1' THEN -- Use trigger to start first packet - d.start_pulse <= '1'; - d.start_address <= 0; - d.block_count <= 1; + v.start_pulse := '1'; + v.start_address := 0; + v.block_count := 1; ELSIF mm_done = '1' THEN -- Use mm_done to start next packets IF r.block_count < c_nof_packets THEN IF r.block_count MOD c_nof_data_per_step = 0 THEN - d.start_address <= r.start_address + c_data_size; -- step to next packet within block + v.start_address := r.start_address + c_data_size; -- step to next packet within block ELSE - d.start_address <= r.block_count / c_nof_data_per_step * c_block_size; -- jump to first packet in next block + v.start_address := r.block_count / c_nof_data_per_step * c_block_size; -- jump to first packet in next block END IF; - d.start_pulse <= '1'; - d.block_count <= r.block_count + 1; + v.start_pulse := '1'; + v.block_count := r.block_count + 1; ELSE -- Prepare for next trigger interval. - d.start_address <= 0; - d.block_count <= 0; + v.start_address := 0; + v.block_count := 0; END IF; END IF; -- Release header info per packet offload IF trigger = '1' OR mm_done = '1' THEN - d.dp_header_info <= dp_header_info; + v.dp_header_info := dp_header_info; END IF; + nxt_r <= v; END PROCESS; u_mms_common_variable_delay : ENTITY common_lib.mms_common_variable_delay @@ -274,6 +279,18 @@ BEGIN out_siso => dp_block_from_mm_src_in ); + u_dp_pipeline_ready : ENTITY dp_lib.dp_pipeline_ready + PORT MAP( + rst => dp_rst, + clk => dp_clk, + -- ST sink + snk_out => dp_block_from_mm_src_in, + snk_in => dp_block_from_mm_src_out, + -- ST source + src_in => dp_offload_snk_out, + src_out => dp_offload_snk_in + ); + u_dp_offload_tx_v3: ENTITY dp_lib.dp_offload_tx_v3 GENERIC MAP ( g_nof_streams => c_nof_streams, @@ -290,8 +307,8 @@ BEGIN dp_clk => dp_clk, reg_hdr_dat_mosi => reg_hdr_dat_mosi, reg_hdr_dat_miso => reg_hdr_dat_miso, - snk_in_arr(0) => dp_block_from_mm_src_out, - snk_out_arr(0) => dp_block_from_mm_src_in, + snk_in_arr(0) => dp_offload_snk_in, + snk_out_arr(0) => dp_offload_snk_out, src_out_arr(0) => out_sosi, src_in_arr(0) => out_siso, hdr_fields_in_arr(0) => r.dp_header_info 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 d3b8c961bb..ca050afb70 100644 --- a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd @@ -66,8 +66,8 @@ ARCHITECTURE rtl OF dp_block_from_mm IS CONSTANT c_reg_rst : t_reg := ('0', '0', '0', 0, 0); - SIGNAL r : t_reg; - SIGNAL d : t_reg; + SIGNAL r : t_reg; + SIGNAL nxt_r : t_reg; SIGNAL mm_address : NATURAL := 0; SIGNAL last_mm_address : NATURAL := 0; BEGIN @@ -77,10 +77,14 @@ BEGIN mm_mosi.address <= TO_MEM_ADDRESS(mm_address); - out_sosi.data <= RESIZE_DP_DATA(mm_miso.rddata(c_word_w-1 DOWNTO 0)); - out_sosi.valid <= mm_miso.rdval; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so same as the ready latency (RL = 1) - 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 + u_sosi : PROCESS(r, mm_miso) + BEGIN + out_sosi <= c_dp_sosi_rst; -- To avoid Modelsim warnings on conversion to integer from unused fields. + out_sosi.data <= RESIZE_DP_DATA(mm_miso.rddata(c_word_w-1 DOWNTO 0)); + out_sosi.valid <= mm_miso.rdval; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so same as the ready latency (RL = 1) + 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 + END PROCESS; mm_done <= r.eop; @@ -89,45 +93,47 @@ BEGIN IF rst='1' THEN r <= c_reg_rst; ELSIF rising_edge(clk) THEN - r <= d; + r <= nxt_r; END IF; END PROCESS; p_comb : PROCESS(r, start_pulse, out_siso, mm_address, last_mm_address) + VARIABLE v : t_reg; BEGIN - d <= r; - d.sop <= '0'; - d.eop <= '0'; + v := r; + v.sop := '0'; + v.eop := '0'; mm_mosi.rd <= '0'; IF r.busy = '0' AND start_pulse = '1' THEN -- initiate next block - d.busy <= '1'; + v.busy := '1'; ELSIF r.busy = '1' THEN IF out_siso.ready = '1' THEN -- continue with block mm_mosi.rd <= '1'; IF r.word_index < g_data_size - 1 THEN - d.word_index <= r.word_index + 1; + v.word_index := r.word_index + 1; ELSE - d.word_index <= 0; - d.step_index <= r.step_index + g_step_size; + v.word_index := 0; + v.step_index := r.step_index + g_step_size; END IF; -- check start of block IF r.word_index = 0 AND r.step_index = 0 THEN - d.sop <= '1'; + v.sop := '1'; END IF; -- check end of block IF mm_address >= last_mm_address THEN - d.eop <= '1'; + v.eop := '1'; -- prepare for next block - d.busy <= '0'; - d.word_index <= 0; - d.step_index <= 0; + v.busy := '0'; + v.word_index := 0; + v.step_index := 0; END IF; END IF; END IF; + nxt_r <= v; END PROCESS; END rtl; \ No newline at end of file diff --git a/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd b/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd index d57dddde37..105a6387e9 100644 --- a/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd +++ b/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd @@ -117,8 +117,6 @@ ARCHITECTURE str OF ip_arria10_e1sg_jesd204b IS SIGNAL jesd204b_sysref_2 : STD_LOGIC; SIGNAL jesd204b_sysref_frameclk_1 : STD_LOGIC; SIGNAL jesd204b_sysref_frameclk_2 : STD_LOGIC; - SIGNAL jesd204b_sysref_linkclk_1 : STD_LOGIC; - SIGNAL jesd204b_sysref_linkclk_2 : STD_LOGIC; -- Data path SIGNAL jesd204b_rx_link_data_arr : STD_LOGIC_VECTOR(c_jesd204b_rx_data_w*g_nof_streams-1 DOWNTO 0); @@ -176,7 +174,7 @@ ARCHITECTURE str OF ip_arria10_e1sg_jesd204b IS rx_islockedtodata : out std_logic_vector(0 downto 0); -- rx_is_lockedtodata rx_serial_data : in std_logic_vector(0 downto 0) := (others => 'X'); -- rx_serial_data rxlink_clk : in std_logic := 'X'; -- clk - rxlink_rst_n_reset_n : in std_logic := 'X'; -- reset_n + rxlink_rst_n_reset_n : in std_logic := 'X'; -- reset_n rxphy_clk : out std_logic_vector(0 downto 0); -- export sof : out std_logic_vector(3 downto 0); -- export somf : out std_logic_vector(c_jesd204b_rx_somf_w-1 downto 0); -- export @@ -399,7 +397,6 @@ BEGIN END IF; END PROCESS; - ----------------------------------------------------------------------------- -- Move sysref from rxlink_clk to rxframe_clk ----------------------------------------------------------------------------- @@ -412,7 +409,7 @@ BEGIN ELSE IF rising_edge(rxframe_clk) THEN jesd204b_sysref_frameclk_1 <= jesd204b_sysref_2; -- sysref from rxlink_clk domain - jesd204b_sysref_frameclk_2 <= jesd204b_sysref_linkclk_1; + jesd204b_sysref_frameclk_2 <= jesd204b_sysref_frameclk_1; IF jesd204b_sysref_frameclk_1 = '1' and jesd204b_sysref_frameclk_2 = '0' THEN rx_sysref <= '1'; ELSE -- GitLab