diff --git a/libraries/base/reorder/tb/vhdl/tb_reorder_col_select_all.vhd b/libraries/base/reorder/tb/vhdl/tb_reorder_col_select_all.vhd index 955c7a71843cff1ce24a7f1bee58ebd539d888da..3d8876bef741062289b57fb0e393ff70e8bcb436 100644 --- a/libraries/base/reorder/tb/vhdl/tb_reorder_col_select_all.vhd +++ b/libraries/base/reorder/tb/vhdl/tb_reorder_col_select_all.vhd @@ -83,7 +83,8 @@ entity tb_reorder_col_select_all is g_nof_data_per_block : natural := 3; g_inter_valid_gap : natural := 0; -- nof clk gap in in_sosi.valid g_inter_packet_gap : natural := 3; -- nof clk gap betweek in_sosi.eop and next in_sosi.sop - g_use_complex : boolean := false; + g_use_complex : boolean := true; + g_use_identity : boolean := true; -- reorder identity or transpose g_use_dynamic_selection : boolean := false ); end tb_reorder_col_select_all; @@ -115,9 +116,12 @@ architecture tb of tb_reorder_col_select_all is signal clk : std_logic := '1'; signal tb_end : std_logic := '0'; - signal verify_en_sosi : t_dp_sosi_sl; - signal verify_en_out_sosi : t_dp_sosi_sl; - signal verify_en_out_sosi_long : t_dp_sosi_sl; + signal verify_en_sosi_sl : t_dp_sosi_sl; + signal verify_en_out_sosi_sl : t_dp_sosi_sl; + signal verify_en_out_sosi_sl_long : t_dp_sosi_sl; + + signal expected_last_sosi : t_dp_sosi := c_dp_sosi_rst; + signal expected_last_sosi_evt : t_dp_sosi_sl := c_dp_sosi_sl_rst; -- Data signal in_en : std_logic := '1'; @@ -126,7 +130,7 @@ architecture tb of tb_reorder_col_select_all is signal transposed_sosi : t_dp_sosi; signal out_sosi : t_dp_sosi; - -- Reorder control for transpose and undo transpose + -- Reorder control for first and second reorder_col_select signal sel_long : boolean := false; signal reorder_busy_transposed : std_logic; signal reorder_busy_output : std_logic; @@ -141,8 +145,15 @@ architecture tb of tb_reorder_col_select_all is signal nof_data_per_block_transposed : natural; signal nof_data_per_block_output : natural; + -- Connect reorder identity or reorder transpose, dependent on g_use_identity + signal select_copi : t_mem_copi; + signal undo_select_copi : t_mem_copi; signal select_cipo : t_mem_cipo; signal undo_select_cipo : t_mem_cipo; + signal r_identity : t_reorder_identity; + signal d_identity : t_reorder_identity; + signal r_redo_identity : t_reorder_identity; + signal d_redo_identity : t_reorder_identity; signal r_transpose : t_reorder_transpose; signal d_transpose : t_reorder_transpose; signal r_undo_transpose : t_reorder_transpose; @@ -173,7 +184,8 @@ begin -- Run some sync intervals with counter data in the packets -- proc_dp_gen_block_data( -- constant c_ready_latency : in natural; -- 0, 1 are supported by proc_dp_stream_ready_latency() - -- constant c_use_data : in boolean; -- when TRUE use data field, else use re, im fields, and keep unused fields at 'X' + -- constant c_use_data : in boolean; -- when TRUE use data field, else use re, im fields, + -- and keep unused fields at 'X' -- constant c_data_w : in natural; -- data width for the data, re and im fields -- constant c_symbol_w : in natural; -- c_data_w/c_symbol_w must be an integer -- constant c_symbol_init : in natural; -- init counter for symbols in data field @@ -246,6 +258,20 @@ begin in_sosi <= c_dp_sosi_rst; proc_common_wait_some_cycles(clk, c_nof_ch_long * 2); proc_common_wait_some_cycles(clk, 10); + + -- Pulse event for used sosi fields, to verify that stimuli have been applied + expected_last_sosi_evt <= c_dp_sosi_sl_ones; + if g_use_complex then + expected_last_sosi_evt.data <= '0'; + else + expected_last_sosi_evt.re <= '0'; + expected_last_sosi_evt.im <= '0'; + end if; + proc_common_wait_some_cycles(clk, 1); + expected_last_sosi_evt <= c_dp_sosi_sl_rst; + + -- End of test + proc_common_wait_some_cycles(clk, 10); tb_end <= '1'; wait; end process; @@ -254,25 +280,42 @@ begin -- Verification ------------------------------------------------------------------------------ - p_verify_en_sosi : process + -- During stimuli verify that values are incrementing + p_verify_en_sosi_sl : process begin - verify_en_sosi <= c_dp_sosi_sl_rst; + verify_en_sosi_sl <= c_dp_sosi_sl_rst; proc_common_wait_until_low(clk, rst); -- Verify all sosi fields, except for some - verify_en_sosi <= c_dp_sosi_sl_ones; + verify_en_sosi_sl <= c_dp_sosi_sl_ones; if g_use_complex then - verify_en_sosi.data <= '0'; + verify_en_sosi_sl.data <= '0'; else - verify_en_sosi.re <= '0'; - verify_en_sosi.im <= '0'; + verify_en_sosi_sl.re <= '0'; + verify_en_sosi_sl.im <= '0'; end if; - verify_en_sosi.empty <= '0'; + verify_en_sosi_sl.empty <= '0'; wait; end process; - verify_en_out_sosi <= verify_en_sosi when sel_long = false else c_dp_sosi_sl_rst; - verify_en_out_sosi_long <= verify_en_sosi when sel_long = true else c_dp_sosi_sl_rst; + verify_en_out_sosi_sl <= verify_en_sosi_sl when sel_long = false else c_dp_sosi_sl_rst; + verify_en_out_sosi_sl_long <= verify_en_sosi_sl when sel_long = true else c_dp_sosi_sl_rst; + + -- After stimuli verify last valid values, to check that stimuli have been applied + p_expected_last_sosi : process(clk) + begin + if rising_edge(clk) then + if in_sosi.valid = '1' then + -- hold last valid sosi.info fields + expected_last_sosi <= in_sosi; + end if; + -- sosi.ctrl fields must have occured at least once + expected_last_sosi.valid <= '1'; + expected_last_sosi.sync <= '1'; + expected_last_sosi.sop <= '1'; + expected_last_sosi.eop <= '1'; + end if; + end process; u_verify_out_sosi : entity dp_lib.dp_stream_verify generic map ( @@ -289,11 +332,11 @@ begin -- Verify data snk_in => out_sosi, -- During stimuli - verify_snk_in_enable => verify_en_out_sosi, + verify_snk_in_enable => verify_en_out_sosi_sl, -- End of stimuli - expected_snk_in => c_dp_sosi_rst, - verify_expected_snk_in_evt => c_dp_sosi_sl_rst + expected_snk_in => expected_last_sosi, + verify_expected_snk_in_evt => expected_last_sosi_evt ); -- When g_use_dynamic_selection = true then c_nof_sync = 2 and second sync interval @@ -316,28 +359,65 @@ begin -- Verify data snk_in => out_sosi, -- During stimuli - verify_snk_in_enable => verify_en_out_sosi_long, + verify_snk_in_enable => verify_en_out_sosi_sl_long, -- End of stimuli - expected_snk_in => c_dp_sosi_rst, + expected_snk_in => c_dp_sosi_rst, -- u_verify_out_sosi already does this verify_expected_snk_in_evt => c_dp_sosi_sl_rst ); ------------------------------------------------------------------------------ - -- DUT + -- DUT reorder control for select_copi/select_cipo ------------------------------------------------------------------------------ - p_clk : process(rst, clk) + select_copi <= r_identity.select_copi when g_use_identity else r_transpose.select_copi; + undo_select_copi <= r_redo_identity.select_copi when g_use_identity else r_undo_transpose.select_copi; + + -- Use synchronous reset in d signals + p_clk : process(clk) begin - if rst = '1' then - r_transpose <= c_reorder_transpose_rst; - r_undo_transpose <= c_reorder_transpose_rst; - elsif rising_edge(clk) then + if rising_edge(clk) then + r_identity <= r_identity; + r_redo_identity <= d_redo_identity; r_transpose <= d_transpose; r_undo_transpose <= d_undo_transpose; end if; end process; + p_comb_identity : process(rst, select_cipo, nof_ch_input, r_identity) + variable v : t_reorder_identity; + begin + if select_cipo.waitrequest = '0' then + -- Read from reorder_col_select page + v := func_reorder_identity(nof_ch_input, r_identity); + else + -- No read, new reorder_col_select page not available yet + v := c_reorder_identity_rst; + end if; + -- Synchronous reset + if rst = '1' then + v := c_reorder_identity_rst; + end if; + d_identity <= v; + end process; + + p_comb_redo_identity : process(rst, select_cipo, nof_ch_input, r_redo_identity) + variable v : t_reorder_identity; + begin + if select_cipo.waitrequest = '0' then + -- Read from reorder_col_select page + v := func_reorder_identity(nof_ch_input, r_redo_identity); + else + -- No read, new reorder_col_select page not available yet + v := c_reorder_identity_rst; + end if; + -- Synchronous reset + if rst = '1' then + v := c_reorder_identity_rst; + end if; + d_redo_identity <= v; + end process; + -- The p_comb_transpose and p_comb_undo_transpose can both use -- func_reorder_transpose(), by swapping the transpose dimensions. @@ -346,7 +426,8 @@ begin nof_data_per_block_input <= g_nof_data_per_block when nof_ch_input = c_nof_ch else g_nof_data_per_block * c_factor_dat; - p_comb_transpose : process(rst, r_transpose, select_cipo) + p_comb_transpose : process(rst, select_cipo, + nof_data_per_block_input, nof_blocks_per_packet_input, r_transpose) variable v : t_reorder_transpose; begin if select_cipo.waitrequest = '0' then @@ -368,7 +449,8 @@ begin nof_data_per_block_transposed <= g_nof_data_per_block when nof_ch_transposed = c_nof_ch else g_nof_data_per_block * c_factor_dat; - p_comb_undo_transpose : process(rst, r_undo_transpose, undo_select_cipo) + p_comb_undo_transpose : process(rst, undo_select_cipo, + nof_blocks_per_packet_transposed, nof_data_per_block_transposed, r_undo_transpose) variable v : t_reorder_transpose; begin if undo_select_cipo.waitrequest = '0' then @@ -390,6 +472,9 @@ begin nof_data_per_block_output <= g_nof_data_per_block when nof_ch_output = c_nof_ch else g_nof_data_per_block * c_factor_dat; + ------------------------------------------------------------------------------ + -- DUT + ------------------------------------------------------------------------------ u_transpose : entity work.reorder_col_select generic map ( g_dsp_data_w => g_dsp_data_w, diff --git a/libraries/base/reorder/tb/vhdl/tb_tb_reorder_col_select_all.vhd b/libraries/base/reorder/tb/vhdl/tb_tb_reorder_col_select_all.vhd index bd66fd81f0cd9f3021c662a50fce8ed3cb750816..442bf28f0142a4398412c0ba0a7d78f03f351f05 100644 --- a/libraries/base/reorder/tb/vhdl/tb_tb_reorder_col_select_all.vhd +++ b/libraries/base/reorder/tb/vhdl/tb_tb_reorder_col_select_all.vhd @@ -45,16 +45,19 @@ begin -- g_inter_valid_gap : natural := 5; -- nof clk gap in in_sosi.valid -- g_inter_packet_gap : natural := 0; -- nof clk gap between in_sosi.eop and next in_sosi.sop -- g_use_complex : boolean := false; +-- g_use_identity : boolean := false; -- reorder identity or transpose -- g_use_dynamic_selection : boolean := true - u_complex_5_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 2, 5, 3, 0, 0, true, false); - u_data_5_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 3, 5, 3, 0, 0, false, false); - u_data_5_1_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 4, 5, 1, 0, 0, false, false); - u_data_1_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 5, 1, 3, 0, 0, false, false); - u_data_3_5_pkt_gap_1 : entity work.tb_reorder_col_select_all generic map(16, 3, 6, 3, 5, 0, 1, false, false); - u_data_3_5_valid_gap_1 : entity work.tb_reorder_col_select_all generic map(16, 3, 6, 3, 5, 1, 0, false, false); + u_data_5_3_no_gaps_identity : entity work.tb_reorder_col_select_all generic map(16, 3, 2, 5, 3, 0, 0, false, true, false); - u_dynamic_data_5_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 3, 5, 3, 0, 0, false, true); - u_dynamic_data_5_3_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 3, 5, 3,10,100, false, true); + u_complex_5_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 2, 5, 3, 0, 0, true, false, false); + u_data_5_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 3, 5, 3, 0, 0, false, false, false); + u_data_5_1_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 4, 5, 1, 0, 0, false, false, false); + u_data_1_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 5, 1, 3, 0, 0, false, false, false); + u_data_3_5_pkt_gap_1 : entity work.tb_reorder_col_select_all generic map(16, 3, 6, 3, 5, 0, 1, false, false, false); + u_data_3_5_valid_gap_1 : entity work.tb_reorder_col_select_all generic map(16, 3, 6, 3, 5, 1, 0, false, false, false); + + u_dynamic_data_5_3_no_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 3, 5, 3, 0, 0, false, false, true); + u_dynamic_data_5_3_gaps : entity work.tb_reorder_col_select_all generic map(16, 3, 3, 5, 3,10,100, false, false, true); end tb;