From b0d156c9c0da3ccb233b8abf0b393fa38cf8850f Mon Sep 17 00:00:00 2001 From: Reinier van der Walle <walle@astron.nl> Date: Wed, 3 Nov 2021 10:36:28 +0100 Subject: [PATCH] processed review comments --- .../dp/src/vhdl/dp_block_validate_err.vhd | 9 +++++--- .../base/dp/src/vhdl/dp_fifo_fill_eop.vhd | 3 +++ .../base/dp/tb/vhdl/tb_dp_fifo_fill_eop.vhd | 15 +++++++----- .../dp/tb/vhdl/tb_tb_dp_fifo_fill_eop.vhd | 23 +++++++++++-------- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/libraries/base/dp/src/vhdl/dp_block_validate_err.vhd b/libraries/base/dp/src/vhdl/dp_block_validate_err.vhd index 021806547b..74e3db58e9 100644 --- a/libraries/base/dp/src/vhdl/dp_block_validate_err.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_validate_err.vhd @@ -39,6 +39,9 @@ -- The ratio of max / min is used to determine a fifo size for the outgoing -- sosi.valid signals. To minimize logic the g_min_block_size can be set to -- the expected minimum block size. +-- . g_fifo_size can be set to g_max_block_size if there is no backpressure. +-- If there is back pressure on the src_in, the fifo_fill_eop can be used to +-- to account for this backpressure by using an g_fifo_size > g_max_block_size. ------------------------------------------------------------------------------- -- REGMAP ------------------------------------------------------------------------------- @@ -65,11 +68,11 @@ USE common_lib.common_mem_pkg.ALL; ENTITY dp_block_validate_err IS GENERIC ( g_cnt_w : NATURAL := c_word_w; -- max is c_word_w due to mm word width - g_max_block_size : POSITIVE := 250; - g_min_block_size : POSITIVE := 1; + g_max_block_size : POSITIVE := 250; -- largest possible incoming block size. + g_min_block_size : POSITIVE := 1; -- smallest possible incoming block size. g_nof_err_counts : NATURAL := 8; -- fifo generics - g_fifo_size : POSITIVE := 256; + g_fifo_size : POSITIVE := 256; -- fifo size to buffer incoming blocks, should be >= g_max_block_size g_data_w : NATURAL := 16; g_bsn_w : NATURAL := 1; g_empty_w : NATURAL := 1; diff --git a/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd b/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd index 0bacb8c204..cd8c20ec66 100644 --- a/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd +++ b/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd @@ -208,6 +208,9 @@ BEGIN END GENERATE; -- Set rd_eop_cnt outside generate statements to avoid Modelsim warning "Nonresolved signal 'rd_eop_cnt' may have multiple sources". + -- This is only the case with INTEGER (sub) types as it does not have a resolve function te decide the value in case of multiple sources + -- through GENERATE statements. STD_LOGIC / STD_LOGIC VECTORS do have such a resolve function. Modelsim cannot resolve that the two GENERATE + -- statements where g_use_dual_clock = FALSE / TRUE will never be active simultaneously as a GENERATE statement cannot have an ELSE statement. rd_eop_cnt <= TO_UINT(reg_rd_eop_cnt) WHEN g_use_dual_clock ELSE wr_eop_cnt; p_eop_cnt: PROCESS(wr_clk, wr_rst) diff --git a/libraries/base/dp/tb/vhdl/tb_dp_fifo_fill_eop.vhd b/libraries/base/dp/tb/vhdl/tb_dp_fifo_fill_eop.vhd index c460f036be..ab79f93e74 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_fifo_fill_eop.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_fifo_fill_eop.vhd @@ -56,7 +56,8 @@ ENTITY tb_dp_fifo_fill_eop IS g_dut_fifo_size : NATURAL := 128; g_dut_fifo_fill : NATURAL := 100; -- selectable >= 0 for dp_fifo_fill g_dut_use_rd_fill_32b : BOOLEAN := FALSE; - g_dut_use_gap : BOOLEAN := TRUE + g_dut_use_gap : BOOLEAN := TRUE; + g_dut_use_random_ctrl : BOOLEAN := TRUE ); END tb_dp_fifo_fill_eop; @@ -100,7 +101,7 @@ ARCHITECTURE tb OF tb_dp_fifo_fill_eop IS SIGNAL cnt_dat : STD_LOGIC_VECTOR(c_dp_data_w-1 DOWNTO 0); SIGNAL cnt_val : STD_LOGIC; - SIGNAL cnt_en : STD_LOGIC; + SIGNAL cnt_en : STD_LOGIC := '1'; -- default always active input control. SIGNAL tx_data : t_dp_data_arr(0 TO c_tx_latency + c_tx_void) := (OTHERS=>(OTHERS=>'0')); SIGNAL tx_val : STD_LOGIC_VECTOR(0 TO c_tx_latency + c_tx_void) := (OTHERS=>'0'); @@ -123,7 +124,7 @@ ARCHITECTURE tb OF tb_dp_fifo_fill_eop IS SIGNAL out_siso : t_dp_siso; SIGNAL out_sosi : t_dp_sosi; - SIGNAL out_ready : STD_LOGIC; + SIGNAL out_ready : STD_LOGIC := '1'; -- default always active output flow control. SIGNAL prev_out_ready : STD_LOGIC_VECTOR(0 TO c_rx_latency); SIGNAL out_data : STD_LOGIC_VECTOR(c_dp_data_w-1 DOWNTO 0); SIGNAL out_bsn : STD_LOGIC_VECTOR(c_dp_data_w-1 DOWNTO 0) := (OTHERS=>'0'); @@ -156,7 +157,7 @@ BEGIN proc_dp_sync_interval(clk, sync); -- Input data - cnt_val <= in_ready AND cnt_en AND NOT gap_en; + cnt_val <= in_ready AND cnt_en AND NOT gap_en WHEN g_dut_use_random_ctrl ELSE in_ready AND NOT gap_en; proc_dp_cnt_dat(rst, clk, cnt_val, cnt_dat); @@ -173,8 +174,10 @@ BEGIN in_channel <= INCR_UVEC(in_data, c_channel_offset); -- Stimuli control - proc_dp_count_en(rst, clk, sync, lfsr1, state, verify_done, tb_done, cnt_en); - proc_dp_out_ready(rst, clk, sync, lfsr2, out_ready); + proc_dp_count_en(rst, clk, sync, lfsr1, state, verify_done, tb_done, cnt_en); + gen_random_ctrl : IF g_dut_use_random_ctrl GENERATE + proc_dp_out_ready(rst, clk, sync, lfsr2, out_ready); + END GENERATE; -- Output verify proc_dp_verify_en(c_verify_en_wait, rst, clk, sync, verify_en); diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_fifo_fill_eop.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_fifo_fill_eop.vhd index cd5259d783..c3711898d2 100644 --- a/libraries/base/dp/tb/vhdl/tb_tb_dp_fifo_fill_eop.vhd +++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_fifo_fill_eop.vhd @@ -45,13 +45,18 @@ END tb_tb_dp_fifo_fill_eop; ARCHITECTURE tb OF tb_tb_dp_fifo_fill_eop IS SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end' BEGIN - -- Try FIFO settings : GENERIC MAP (g_dut_use_dual_clock, g_dut_use_bsn, g_dut_use_empty, g_dut_use_channel, g_dut_use_sync, g_dut_fifo_rl, g_dut_fifo_size, g_dut_fifo_fill, g_dut_use_rd_fill_32b, g_dut_use_gap) - u_dut_sc_1 : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 1); - u_dut_dc_1 : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 1); - u_dut_sc_0 : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 0); - u_dut_dc_0 : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 0); - u_dut_sc_1_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 1, g_dut_use_gap => FALSE); - u_dut_dc_1_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 1, g_dut_use_gap => FALSE); - u_dut_sc_0_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 0, g_dut_use_gap => FALSE); - u_dut_dc_0_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 0, g_dut_use_gap => FALSE); + -- Try FIFO settings : GENERIC MAP (g_dut_use_dual_clock, g_dut_use_bsn, g_dut_use_empty, g_dut_use_channel, g_dut_use_sync, g_dut_fifo_rl, g_dut_fifo_size, g_dut_fifo_fill, g_dut_use_rd_fill_32b, g_dut_use_gap, g_dut_use_random_ctrl) + + u_dut_sc_1 : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 1, g_dut_use_random_ctrl => FALSE); + u_dut_sc_1_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 1, g_dut_use_random_ctrl => FALSE, g_dut_use_gap => FALSE); + u_dut_dc_1_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 1, g_dut_use_random_ctrl => FALSE, g_dut_use_gap => FALSE); + u_dut_dc_0_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 0, g_dut_use_random_ctrl => FALSE, g_dut_use_gap => FALSE); + u_dut_sc_1_rand : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 1, g_dut_use_random_ctrl => TRUE); + u_dut_dc_1_rand : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 1, g_dut_use_random_ctrl => TRUE); + u_dut_sc_0_rand : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 0, g_dut_use_random_ctrl => TRUE); + u_dut_dc_0_rand : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 0, g_dut_use_random_ctrl => TRUE); + u_dut_sc_1_rand_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 1, g_dut_use_random_ctrl => TRUE, g_dut_use_gap => FALSE); + u_dut_dc_1_rand_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 1, g_dut_use_random_ctrl => TRUE, g_dut_use_gap => FALSE); + u_dut_sc_0_rand_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => FALSE, g_dut_fifo_rl => 0, g_dut_use_random_ctrl => TRUE, g_dut_use_gap => FALSE); + u_dut_dc_0_rand_no_gap : ENTITY work.tb_dp_fifo_fill_eop GENERIC MAP (g_dut_use_dual_clock => TRUE, g_dut_fifo_rl => 0, g_dut_use_random_ctrl => TRUE, g_dut_use_gap => FALSE); END tb; -- GitLab