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

Verify high word of count and overflow.

parent 1626fb80
No related branches found
No related tags found
1 merge request!285Resolve L2SDP-840
Pipeline #37487 passed
...@@ -22,6 +22,11 @@ ...@@ -22,6 +22,11 @@
-- Author: E. Kooistra -- Author: E. Kooistra
-- Purpose: Test bench for dp_strobe_total_count.vhd -- Purpose: Test bench for dp_strobe_total_count.vhd
-- Description: -- Description:
-- * maximum g_count_w = 31 to fit in largest NATURAL
-- * Use g_mm_w < c_word_w = 32 to simulate large counts in feasible time.
-- * Use g_nof_sync in combination with g_mm_w and g_count_w to achieve
-- . a count > 2**g_mm_w that uses the high part of an MM word
-- . a count > 2**(g_mm_w*2) that will clip at 2**g_mm_w - 1
-- Usage: -- Usage:
-- . as 5 -- . as 5
-- . run -all -- . run -all
...@@ -38,9 +43,12 @@ USE work.dp_stream_pkg.ALL; ...@@ -38,9 +43,12 @@ USE work.dp_stream_pkg.ALL;
ENTITY tb_dp_strobe_total_count IS ENTITY tb_dp_strobe_total_count IS
GENERIC ( GENERIC (
g_count_w : NATURAL := 16; g_mm_w : NATURAL := 8;
g_gap_size : NATURAL := 0; g_count_w : NATURAL := 7;
g_clip : BOOLEAN := TRUE g_nof_blocks_per_sync : NATURAL := 10;
g_nof_valid_per_blk : NATURAL := 10;
g_nof_sync : NATURAL := 10;
g_gap_size : NATURAL := 3
); );
END tb_dp_strobe_total_count; END tb_dp_strobe_total_count;
...@@ -53,22 +61,24 @@ ARCHITECTURE tb OF tb_dp_strobe_total_count IS ...@@ -53,22 +61,24 @@ ARCHITECTURE tb OF tb_dp_strobe_total_count IS
CONSTANT c_dp_clk_period : TIME := 5 ns; CONSTANT c_dp_clk_period : TIME := 5 ns;
CONSTANT c_mm_clk_period : TIME := 10 ns; CONSTANT c_mm_clk_period : TIME := 10 ns;
CONSTANT c_nof_blocks_per_sync : NATURAL := 5; CONSTANT c_skip_nof_sync : NATURAL := 3;
CONSTANT c_nof_data_per_blk : NATURAL := 9; CONSTANT c_tb_nof_sync : NATURAL := c_skip_nof_sync + g_nof_sync;
CONSTANT c_nof_sync : NATURAL := 5; CONSTANT c_clip : BOOLEAN := TRUE;
CONSTANT c_nof_blk : NATURAL := c_nof_blocks_per_sync * (c_nof_sync - 1);
-- dut -- dut
CONSTANT c_nof_counts_max : NATURAL := 15; CONSTANT c_nof_counts_max : NATURAL := 15;
CONSTANT c_nof_counts : NATURAL := 3; -- count stimuli.sync, sop, valid CONSTANT c_nof_counts : NATURAL := 3; -- count stimuli.sync, sop, valid
CONSTANT c_count_max : NATURAL := 2**g_count_w - 1;
CONSTANT c_mm_addr_clear : NATURAL := c_nof_counts_max*2; CONSTANT c_mm_addr_clear : NATURAL := c_nof_counts_max*2;
-- c_nof_sync - 1 because stimuli_sosi.sync is used as ref_sync, and ref_sync is used -- c_tb_nof_sync - c_skip_nof_sync because first sync intervals are skipped
-- to hold the count. -- by using clear, and -1, because stimuli_sosi.sync is used as ref_sync,
CONSTANT c_exp_nof_sync : NATURAL := c_nof_sync - 1; -- and ref_sync is used to hold the counts.
CONSTANT c_exp_nof_sop : NATURAL := c_nof_blk; CONSTANT c_exp_nof_sync : NATURAL := c_tb_nof_sync - c_skip_nof_sync - 1;
CONSTANT c_exp_nof_valid : NATURAL := c_nof_blk * c_nof_data_per_blk; CONSTANT c_nof_blk : NATURAL := g_nof_blocks_per_sync * c_exp_nof_sync;
CONSTANT c_exp_nof_sop : NATURAL := sel_a_b(c_nof_blk < c_count_max, c_nof_blk, c_count_max);
CONSTANT c_nof_valid : NATURAL := c_nof_blk * g_nof_valid_per_blk;
CONSTANT c_exp_nof_valid : NATURAL := sel_a_b(c_nof_valid < c_count_max, c_nof_valid, c_count_max);
SIGNAL dp_clk : STD_LOGIC := '1'; SIGNAL dp_clk : STD_LOGIC := '1';
SIGNAL mm_clk : STD_LOGIC := '1'; SIGNAL mm_clk : STD_LOGIC := '1';
...@@ -104,9 +114,9 @@ BEGIN ...@@ -104,9 +114,9 @@ BEGIN
-- Generate snk_in with data frames -- Generate snk_in with data frames
u_stimuli : ENTITY work.dp_stream_stimuli u_stimuli : ENTITY work.dp_stream_stimuli
GENERIC MAP ( GENERIC MAP (
g_sync_period => c_nof_blocks_per_sync, g_sync_period => g_nof_blocks_per_sync,
g_nof_repeat => c_nof_blocks_per_sync * c_nof_sync, g_nof_repeat => g_nof_blocks_per_sync * c_tb_nof_sync,
g_pkt_len => c_nof_data_per_blk, g_pkt_len => g_nof_valid_per_blk,
g_pkt_gap => g_gap_size g_pkt_gap => g_gap_size
) )
PORT MAP ( PORT MAP (
...@@ -129,10 +139,11 @@ BEGIN ...@@ -129,10 +139,11 @@ BEGIN
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
u_dut : ENTITY work.dp_strobe_total_count u_dut : ENTITY work.dp_strobe_total_count
GENERIC MAP ( GENERIC MAP (
g_mm_w => g_mm_w,
g_nof_counts_max => c_nof_counts_max, g_nof_counts_max => c_nof_counts_max,
g_nof_counts => c_nof_counts, g_nof_counts => c_nof_counts,
g_count_w => g_count_w, g_count_w => g_count_w,
g_clip => g_clip g_clip => c_clip
) )
PORT MAP ( PORT MAP (
dp_rst => rst, dp_rst => rst,
...@@ -153,10 +164,15 @@ BEGIN ...@@ -153,10 +164,15 @@ BEGIN
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
p_mm : PROCESS p_mm : PROCESS
VARIABLE v_rd_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); VARIABLE v_rd_data : STD_LOGIC_VECTOR(g_mm_w-1 DOWNTO 0);
VARIABLE v_rd_count : NATURAL; VARIABLE v_rd_count : NATURAL;
BEGIN BEGIN
proc_common_wait_until_low(mm_clk, rst); -- Wait until strobes have started, skip first sync intervals
FOR I IN 0 TO c_skip_nof_sync-1 LOOP
proc_common_wait_until_lo_hi(dp_clk, stimuli_sosi.sync);
END LOOP;
proc_common_wait_some_cycles(dp_clk, 1);
-- Clear to restart counting at next sync interval
proc_mem_mm_bus_wr(c_mm_addr_clear, 1, mm_clk, reg_mosi); proc_mem_mm_bus_wr(c_mm_addr_clear, 1, mm_clk, reg_mosi);
proc_common_wait_until_lo_hi(dp_clk, stimuli_end); proc_common_wait_until_lo_hi(dp_clk, stimuli_end);
...@@ -164,10 +180,16 @@ BEGIN ...@@ -164,10 +180,16 @@ BEGIN
proc_common_wait_some_cycles(mm_clk, 1); proc_common_wait_some_cycles(mm_clk, 1);
FOR I IN 0 TO c_nof_counts-1 LOOP FOR I IN 0 TO c_nof_counts-1 LOOP
-- read low part
proc_mem_mm_bus_rd(I*2, mm_clk, reg_miso, reg_mosi); proc_mem_mm_bus_rd(I*2, mm_clk, reg_miso, reg_mosi);
proc_mem_mm_bus_rd_latency(1, mm_clk); proc_mem_mm_bus_rd_latency(1, mm_clk);
v_rd_data := reg_miso.rddata(c_word_w-1 DOWNTO 0); v_rd_data := reg_miso.rddata(g_mm_w-1 DOWNTO 0);
v_rd_count := TO_UINT(v_rd_data); v_rd_count := TO_UINT(v_rd_data);
-- read and add high part
proc_mem_mm_bus_rd(I*2+1, mm_clk, reg_miso, reg_mosi);
proc_mem_mm_bus_rd_latency(1, mm_clk);
v_rd_data := reg_miso.rddata(g_mm_w-1 DOWNTO 0);
v_rd_count := v_rd_count + TO_UINT(v_rd_data) * 2**g_mm_w;
rd_count_arr(I) <= v_rd_count; rd_count_arr(I) <= v_rd_count;
ASSERT exp_count_arr(I) = v_rd_count REPORT "Wrong total block count(" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR; ASSERT exp_count_arr(I) = v_rd_count REPORT "Wrong total block count(" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR;
END LOOP; END LOOP;
......
...@@ -37,11 +37,25 @@ ARCHITECTURE tb OF tb_tb_dp_strobe_total_count IS ...@@ -37,11 +37,25 @@ ARCHITECTURE tb OF tb_tb_dp_strobe_total_count IS
SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end' SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end'
BEGIN BEGIN
--g_mm_w : NATURAL := c_word_w;
--g_count_w : NATURAL := 16; --g_count_w : NATURAL := 16;
--g_nof_blocks_per_sync : NATURAL := 10;
--g_nof_valid_per_blk : NATURAL := 10;
--g_nof_sync : NATURAL := 10;
--g_gap_size : NATURAL := 0; --g_gap_size : NATURAL := 0;
--g_clip : BOOLEAN := TRUE
u_clip_word_gap : ENTITY work.tb_dp_strobe_total_count GENERIC MAP(8, 3, TRUE); -- Use g_nof_blocks_per_sync * g_nof_valid_per_blk = 100 valid per sync and
u_clip_word_no_gap : ENTITY work.tb_dp_strobe_total_count GENERIC MAP(8, 0, TRUE); -- use g_nof_sync = 10, so maximum expected valid count is 900.
-- Maximum expected sop count is 90
-- Maximum expected sync count is 9
-- Default usage
u_mm32b_cnt16b_no_gap : ENTITY work.tb_dp_strobe_total_count GENERIC MAP(32, 16, 10,10, 10, 0);
u_mm32b_cnt16b_gap : ENTITY work.tb_dp_strobe_total_count GENERIC MAP(32, 16, 10,10, 10, 3);
-- Check MM high word and counter overflow (clipping)
u_mm8b_cnt16b_high : ENTITY work.tb_dp_strobe_total_count GENERIC MAP(8, 16, 10,10, 10, 3); -- use high part
u_mm8b_cnt9b_overflow : ENTITY work.tb_dp_strobe_total_count GENERIC MAP(8, 9, 10,10, 10, 3); -- cause overflow to clip count high part
u_mm8b_cnt7b_overflow : ENTITY work.tb_dp_strobe_total_count GENERIC MAP(8, 7, 10,10, 10, 3); -- cause overflow to clip count low part
END tb; END tb;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment