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

Improved verification by using multiple fragmented wr and rd accesses.

parent 3516f313
No related branches found
No related tags found
No related merge requests found
...@@ -50,7 +50,7 @@ END ENTITY tb_io_ddr; ...@@ -50,7 +50,7 @@ END ENTITY tb_io_ddr;
ARCHITECTURE str of tb_io_ddr IS ARCHITECTURE str of tb_io_ddr IS
CONSTANT c_ctlr_ref_clk_period : TIME := 5 ns; -- 200 MHz CONSTANT c_ctlr_ref_clk_period : TIME := 5 ns; -- 200 MHz
CONSTANT c_dp_clk_period : TIME := 5 ns; -- 200 MHz CONSTANT c_dp_clk_period : TIME := 5000 ps; -- 200 MHz
CONSTANT c_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; CONSTANT c_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master;
...@@ -62,6 +62,10 @@ ARCHITECTURE str of tb_io_ddr IS ...@@ -62,6 +62,10 @@ ARCHITECTURE str of tb_io_ddr IS
(OTHERS=>'0'), (OTHERS=>'0'),
TO_UVEC( 3, c_tech_ddr_max.a_row_w), TO_UVEC( 3, c_tech_ddr_max.a_row_w),
TO_UVEC(2**c_tech_ddr_4g.a_col_w-1, c_tech_ddr_max.a_col_w)); TO_UVEC(2**c_tech_ddr_4g.a_col_w-1, c_tech_ddr_max.a_col_w));
-- DDR access stimuli
CONSTANT c_address_lo_arr : t_nat_natural_arr := ( 0, 517, 0, 1, 2, 1, 2, 3, 5, 1900, 1900);
CONSTANT c_nof_address_arr : t_nat_natural_arr := (517, 507, 1024, 1, 6, 1, 1, 2, 3, 153, 153);
CONSTANT c_wr_not_rd_arr : STD_LOGIC_VECTOR := ('1', '1', '0', '1', '1', '0', '0', '0', '0', '1', '0');
CONSTANT c_ctlr_data_w : NATURAL := func_tech_ddr_ctlr_data_w(c_tech_ddr); CONSTANT c_ctlr_data_w : NATURAL := func_tech_ddr_ctlr_data_w(c_tech_ddr);
--CONSTANT c_dp_data_w : NATURAL := 32; --CONSTANT c_dp_data_w : NATURAL := 32;
...@@ -113,16 +117,16 @@ BEGIN ...@@ -113,16 +117,16 @@ BEGIN
dp_clk <= NOT dp_clk OR tb_end AFTER c_dp_clk_period/2; dp_clk <= NOT dp_clk OR tb_end AFTER c_dp_clk_period/2;
dp_rst <= '1', '0' AFTER 100 ns; dp_rst <= '1', '0' AFTER 100 ns;
dvr_start_addr <= c_tech_ddr_addr_lo;
dvr_end_addr <= c_ddr_addr_hi;
p_stimuli : PROCESS p_stimuli : PROCESS
VARIABLE v_addr_lo : t_tech_ddr_addr;
VARIABLE v_addr_hi : t_tech_ddr_addr;
BEGIN BEGIN
tb_end <= '0'; tb_end <= '0';
dvr_en <= '0'; dvr_en <= '0';
src_diag_en <= '0'; src_diag_en <= '0';
dvr_wr_not_rd <= '0'; dvr_wr_not_rd <= '0';
snk_diag_en <= '0'; snk_diag_en <= '0';
expected_cnt <= 0;
proc_common_wait_until_high(ctlr_clk, ctlr_init_done); proc_common_wait_until_high(ctlr_clk, ctlr_init_done);
proc_common_wait_some_cycles(ctlr_clk, 2); -- Give the driver FSM a cycle to go into idle mode proc_common_wait_some_cycles(ctlr_clk, 2); -- Give the driver FSM a cycle to go into idle mode
...@@ -131,31 +135,31 @@ BEGIN ...@@ -131,31 +135,31 @@ BEGIN
src_diag_en <= '1'; src_diag_en <= '1';
snk_diag_en <= '1'; snk_diag_en <= '1';
-- START WRITE FOR I IN c_address_lo_arr'RANGE LOOP
dvr_wr_not_rd <= '1'; v_addr_lo := func_tech_ddr_dq_address(TO_DDR_CTLR_ADDRESS(4*c_address_lo_arr(I)) , c_tech_ddr);
dvr_en <= '1'; v_addr_hi := func_tech_ddr_dq_address(TO_DDR_CTLR_ADDRESS(4*c_address_lo_arr(I)+4*c_nof_address_arr(I)-1), c_tech_ddr);
proc_common_wait_some_cycles(ctlr_clk, 1);
dvr_en <= '0'; dvr_start_addr <= v_addr_lo;
dvr_end_addr <= v_addr_hi;
-- START ACCESS
dvr_wr_not_rd <= c_wr_not_rd_arr(I);
dvr_en <= '1';
proc_common_wait_some_cycles(ctlr_clk, 1);
dvr_en <= '0';
-- ACCESS DONE
proc_common_wait_until_lo_hi(ctlr_clk, dvr_done);
IF c_wr_not_rd_arr(I)='0' THEN
expected_cnt <= expected_cnt + c_nof_address_arr(I)*c_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 LOOP;
-- WRITE DONE proc_common_wait_some_cycles(ctlr_clk, 500);
proc_common_wait_some_cycles(ctlr_clk, 10);
proc_common_wait_until_high(ctlr_clk, dvr_done);
-- START READ
dvr_wr_not_rd <= '0';
dvr_en <= '1';
proc_common_wait_some_cycles(ctlr_clk, 1);
dvr_en <= '0';
-- READ DONE
proc_common_wait_some_cycles(ctlr_clk, 10);
proc_common_wait_until_high(ctlr_clk, dvr_done);
expected_cnt <= 1024*c_dp_factor;
proc_common_wait_some_cycles(ctlr_clk, 500*c_dp_factor); -- 'Done' means all requests are posted. Wait for the last read data to arrive.
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;
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;
REPORT "[OK] Test passed." SEVERITY NOTE; REPORT "[OK] Test passed." SEVERITY NOTE;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment