diff --git a/libraries/base/dp/src/vhdl/dp_block_gen_arr.vhd b/libraries/base/dp/src/vhdl/dp_block_gen_arr.vhd index 6c22c7803f5744086e0c49dfcd82757d4dda81de..4570b1f58a6792736f51b9962da4174c99f0909b 100644 --- a/libraries/base/dp/src/vhdl/dp_block_gen_arr.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_gen_arr.vhd @@ -22,12 +22,13 @@ -- Purpose : Generate the sosi control for a block of data based on the -- input valid -- Description: --- When enabled a block of g_nof_data_per_block words is output via --- src_out_arr under flow control by the input valid. The input valid is --- taken from snk_in_arr(0). Therefore all input streams in the snk_in_arr --- must have the same sosi ctrl and info fields, such that the valid from --- snk_in_arr(0) is sufficient. Only the data, re, im in the snk_in_arr() --- differs. +-- All input streams in the snk_in_arr must have the same sosi ctrl and info +-- fields, such that the valid from snk_in_arr(0) is sufficient. Only the +-- data, re, im in the snk_in_arr() differs. Therefore default connect snk_in +-- = snk_in_arr(0). +-- +-- When enabled (enable='1') then a block of g_nof_data_per_block words is +-- output via src_out_arr under flow control by the input valid. -- -- The input sync, sop and eop are ignored. For the output the sync, sop and -- eop are generated by counting the input valid and using @@ -41,27 +42,89 @@ -- such that it increments for every block and that it restarts at 0 at every -- output sync. -- --- g_use_input_sync: --- When g_use_input_sync=FALSE then the input sync is ignored and the first +-- Typically the size of g_nof_blk_per_sync*g_nof_data_per_block should match +-- the number of input valids in an input sync interval. +-- +-- The local BSN restarts at 0 for every new output sync interval, but instead +-- of BSN = 0 the input BSN will be inserted at the first block in a new +-- output sync interval. If the first output BSN should remain 0 then simply +-- keep snk_in.bsn = 0. +-- +-- g_nof_pages_bsn: +-- The input BSN is not available in snk_in_arr(0) if the upstream component +-- does not pass the BSN on. In that case the snk_in.sync and snk_in.bsn can +-- be connected to some further upstream interface that does have the proper +-- BSN. The input BSN is then buffered to align it with the local sync that is +-- recreated for the output. This buffer is set via g_nof_pages_bsn. Typically +-- g_nof_pages_bsn = 1 is sufficient to align the BSN along some DSP, +-- components, because the latency in number of blocks of most DSP functions +-- is much less than a sync interval. For a corner turn that operates per sync +-- interval choosing g_nof_pages_bsn = 2 seems appropriate. +-- +-- g_check_input_sync: +-- When g_check_input_sync=FALSE then the input sync is ignored and the first -- input valid that occurs after when enable is active will start the local --- sync. When g_use_input_sync=TRUE then the block output for a new sync +-- sync. When g_check_input_sync=TRUE then the block output for a new sync -- interval is only started if the input valid also coincides with a input --- sync. Hence for this mode the size of g_nof_blk_per_sync * --- g_nof_data_per_block should match the number of input valids in an input --- sync interval. +-- sync. Until then all input valid are ignored and there is no output then. -- --- g_use_input_bsn_at_sync: --- When g_use_input_bsn_at_sync=FALSE then all output blocks will count the --- local BSN that restarts at 0 for every new output sync interval. When --- g_use_input_bsn_at_sync=TRUE then the input BSN will be inserted instead --- of BSN = 0 for the first block in a new output sync interval. This mode --- is useful to preserve the longer term timestamp information that may be --- carried by the input BSN. --- +-- Usage: +-- * Example 1: Use snk_in.valid to recreate sync, sop, eop, bsn for a DP +-- function that only passes on the valid. +-- +-- - g_check_input_sync = False +-- - g_nof_pages_bsn = 0 +-- +-- |------| +-- snk_in_arr() ----*--------->| |----> src_out_arr +-- | | dp | +-- (0)| | block| +-- | snk_in | gen | +-- \--------->| arr | +-- |------| +-- +-- * Example 2: Use snk_in.valid to recreate sop, eop, bsn and check that the +-- local sync is aligned with the snk_in.sync. If the snk_in.sync +-- does not coincide with the local sync, then stop the output of +-- blocks until the snk_in.sync occurs again. +-- +-- - g_check_input_sync = True +-- - g_nof_pages_bsn = 0 +-- +-- |------| +-- snk_in_arr() ----*--------->| |----> src_out_arr +-- | | dp | +-- (0)| | block| +-- | snk_in | gen | +-- \--------->| arr | +-- |------| +-- * Example 3: Use snk_in.valid to recreate sop, eop, bsn for a DP +-- function that only passes on the valid. However for delay +-- the snk_in.bsn by g_nof_pages_bsn to account for the block +-- latency of the upstream DP components that did not pass on +-- the snk_in.bsn. +-- +-- - g_check_input_sync = False +-- - g_nof_pages_bsn >= 1 +-- +-- |-----| snk_in_arr() |------| +-- -----*-->| |-------*--------->| |----> src_out_arr +-- | | DP | | | dp | +-- | | | (0)| | block| +-- | | | | snk_in | gen | +-- | | | \--*------>| arr | +-- sync| |-----| ^ |------| +-- bsn | | +-- \--------------------/ +-- -- Remarks: -- . No siso flow control, although enable could be used as siso.xon --- . Only the bsn info field is supported, the other info fields (channel, --- empty and err) are output as 0. +-- . The channel, empty and err fields are passed on to the output. Typically +-- these fields are not used with DSP data. However this scheme still +-- allows setting these fields to a fixed value via snk_in. +-- . Using g_check_input_sync=True is similar to using a dp_sync_checker in +-- front of this dp_block_gen_arr. However the advantage of dp_sync_checker +-- is that it provides monitoring and control via MM. LIBRARY IEEE, common_lib; USE IEEE.STD_LOGIC_1164.ALL; @@ -72,15 +135,16 @@ USE work.dp_stream_pkg.ALL; ENTITY dp_block_gen_arr IS GENERIC ( g_nof_streams : POSITIVE := 1; - g_nof_data_per_block : POSITIVE := 1; -- nof data per block + g_nof_data_per_block : POSITIVE := 1; g_nof_blk_per_sync : POSITIVE := 8; - g_use_input_sync : BOOLEAN := FALSE; - g_use_input_bsn_at_sync : BOOLEAN := FALSE + g_check_input_sync : BOOLEAN := FALSE; + g_nof_pages_bsn : NATURAL := 0 ); PORT ( rst : IN STD_LOGIC; clk : IN STD_LOGIC; -- Streaming sink + snk_in : IN t_dp_sosi; -- = snk_in_arr(0) snk_in_arr : IN t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); -- Streaming source src_out_arr : OUT t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); @@ -92,6 +156,22 @@ END dp_block_gen_arr; ARCHITECTURE rtl OF dp_block_gen_arr IS + -- Check consistancy of the parameters, the function return value is void, because always true or abort due to failure + FUNCTION parameter_asserts(g_check_input_sync : BOOLEAN; g_nof_pages_bsn : NATURAL) return BOOLEAN IS + BEGIN + IF g_check_input_sync=TRUE THEN + ASSERT g_nof_pages_bsn=0 REPORT "When g_check_input_sync=TRUE then g_nof_pages_bsn must be 0." SEVERITY FAILURE; + -- because snk_in.sync and snk_in.bsn are then already aligned with the first snk_in.valid + END IF; + IF g_nof_pages_bsn>0 THEN + ASSERT g_check_input_sync=FALSE REPORT "When g_nof_pages_bsn>0 then g_check_input_sync must be FALSE." SEVERITY FAILURE; + -- because snk_in.sync and snk_in.bsn are then NOT aligned with the first snk_in.valid + END IF; + RETURN TRUE; + END parameter_asserts; + + CONSTANT c_parameters_ok : BOOLEAN := parameter_asserts(g_check_input_sync, g_nof_pages_bsn); + TYPE t_state IS (s_sop, s_data, s_eop); TYPE t_reg IS RECORD -- local registers @@ -102,8 +182,11 @@ ARCHITECTURE rtl OF dp_block_gen_arr IS END RECORD; CONSTANT c_reg_rst : t_reg := (s_sop, 0, 0, c_dp_sosi_rst); + + SIGNAL in_sosi : t_dp_sosi; + SIGNAL in_sync_wr_en : STD_LOGIC_VECTOR(g_nof_pages_bsn-1 DOWNTO 0); + SIGNAL in_bsn_buffer : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); - SIGNAL snk_in : t_dp_sosi; SIGNAL nxt_src_out_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); -- Define the local registers in t_reg record @@ -123,17 +206,46 @@ BEGIN END IF; END PROCESS; + no_bsn_buffer : IF g_nof_pages_bsn=0 GENERATE + in_sosi <= snk_in; + END GENERATE; + + gen_bsn_buffer : IF g_nof_pages_bsn>0 GENERATE + -- Buffer input BSN at each input sync + in_sync_wr_en <= (OTHERS=>snk_in.sync); + + u_paged_bsn : ENTITY common_lib.common_paged_reg + GENERIC MAP ( + g_data_w => c_dp_stream_bsn_w, + g_nof_pages => g_nof_pages_bsn + ) + PORT MAP ( + rst => rst, + clk => clk, + wr_en => in_sync_wr_en, + wr_dat => snk_in.bsn, + out_dat => in_bsn_buffer + ); + + p_snk_in : PROCESS(snk_in, in_bsn_buffer) + BEGIN + in_sosi <= snk_in; + in_sosi.sync <= '0'; + in_sosi.bsn <= in_bsn_buffer; + END PROCESS; + END GENERATE; + -- Combine input data with the same out_put info and output ctrl for all streams nxt_src_out_arr <= func_dp_stream_arr_combine_data_info_ctrl(snk_in_arr, nxt_r.src_out, nxt_r.src_out); -- Determine the output info and output ctrl using snk_in and r.src_out - snk_in <= snk_in_arr(0); - - p_state : PROCESS(r, enable, snk_in) + p_state : PROCESS(r, enable, in_sosi) BEGIN nxt_r <= r; - -- default set the output ctrl to '0' + -- default output in_sosi, hold output bsn and set the output ctrl to '0' + nxt_r.src_out <= in_sosi; + nxt_r.src_out.bsn <= r.src_out.bsn; nxt_r.src_out.valid <= '0'; nxt_r.src_out.sop <= '0'; nxt_r.src_out.eop <= '0'; @@ -153,19 +265,14 @@ BEGIN nxt_r.blk_cnt <= r.blk_cnt+1; END IF; - -- create local sync + -- create local sync and pass on input bsn at local sync IF r.blk_cnt=0 THEN -- output sync starts at first input valid nxt_r.src_out.sync <= '1'; -- output sync for this block + nxt_r.src_out.bsn <= in_sosi.bsn; -- output input bsn at sync + ELSE + nxt_r.src_out.bsn <= TO_DP_BSN(r.blk_cnt); -- output local bsn for the subsequent blocks END IF; - -- create local bsn - nxt_r.src_out.bsn <= TO_DP_BSN(r.blk_cnt); -- default use local bsn for all blocks - IF g_use_input_bsn_at_sync=TRUE THEN - IF r.blk_cnt=0 THEN - nxt_r.src_out.bsn <= snk_in.bsn; -- if enabled then pass on the input bsn at the sync - END IF; - END IF; - nxt_r.src_out.valid <= '1'; nxt_r.src_out.sop <= '1'; @@ -177,7 +284,7 @@ BEGIN END IF; -- if enabled then check input sync and stop the new block output if the local sync does not coincide with the input sync - IF g_use_input_sync=TRUE THEN + IF g_check_input_sync=TRUE THEN IF r.blk_cnt=0 THEN IF snk_in.sync='0' THEN nxt_r.src_out.valid <= '0'; -- undo all ctrl preparations for the new block diff --git a/libraries/base/dp/tb/vhdl/tb_dp_block_gen_arr.vhd b/libraries/base/dp/tb/vhdl/tb_dp_block_gen_arr.vhd index 1f5a9c10dc84a55cee7d7fe776d3905b6eafd33f..5f78522b8ea3212286c77d065b91eee866cc0a22 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_block_gen_arr.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_block_gen_arr.vhd @@ -42,8 +42,8 @@ ENTITY tb_dp_block_gen_arr IS g_nof_streams : POSITIVE := 1; g_nof_data_per_block : POSITIVE := 11; g_nof_blk_per_sync : POSITIVE := 8; - g_use_input_sync : BOOLEAN := FALSE; - g_use_input_bsn_at_sync : BOOLEAN := TRUE; + g_check_input_sync : BOOLEAN := FALSE; + g_nof_pages_bsn : NATURAL := 0; g_enable : t_dp_flow_control_enum := e_active; -- always e_active or e_pulse block generator enable g_flow_control : t_dp_flow_control_enum := e_active; -- always e_active, e_random or e_pulse flow control for input valid g_nof_repeat : NATURAL := 1000 @@ -57,34 +57,48 @@ ARCHITECTURE tb OF tb_dp_block_gen_arr IS CONSTANT c_nof_valid_per_sync : NATURAL := g_nof_blk_per_sync*g_nof_data_per_block; CONSTANT c_nof_valid_per_enable : NATURAL := 3*c_nof_valid_per_sync+1; + CONSTANT c_dsp_latency : NATURAL := 1; -- >= 1 block and typically << g_nof_blk_per_sync blocks + CONSTANT c_bsn_init : NATURAL := 3; - CONSTANT c_block_bsn_max : NATURAL := g_nof_blk_per_sync-1; + CONSTANT c_channel_init : NATURAL := 17; + CONSTANT c_err_init : NATURAL := 13; + + CONSTANT c_input_bsn_no_wrap : NATURAL := 0; -- use 0 to indicate no max, so no wrap + CONSTANT c_input_bsn_gap : NATURAL := g_nof_blk_per_sync; + CONSTANT c_local_bsn_max : NATURAL := g_nof_blk_per_sync-1; + CONSTANT c_local_bsn_gap : NATURAL := 2; SIGNAL tb_input_end : STD_LOGIC := '0'; SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL clk : STD_LOGIC := '1'; SIGNAL rst : STD_LOGIC := '1'; SIGNAL sl1 : STD_LOGIC := '1'; + SIGNAL exp_channel : STD_LOGIC_VECTOR(c_dp_stream_channel_w-1 DOWNTO 0) := TO_DP_CHANNEL(c_channel_init); + SIGNAL exp_err : STD_LOGIC_VECTOR(c_dp_stream_error_w-1 DOWNTO 0) := TO_DP_ERROR(c_err_init); SIGNAL enable : STD_LOGIC; SIGNAL in_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); SIGNAL out_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL stimuli_sosi : t_dp_sosi; + SIGNAL dsp_sosi : t_dp_sosi; SIGNAL in_sosi : t_dp_sosi; SIGNAL out_sosi : t_dp_sosi; SIGNAL prev_out_sosi : t_dp_sosi; + SIGNAL out_sosi_local : t_dp_sosi; + SIGNAL prev_out_sosi_local : t_dp_sosi; SIGNAL out_gap : STD_LOGIC := '0'; SIGNAL hold_sop : STD_LOGIC := '0'; SIGNAL exp_size : NATURAL := g_nof_data_per_block; SIGNAL cnt_size : NATURAL := 0; - SIGNAL verify_en : STD_LOGIC := '0'; SIGNAL verify_bsn_en : STD_LOGIC := '0'; SIGNAL verify_done : STD_LOGIC := '0'; SIGNAL verify_valid : STD_LOGIC := '0'; SIGNAL verify_sop : STD_LOGIC := '0'; SIGNAL verify_eop : STD_LOGIC := '0'; + SIGNAL verify_sync : STD_LOGIC := '0'; BEGIN @@ -131,8 +145,10 @@ BEGIN g_sync_offset => 0, g_data_init => 0, g_bsn_init => TO_DP_BSN(c_bsn_init), - g_err_init => 0, - g_channel_init => 0, + g_err_init => c_err_init, + g_err_incr => 0, + g_channel_init => c_channel_init, + g_channel_incr => 0, -- specific g_in_dat_w => 32, g_nof_repeat => g_nof_repeat, @@ -144,7 +160,7 @@ BEGIN clk => clk, -- Generate stimuli - src_out => in_sosi, + src_out => stimuli_sosi, -- End of stimuli last_snk_in => OPEN, -- expected verify_snk_in after end of stimuli @@ -152,6 +168,29 @@ BEGIN tb_end => tb_input_end -- signal end of tb as far as this dp_stream_stimuli is concerned ); + -- Use dp_pipeline to model the latency introduced by upstream DSP components + u_dp_pipeline : ENTITY work.dp_pipeline + GENERIC MAP ( + g_pipeline => c_dsp_latency -- 0 for wires, > 0 for registers, + ) + PORT MAP ( + rst => rst, + clk => clk, + -- ST sink + snk_in => stimuli_sosi, + -- ST source + src_out => dsp_sosi + ); + + p_in_sosi : PROCESS(dsp_sosi, stimuli_sosi) + BEGIN + in_sosi <= dsp_sosi; + IF g_nof_pages_bsn>0 THEN + in_sosi.sync <= stimuli_sosi.sync; + in_sosi.bsn <= stimuli_sosi.bsn; + END IF; + END PROCESS; + -- Use same stimuli for all streams in_sosi_arr <= (OTHERS=>in_sosi); @@ -159,14 +198,13 @@ BEGIN -- VERIFICATION ------------------------------------------------------------------------------ - verify_en <= '1'; - p_verify_bsn : PROCESS BEGIN verify_bsn_en <= '0'; proc_common_wait_until_high(clk, enable); - proc_common_wait_until_hi_lo(clk, out_sosi.sop); -- first sop will have occured, so start verification for subsequent BSN - IF g_use_input_sync=TRUE THEN + proc_common_wait_until_hi_lo(clk, out_sosi.sop); + proc_common_wait_until_hi_lo(clk, out_sosi.sop); -- first two sop will have occured, so start verification for subsequent BSN + IF g_check_input_sync=TRUE THEN proc_common_wait_until_hi_lo(clk, out_sosi.sync); -- if necessary also wait for first sync END IF; WHILE enable='1' LOOP @@ -182,28 +220,35 @@ BEGIN verify_valid <= '1' WHEN out_sosi.valid='1' AND rising_edge(clk); verify_sop <= '1' WHEN out_sosi.sop='1' AND rising_edge(clk); verify_eop <= '1' WHEN out_sosi.eop='1' AND rising_edge(clk); - proc_dp_verify_value("out_sosi.valid", clk, verify_done, sl1, verify_valid); - proc_dp_verify_value("out_sosi.sop", clk, verify_done, sl1, verify_sop); - proc_dp_verify_value("out_sosi.eop", clk, verify_done, sl1, verify_eop); + verify_sync <= '1' WHEN out_sosi.sync='1' AND rising_edge(clk); + proc_dp_verify_value("out_sosi.valid", clk, verify_done, sl1, verify_valid); + proc_dp_verify_value("out_sosi.sop", clk, verify_done, sl1, verify_sop); + proc_dp_verify_value("out_sosi.eop", clk, verify_done, sl1, verify_eop); + proc_dp_verify_value("out_sosi.sync", clk, verify_done, sl1, verify_sync); + proc_dp_verify_value("out_sosi.channel", e_equal, clk, verify_done, exp_channel, out_sosi.channel); + proc_dp_verify_value("out_sosi.err", e_equal, clk, verify_done, exp_err, out_sosi.err); -- Verify some general streaming interface properties proc_dp_verify_gap_invalid(clk, out_sosi.valid, out_sosi.sop, out_sosi.eop, out_gap); -- Verify that the out_sosi valid is low between blocks - gen_use_input_bsn_at_sync : IF g_use_input_bsn_at_sync=TRUE GENERATE - proc_dp_verify_data("BSN", 0, g_nof_blk_per_sync, clk, verify_bsn_en, out_sosi.sync, out_sosi.bsn, prev_out_sosi.bsn); -- only verify BSN at sync - END GENERATE; - gen_use_local_bsn_at_sync : IF g_use_input_bsn_at_sync=FALSE GENERATE - proc_dp_verify_data("BSN", c_block_bsn_max, clk, verify_bsn_en, out_sosi.sop, out_sosi.bsn, prev_out_sosi.bsn); -- verify all BSN - END GENERATE; + -- define out_sosi_local with sync = '0' to be able to verify local bsn incrementing during rest of sync interval + p_out_sosi_local : PROCESS(out_sosi) + BEGIN + out_sosi_local <= out_sosi; + out_sosi_local.sync <= '0'; + IF out_sosi.sync='1' THEN + out_sosi_local.sop <= '0'; + END IF; + END PROCESS; + + -- only verify BSN at sync using out_sosi + proc_dp_verify_sync(1, c_bsn_init, clk, verify_bsn_en, out_sosi.sync, out_sosi.sync, out_sosi.bsn); + proc_dp_verify_data("BSN", c_input_bsn_no_wrap, c_input_bsn_gap, clk, verify_bsn_en, out_sosi.sync, out_sosi.bsn, prev_out_sosi.bsn); + + -- verify BSN at all sop using out_sosi_local + proc_dp_verify_data("BSN", c_local_bsn_max, c_local_bsn_gap, clk, verify_bsn_en, out_sosi_local.sop, out_sosi_local.bsn, prev_out_sosi_local.bsn); -- Verify intervals - gen_use_input_sync : IF g_use_input_sync GENERATE - proc_dp_verify_sync(1, c_bsn_init, clk, verify_en, out_sosi.sync, out_sosi.sync, out_sosi.bsn); - END GENERATE; - gen_use_local_sync : IF g_use_input_sync GENERATE - proc_dp_verify_sync(g_nof_blk_per_sync, 0, clk, verify_en, out_sosi.sync, out_sosi.sop, out_sosi.bsn); - END GENERATE; - proc_dp_verify_sop_and_eop(clk, out_sosi.valid, out_sosi.sop, out_sosi.eop, hold_sop); proc_dp_verify_block_size(exp_size, clk, out_sosi.valid, out_sosi.sop, out_sosi.eop, cnt_size); @@ -217,13 +262,14 @@ BEGIN g_nof_streams => g_nof_streams, g_nof_data_per_block => g_nof_data_per_block, g_nof_blk_per_sync => g_nof_blk_per_sync, - g_use_input_sync => g_use_input_sync, - g_use_input_bsn_at_sync => g_use_input_bsn_at_sync + g_check_input_sync => g_check_input_sync, + g_nof_pages_bsn => g_nof_pages_bsn ) PORT MAP ( rst => rst, clk => clk, -- Streaming sink + snk_in => in_sosi, snk_in_arr => in_sosi_arr, -- Streaming source src_out_arr => out_sosi_arr, diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_block_gen_arr.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_block_gen_arr.vhd index aabf0435f10d382acf223f4b4237ef9e2d83dac2..b0ffa735c9b596e531adef463ec58d67a1b13f3e 100644 --- a/libraries/base/dp/tb/vhdl/tb_tb_dp_block_gen_arr.vhd +++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_block_gen_arr.vhd @@ -39,19 +39,21 @@ BEGIN -- g_nof_streams : POSITIVE := 1; -- g_nof_data_per_block : POSITIVE := 11; -- g_nof_blk_per_sync : POSITIVE := 8; - -- g_use_input_sync : BOOLEAN := FALSE; - -- g_use_input_bsn_at_sync : BOOLEAN := FALSE; + -- g_check_input_sync : BOOLEAN := FALSE; + -- g_nof_pages_bsn : NATURAL := 0; -- g_enable : t_dp_flow_control_enum := e_active; -- always e_active or e_pulse block generator enable -- g_flow_control : t_dp_flow_control_enum := e_active; -- always e_active, e_random or e_pulse flow control for input valid -- g_nof_repeat : NATURAL := 200 - u_local : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 8, FALSE, FALSE, e_active, e_active, 100); - u_input_sync : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 9, TRUE, FALSE, e_active, e_active, 100); - u_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 5, FALSE, TRUE, e_active, e_active, 100); - u_input_sync_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 8, TRUE, TRUE, e_active, e_active, 100); + u_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 8, FALSE, 0, e_active, e_active, 100); + u_input_bsn_check_sync : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 9, TRUE, 0, e_active, e_active, 100); + u_buffer_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 5, FALSE, 1, e_active, e_active, 100); - u_rnd_local : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 8, FALSE, FALSE, e_pulse, e_random, 300); - u_rnd_input_sync : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 9, TRUE, FALSE, e_pulse, e_random, 300); - u_rnd_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 5, FALSE, TRUE, e_pulse, e_random, 300); - u_rnd_input_sync_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 8, TRUE, TRUE, e_pulse, e_random, 300); + u_en_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 8, FALSE, 0, e_pulse, e_active, 500); + u_en_input_bsn_check_sync : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 9, TRUE, 0, e_pulse, e_active, 500); + u_en_buffer_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 5, FALSE, 1, e_pulse, e_active, 500); + + u_en_rnd_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 8, FALSE, 0, e_pulse, e_random, 500); + u_en_rnd_input_bsn_check_sync : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 9, TRUE, 0, e_pulse, e_random, 500); + u_en_rnd_buffer_input_bsn : ENTITY work.tb_dp_block_gen_arr GENERIC MAP (1, 11, 5, FALSE, 1, e_pulse, e_random, 500); END tb;