diff --git a/libraries/base/dp/src/vhdl/mmp_dp_bsn_align_v2.vhd b/libraries/base/dp/src/vhdl/mmp_dp_bsn_align_v2.vhd index 1bc78884b78807cc69c43931d05dfc7474540e8b..5f55dc5a6675482176658ff3d29b308769cde600 100644 --- a/libraries/base/dp/src/vhdl/mmp_dp_bsn_align_v2.vhd +++ b/libraries/base/dp/src/vhdl/mmp_dp_bsn_align_v2.vhd @@ -45,12 +45,11 @@ ENTITY mmp_dp_bsn_align_v2 IS GENERIC ( g_nof_streams : NATURAL; -- number of input and output streams g_bsn_latency_max : NATURAL; -- Maximum travel latency of a remote block in number of block periods T_blk - g_bsn_latency_use_node_index : BOOLEAN := FALSE; -- FALSE for align at end node, TRUE for align at every intermediate node + g_nof_aligners_max : NATURAL := 1; -- 1 when only align at last node, > 1 when align at every intermediate node g_block_size : NATURAL := 32; -- > 1, g_block_size=1 is not supported - g_buffer_nof_blocks : NATURAL; -- circular buffer size per input, choose ceil_pow2(1 + g_bsn_latency_max) g_bsn_w : NATURAL := c_dp_stream_bsn_w; -- number of bits in sosi BSN g_data_w : NATURAL; -- number of bits in sosi data - g_filler_value : INTEGER := 0; -- output sosi data value for missing input blocks + g_replacement_value : INTEGER := 0; -- output sosi data value for missing input blocks g_nof_clk_per_sync : NATURAL := 200*10**6; g_nof_input_bsn_monitors : NATURAL := 0; g_use_bsn_output_monitor : BOOLEAN := FALSE @@ -73,7 +72,7 @@ ENTITY mmp_dp_bsn_align_v2 IS dp_rst : IN STD_LOGIC; dp_clk : IN STD_LOGIC; - node_index : IN NATURAL := 0; -- only used when g_bsn_latency_use_node_index is TRUE + node_index : IN NATURAL := 0; -- only used when g_nof_aligners_max > 1 -- Streaming input in_sosi_arr : IN t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); @@ -197,12 +196,11 @@ BEGIN GENERIC MAP ( g_nof_streams => g_nof_streams, g_bsn_latency_max => g_bsn_latency_max, - g_bsn_latency_use_node_index => g_bsn_latency_use_node_index, + g_nof_aligners_max => g_nof_aligners_max, g_block_size => g_block_size, - g_buffer_nof_blocks => g_buffer_nof_blocks, g_bsn_w => g_bsn_w, g_data_w => g_data_w, - g_filler_value => g_filler_value + g_replacement_value => g_replacement_value ) PORT MAP ( dp_rst => dp_rst, diff --git a/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd b/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd index 53a6cbd6a64a115940449044fcdfc16abc51ad0f..e3ea3b5d0d7f0858958c8c6d5044ec608c6d406f 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd @@ -28,7 +28,7 @@ USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; USE common_lib.common_mem_pkg.ALL; -USE common_lib.common_lfsr_sequences_pkg.ALL; +USE common_lib.common_str_pkg.ALL; USE common_lib.tb_common_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE dp_lib.tb_dp_pkg.ALL; @@ -38,20 +38,20 @@ ENTITY tb_dp_bsn_align_v2 IS GENERIC ( -- DUT g_nof_streams : NATURAL := 2; -- number of input and output streams - g_bsn_latency_max : NATURAL := 1; -- Maximum travel latency of a remote block in number of block periods T_blk - g_bsn_latency_use_node_index : BOOLEAN := FALSE; -- FALSE for align at end node, TRUE for align at every intermediate node + g_bsn_latency_max : NATURAL := 2; -- Maximum travel latency of a remote block in number of block periods T_blk + g_nof_aligners_max : POSITIVE := 1; -- 1 when only align at last node, > 1 when align at every intermediate node g_block_size : NATURAL := 11; -- > 1, g_block_size=1 is not supported g_bsn_w : NATURAL := c_dp_stream_bsn_w; -- number of bits in sosi BSN g_data_w : NATURAL := 16; -- number of bits in sosi data - g_filler_value : INTEGER := 0; -- output sosi data value for missing input blocks + g_replacement_value : INTEGER := 17; -- output sosi data replacement value for missing input blocks g_use_mm_output : BOOLEAN := FALSE; -- output via MM or via streaming DP g_pipeline_input : NATURAL := 1; -- >= 0, choose 0 for wires, choose 1 to ease timing closure g_rd_latency : NATURAL := 2; -- 1 or 2, choose 2 to ease timing closure -- TB - g_diff_delay : NATURAL := 0; + g_diff_delay : NATURAL := 0; -- nof clk delay between inputs g_diff_bsn : NATURAL := 0; -- g_diff_bsn = g_bsn_latency_max can just be aligned - g_nof_repeat : NATURAL := 100 -- for constant active stream control using 1 is sufficient, use > 1 to verify longer with random stimuli + g_nof_repeat : NATURAL := 8 ); END tb_dp_bsn_align_v2; @@ -59,8 +59,6 @@ END tb_dp_bsn_align_v2; ARCHITECTURE tb OF tb_dp_bsn_align_v2 IS CONSTANT c_rl : NATURAL := 1; - CONSTANT c_pulse_active : NATURAL := 1; - CONSTANT c_pulse_period : NATURAL := 7; CONSTANT c_data_w : NATURAL := 16; CONSTANT c_data_init : INTEGER := 0; @@ -73,20 +71,11 @@ ARCHITECTURE tb OF tb_dp_bsn_align_v2 IS CONSTANT c_gap_size : NATURAL := 10; CONSTANT c_block_period : NATURAL := g_block_size + c_gap_size; - CONSTANT c_xoff_timeout : NATURAL := c_block_period * g_bsn_latency_max * 2; -- xoff timeout to recover for next alignment attempt - CONSTANT c_sop_timeout : NATURAL := c_block_period * g_bsn_latency_max; -- sop timeout to end current aligment attempt - CONSTANT c_event_input : NATURAL := smallest(1, g_nof_streams-1); -- select special event input at which the event will apply, use >= g_nof_streams to disable the special events - - CONSTANT c_buffer_nof_blocks : NATURAL := ceil_pow2(1 + g_bsn_latency_max); -- circular buffer size per input - TYPE t_data_arr IS ARRAY (g_nof_streams-1 DOWNTO 0) OF STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0); TYPE t_bsn_arr IS ARRAY (g_nof_streams-1 DOWNTO 0) OF STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0); TYPE t_err_arr IS ARRAY (g_nof_streams-1 DOWNTO 0) OF STD_LOGIC_VECTOR(c_dp_stream_error_w-1 DOWNTO 0); TYPE t_channel_arr IS ARRAY (g_nof_streams-1 DOWNTO 0) OF STD_LOGIC_VECTOR(c_dp_stream_channel_w-1 DOWNTO 0); - TYPE t_rl_vec_arr IS ARRAY (g_nof_streams-1 DOWNTO 0) OF STD_LOGIC_VECTOR(0 TO c_rl); - - TYPE t_tb_state IS (s_idle, s_bsn_mis_aligned, s_bsn_aligned, s_small_bsn_diff, s_large_bsn_diff, s_restore_bsn, s_disable_one_input, s_enable_inputs); TYPE t_reg IS RECORD -- p_write_arr @@ -95,15 +84,12 @@ ARCHITECTURE tb OF tb_dp_bsn_align_v2 IS out_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); END RECORD; - SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL tb_end_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS=>'0'); + SIGNAL tb_end : STD_LOGIC; SIGNAL clk : STD_LOGIC := '1'; SIGNAL rst : STD_LOGIC := '1'; SIGNAL sl1 : STD_LOGIC := '1'; - SIGNAL random : STD_LOGIC_VECTOR(15 DOWNTO 0) := (OTHERS=>'0'); -- use different lengths to have different random sequences - SIGNAL pulse : STD_LOGIC; - SIGNAL pulse_en : STD_LOGIC := '1'; - SIGNAL node_index : NATURAL := 0; SIGNAL in_siso_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS=>c_dp_siso_rdy); @@ -140,28 +126,18 @@ ARCHITECTURE tb OF tb_dp_bsn_align_v2 IS SIGNAL out_err : t_err_arr; SIGNAL out_channel : t_channel_arr; - SIGNAL tb_state : t_tb_state; - + SIGNAL in_sosi_arr_dly : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL out_sosi_arr_exp : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL tb_bsn : INTEGER; SIGNAL verify_done_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL default_end_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL default_end : STD_LOGIC; - SIGNAL verify_dis_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS=>'0'); SIGNAL verify_en_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS=>'0'); SIGNAL hold_out_sop : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL prev_out_ready : t_rl_vec_arr; SIGNAL prev_out_bsn : t_bsn_arr; SIGNAL expected_out_bsn : t_bsn_arr; SIGNAL prev_out_data : t_data_arr; SIGNAL expected_out_data : t_data_arr; - SIGNAL verify_extra_end : STD_LOGIC := '0'; - SIGNAL bsn_diff : INTEGER; - SIGNAL bsn_offset : INTEGER; - SIGNAL bsn_event : STD_LOGIC := '0'; -- pulse '1' triggers a BSN offset for an input - SIGNAL bsn_event_ack_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL bsn_event_ack : STD_LOGIC; - SIGNAL stream_en_event : STD_LOGIC := '0'; -- pulse '1' indicates that the stream enables in stream_en_arr have been updated SIGNAL stream_en_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS=>'1'); -- default all streams are enabled BEGIN @@ -169,10 +145,6 @@ BEGIN clk <= (NOT clk) OR tb_end AFTER clk_period/2; rst <= '1', '0' AFTER clk_period*7; - random <= func_common_random(random) WHEN rising_edge(clk); - - proc_common_gen_duty_pulse(c_pulse_active, c_pulse_period+1, '1', rst, clk, pulse_en, pulse); - ------------------------------------------------------------------------------ -- DATA GENERATION ------------------------------------------------------------------------------ @@ -194,10 +166,10 @@ BEGIN v_bsn := INCR_UVEC(v_bsn, v_diff_bsn); in_sosi_arr(I) <= c_dp_sosi_rst; proc_common_wait_until_low(clk, rst); - proc_common_wait_some_cycles(clk, c_xoff_timeout*2); + proc_common_wait_some_cycles(clk, 10); -- Create latency misalignment between the input streams - proc_common_wait_some_cycles(clk, I*g_diff_delay/g_nof_streams); + proc_common_wait_some_cycles(clk, I*g_diff_delay); -- Begin of stimuli FOR R IN 0 TO g_nof_repeat-v_diff_bsn-1 LOOP @@ -208,172 +180,39 @@ BEGIN proc_common_wait_some_cycles(clk, c_gap_size); -- create gap between frames END LOOP; - -- End of default stimuli - expected_out_bsn(I) <= INCR_UVEC(v_bsn, -1); - expected_out_data(I) <= TO_UVEC(v_data-1, c_data_w); + -- End of stimuli, g_bsn_latency_max blocks remain in buffer + expected_out_bsn(I) <= INCR_UVEC(v_bsn, -1 -g_bsn_latency_max); + expected_out_data(I) <= TO_UVEC(v_data-1 -g_bsn_latency_max*g_block_size, c_data_w); - proc_common_wait_some_cycles(clk, 100); -- depends on stream control - default_end_arr(I) <= '1'; + proc_common_wait_some_cycles(clk, 100); verify_done_arr(I) <= '1'; proc_common_wait_some_cycles(clk, 1); verify_done_arr(I) <= '0'; - -------------------------------------------------------------------------- - -- Extra - -------------------------------------------------------------------------- - - proc_common_wait_some_cycles(clk, 500); - WHILE verify_extra_end /= '1' LOOP - v_sync := sel_a_b(TO_UINT(v_bsn) MOD c_sync_period = c_sync_offset, '1', '0'); - proc_dp_gen_block_data(c_rl, TRUE, c_data_w, c_data_w, v_data, 0, 0, g_block_size, v_channel, v_err, v_sync, v_bsn, clk, stream_en_arr(I), in_siso_arr(I), in_sosi_arr(I)); - v_bsn := INCR_UVEC(v_bsn, 1); - bsn_event_ack_arr(I) <= '0'; - IF I=c_event_input AND bsn_event='1' THEN - v_bsn := INCR_UVEC(v_bsn, bsn_offset); - bsn_event_ack_arr(I) <= '1'; - END IF; - v_data := v_data + g_block_size; - proc_common_wait_some_cycles(clk, c_gap_size); -- create gap between frames - END LOOP; - - -- End of extra stimuli - expected_out_bsn(I) <= INCR_UVEC(v_bsn, -1); - expected_out_data(I) <= TO_UVEC(v_data-1, c_data_w); - - verify_done_arr(I) <= '1'; - proc_common_wait_some_cycles(clk, 1); - verify_done_arr(I) <= '0'; + tb_end_arr(I) <= '1'; WAIT; END PROCESS; END GENERATE; - default_end <= vector_and(default_end_arr); - bsn_event_ack <= vector_or(bsn_event_ack_arr); + tb_end <= vector_and(tb_end_arr); - p_special_stimuli : PROCESS - BEGIN - verify_dis_arr <= (OTHERS=>'0'); - - tb_state <= s_bsn_mis_aligned; - stream_en_event <= '0'; - stream_en_arr <= (OTHERS=>'1'); + ------------------------------------------------------------------------------ + -- DATA VERIFICATION + ------------------------------------------------------------------------------ - ---------------------------------------------------------------------------- - -- Wait until default verify test is done - ---------------------------------------------------------------------------- - - proc_common_wait_until_high(clk, default_end); - - verify_dis_arr <= (OTHERS=>'1'); - proc_common_wait_some_cycles(clk, 100); - verify_dis_arr <= (OTHERS=>'0'); - - tb_state <= s_bsn_aligned; - proc_common_wait_some_cycles(clk, 1000); - - ---------------------------------------------------------------------------- - -- Verify change in input BSN offset - ---------------------------------------------------------------------------- + tb_bsn <= TO_UINT(out_sosi_arr(0).bsn); - -- . enforce small BSN misalignment - tb_state <= s_small_bsn_diff; - verify_dis_arr <= (OTHERS=>'1'); - bsn_offset <= -1; - bsn_event <= '1'; - proc_common_wait_until_high(clk, bsn_event_ack); - bsn_event <= '0'; - proc_common_wait_some_cycles(clk, 100); - - verify_dis_arr <= (OTHERS=>'0'); - proc_common_wait_some_cycles(clk, 1000); - verify_dis_arr <= (OTHERS=>'1'); - - -- . restore original BSN sequence - tb_state <= s_restore_bsn; - bsn_offset <= +1; - bsn_event <= '1'; - proc_common_wait_until_high(clk, bsn_event_ack); - bsn_event <= '0'; - proc_common_wait_some_cycles(clk, 100); - - verify_dis_arr <= (OTHERS=>'0'); - proc_common_wait_some_cycles(clk, 1000); --- verify_dis_arr <= (OTHERS=>'1'); - - -- . enforce large BSN misalignment - tb_state <= s_large_bsn_diff; - bsn_offset <= -g_bsn_latency_max-1; - bsn_event <= '1'; - proc_common_wait_until_high(clk, bsn_event_ack); - bsn_event <= '0'; - -- expect no output, because difference remains too large, so do not restart verify_en here and leave it commented: --- proc_common_wait_some_cycles(clk, 100); --- verify_dis_arr <= (OTHERS=>'0'); - proc_common_wait_some_cycles(clk, 1000); - verify_dis_arr <= (OTHERS=>'1'); - - -- . restore original BSN sequence - tb_state <= s_restore_bsn; - bsn_offset <= g_bsn_latency_max+1; - bsn_event <= '1'; - proc_common_wait_until_high(clk, bsn_event_ack); - bsn_event <= '0'; - proc_common_wait_some_cycles(clk, 100); - verify_dis_arr <= (OTHERS=>'0'); - proc_common_wait_some_cycles(clk, 1000); - - ---------------------------------------------------------------------------- - -- Verify change in input enables - ---------------------------------------------------------------------------- - - tb_state <= s_disable_one_input; - verify_dis_arr <= (OTHERS=>'1'); - stream_en_event <= '1'; - stream_en_arr(c_event_input) <= '0'; -- switch an input off - proc_common_wait_some_cycles(clk, 1); - stream_en_event <= '0'; - proc_common_wait_some_cycles(clk, 100); - verify_dis_arr <= (OTHERS=>'0'); - proc_common_wait_some_cycles(clk, 2000); -- keep this input off for a while - - tb_state <= s_enable_inputs; - verify_dis_arr <= (OTHERS=>'1'); - stream_en_event <= '1'; - stream_en_arr(c_event_input) <= '1'; -- switch this input on - proc_common_wait_some_cycles(clk, 1); - stream_en_event <= '0'; - proc_common_wait_some_cycles(clk, 100); - verify_dis_arr <= (OTHERS=>'0'); - proc_common_wait_some_cycles(clk, 500); - - tb_state <= s_restore_bsn; - verify_dis_arr <= (OTHERS=>'1'); - bsn_offset <= bsn_diff; -- use input 0 to restore original BSN sequence for input c_event_input, that got lost due to input disable - bsn_event <= '1'; - proc_common_wait_until_high(clk, bsn_event_ack); - bsn_event <= '0'; - proc_common_wait_some_cycles(clk, 100); - verify_dis_arr <= (OTHERS=>'0'); - proc_common_wait_some_cycles(clk, 2000); - - tb_state <= s_idle; - verify_extra_end <= '1'; - proc_common_wait_some_cycles(clk, 500); - tb_end <= '1'; + p_verify_en_arr : PROCESS + BEGIN + -- Skip initial blocks from verification + proc_common_wait_until_value(TO_UINT(c_bsn_init) + g_bsn_latency_max, clk, tb_bsn); + verify_en_arr <= (OTHERS => '1'); + proc_common_wait_until_value(TO_UINT(c_bsn_init) + g_nof_repeat - g_bsn_latency_max - 1, clk, tb_bsn); + verify_en_arr <= (OTHERS => '0'); WAIT; END PROCESS; - bsn_diff <= TO_UINT(in_sosi_arr(0).bsn) - TO_UINT(in_sosi_arr(c_event_input).bsn) WHEN rising_edge(clk) AND in_sosi_arr(0).sop='1'; - - ------------------------------------------------------------------------------ - -- DATA VERIFICATION - ------------------------------------------------------------------------------ - - gen_verify : FOR I IN g_nof_streams-1 DOWNTO 0 GENERATE - -- Verification logistics - verify_en_arr(I) <= '1' WHEN rising_edge(clk) AND verify_dis_arr(I)='0' AND stream_en_arr(I)='1' AND out_sosi_arr(I).sop='1' ELSE - '0' WHEN rising_edge(clk) AND verify_dis_arr(I)='1'; -- verify enable after first output sop - + gen_verify_sosi : FOR I IN g_nof_streams-1 DOWNTO 0 GENERATE -- Ease in_sosi_arr monitoring in_data(I) <= in_sosi_arr(I).data(c_data_w-1 DOWNTO 0); in_val(I) <= in_sosi_arr(I).valid; @@ -393,10 +232,8 @@ BEGIN out_channel(I) <= out_sosi_arr(I).channel; out_sync(I) <= out_sosi_arr(I).sync; out_bsn(I) <= out_sosi_arr(I).bsn(c_bsn_w-1 DOWNTO 0); - + -- Actual verification of the output streams - -- . Verify that the output valid fits with the output ready latency - proc_dp_verify_valid(c_rl, clk, verify_en_arr(I), out_siso_arr(I).ready, prev_out_ready(I), out_val(I)); -- . Verify that sop and eop come in pairs proc_dp_verify_sop_and_eop(clk, out_val(I), out_sop(I), out_eop(I), hold_out_sop(I)); @@ -409,7 +246,23 @@ BEGIN proc_dp_verify_value("out_bsn", e_equal, clk, verify_done_arr(I), expected_out_bsn(I), prev_out_bsn(I)); END GENERATE; - + in_sosi_arr_dly <= TRANSPORT in_sosi_arr AFTER (g_bsn_latency_max * (g_block_size + c_gap_size) + 5) * clk_period; + out_sosi_arr_exp <= in_sosi_arr_dly WHEN rising_edge(clk); + + gen_verify_data : FOR I IN g_nof_streams-1 DOWNTO 0 GENERATE + p_verify_data : PROCESS(clk) + BEGIN + IF rising_edge(clk) THEN + IF verify_en_arr(I) = '1' AND out_sosi_arr_exp(I).valid = '1' THEN + ASSERT out_sosi_arr(I).valid = out_sosi_arr_exp(I).valid REPORT "Wrong valid for output " & int_to_str(I) SEVERITY ERROR; + ASSERT out_sosi_arr(I).data = out_sosi_arr_exp(I).data REPORT "Wrong data for output " & int_to_str(I) & " : " + & int_to_str(TO_UINT(out_sosi_arr(I).data)) + & " /= " & int_to_str(TO_UINT(out_sosi_arr_exp(I).data)) SEVERITY ERROR; + END IF; + END IF; + END PROCESS; + END GENERATE; + ------------------------------------------------------------------------------ -- DUT ------------------------------------------------------------------------------ @@ -418,13 +271,11 @@ BEGIN GENERIC MAP ( g_nof_streams => g_nof_streams, g_bsn_latency_max => g_bsn_latency_max, - g_bsn_latency_use_node_index => g_bsn_latency_use_node_index, - g_node_index_max => 31, -- limit to functional 5 bit range, instead of full 31 bit NATURAL range + g_nof_aligners_max => g_nof_aligners_max, g_block_size => g_block_size, - g_buffer_nof_blocks => c_buffer_nof_blocks, g_bsn_w => g_bsn_w, g_data_w => g_data_w, - g_filler_value => g_filler_value, + g_replacement_value => g_replacement_value, g_use_mm_output => g_use_mm_output, -- output via MM or via streaming DP g_pipeline_input => g_pipeline_input, -- >= 0, choose 0 for wires, choose 1 to ease timing closure g_rd_latency => g_rd_latency -- 1 or 2, choose 2 to ease timing closure diff --git a/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_align_v2.vhd b/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_align_v2.vhd index cdc26095fd4a2953491ecccbbc09627bb2b79faa..2b624d5d125f2c1f117c8b18c2fd3e7a2b867f55 100644 --- a/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_align_v2.vhd +++ b/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_align_v2.vhd @@ -54,12 +54,11 @@ ARCHITECTURE tb OF tb_mmp_dp_bsn_align_v2 IS CONSTANT c_sim_nof_blocks : NATURAL := c_nof_block_per_sync * c_nof_input_sync; CONSTANT c_nof_streams : NATURAL := 2; - CONSTANT c_bsn_latency_max : NATURAL := 2; - CONSTANT c_bsn_latency_use_node_index : BOOLEAN := FALSE; - CONSTANT c_buffer_nof_blocks : NATURAL := ceil_pow2(1 + c_bsn_latency_max); + CONSTANT c_bsn_latency_max : POSITIVE := 2; + CONSTANT c_nof_aligners_max : NATURAL := 1; CONSTANT c_bsn_w : NATURAL := c_dp_stream_bsn_w; CONSTANT c_data_w : NATURAL := 16; - CONSTANT c_filler_value : INTEGER := 0; + CONSTANT c_replacement_value : INTEGER := 0; CONSTANT c_nof_clk_per_sync : NATURAL := 200*10**6; CONSTANT c_nof_input_bsn_monitors : NATURAL := 0; CONSTANT c_use_bsn_output_monitor : BOOLEAN := FALSE; @@ -153,12 +152,11 @@ BEGIN GENERIC MAP ( g_nof_streams => c_nof_streams, g_bsn_latency_max => c_bsn_latency_max, - g_bsn_latency_use_node_index => c_bsn_latency_use_node_index, + g_nof_aligners_max => c_nof_aligners_max, g_block_size => c_block_size, - g_buffer_nof_blocks => c_buffer_nof_blocks, g_bsn_w => c_bsn_w, g_data_w => c_data_w, - g_filler_value => c_filler_value, + g_replacement_value => c_replacement_value, g_nof_clk_per_sync => c_nof_clk_per_sync, g_nof_input_bsn_monitors => c_nof_input_bsn_monitors, g_use_bsn_output_monitor => c_use_bsn_output_monitor diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd index bfc16dfa090c75a33227375c8429322bea4b4e30..f1ec0cc403fe03e98ff0de9aed0f4eceae302121 100644 --- a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd +++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd @@ -37,7 +37,7 @@ ARCHITECTURE tb OF tb_tb_dp_bsn_align_v2 IS CONSTANT c_block_size : NATURAL := 11; CONSTANT c_diff_delay : NATURAL := 20; CONSTANT c_diff_bsn : NATURAL := 3; -- g_diff_bsn = g_bsn_latency can just be aligned - CONSTANT c_bsn_latency_max : NATURAL := 1; + CONSTANT c_bsn_latency_max : POSITIVE := 1; CONSTANT c_nof_repeat : NATURAL := 100; -- for constant active stream control using 1 is sufficient, use > 1 to verify longer with random stimuli SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end' @@ -46,12 +46,12 @@ BEGIN -- -- DUT -- g_nof_streams : NATURAL := 2; -- number of input and output streams -- g_bsn_latency_max : NATURAL := 1; -- Maximum travel latency of a remote block in number of block periods T_blk - -- g_bsn_latency_use_node_index : BOOLEAN := FALSE; -- FALSE for align at end node, TRUE for align at every intermediate node + -- g_nof_aligners_max : NATURAL := 1; -- 1 when only align at last node, > 1 when align at every intermediate node -- g_block_size : NATURAL := 11; -- > 1, g_block_size=1 is not supported -- g_bsn_w : NATURAL := c_dp_stream_bsn_w; -- number of bits in sosi BSN -- g_data_w : NATURAL := 16; -- number of bits in sosi data - -- g_filler_value : INTEGER := 0; -- output sosi data value for missing input blocks - -- g_use_mm_output : BOOLEAN := FALSE; -- output via MM or via streaming DP + -- c_replacement_value : INTEGER := 0; -- output sosi data replacement value for missing input blocks + -- g_use_mm_output : BOOLEAN := FALSE; -- output via MM or via streaming DP -- g_pipeline_input : NATURAL := 1; -- >= 0, choose 0 for wires, choose 1 to ease timing closure -- g_rd_latency : NATURAL := 2; -- 1 or 2, choose 2 to ease timing closure -- @@ -60,7 +60,7 @@ BEGIN -- g_diff_bsn : NATURAL := 0; -- g_diff_bsn = g_bsn_latency_max can just be aligned -- g_nof_repeat : NATURAL := 100 -- for constant active stream control using 1 is sufficient, use > 1 to verify longer with random stimuli - u_mm_output : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, FALSE, 11, 32, 16, 0, TRUE, 0, 1, 0, 9, c_nof_repeat); - u_dp_output : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, FALSE, 11, 32, 16, 0, FALSE, 0, 1, 0, 9, c_nof_repeat); + u_mm_output : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, 11, 32, 16, 0, TRUE, 0, 1, 0, 9, c_nof_repeat); + u_dp_output : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, 11, 32, 16, 0, FALSE, 0, 1, 0, 9, c_nof_repeat); END tb;