From fcf3f716409ac949cec222400f2fa58f83e1483c Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Mon, 14 Aug 2023 13:15:49 +0200 Subject: [PATCH] Correct timing of info_sosi, especially to avoid too early for eop fields. --- .../base/reorder/src/vhdl/reorder_col.vhd | 50 ++++++++++--------- .../reorder/src/vhdl/reorder_col_select.vhd | 6 ++- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/libraries/base/reorder/src/vhdl/reorder_col.vhd b/libraries/base/reorder/src/vhdl/reorder_col.vhd index bc61e62a31..79db37a81a 100644 --- a/libraries/base/reorder/src/vhdl/reorder_col.vhd +++ b/libraries/base/reorder/src/vhdl/reorder_col.vhd @@ -111,6 +111,7 @@ architecture str of reorder_col is signal info_sop_wr_en : std_logic_vector(c_info_nof_pages - 1 downto 0); signal info_eop_wr_en : std_logic_vector(c_info_nof_pages - 1 downto 0); + signal info_sosi_paged : t_dp_sosi; signal info_sosi : t_dp_sosi; signal store_mosi : t_mem_mosi; @@ -123,11 +124,9 @@ architecture str of reorder_col is signal select_mosi : t_mem_mosi := c_mem_mosi_rst; signal select_miso : t_mem_miso := c_mem_miso_rst; - signal retrieve_sosi : t_dp_sosi; - signal retrieve_siso : t_dp_siso; - - signal ss_sosi : t_dp_sosi; - signal ss_siso : t_dp_siso; + signal retrieve_info_sosi : t_dp_sosi; + signal retrieve_sosi : t_dp_sosi; + signal retrieve_siso : t_dp_siso; begin @@ -241,22 +240,6 @@ begin output_siso => retrieve_siso ); - u_rl : entity dp_lib.dp_latency_adapter -- defaults to wires when c_output_rl = c_retrieve_lat - generic map ( - g_in_latency => c_retrieve_lat, - g_out_latency => c_output_rl - ) - port map ( - rst => dp_rst, - clk => dp_clk, - -- ST sink - snk_out => retrieve_siso, - snk_in => retrieve_sosi, - -- ST source - src_in => ss_siso, - src_out => ss_sosi - ); - -- Page delay the input_sosi info (sync, BSN, channel at sop and err, empty at eop) and combine -- it with the retrieved SS data to get the output_sosi. info_sop_wr_en <= input_sosi.sop & store_done; @@ -275,11 +258,30 @@ begin -- ST sink snk_in => input_sosi, -- ST source - src_out => info_sosi + src_out => info_sosi_paged ); - output_sosi <= func_dp_stream_combine_info_and_data(info_sosi, ss_sosi); - ss_siso <= output_siso; + -- Account for retrieve rd latency is 1, for sop related info it is not + -- critical that it arrives early, but for eop related info it is. + info_sosi <= info_sosi_paged when rising_edge(dp_clk); + retrieve_info_sosi <= func_dp_stream_combine_info_and_data(info_sosi, retrieve_sosi); + + -- Adapt output ready latency (RL), defaults to wires when c_output_rl = c_retrieve_lat + u_rl : entity dp_lib.dp_latency_adapter + generic map ( + g_in_latency => c_retrieve_lat, + g_out_latency => c_output_rl + ) + port map ( + rst => dp_rst, + clk => dp_clk, + -- ST sink + snk_out => retrieve_siso, + snk_in => retrieve_info_sosi, + -- ST source + src_in => output_siso, + src_out => output_sosi + ); end str; diff --git a/libraries/base/reorder/src/vhdl/reorder_col_select.vhd b/libraries/base/reorder/src/vhdl/reorder_col_select.vhd index 81e05c186c..0a6626912b 100644 --- a/libraries/base/reorder/src/vhdl/reorder_col_select.vhd +++ b/libraries/base/reorder/src/vhdl/reorder_col_select.vhd @@ -93,6 +93,7 @@ architecture str of reorder_col_select is signal info_sop_wr_en : std_logic_vector(c_info_nof_pages - 1 downto 0); signal info_eop_wr_en : std_logic_vector(c_info_nof_pages - 1 downto 0); + signal info_sosi_paged : t_dp_sosi; signal info_sosi : t_dp_sosi; signal store_mosi : t_mem_mosi; @@ -227,9 +228,12 @@ begin -- ST sink snk_in => input_sosi, -- ST source - src_out => info_sosi + src_out => info_sosi_paged ); + -- Account for retrieve rd latency is 1, for sop related info it is not + -- critical that it arrives early, but for eop related info it is. + info_sosi <= info_sosi_paged when rising_edge(dp_clk); output_sosi <= func_dp_stream_combine_info_and_data(info_sosi, retrieve_sosi); end str; -- GitLab