diff --git a/libraries/base/reorder/hdllib.cfg b/libraries/base/reorder/hdllib.cfg index 0c5cfb57f97114126f356222a32abd9d9f34f2ba..0c4ce6f94ca7807fb3e5ce862cdc3210ba3efa8d 100644 --- a/libraries/base/reorder/hdllib.cfg +++ b/libraries/base/reorder/hdllib.cfg @@ -35,12 +35,13 @@ test_bench_files = tb/vhdl/tb_tb_reorder_col.vhd tb/vhdl/tb_reorder_col_wide.vhd tb/vhdl/tb_reorder_col_wide_row_select.vhd + tb/vhdl/tb_tb_reorder_col_wide_row_select.vhd tb/vhdl/tb_mmf_reorder_matrix.vhd tb/vhdl/tb_mmf_reorder_row.vhd tb/vhdl/tb_mms_reorder_rewire.vhd regression_test_vhdl = - tb/vhdl/tb_reorder_col_wide_row_select.vhd + tb/vhdl/tb_tb_reorder_col_wide_row_select.vhd # tb/vhdl/tb_tb_reorder_col.vhd -- fails in unb2c diff --git a/libraries/base/reorder/src/vhdl/reorder_col_select.vhd b/libraries/base/reorder/src/vhdl/reorder_col_select.vhd index 0c473d217b9614df7d6588373c4445fc363e6387..d8ee5f2dae9b9014c7af442272322ea5f49bf2e8 100644 --- a/libraries/base/reorder/src/vhdl/reorder_col_select.vhd +++ b/libraries/base/reorder/src/vhdl/reorder_col_select.vhd @@ -20,7 +20,7 @@ ------------------------------------------------------------------------------- -- Author : R vd Walle --- Purpose: Reorder packet +-- Purpose: Reorder block of data in time -- Description: -- Select g_nof_ch_sel complex samples from an input block of g_nof_ch_in -- complex samples. The subband select map is arbitrary (any order and also diff --git a/libraries/base/reorder/src/vhdl/reorder_col_wide_select.vhd b/libraries/base/reorder/src/vhdl/reorder_col_wide_select.vhd index 53accf74f748070b8bffbe24cf61f596432a92ac..ff0cdce5cab6ef2cb9056e611c3b4063eb00621c 100644 --- a/libraries/base/reorder/src/vhdl/reorder_col_wide_select.vhd +++ b/libraries/base/reorder/src/vhdl/reorder_col_wide_select.vhd @@ -23,9 +23,7 @@ -- Purpose: Select and/or reorder data on multiple streams. -- -- Description: --- Reorder-col unit that handles a stream that consists of --- multiple (g_nof_inputs) input streams. --- +-- Array of reorder_col_select instances -- -- Remarks: -- @@ -74,8 +72,8 @@ BEGIN --------------------------------------------------------------- -- INSTANTIATE MULTIPLE SINGLE CHANNEL SUBBAND SELECT UNITS --------------------------------------------------------------- - gen_ss_singles : FOR I IN 0 TO g_nof_inputs-1 GENERATE - u_single_ss : ENTITY work.reorder_col_select + gen_nof_input : FOR I IN 0 TO g_nof_inputs-1 GENERATE + u_reorder_col_select : ENTITY work.reorder_col_select GENERIC MAP ( g_technology => g_technology, g_dsp_data_w => g_dsp_data_w, diff --git a/libraries/base/reorder/src/vhdl/reorder_row_select.vhd b/libraries/base/reorder/src/vhdl/reorder_row_select.vhd index 478eb96db607a8eeaa5627264d6886ad1c83dee2..b2c8ebf64687c8f32e4c1e4b7267bd5939e7b4b6 100644 --- a/libraries/base/reorder/src/vhdl/reorder_row_select.vhd +++ b/libraries/base/reorder/src/vhdl/reorder_row_select.vhd @@ -29,7 +29,7 @@ -- for a single clock cylce. -- -- Remarks: --- in_select has to be defined 1 clock cycle after the in_sosi data. +-- in_select always has to be defined on the same clock cycle as the in_sosi data. LIBRARY IEEE, common_lib, technology_lib, dp_lib; USE IEEE.STD_LOGIC_1164.ALL; @@ -62,7 +62,7 @@ END reorder_row_select; ARCHITECTURE str OF reorder_row_select IS - CONSTANT c_tot_pipeline : NATURAL := g_pipeline_in + g_pipeline_in_m + g_pipeline_out + 1; --+1 for regs process + CONSTANT c_tot_pipeline : NATURAL := g_pipeline_in + g_pipeline_in_m + g_pipeline_out; CONSTANT c_data_w : NATURAL := g_dsp_data_w*c_nof_complex; TYPE t_dp_sosi_2arr IS ARRAY (INTEGER RANGE <>) OF t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0); @@ -87,8 +87,8 @@ BEGIN -- selection buffer. --------------------------------------------------------------- gen_input : FOR I IN g_nof_inputs-1 DOWNTO 0 GENERATE - reorder_in_dat((I+1)*c_data_w-1 DOWNTO I*c_data_w) <= r.pipe_sosi_2arr(0)(I).im(g_dsp_data_w-1 DOWNTO 0) & - r.pipe_sosi_2arr(0)(I).re(g_dsp_data_w-1 DOWNTO 0); + reorder_in_dat((I+1)*c_data_w-1 DOWNTO I*c_data_w) <= input_sosi_arr(I).im(g_dsp_data_w-1 DOWNTO 0) & + input_sosi_arr(I).re(g_dsp_data_w-1 DOWNTO 0); END GENERATE; --------------------------------------------------------------- @@ -123,7 +123,7 @@ BEGIN -- Also the data-output of the select_m_symbols block is merged -- here with the rest of the pipelined SOSI signals. --------------------------------------------------------------- - comb : PROCESS(r, input_sosi_arr, reorder_out_dat) + comb : PROCESS(r, input_sosi_arr, reorder_out_dat) VARIABLE v : reg_type; BEGIN v := r; diff --git a/libraries/base/reorder/tb/vhdl/tb_reorder_col_wide_row_select.vhd b/libraries/base/reorder/tb/vhdl/tb_reorder_col_wide_row_select.vhd index 847aea42e6d1ad4d7d992abf2d0acf18c35b9bb9..db63122e71dbd21b911c3b2d160fb819505d1629 100644 --- a/libraries/base/reorder/tb/vhdl/tb_reorder_col_wide_row_select.vhd +++ b/libraries/base/reorder/tb/vhdl/tb_reorder_col_wide_row_select.vhd @@ -20,12 +20,46 @@ ------------------------------------------------------------------------------- -- Author : R vd Walle +-- Purpose: Verify reorder_col_wide select and reorder_row_select. -- Usage: -- > as 10 -- > run -all --- . Observe in_sosi_arr and out_sosi_arr in the Wave window +-- * The tb is self stopping and self checking,tb_end will stop the simulation by +-- stopping the clk and thus all toggling. -- --- Description: +-- Description: The tb generates counter data for all g_nof_inputs packetized according +-- to g_nof_sync, g_nof_block_per_sync and g_nof_ch_in. Each input stream then passes through +-- reorder_col_wide_select where each stream is reordered according to g_nof_ch_sel_col, +-- g_ch_sel_offsets and g_ch_sel_step. Those streams then enter reorder_row_select. Each output +-- is created by selecting one input at the time based on in_select, this tb always selects the next input (row) +-- in ascending order after g_nof_ch_sel_col elements. Each output has the same selection in this tb. +-- The tb verifies the functionality by generating an expected sosi array and comparing it with the output. +-- The signals verified are sop, eop, valid, sync, re, and im. +-- The example below shows what the expected outputs are based on the default TB generics and the following input. +-- The 6 rows in the table represent the c_nof_inputs = 6 input streams. (A,B), (C,D), etc. represent the +-- g_nof_ch_sel_col = 2 nof sequential collums to select per row. +-- +-- Input: +-- | 0| 1| 2| 3| ...| 32| 33| ...|1022|1023| +-- -+----------------------------------------- +-- 0|A0|B0|A1|B1| ...|A16|B16| ...|A511|B511| +-- -|--+--+--+--+----+---+---+----+----+----+ +-- 1|C0|D0|C1|D1| ...|C16|D16| ...|C511|D511| +-- -|--+--+--+--+----+---+---+----+----+----+ +-- 2|E0|F0|E1|F1| ...|E16|F16| ...|E511|F511| +-- -|--+--+--+--+----+---+---+----+----+----+ +-- 3|G0|H0|G1|H1| ...|G16|H16| ...|G511|H511| +-- -|--+--+--+--+----+---+---+----+----+----+ +-- 4|I0|J0|I1|J1| ...|I16|J16| ...|I511|J511| +-- -|--+--+--+--+----+---+---+----+----+----+ +-- 5|K0|L0|K1|L1| ...|K16|L16| ...|K511|L511| +-- +-- Expected output for each of the g_nof_outputs = 2 output streams in the first sync intercal. You can see that +-- all "0" and all "16" elements are selected from the inputs which is configured by g_ch_sel_offset = (0, 16). +-- The next sync intervals, the offset selection will be (0+i*k, 16+i*k) where i is the sync interval and k is +-- g_ch_sel_step = 3. +-- |A0 B0 C0 D0 E0 F0 G0 H0 I0 J0 K0 L0 A16 B16 C16 D16 E16 F16 G16 H16 I16 J16 K16 L16| + LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; USE common_lib.common_pkg.ALL; @@ -37,32 +71,36 @@ USE dp_lib.dp_stream_pkg.ALL; USE dp_lib.tb_dp_pkg.ALL; ENTITY tb_reorder_col_wide_row_select IS + GENERIC( + g_nof_inputs : NATURAL := 6; -- also nof rows + g_nof_outputs : NATURAL := 2; + g_dsp_data_w : NATURAL := 16; + g_nof_sync : NATURAL := 5; + g_nof_block_per_sync : NATURAL := 4; + g_nof_ch_in : NATURAL := 1024; -- nof input words per block, identical for all input streams. + g_nof_ch_sel_col : NATURAL := 2; -- nof of sequential collums to select per row. + g_nof_ch_sel_offset : NATURAL := 2; -- nof offsets defined + g_ch_sel_offsets : t_natural_arr := (0, 16); + g_ch_sel_step : NATURAL := 3; -- offset step size to increase per sync interval + g_reorder_row_select_pipe_in : NATURAL := 1; + g_reorder_row_select_pipe_in_m : NATURAL := 1; + g_reorder_row_select_pipe_out : NATURAL := 1 + ); END tb_reorder_col_wide_row_select; ARCHITECTURE tb OF tb_reorder_col_wide_row_select IS - CONSTANT c_clk_period : TIME := 10 ns; + CONSTANT c_clk_period : TIME := 10 ns; CONSTANT c_rl : NATURAL := 1; - CONSTANT c_dsp_data_w : NATURAL := 16; - - CONSTANT c_nof_sync : NATURAL := 5; - - CONSTANT c_nof_inputs : NATURAL := 6; - CONSTANT c_nof_outputs : NATURAL := 2; - CONSTANT c_nof_ch_in : NATURAL := 1024; - CONSTANT c_nof_ch_sel_row : NATURAL := c_nof_inputs; - CONSTANT c_nof_ch_sel_col : NATURAL := 2; - CONSTANT c_nof_ch_sel_offset : NATURAL := 2; - CONSTANT c_ch_sel_offsets : t_natural_arr(0 TO c_nof_ch_sel_offset-1) := (0, 16); - CONSTANT c_ch_sel_step : NATURAL := 3; - CONSTANT c_nof_ch_sel : NATURAL := c_nof_ch_sel_offset*c_nof_ch_sel_col*c_nof_ch_sel_row; - CONSTANT c_nof_block_per_sync : NATURAL := 4; - CONSTANT c_nof_inputs_w : NATURAL := ceil_log2(c_nof_inputs); - CONSTANT c_in_select_w : NATURAL := c_nof_outputs*c_nof_inputs_w; - CONSTANT c_in_select_dly : NATURAL := 2; - + CONSTANT c_nof_ch_sel_row : NATURAL := g_nof_inputs; + CONSTANT c_nof_ch_sel : NATURAL := g_nof_ch_sel_offset*g_nof_ch_sel_col*c_nof_ch_sel_row; + CONSTANT c_nof_inputs_w : NATURAL := ceil_log2(g_nof_inputs); + CONSTANT c_in_select_w : NATURAL := g_nof_outputs*c_nof_inputs_w; + CONSTANT c_in_select_dly : NATURAL := 1; + CONSTANT c_ch_sel_offsets : t_natural_arr(0 TO g_nof_ch_sel_offset-1) := g_ch_sel_offsets; + SIGNAL rst : STD_LOGIC; SIGNAL clk : STD_LOGIC := '1'; SIGNAL tb_end : STD_LOGIC; @@ -71,19 +109,19 @@ ARCHITECTURE tb OF tb_reorder_col_wide_row_select IS SIGNAL mm_miso : t_mem_miso; SIGNAL st_en : STD_LOGIC := '1'; - SIGNAL st_siso_arr : t_dp_siso_arr(c_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy); - SIGNAL st_sosi_arr : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); - SIGNAL exp_sosi_arr : t_dp_sosi_arr(c_nof_outputs-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); - SIGNAL exp_siso_arr : t_dp_siso_arr(c_nof_outputs-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy); + SIGNAL st_siso_arr : t_dp_siso_arr(g_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy); + SIGNAL st_sosi_arr : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + SIGNAL exp_sosi_arr : t_dp_sosi_arr(g_nof_outputs-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + SIGNAL exp_siso_arr : t_dp_siso_arr(g_nof_outputs-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy); SIGNAL bsn : NATURAL := 10; - SIGNAL in_sosi_arr : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + SIGNAL in_sosi_arr : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); - SIGNAL out_siso_arr : t_dp_siso_arr(c_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy); - SIGNAL col_wide_select_sosi_arr : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0); - SIGNAL out_sosi_arr : t_dp_sosi_arr(c_nof_outputs-1 DOWNTO 0); - SIGNAL dly_out_sosi_arr : t_dp_sosi_arr(c_nof_outputs-1 DOWNTO 0); + SIGNAL out_siso_arr : t_dp_siso_arr(g_nof_inputs-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy); + SIGNAL col_wide_select_sosi_arr : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0); + SIGNAL out_sosi_arr : t_dp_sosi_arr(g_nof_outputs-1 DOWNTO 0); + SIGNAL dly_out_sosi_arr : t_dp_sosi_arr(g_nof_outputs-1 DOWNTO 0); SIGNAL reorder_row_in_select : STD_LOGIC_VECTOR(c_in_select_w-1 DOWNTO 0); SIGNAL in_select : STD_LOGIC_VECTOR(c_in_select_w-1 DOWNTO 0); @@ -93,18 +131,17 @@ BEGIN clk <= (NOT clk) OR tb_end AFTER c_clk_period/2; rst <= '1', '0' AFTER c_clk_period*7; - -- MM domain - p_mm_stimuli : PROCESS + p_select_stimuli : PROCESS VARIABLE k : NATURAL; BEGIN - FOR rep IN 0 TO c_nof_sync*c_nof_block_per_sync-1 LOOP - k := c_nof_ch_sel_col * (rep/c_nof_block_per_sync) * c_ch_sel_step; + FOR rep IN 0 TO g_nof_sync*g_nof_block_per_sync-1 LOOP + k := g_nof_ch_sel_col * (rep/g_nof_block_per_sync) * g_ch_sel_step; mm_mosi <= c_mem_mosi_rst; proc_common_wait_until_low(clk, mm_miso.waitrequest); - FOR I IN 0 TO c_nof_ch_sel_offset-1 LOOP + FOR I IN 0 TO g_nof_ch_sel_offset-1 LOOP FOR row IN 0 TO c_nof_ch_sel_row-1 LOOP - FOR col IN 0 TO c_nof_ch_sel_col-1 LOOP - FOR i_out IN 0 TO c_nof_outputs-1 LOOP + FOR col IN 0 TO g_nof_ch_sel_col-1 LOOP + FOR i_out IN 0 TO g_nof_outputs-1 LOOP reorder_row_in_select((i_out+1)* c_nof_inputs_w -1 DOWNTO i_out * c_nof_inputs_w) <= TO_UVEC(row, c_nof_inputs_w); END LOOP; proc_mem_mm_bus_rd(c_ch_sel_offsets(I)+col+k, clk, mm_mosi); @@ -130,7 +167,7 @@ BEGIN ------------------------------------------------------------------------------ -- Data blocks ------------------------------------------------------------------------------ - gen_stimuli : FOR K IN 0 TO c_nof_inputs-1 GENERATE + gen_stimuli : FOR K IN 0 TO g_nof_inputs-1 GENERATE p_st_stimuli : PROCESS VARIABLE v_re : NATURAL := 0+k*2**5; VARIABLE v_im : NATURAL := 1+k*2**5; @@ -141,17 +178,18 @@ BEGIN -- Run some sync intervals with DSP counter data for the real and imag fields WAIT UNTIL rising_edge(clk); - FOR I IN 0 TO c_nof_sync-1 LOOP - proc_dp_gen_block_data(c_rl, FALSE, c_dsp_data_w, c_dsp_data_w, 0, v_re, v_im, c_nof_ch_in, 0, 0, '1', "0", clk, st_en, st_siso_arr(K), st_sosi_arr(K)); -- next sync - v_re := v_re + c_nof_ch_in; - v_im := v_im + c_nof_ch_in; - FOR J IN 0 TO c_nof_block_per_sync-2 LOOP -- provide sop and eop for block reference - proc_dp_gen_block_data(c_rl, FALSE, c_dsp_data_w, c_dsp_data_w, 0, v_re, v_im, c_nof_ch_in, 0, 0, '0', "0", clk, st_en, st_siso_arr(K), st_sosi_arr(K)); -- no sync - v_re := v_re + c_nof_ch_in; - v_im := v_im + c_nof_ch_in; + FOR I IN 0 TO g_nof_sync-1 LOOP + proc_dp_gen_block_data(c_rl, FALSE, g_dsp_data_w, g_dsp_data_w, 0, v_re, v_im, g_nof_ch_in, 0, 0, '1', "0", clk, st_en, st_siso_arr(K), st_sosi_arr(K)); -- next sync + v_re := v_re + g_nof_ch_in; + v_im := v_im + g_nof_ch_in; + FOR J IN 0 TO g_nof_block_per_sync-2 LOOP -- provide sop and eop for block reference + proc_dp_gen_block_data(c_rl, FALSE, g_dsp_data_w, g_dsp_data_w, 0, v_re, v_im, g_nof_ch_in, 0, 0, '0', "0", clk, st_en, st_siso_arr(K), st_sosi_arr(K)); -- no sync + v_re := v_re + g_nof_ch_in; + v_im := v_im + g_nof_ch_in; END LOOP; END LOOP; st_sosi_arr(K) <= c_dp_sosi_rst; + proc_common_wait_some_cycles(clk, g_nof_ch_in); proc_common_wait_some_cycles(clk, 10); tb_end <= '1'; WAIT; @@ -164,7 +202,7 @@ BEGIN -- Add BSN to the ST data p_in_sosi : PROCESS(st_sosi_arr, bsn) BEGIN - FOR I IN 0 TO c_nof_inputs-1 LOOP + FOR I IN 0 TO g_nof_inputs-1 LOOP in_sosi_arr(I) <= st_sosi_arr(I); in_sosi_arr(I).bsn <= TO_DP_BSN(bsn); END LOOP; @@ -173,10 +211,9 @@ BEGIN ------------------------------------------------------------------------------ -- Verification ------------------------------------------------------------------------------ - u_pipeline_arr : ENTITY dp_lib.dp_pipeline_arr GENERIC MAP ( - g_nof_streams => c_nof_outputs + g_nof_streams => g_nof_outputs ) PORT MAP ( rst => rst, @@ -186,7 +223,7 @@ BEGIN src_out_arr => dly_out_sosi_arr ); - gen_verify : FOR O IN 0 TO c_nof_outputs-1 GENERATE + gen_verify : FOR O IN 0 TO g_nof_outputs-1 GENERATE p_generate_exp_data : PROCESS VARIABLE v_col : NATURAL := 0; VARIABLE v_row : NATURAL := 0; @@ -194,31 +231,32 @@ BEGIN VARIABLE v_sync_ix : NATURAL := 0; VARIABLE v_k : NATURAL := 0; BEGIN - FOR I IN 0 TO c_nof_sync*c_nof_block_per_sync-1 LOOP + FOR I IN 0 TO g_nof_sync*g_nof_block_per_sync-1 LOOP exp_sosi_arr(O) <= c_dp_sosi_rst; proc_common_wait_until_high(clk, out_sosi_arr(0).sop); FOR J IN 0 TO c_nof_ch_sel-1 LOOP - v_sync_ix := I / c_nof_block_per_sync; - v_offset := J / (c_nof_ch_sel_col*c_nof_ch_sel_row); - v_col := J MOD c_nof_ch_sel_col; - v_row := (J/c_nof_ch_sel_col) MOD c_nof_ch_sel_row; - v_k := c_nof_ch_sel_col * v_sync_ix * c_ch_sel_step; + v_sync_ix := I / g_nof_block_per_sync; + v_offset := J / (g_nof_ch_sel_col*c_nof_ch_sel_row); + v_col := J MOD g_nof_ch_sel_col; + v_row := (J/g_nof_ch_sel_col) MOD c_nof_ch_sel_row; + v_k := g_nof_ch_sel_col * v_sync_ix * g_ch_sel_step; exp_sosi_arr(O) <= c_dp_sosi_rst; exp_sosi_arr(O).valid <= '1'; IF J = 0 THEN exp_sosi_arr(O).sop <= '1'; - IF I MOD c_nof_block_per_sync = 0 THEN + IF I MOD g_nof_block_per_sync = 0 THEN exp_sosi_arr(O).sync <= '1'; END IF; ELSIF j = c_nof_ch_sel-1 THEN exp_sosi_arr(O).eop <= '1'; END IF; - exp_sosi_arr(O).re <= TO_DP_DSP_DATA( I * c_nof_ch_in + v_k + c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); - exp_sosi_arr(O).im <= TO_DP_DSP_DATA(1+ I * c_nof_ch_in + v_k + c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); + exp_sosi_arr(O).re <= TO_DP_DSP_DATA( I * g_nof_ch_in + v_k + c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); + exp_sosi_arr(O).im <= TO_DP_DSP_DATA(1+ I * g_nof_ch_in + v_k + c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); proc_common_wait_some_cycles(clk, 1); END LOOP; + exp_sosi_arr(O) <= c_dp_sosi_rst; END LOOP; WAIT; END PROCESS; @@ -241,9 +279,9 @@ BEGIN u_dut_col : ENTITY work.reorder_col_wide_select GENERIC MAP ( - g_nof_inputs => c_nof_inputs, - g_dsp_data_w => c_dsp_data_w, - g_nof_ch_in => c_nof_ch_in, + g_nof_inputs => g_nof_inputs, + g_dsp_data_w => g_dsp_data_w, + g_nof_ch_in => g_nof_ch_in, g_nof_ch_sel => c_nof_ch_sel ) PORT MAP ( @@ -262,9 +300,12 @@ BEGIN u_dut_row : ENTITY work.reorder_row_select GENERIC MAP ( - g_dsp_data_w => c_dsp_data_w, - g_nof_inputs => c_nof_inputs, - g_nof_outputs => c_nof_outputs + g_dsp_data_w => g_dsp_data_w, + g_nof_inputs => g_nof_inputs, + g_nof_outputs => g_nof_outputs, + g_pipeline_in => g_reorder_row_select_pipe_in, + g_pipeline_in_m => g_reorder_row_select_pipe_in_m, + g_pipeline_out => g_reorder_row_select_pipe_out ) PORT MAP ( dp_rst => rst, diff --git a/libraries/base/reorder/tb/vhdl/tb_tb_reorder_col_wide_row_select.vhd b/libraries/base/reorder/tb/vhdl/tb_tb_reorder_col_wide_row_select.vhd new file mode 100644 index 0000000000000000000000000000000000000000..4e499c8e96678ff5ada789594f588ac1ffb2cd43 --- /dev/null +++ b/libraries/base/reorder/tb/vhdl/tb_tb_reorder_col_wide_row_select.vhd @@ -0,0 +1,63 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2021 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- Author : R vd Walle +-- Purpose: Test multiple instances of tb_reorder_col_wide_row_select +-- Usage: +-- > as 10 +-- > run -all +-- +-- Description: See tb_reorder_col_wide_row_select + +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY tb_tb_reorder_col_wide_row_select IS +END tb_tb_reorder_col_wide_row_select; + +ARCHITECTURE tb OF tb_tb_reorder_col_wide_row_select IS + + CONSTANT c_nof_sync : NATURAL := 3; + CONSTANT c_dsp_data_w : NATURAL := 16; + SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end' + +BEGIN + + -- Generics: + -- g_nof_inputs : NATURAL := 6; -- also nof rows + -- g_nof_outputs : NATURAL := 2; + -- g_dsp_data_w : NATURAL := 16; + -- g_nof_sync : NATURAL := 5; + -- g_nof_block_per_sync : NATURAL := 4; + -- g_nof_ch_in : NATURAL := 1024; -- nof input words per block, identical for all input streams. + -- g_nof_ch_sel_col : NATURAL := 2; -- nof of sequential collums to select per row. + -- g_nof_ch_sel_offset : NATURAL := 2; -- nof offsets defined + -- g_ch_sel_offsets : t_natural_arr := (0, 16); + -- g_ch_sel_step : NATURAL := 3; -- offset step size to increase per sync interval + -- g_reorder_row_select_pipe_in : NATURAL := 1; + -- g_reorder_row_select_pipe_in_m : NATURAL := 1; + -- g_reorder_row_select_pipe_out : NATURAL := 1 + + u_sdp : ENTITY work.tb_reorder_col_wide_row_select GENERIC MAP (6, 1, c_dsp_data_w, c_nof_sync, 4, 1024, 2, 2, (0, 16), 3, 0, 1, 1); + u_max_out : ENTITY work.tb_reorder_col_wide_row_select GENERIC MAP (8, 1, c_dsp_data_w, c_nof_sync, 1, 512, 8, 8, (0 ,64, 128, 192, 256, 320, 384, 448), 0, 0, 1, 1); -- rows * cols * offsets = 8*8*8 = 512 + u_multiple_out : ENTITY work.tb_reorder_col_wide_row_select GENERIC MAP (2, 5, c_dsp_data_w, c_nof_sync, 4, 1024, 2, 2, (0, 16), 3, 0, 1, 1); + +END tb;