Skip to content
Snippets Groups Projects
Commit df3ec792 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Support g_use_identity. Verify last out_sosi, to check that stimuli have been applied.

parent fc69ae78
No related branches found
No related tags found
1 merge request!348Use use_bdo_transpose = true in c_bf revision. Test use_bdo_transpose = false...
......@@ -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,
......
......@@ -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;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment