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

Improved check on snk_diag_res by placing it after the read FIFO has been read...

Improved check on snk_diag_res by placing it after the read FIFO has been read empty. No need for using v_diag_first_rd to ensure that snk_diag_res_val has become 1.
parent 69ce2a19
Branches
No related tags found
No related merge requests found
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
-- --
-- Testbench is selftesting: -- Testbench is selftesting:
-- --
-- > as 8 -- > as 10
-- > run -all -- > run -all
-- --
...@@ -54,12 +54,12 @@ ENTITY tb_io_ddr IS ...@@ -54,12 +54,12 @@ ENTITY tb_io_ddr IS
g_dvr_clk_period : TIME := 5000 ps; -- 50 MHz g_dvr_clk_period : TIME := 5000 ps; -- 50 MHz
g_dp_clk_period : TIME := 5000 ps; -- 200 MHz g_dp_clk_period : TIME := 5000 ps; -- 200 MHz
g_dp_factor : NATURAL := 4; -- 1 or power of 2, c_dp_data_w = c_ctlr_data_w / g_dp_factor g_dp_factor : NATURAL := 4; -- 1 or power of 2, c_dp_data_w = c_ctlr_data_w / g_dp_factor
g_block_len : NATURAL := 5; -- block length for a DDR write access and read back access in number of c_ctlr_data_w words g_block_len : NATURAL := 2500; -- block length for a DDR write access and read back access in number of c_ctlr_data_w words
g_nof_block : NATURAL := 1; -- number of blocks that will be written to DDR and readback from DDR g_nof_block : NATURAL := 3; -- number of blocks that will be written to DDR and readback from DDR
g_nof_wr_per_block : NATURAL := 6; -- number of write accesses per block g_nof_wr_per_block : NATURAL := 1; -- number of write accesses per block
g_nof_rd_per_block : NATURAL := 5; -- number of read accesses per block g_nof_rd_per_block : NATURAL := 1; -- number of read accesses per block
g_nof_repeat : NATURAL := 1; -- number of stimuli repeats with write flush after each repeat g_nof_repeat : NATURAL := 1; -- number of stimuli repeats with write flush after each repeat
g_wr_flush_mode : STRING := "SYN" -- "VAL", "SOP", "SYN" g_wr_flush_mode : STRING := "VAL" -- "VAL", "SOP", "SYN"
); );
PORT ( PORT (
tb_end : OUT STD_LOGIC tb_end : OUT STD_LOGIC
...@@ -145,7 +145,7 @@ ARCHITECTURE str of tb_io_ddr IS ...@@ -145,7 +145,7 @@ ARCHITECTURE str of tb_io_ddr IS
CONSTANT c_ctlr_wr_not_rd_arr : STD_LOGIC_VECTOR(0 TO c_nof_access-1) := func_ctlr_wr_not_rd_arr; CONSTANT c_ctlr_wr_not_rd_arr : STD_LOGIC_VECTOR(0 TO c_nof_access-1) := func_ctlr_wr_not_rd_arr;
CONSTANT c_wr_fifo_depth : NATURAL := 256; CONSTANT c_wr_fifo_depth : NATURAL := 256;
CONSTANT c_rd_fifo_depth : NATURAL := 256; CONSTANT c_rd_fifo_depth : NATURAL := 16384;--256;
-- Frame size for sop/eop -- Frame size for sop/eop
CONSTANT c_wr_frame_size : NATURAL := 32; CONSTANT c_wr_frame_size : NATURAL := 32;
...@@ -221,7 +221,6 @@ BEGIN ...@@ -221,7 +221,6 @@ BEGIN
tb_end <= i_tb_end; tb_end <= i_tb_end;
p_stimuli : PROCESS p_stimuli : PROCESS
VARIABLE v_diag_first_rd : BOOLEAN;
BEGIN BEGIN
i_tb_end <= '0'; i_tb_end <= '0';
dvr_en <= '0'; dvr_en <= '0';
...@@ -242,7 +241,6 @@ BEGIN ...@@ -242,7 +241,6 @@ BEGIN
proc_common_wait_some_cycles(dp_clk, 1); proc_common_wait_some_cycles(dp_clk, 1);
src_diag_en <= '1'; src_diag_en <= '1';
snk_diag_en <= '1'; snk_diag_en <= '1';
v_diag_first_rd := TRUE;
-- After reset the write FIFO is flushed until the first write access is started, even when dvr_wr_flush_en='0' -- After reset the write FIFO is flushed until the first write access is started, even when dvr_wr_flush_en='0'
proc_common_wait_some_cycles(ctlr_clk, 1000); proc_common_wait_some_cycles(ctlr_clk, 1000);
...@@ -262,24 +260,14 @@ BEGIN ...@@ -262,24 +260,14 @@ BEGIN
-- ACCESS DONE -- ACCESS DONE
proc_common_wait_until_lo_hi(dvr_clk, dvr_done); proc_common_wait_until_lo_hi(dvr_clk, dvr_done);
-- wait for first valid read data that starts the diagnostics
IF v_diag_first_rd=TRUE AND c_ctlr_wr_not_rd_arr(I)='0' THEN
v_diag_first_rd := FALSE;
proc_common_wait_some_cycles(dp_clk, 100); -- wait for somewhat longer than the dvr_en read latency
END IF;
IF c_ctlr_wr_not_rd_arr(I)='0' THEN IF c_ctlr_wr_not_rd_arr(I)='0' THEN
expected_cnt <= expected_cnt + c_ctlr_nof_address_arr(I)*g_dp_factor; expected_cnt <= expected_cnt + c_ctlr_nof_address_arr(I)*g_dp_factor;
ASSERT snk_diag_res_val = '1' REPORT "[ERROR] DIAG_RES INVALID!" SEVERITY FAILURE;
ASSERT snk_diag_res = '0' REPORT "[ERROR] NON-ZERO DIAG_RES!" SEVERITY FAILURE;
END IF; END IF;
END LOOP; END LOOP;
-- Stop diagnostics source and sink -- Stop diagnostics source
proc_common_wait_some_cycles(dp_clk, 1); proc_common_wait_some_cycles(dp_clk, 1);
src_diag_en <= '0'; src_diag_en <= '0';
snk_diag_en <= '0';
-- Flush the wr fifo -- Flush the wr fifo
proc_common_wait_some_cycles(dvr_clk, 1); proc_common_wait_some_cycles(dvr_clk, 1);
...@@ -296,11 +284,18 @@ BEGIN ...@@ -296,11 +284,18 @@ BEGIN
ASSERT UNSIGNED(rd_fifo_usedw) = 0 REPORT "[ERROR] Read FIFO is not empty!" SEVERITY FAILURE; ASSERT UNSIGNED(rd_fifo_usedw) = 0 REPORT "[ERROR] Read FIFO is not empty!" SEVERITY FAILURE;
ASSERT UNSIGNED(snk_val_cnt) = expected_cnt REPORT "[ERROR] Unexpected number of read data!" SEVERITY FAILURE; ASSERT UNSIGNED(snk_val_cnt) = expected_cnt REPORT "[ERROR] Unexpected number of read data!" SEVERITY FAILURE;
-- Check diagnostics sink after the rd fifo has been read empty
proc_common_wait_some_cycles(dp_clk, 1);
ASSERT snk_diag_res_val = '1' REPORT "[ERROR] DIAG_RES INVALID!" SEVERITY FAILURE;
ASSERT snk_diag_res = '0' REPORT "[ERROR] NON-ZERO DIAG_RES!" SEVERITY FAILURE;
-- Stop diagnostics sink
snk_diag_en <= '0';
-- Restart diagnostics source and sink -- Restart diagnostics source and sink
proc_common_wait_some_cycles(dp_clk, 1); proc_common_wait_some_cycles(dp_clk, 1);
src_diag_en <= '1'; src_diag_en <= '1';
snk_diag_en <= '1'; snk_diag_en <= '1';
v_diag_first_rd := TRUE;
END LOOP; END LOOP;
-- If the test failed then it would have stopped already, so it the test has passed -- If the test failed then it would have stopped already, so it the test has passed
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment