From a7483ef47d39e045d533cdbfd2838c6f63e54415 Mon Sep 17 00:00:00 2001 From: donker <donker@astron.nl> Date: Thu, 3 Dec 2020 15:20:38 +0100 Subject: [PATCH] L2SDP-184, add tb_tb_dp_block_from_mm and now working with full blocks --- libraries/base/dp/hdllib.cfg | 10 +- .../base/dp/src/vhdl/dp_block_from_mm.vhd | 32 ++-- libraries/base/dp/src/vhdl/dp_block_to_mm.vhd | 27 ++- .../base/dp/tb/vhdl/tb_dp_block_from_mm.vhd | 156 ++++++++---------- 4 files changed, 107 insertions(+), 118 deletions(-) diff --git a/libraries/base/dp/hdllib.cfg b/libraries/base/dp/hdllib.cfg index 4ef6330876..08537b9386 100644 --- a/libraries/base/dp/hdllib.cfg +++ b/libraries/base/dp/hdllib.cfg @@ -73,6 +73,8 @@ synth_files = src/vhdl/dp_bsn_restore_global.vhd src/vhdl/dp_block_gen.vhd src/vhdl/dp_block_gen_valid_arr.vhd + src/vhdl/dp_block_from_mm.vhd + src/vhdl/dp_block_to_mm.vhd src/vhdl/dp_bsn_source.vhd src/vhdl/dp_bsn_source_v2.vhd src/vhdl/dp_bsn_source_reg.vhd @@ -167,8 +169,7 @@ synth_files = src/vhdl/dp_selector.vhd src/vhdl/mms_dp_scale.vhd - src/vhdl/dp_block_from_mm.vhd - src/vhdl/dp_block_to_mm.vhd + tb/vhdl/dp_stream_player.vhd tb/vhdl/dp_sosi_recorder.vhd @@ -188,6 +189,7 @@ test_bench_files = tb/vhdl/tb_dp_block_reshape_sync.vhd tb/vhdl/tb_dp_block_gen.vhd tb/vhdl/tb_dp_block_gen_valid_arr.vhd + tb/vhdl/tb_dp_block_from_mm.vhd tb/vhdl/tb_dp_bsn_align.vhd tb/vhdl/tb_mms_dp_bsn_align.vhd tb/vhdl/tb_dp_bsn_monitor.vhd @@ -255,13 +257,14 @@ test_bench_files = tb/vhdl/tb_mms_dp_force_data_serial_arr.vhd tb/vhdl/tb_mms_dp_gain_arr.vhd tb/vhdl/tb_mms_dp_gain_serial_arr.vhd - tb/vhdl/tb_dp_block_from_mm.vhd + tb/vhdl/tb_tb_dp_block_select.vhd tb/vhdl/tb_tb_dp_block_reshape.vhd tb/vhdl/tb_tb_dp_block_reshape_sync.vhd tb/vhdl/tb_tb_dp_block_gen.vhd tb/vhdl/tb_tb_dp_block_gen_valid_arr.vhd + tb/vhdl/tb_tb_dp_block_from_mm.vhd tb/vhdl/tb_tb_dp_bsn_align.vhd tb/vhdl/tb_tb_dp_bsn_source_v2.vhd tb/vhdl/tb_tb_dp_concat.vhd @@ -323,6 +326,7 @@ regression_test_vhdl = tb/vhdl/tb_tb_dp_block_reshape_sync.vhd tb/vhdl/tb_tb_dp_block_gen.vhd tb/vhdl/tb_tb_dp_block_gen_valid_arr.vhd + tb/vhdl/tb_tb_dp_block_from_mm.vhd tb/vhdl/tb_tb_dp_bsn_align.vhd tb/vhdl/tb_tb_dp_bsn_source_v2.vhd tb/vhdl/tb_tb_dp_concat.vhd diff --git a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd index 56b129b4e6..553d7370c4 100644 --- a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd @@ -22,7 +22,7 @@ -- Purpose: -- . Read a block of data from memory mapped (MM) location and stream it as a block of data. -- Description: --- . " " +-- . https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank -- -------------------------------------------------------------------------- LIBRARY IEEE,common_lib; @@ -60,18 +60,22 @@ ARCHITECTURE rtl OF dp_block_from_mm IS busy : STD_LOGIC; sop : STD_LOGIC; eop : STD_LOGIC; - word_index : NATURAL RANGE 0 TO g_data_size-1; - step_index : NATURAL RANGE 0 TO c_mem_size; + word_index : NATURAL; + step_index : NATURAL; END RECORD; CONSTANT c_reg_rst : t_reg := ('0', '0', '0', 0, 0); SIGNAL r : t_reg; SIGNAL d : t_reg; - + SIGNAL mm_address : NATURAL := 0; + SIGNAL last_mm_address : NATURAL := 0; BEGIN - mm_mosi.address <= TO_MEM_ADDRESS(start_address + r.word_index + r.step_index); + last_mm_address <= g_step_size * (g_nof_data - 1) + g_data_size + start_address; + mm_address <= start_address + r.word_index + r.step_index; + + mm_mosi.address <= TO_MEM_ADDRESS(mm_address); out_sosi.data <= RESIZE_DP_DATA(mm_miso.rddata(c_word_w-1 DOWNTO 0)); out_sosi.valid <= mm_miso.rdval; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so same as the ready latency (RL = 1) @@ -89,7 +93,7 @@ BEGIN END IF; END PROCESS; - p_comb : PROCESS(r, start_pulse, out_siso, d) + p_comb : PROCESS(r, start_pulse, out_siso, mm_address, last_mm_address) BEGIN d <= r; d.sop <= '0'; @@ -101,14 +105,12 @@ BEGIN ELSIF r.busy = '1' THEN IF out_siso.ready = '1' THEN -- continue with block - IF r.step_index < c_mem_size THEN - mm_mosi.rd <= '1'; - IF r.word_index < g_data_size - 1 THEN - d.word_index <= r.word_index + 1; - ELSE - d.word_index <= 0; - d.step_index <= r.step_index + g_step_size; - END IF; + mm_mosi.rd <= '1'; + IF r.word_index < g_data_size - 1 THEN + d.word_index <= r.word_index + 1; + ELSE + d.word_index <= 0; + d.step_index <= r.step_index + g_step_size; END IF; -- check start of block @@ -117,7 +119,7 @@ BEGIN END IF; -- check end of block - IF r.step_index >= c_mem_size THEN + IF mm_address >= last_mm_address THEN d.eop <= '1'; -- prepare for next block d.busy <= '0'; diff --git a/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd index 29929f9e43..7f2fd8aed8 100644 --- a/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd @@ -22,7 +22,7 @@ -- Purpose: -- . get a block of data from a stream and write it to a memory mapped (MM) location. -- Description: --- . " " +-- . https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank -- -------------------------------------------------------------------------- LIBRARY IEEE,common_lib; @@ -54,18 +54,19 @@ ARCHITECTURE rtl OF dp_block_to_mm IS TYPE t_reg IS RECORD wr : STD_LOGIC; - word_index : NATURAL RANGE 0 TO g_data_size-1; - step_index : NATURAL RANGE 0 TO c_mem_size; + word_index : NATURAL; + step_index : NATURAL; END RECORD; CONSTANT c_reg_rst : t_reg := ('0', 0, 0); SIGNAL r : t_reg; SIGNAL d : t_reg; + SIGNAL address : NATURAL := 0; BEGIN - - mm_mosi.address <= TO_MEM_ADDRESS(start_address + r.word_index + r.step_index); + address <= start_address + r.word_index + r.step_index; + mm_mosi.address <= TO_MEM_ADDRESS(address); mm_mosi.wrdata <= RESIZE_MEM_DATA(in_sosi.data); mm_mosi.wr <= r.wr; @@ -82,18 +83,10 @@ BEGIN BEGIN d <= r; d.wr <= '0'; - - -- if end of block - IF in_sosi.eop = '1' THEN - -- prepare for next block - d.word_index <= 0; - d.step_index <= 0; - END IF; - -- while receiving block IF in_sosi.valid = '1' THEN -- continue with block - IF r.step_index < c_mem_size THEN + IF r.step_index <= c_mem_size THEN d.wr <= '1'; IF r.word_index < g_data_size - 1 THEN d.word_index <= r.word_index + 1; @@ -103,6 +96,12 @@ BEGIN END IF; END IF; END IF; + -- if end of block + IF in_sosi.eop = '1' THEN + -- prepare for next block + d.word_index <= 0; + d.step_index <= 0; + END IF; END PROCESS; END rtl; \ No newline at end of file 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 2f07c14c5c..d1b64a7811 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 @@ -28,9 +28,9 @@ -- . process flow: -- p_init_ram --> p_transfer --> p_verify_read / p_verify_check. -- . p_init_ram, initializes u_ram_rd with ascending values. --- . p_transfer, u_dp_block_from_mm reads data (using data and step size) +-- . p_transfer, u_dp_block_from_mm reads data (using g_data_size and g_step size) -- from u_ram_rd and stream it to u_dp_block_to_mm which write it to u_ram_wr. --- . p_verify_read, set ram address (using data and step size) to check and +-- . p_verify_read, set ram address (using g_data_size and g_step_size) to check and -- read value from ram, also set expected ram value. -- . p_verify_check, check if ram_value is equal to expected value. -- -------------------------------------------------------------------------- @@ -52,47 +52,46 @@ ENTITY tb_dp_block_from_mm IS GENERIC ( g_data_size : NATURAL := 2; g_step_size : NATURAL := 4; - g_nof_data : NATURAL := 512 -- 512 + g_nof_data : NATURAL := 512 ); END tb_dp_block_from_mm; - ARCHITECTURE tb OF tb_dp_block_from_mm IS - CONSTANT c_ram_data_size : NATURAL := g_nof_data * g_step_size; + 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_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'); - SIGNAL tb_end : STD_LOGIC := '0'; - SIGNAL clk : STD_LOGIC := '1'; - SIGNAL rst : STD_LOGIC := '1'; + SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL clk : STD_LOGIC := '1'; + SIGNAL rst : STD_LOGIC := '1'; - SIGNAL start_pulse : STD_LOGIC := '0'; - SIGNAL start_address : NATURAL := 0; - SIGNAL block_done : STD_LOGIC; + SIGNAL start_pulse : STD_LOGIC := '0'; + SIGNAL start_address : NATURAL := 0; + SIGNAL start_address_dly : NATURAL := 0; + SIGNAL block_done : STD_LOGIC; SIGNAL rd_mosi : t_mem_mosi; SIGNAL rd_miso : t_mem_miso; - SIGNAL blk_sosi : t_dp_sosi; - SIGNAL blk_siso : t_dp_siso := c_dp_siso_rdy; + SIGNAL blk_sosi : t_dp_sosi; + SIGNAL blk_siso : t_dp_siso := c_dp_siso_rdy; SIGNAL wr_mosi : t_mem_mosi; 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 exp_data : NATURAL; - - SIGNAL init_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 init_done : STD_LOGIC := '0'; SIGNAL transfer_done : STD_LOGIC := '0'; BEGIN @@ -100,7 +99,6 @@ BEGIN clk <= (NOT clk) OR tb_end AFTER clk_period/2; rst <= '1', '0' AFTER clk_period*7; - ------------------------------------------------------------------------------ -- STIMULI ------------------------------------------------------------------------------ @@ -110,10 +108,10 @@ 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.nof_dat-1 LOOP + FOR i IN 0 TO c_ram_data_size-1 LOOP ram_wr_adr <= TO_UVEC(i, c_ram.adr_w); ram_wr_dat <= TO_UVEC(i, c_ram.dat_w); - ram_wr_en <= '1'; + ram_wr_en <= '1'; proc_common_wait_some_cycles(clk, 1); END LOOP; ram_wr_en <= '0'; @@ -124,41 +122,32 @@ BEGIN p_transfer : PROCESS BEGIN - start_pulse <= '0'; + start_pulse <= '0'; start_address <= 0; + start_address_dly <= 0; proc_common_wait_until_high(clk, init_done); - start_pulse <= '1'; - proc_common_wait_some_cycles(clk, 1); - start_pulse <= '0'; - proc_common_wait_until_high(clk, block_done); - + FOR i IN 0 TO c_nof_blocks-1 LOOP + start_address <= i * g_data_size; + start_pulse <= '1'; + proc_common_wait_some_cycles(clk, 1); + start_address_dly <= i * g_data_size; -- dp_block_to_mm is 1 clock behind so set address also 1 clock later. + start_pulse <= '0'; + 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. transfer_done <= '1'; WAIT; END PROCESS; - p_verify_read : PROCESS - VARIABLE v_word_index: NATURAL := 0; - VARIABLE v_step_index: NATURAL := 0; - VARIABLE v_ram_adr : NATURAL := 0; BEGIN - ram_rd_en <= '0'; + ram_rd_en <= '0'; ram_rd_adr <= TO_UVEC(0 , c_ram.adr_w); - exp_data <= 0; proc_common_wait_until_high(clk, transfer_done); - WHILE v_ram_adr < c_ram.nof_dat LOOP - ram_rd_adr <= TO_UVEC(v_ram_adr , c_ram.adr_w); - ram_rd_en <= '1'; + ram_rd_en <= '1'; + FOR i IN 0 TO c_ram_data_size-1 LOOP + ram_rd_adr <= TO_UVEC(i, c_ram.adr_w); proc_common_wait_some_cycles(clk, 1); - exp_data <= v_ram_adr; - - IF v_word_index < g_data_size-1 THEN - v_word_index := v_word_index + 1; - ELSE - v_word_index := 0; - v_step_index := v_step_index + g_step_size; - END IF; - v_ram_adr := start_address + v_step_index + v_word_index; END LOOP; ram_rd_en <= '0'; @@ -167,39 +156,41 @@ BEGIN WAIT; END PROCESS; - p_verify_check: PROCESS + VARIABLE v_cnt: NATURAL := 0; BEGIN 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 exp_data = TO_UINT(ram_rd_dat) REPORT "RAM values not equal" SEVERITY ERROR; + ASSERT v_cnt = TO_UINT(ram_rd_dat) REPORT "RAM values not equal" SEVERITY ERROR; + v_cnt := v_cnt + 1; END IF; END LOOP; WAIT; END PROCESS; - - + + ------------------------------------------------------------------------------ + -- DUT, dp_block_from_mm and dp_block_to_mm + ------------------------------------------------------------------------------ -- RAM with test data u_ram_rd: ENTITY common_lib.common_ram_r_w GENERIC MAP ( g_ram => c_ram ) PORT MAP ( - rst => rst, - clk => clk, - wr_en => ram_wr_en, - wr_adr => ram_wr_adr, - wr_dat => ram_wr_dat, - rd_en => rd_mosi.rd, - rd_adr => rd_mosi.address(c_ram.adr_w-1 DOWNTO 0), - rd_dat => rd_miso.rddata(c_ram.dat_w-1 DOWNTO 0), - rd_val => rd_miso.rdval + rst => rst, + clk => clk, + wr_en => ram_wr_en, + wr_adr => ram_wr_adr, + wr_dat => ram_wr_dat, + rd_en => rd_mosi.rd, + rd_adr => rd_mosi.address(c_ram.adr_w-1 DOWNTO 0), + rd_dat => rd_miso.rddata(c_ram.dat_w-1 DOWNTO 0), + rd_val => rd_miso.rdval ); - - -- DUT : dp_block_from_mm + -- DUT, dp_block_from_mm u_dp_block_from_mm: ENTITY work.dp_block_from_mm GENERIC MAP ( g_data_size => g_data_size, @@ -209,19 +200,16 @@ BEGIN PORT MAP ( rst => rst, clk => clk, - start_pulse => start_pulse, start_address => start_address, mm_done => block_done, - mm_mosi => rd_mosi, mm_miso => rd_miso, - out_sosi => blk_sosi, out_siso => blk_siso ); - -- convert mm back to block + -- DUT, dp_block_to_mm u_dp_block_to_mm: ENTITY work.dp_block_to_mm GENERIC MAP ( g_data_size => g_data_size, @@ -231,30 +219,26 @@ BEGIN PORT MAP ( rst => rst, clk => clk, - - start_address => start_address, - + start_address => start_address_dly, mm_mosi => wr_mosi, - --mm_miso => wr_miso, - - in_sosi => blk_sosi + in_sosi => blk_sosi ); - -- RAM with converted result + -- RAM with transferred data u_ram_wr: ENTITY common_lib.common_ram_r_w GENERIC MAP ( g_ram => c_ram ) PORT MAP ( - rst => rst, - clk => clk, - wr_en => wr_mosi.wr, - wr_adr => wr_mosi.address(c_ram.adr_w-1 DOWNTO 0), - wr_dat => wr_mosi.wrdata(c_ram.dat_w-1 DOWNTO 0), - rd_en => ram_rd_en, - rd_adr => ram_rd_adr, - rd_dat => ram_rd_dat, - rd_val => ram_rd_val + rst => rst, + clk => clk, + wr_en => wr_mosi.wr, + wr_adr => wr_mosi.address(c_ram.adr_w-1 DOWNTO 0), + wr_dat => wr_mosi.wrdata(c_ram.dat_w-1 DOWNTO 0), + rd_en => ram_rd_en, + rd_adr => ram_rd_adr, + rd_dat => ram_rd_dat, + rd_val => ram_rd_val ); END tb; -- GitLab