diff --git a/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd b/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd index 8313c467f3690c236eba85393fec21351941cb2d..00a1360623b7662f20602a8591632084c45c3bc5 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd @@ -59,10 +59,10 @@ END tb_dp_block_from_mm; ARCHITECTURE tb OF tb_dp_block_from_mm IS CONSTANT c_nof_blocks : NATURAL := g_step_size / g_data_size; - CONSTANT c_ram_data_size : NATURAL := g_nof_data * g_data_size * c_nof_blocks; + CONSTANT c_ram_data_size : NATURAL := g_nof_data * g_data_size * c_nof_blocks + g_data_size; -- Size is 1 address more than needed, to check for oversized blocks. CONSTANT c_ram_adr_w : NATURAL := ceil_log2(c_ram_data_size); - CONSTANT c_ram : t_c_mem := (1, c_ram_adr_w, c_word_w, 2**c_ram_adr_w, '0'); + CONSTANT c_ram : t_c_mem := (1, c_ram_adr_w, c_word_w, 2**c_ram_adr_w, '0'); SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL clk : STD_LOGIC := '1'; @@ -83,16 +83,22 @@ ARCHITECTURE tb OF tb_dp_block_from_mm IS SIGNAL wr_miso : t_mem_miso; -- needed for init and verify - SIGNAL ram_wr_en : STD_LOGIC := '0'; - SIGNAL ram_wr_adr : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL ram_wr_dat : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL ram_rd_en : STD_LOGIC := '0'; - SIGNAL ram_rd_adr : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0); - SIGNAL ram_rd_dat : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0); - SIGNAL ram_rd_val : STD_LOGIC; - - SIGNAL init_done : STD_LOGIC := '0'; - SIGNAL transfer_done : STD_LOGIC := '0'; + SIGNAL ram_wr_en : STD_LOGIC := '0'; + SIGNAL ram_wr_adr : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0) := (OTHERS=>'0'); + SIGNAL ram_wr_dat : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0) := (OTHERS=>'0'); + SIGNAL ram_rd_en : STD_LOGIC := '0'; + SIGNAL ram_rd_adr : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0); + SIGNAL ram_rd_dat : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0); + SIGNAL ram_rd_val : STD_LOGIC; + SIGNAL ram_prev_rd_val : STD_LOGIC; + + SIGNAL rd_nxt_data : NATURAL := 0; + SIGNAL rd_data : NATURAL := 0; + + SIGNAL stop_address : NATURAL := 0; + + SIGNAL init_done : STD_LOGIC := '0'; + SIGNAL transfer_done : STD_LOGIC := '0'; BEGIN @@ -110,7 +116,7 @@ BEGIN ram_wr_en <= '0'; proc_common_wait_until_low(clk, rst); proc_common_wait_some_cycles(clk, 10); - FOR i IN 0 TO c_ram_data_size-1 LOOP + FOR i IN 0 TO c_ram_data_size - 1 LOOP -- Write 1 address more than needed. ram_wr_adr <= TO_UVEC(i, c_ram.adr_w); ram_wr_dat <= TO_UVEC(i, c_ram.dat_w); ram_wr_en <= '1'; @@ -128,25 +134,40 @@ BEGIN start_address <= 0; proc_common_wait_until_high(clk, init_done); FOR i IN 0 TO c_nof_blocks-1 LOOP - start_address <= i * g_data_size; + start_address <= i * g_data_size; + start_pulse <= '1'; proc_common_wait_some_cycles(clk, 1); - start_pulse <= '0'; + + --stop_address <= start_address + g_nof_data * g_step_size - g_data_size - 1; + stop_address <= start_address + (g_nof_data - 1) * g_step_size + g_data_size - 1; proc_common_wait_until_high(clk, block_done); END LOOP; - proc_common_wait_some_cycles(clk, 1); -- needed for dp_block_to_mm to proccess last word. + proc_common_wait_some_cycles(clk, 1); -- Needed for dp_block_to_mm to proccess last word. transfer_done <= '1'; WAIT; END PROCESS; - p_verify_read : PROCESS + p_verify_transfer : PROCESS + BEGIN + proc_common_wait_until_high(clk, init_done); + WHILE tb_end = '0' LOOP + WAIT UNTIL rising_edge(clk); + IF block_done = '1' THEN + ASSERT stop_address = TO_UINT(wr_mosi.wrdata(c_ram.dat_w-1 DOWNTO 0)) REPORT "wrong data at mm_done signal, must be same as stop_address" SEVERITY ERROR; + END IF; + END LOOP; + WAIT; + END PROCESS; + + p_read_ram : PROCESS BEGIN ram_rd_en <= '0'; ram_rd_adr <= TO_UVEC(0 , c_ram.adr_w); proc_common_wait_until_high(clk, transfer_done); ram_rd_en <= '1'; - FOR i IN 0 TO c_ram_data_size-1 LOOP + FOR i IN 0 TO c_ram_data_size - 1 LOOP -- Ask for 1 address more than needed. ram_rd_adr <= TO_UVEC(i, c_ram.adr_w); proc_common_wait_some_cycles(clk, 1); END LOOP; @@ -157,15 +178,25 @@ BEGIN WAIT; END PROCESS; - p_verify_check: PROCESS - VARIABLE v_cnt: NATURAL := 0; + ram_prev_rd_val <= ram_rd_val WHEN rising_edge(clk); + + p_verify_read_ram_data: PROCESS BEGIN + --stop_address <= g_nof_data * g_step_size - 1; + rd_nxt_data <= 1; proc_common_wait_until_high(clk, transfer_done); WHILE tb_end = '0' LOOP WAIT UNTIL rising_edge(clk); - IF ram_rd_val = '1' THEN - ASSERT v_cnt = TO_UINT(ram_rd_dat) REPORT "RAM values not equal" SEVERITY ERROR; - v_cnt := v_cnt + 1; + rd_data <= TO_UINT(ram_rd_dat); + IF rd_data > 0 THEN + IF ram_rd_val = '1' THEN + ASSERT rd_data = rd_nxt_data REPORT "wrong order of RAM values" SEVERITY ERROR; + ASSERT rd_data <= stop_address REPORT "wrong RAM values, greater then block size" SEVERITY ERROR; + rd_nxt_data <= rd_nxt_data + 1; + END IF; + IF ram_rd_val = '0' AND ram_prev_rd_val = '1' THEN -- If ram_rd_val goes from hi tot lo. + ASSERT rd_data = stop_address REPORT "wrong last RAM values, not same as block size" SEVERITY ERROR; + END IF; END IF; END LOOP; WAIT;