diff --git a/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd b/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd index b996da705d1f9318b04abd0fadbae7e0147d3dfc..2e35b186e7f696e3353a497b935a179988921a0e 100644 --- a/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd +++ b/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd @@ -37,6 +37,7 @@ USE common_lib.tb_common_mem_pkg.ALL; USE common_lib.tb_common_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE dp_lib.tb_dp_pkg.ALL; +USE work.diag_pkg.ALL; USE work.tb_diag_pkg.ALL; ENTITY tb_mms_diag_seq IS @@ -44,8 +45,8 @@ ENTITY tb_mms_diag_seq IS -- general g_flow_control_verify : t_dp_flow_control_enum := e_active; -- always active or random flow control -- specific - g_nof_streams : NATURAL := 2; - g_mm_broadcast_tx : BOOLEAN := TRUE; + g_nof_streams : NATURAL := 1; + g_mm_broadcast_tx : BOOLEAN := FALSE; g_data_w : NATURAL := 40; -- >= g_seq_dat_w g_seq_dat_w : NATURAL := 32 ); @@ -55,12 +56,14 @@ ARCHITECTURE str of tb_mms_diag_seq IS CONSTANT mm_clk_period : TIME := 8 ns; -- 125 MHz CONSTANT dp_clk_period : TIME := 5 ns; -- 200 MHz + CONSTANT c_random_w : NATURAL := 16; - SIGNAL random : STD_LOGIC_VECTOR(15 DOWNTO 0) := (OTHERS=>'0'); -- use different lengths to have different random sequences + SIGNAL random : STD_LOGIC_VECTOR(c_random_w-1 DOWNTO 0) := (OTHERS=>'0'); -- use different lengths to have different random sequences SIGNAL ready : STD_LOGIC; SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL tb_mode : t_tb_diag_seq_mode_enum := s_off; + SIGNAL tb_mode_multi : t_tb_diag_seq_mode_enum := s_off; SIGNAL tb_verify : STD_LOGIC := '0'; SIGNAL mm_rst : STD_LOGIC; SIGNAL mm_clk : STD_LOGIC := '0'; @@ -73,11 +76,12 @@ ARCHITECTURE str of tb_mms_diag_seq IS SIGNAL reg_rx_mosi : t_mem_mosi := c_mem_mosi_rst; SIGNAL reg_rx_miso : t_mem_miso; - SIGNAL rd_reg : t_diag_seq_mm_reg; + SIGNAL rd_reg_arr : t_diag_seq_mm_reg_arr(g_nof_streams DOWNTO 0); -- use +1 to support g_nof_streams=1, 2 in p_stimuli_and_verify SIGNAL tx_src_out_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); SIGNAL tx_src_in_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL stream_index : NATURAL; SIGNAL force_low_error : STD_LOGIC; SIGNAL force_replicate_error : STD_LOGIC; @@ -107,104 +111,148 @@ BEGIN -- Stimuli ------------------------------------------------------------------------------ + p_stimuli_and_verify : PROCESS + -- Cannot use non static rd_reg_arr(I) variable index in procedure argument, therefor use constant index rd_reg_arr(c_st_0) or rd_reg_arr(c_st_1). + CONSTANT c_st_0 : NATURAL := 0; + CONSTANT c_st_1 : NATURAL := 1; BEGIN + stream_index <= 0; -- default verify stream 0 force_low_error <= '0'; force_replicate_error <= '0'; tb_mode <= s_off; proc_common_wait_until_low(mm_clk, mm_rst); proc_common_wait_some_cycles(mm_clk, 10); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); - + + ------------------------------------------------------------------------- + -- Verify s_off + ------------------------------------------------------------------------- + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); + IF g_nof_streams>1 THEN + stream_index <= 1; -- try stream 1 + proc_diag_seq_verify(c_st_1, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode_multi, tb_verify, rd_reg_arr(c_st_1)); + stream_index <= 0; -- back to stream 0 + END IF; + ------------------------------------------------------------------------- -- Verify Tx and Rx on and both with the same pattern ------------------------------------------------------------------------- tb_mode <= s_expect_ok; - proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_tx_enable("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_rx_enable("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); + proc_diag_seq_tx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_rx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_tx_enable(c_st_0, "CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_rx_enable(c_st_0, "CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); -- Run test and read and verify Rx status proc_common_wait_some_cycles(mm_clk, 200); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); + -- Check that there is valid data + IF g_flow_control_verify=e_active THEN + ASSERT rx_snk_in_arr(0).valid='1' REPORT "Wrong diag result: no valid data at rx_snk_in_arr(0)." SEVERITY ERROR; + END IF; + ------------------------------------------------------------------------- -- Verify Tx and Rx on but with different pattern ------------------------------------------------------------------------- tb_mode <= s_expect_error; - proc_diag_seq_tx_enable("PSRG", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); + proc_diag_seq_tx_enable(c_st_0, "PSRG", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); -- Run test and read and verify Rx status proc_common_wait_some_cycles(mm_clk, 200); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); ------------------------------------------------------------------------- -- Verify Rx off ------------------------------------------------------------------------- tb_mode <= s_expect_no_result; - proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); + proc_diag_seq_rx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); -- Run test and read and verify Rx status proc_common_wait_some_cycles(mm_clk, 200); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); IF g_mm_broadcast_tx=FALSE THEN ------------------------------------------------------------------------- -- Verify Tx and Rx on with error in sequence low part ------------------------------------------------------------------------- tb_mode <= s_expect_ok; - proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_tx_enable("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_rx_enable("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); + proc_diag_seq_tx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_rx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_tx_enable(c_st_0, "CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_rx_enable(c_st_0, "CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); -- Run test and read and verify Rx status proc_common_wait_some_cycles(mm_clk, 200); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); tb_mode <= s_expect_error; proc_common_wait_some_cycles(dp_clk, 1); force_low_error <= '1'; - proc_common_wait_some_cycles(dp_clk, 1); + proc_common_wait_some_cycles(dp_clk, c_random_w); -- sufficently long to affect a valid data in case g_flow_control_verify=e_random force_low_error <= '0'; proc_common_wait_some_cycles(mm_clk, 200); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); + END IF; + IF g_mm_broadcast_tx=FALSE AND g_data_w>g_seq_dat_w THEN ------------------------------------------------------------------------- -- Verify Tx and Rx on with error in sequence replicate part ------------------------------------------------------------------------- tb_mode <= s_expect_ok; - proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_tx_enable("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); - proc_diag_seq_rx_enable("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); + proc_diag_seq_tx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_rx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_tx_enable(c_st_0, "CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_rx_enable(c_st_0, "CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); -- Run test and read and verify Rx status proc_common_wait_some_cycles(mm_clk, 200); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); tb_mode <= s_expect_error; proc_common_wait_some_cycles(dp_clk, 1); force_replicate_error <= '1'; - proc_common_wait_some_cycles(dp_clk, 1); + proc_common_wait_some_cycles(dp_clk, c_random_w); -- sufficently long to affect a valid data in case g_flow_control_verify=e_random force_replicate_error <= '0'; proc_common_wait_some_cycles(mm_clk, 200); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); + END IF; + + IF g_mm_broadcast_tx=FALSE AND g_nof_streams>1 THEN + stream_index <= 1; -- try stream 1 + ------------------------------------------------------------------------- + -- Verify Tx and Rx on and both with the same pattern for stream 1 + ------------------------------------------------------------------------- + proc_diag_seq_tx_disable(c_st_1, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_1)); + proc_diag_seq_rx_disable(c_st_1, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_1)); + proc_diag_seq_tx_enable(c_st_1, "CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_1)); + proc_diag_seq_rx_enable(c_st_1, "CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_1)); + + -- Run test and read and verify Rx status + proc_common_wait_some_cycles(mm_clk, 200); + tb_mode_multi <= s_expect_ok; + proc_diag_seq_verify(c_st_1, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode_multi, tb_verify, rd_reg_arr(c_st_1)); + + -- Check that there is valid data + IF g_flow_control_verify=e_active THEN + ASSERT rx_snk_in_arr(1).valid='1' REPORT "Wrong diag result: no valid data at rx_snk_in_arr(1)." SEVERITY ERROR; + END IF; + stream_index <= 0; -- back to stream 0 END IF; ------------------------------------------------------------------------- -- Both off ------------------------------------------------------------------------- tb_mode <= s_off; - proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg); + proc_diag_seq_tx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); + proc_diag_seq_rx_disable(c_st_0, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg_arr(c_st_0)); proc_common_wait_some_cycles(mm_clk, 100); - proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg); + proc_diag_seq_verify(c_st_0, mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg_arr(c_st_0)); proc_common_wait_some_cycles(mm_clk, 10); tb_end <= '1'; WAIT; END PROCESS; - + p_verify_mm_broadcast : PROCESS(rx_snk_in_arr) VARIABLE v_snk_in : t_dp_sosi; BEGIN @@ -265,7 +313,9 @@ BEGIN p_connect : PROCESS(tx_src_out_arr, force_low_error, force_replicate_error) BEGIN + -- Default lopoback all streams rx_snk_in_arr <= tx_src_out_arr; + -- Optionally apply errors on stream 0 IF force_low_error='1' THEN rx_snk_in_arr(0).data(0) <= NOT tx_src_out_arr(0).data(0); END IF;