diff --git a/libraries/base/dp/hdllib.cfg b/libraries/base/dp/hdllib.cfg index bde1e5b94e23ef02f8694e5b9065afe70dd5358e..12048d88a88fb9a49145f04cfdac7201eb79bea1 100644 --- a/libraries/base/dp/hdllib.cfg +++ b/libraries/base/dp/hdllib.cfg @@ -74,6 +74,7 @@ synth_files = src/vhdl/dp_block_gen.vhd src/vhdl/dp_block_gen_valid_arr.vhd src/vhdl/dp_bsn_source.vhd + src/vhdl/dp_bsn_source_v2.vhd src/vhdl/dp_bsn_source_reg.vhd src/vhdl/mms_dp_bsn_source.vhd src/vhdl/dp_bsn_scheduler.vhd @@ -183,8 +184,9 @@ test_bench_files = tb/vhdl/tb_dp_bsn_align.vhd tb/vhdl/tb_mms_dp_bsn_align.vhd tb/vhdl/tb_dp_bsn_monitor.vhd - tb/vhdl/tb_dp_bsn_source.vhd + tb/vhdl/tb_dp_bsn_source_v2.vhd tb/vhdl/tb_mms_dp_bsn_source.vhd + tb/vhdl/tb_mms_dp_bsn_source_v2.vhd tb/vhdl/tb_dp_demux.vhd tb/vhdl/tb2_dp_demux.vhd tb/vhdl/tb3_dp_demux.vhd @@ -302,7 +304,9 @@ regression_test_vhdl = tb/vhdl/tb_dp_latency_adapter.vhd tb/vhdl/tb_dp_shiftreg.vhd tb/vhdl/tb_dp_bsn_source.vhd + tb/vhdl/tb_dp_bsn_source_v2.vhd tb/vhdl/tb_mms_dp_bsn_source.vhd + tb/vhdl/tb_mms_dp_bsn_source_v2.vhd tb/vhdl/tb_tb_dp_block_select.vhd tb/vhdl/tb_tb_dp_block_reshape.vhd diff --git a/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd b/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd new file mode 100644 index 0000000000000000000000000000000000000000..5f2acfa1818b97d86048ad16e9466ef55ab7b3cb --- /dev/null +++ b/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd @@ -0,0 +1,183 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2012 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +-- Purpose : +-- Start a periodic block sync interval and maintain a block sequence +-- number +-- Description: +-- When dp_on is low then all outputs are low. When dp_on is high, the +-- output sync starts pulsing with a period of g_block_size number of clk +-- cycles and the output valid, sop and eop will be active. +-- Alternatively, one can assert dp_on while dp_on_pps is high to +-- start the data path on the next PPS. +-- Remarks: +-- Starting the data path is only possible from the dp_off state, so one +-- has to disable (dp_on='0') the data path before restarting it. + +LIBRARY IEEE, common_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; +USE common_lib.common_pkg.ALL; +USE work.dp_stream_pkg.ALL; + +ENTITY dp_bsn_source_v2 IS + GENERIC ( + g_block_size : NATURAL := 256; + g_nof_block_per_sync : NATURAL := 8; + g_bsn_w : NATURAL := 48 + ); + PORT ( + rst : IN STD_LOGIC; + clk : IN STD_LOGIC; + pps : IN STD_LOGIC := '1'; + + dp_on : IN STD_LOGIC; + dp_on_pps : IN STD_LOGIC; + + dp_on_status : OUT STD_LOGIC; + + init_bsn : IN STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0) := (OTHERS=>'0'); + nof_block_per_sync : IN STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := TO_UVEC(g_nof_block_per_sync, c_word_w); + + src_out : OUT t_dp_sosi -- only uses sync, bsn[], valid, sop and eop + ); +END dp_bsn_source_v2; + + +ARCHITECTURE rtl OF dp_bsn_source_v2 IS + + CONSTANT c_block_size_cnt_w : NATURAL := ceil_log2(g_block_size); + CONSTANT c_block_cnt_zero : STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0) := (OTHERS => '0'); + + TYPE t_state_enum IS (s_init, s_dp_off, s_dp_on_sop, s_dp_on, s_dp_on_eop); + + SIGNAL state : t_state_enum; + SIGNAL nxt_state : t_state_enum; + SIGNAL prev_state : t_state_enum; + + SIGNAL block_size_cnt : STD_LOGIC_VECTOR(c_block_size_cnt_w-1 DOWNTO 0); + SIGNAL nxt_block_size_cnt : STD_LOGIC_VECTOR(c_block_size_cnt_w-1 DOWNTO 0); + + SIGNAL block_cnt : STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0); + SIGNAL nxt_block_cnt : STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0); + + SIGNAL i_src_out : t_dp_sosi := c_dp_sosi_init; + SIGNAL nxt_src_out : t_dp_sosi; + + SIGNAL nxt_dp_on_status : STD_LOGIC; + SIGNAL i_dp_on_status : STD_LOGIC; + +BEGIN + + src_out <= i_src_out; + dp_on_status <= i_dp_on_status; + + p_state : PROCESS(state, prev_state, dp_on, dp_on_pps, pps, block_size_cnt, block_cnt, nof_block_per_sync, init_bsn, i_src_out, i_dp_on_status) + BEGIN + nxt_state <= state; + nxt_src_out <= i_src_out; + nxt_src_out.sync <= '0'; + nxt_src_out.valid <= '0'; + nxt_src_out.sop <= '0'; + nxt_src_out.eop <= '0'; + nxt_block_size_cnt <= block_size_cnt; + nxt_block_cnt <= block_cnt; + nxt_dp_on_status <= i_dp_on_status; + + CASE state IS + + WHEN s_dp_on_eop => + nxt_src_out.eop <= '1'; + nxt_src_out.valid <= '1'; + nxt_state <= s_dp_on_sop; + nxt_block_size_cnt <= INCR_UVEC(block_size_cnt, 1); + IF UNSIGNED(block_cnt) = UNSIGNED(nof_block_per_sync) -1 THEN + nxt_block_cnt <= (OTHERS=>'0'); + ELSE + nxt_block_cnt <= INCR_UVEC(block_cnt, 1); + END IF; + IF dp_on = '0' THEN + nxt_state <= s_dp_off; + END IF; + + WHEN s_dp_on => + nxt_src_out.valid <= '1'; + nxt_block_size_cnt <= INCR_UVEC(block_size_cnt, 1); + IF UNSIGNED(block_size_cnt) = g_block_size -3 THEN + nxt_state <= s_dp_on_eop; + END IF; + + WHEN s_dp_on_sop => + nxt_dp_on_status <= '1'; + nxt_src_out.sop <= '1'; + nxt_src_out.valid <= '1'; + nxt_state <= s_dp_on; + nxt_block_size_cnt <= (OTHERS=>'0'); + IF prev_state = s_dp_on_eop THEN + nxt_src_out.bsn(g_bsn_w-1 DOWNTO 0) <= INCR_UVEC(i_src_out.bsn(g_bsn_w-1 DOWNTO 0), 1); + END IF; + IF UNSIGNED(block_cnt) = UNSIGNED(c_block_cnt_zero) THEN + nxt_src_out.sync <= '1'; + END IF; + + WHEN s_dp_off => + nxt_dp_on_status <= '0'; + nxt_block_cnt <= (OTHERS=>'0'); + nxt_src_out.bsn <= RESIZE_DP_BSN(init_bsn); + IF dp_on = '1' THEN + IF dp_on_pps = '1' THEN + IF pps = '1' THEN + nxt_state <= s_dp_on_sop; + END IF; + ELSE + nxt_state <= s_dp_on_sop; + END IF; + END IF; + + WHEN OTHERS => -- s_init + nxt_state <= s_dp_off; + + END CASE; + END PROCESS; + + + p_clk : PROCESS(rst, clk) + BEGIN + IF rst='1' THEN + prev_state <= s_init; + state <= s_init; + i_src_out <= c_dp_sosi_rst; + block_cnt <= (OTHERS=>'0'); + block_size_cnt <= (OTHERS=>'0'); + i_dp_on_status <= '0'; + ELSIF rising_edge(clk) THEN + prev_state <= state; + state <= nxt_state; + i_src_out <= nxt_src_out; + block_cnt <= nxt_block_cnt; + block_size_cnt <= nxt_block_size_cnt; + i_dp_on_status <= nxt_dp_on_status; + END IF; + END PROCESS; + +END rtl; + + diff --git a/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd b/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd new file mode 100644 index 0000000000000000000000000000000000000000..bcfaab3c2317d308a54c569f6fe1467cf129062c --- /dev/null +++ b/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd @@ -0,0 +1,180 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2011 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +-- Usage: +-- > as 10 +-- > run -all +-- . sop, eop are verified automatically +-- . sync and bsn are verified automatically +-- and then manually verify on/off in Wave window + +LIBRARY IEEE, common_lib, dp_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.tb_common_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; +USE dp_lib.tb_dp_pkg.ALL; + +ENTITY tb_dp_bsn_source_v2 IS +END tb_dp_bsn_source_v2; + +ARCHITECTURE tb OF tb_dp_bsn_source_v2 IS + + CONSTANT c_clk_period : TIME := 10 ns; + + CONSTANT c_block_size : NATURAL := 31; + --CONSTANT c_block_size : NATURAL := 32; + CONSTANT c_bsn_w : NATURAL := 16; + CONSTANT c_sync_period : NATURAL := 7; + CONSTANT c_sync_offset : NATURAL := 3; -- must be < c_sync_period for proc_dp_verify_sync + + -- The state name tells what kind of test is being done + TYPE t_state_enum IS ( + s_disable, + s_start, + s_pps_start + ); + + SIGNAL tb_state : t_state_enum; + + SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL rst : STD_LOGIC := '1'; + SIGNAL clk : STD_LOGIC := '1'; + SIGNAL pps : STD_LOGIC; + + -- DUT + SIGNAL dp_on : STD_LOGIC := '0'; + SIGNAL dp_on_pps : STD_LOGIC := '0'; + SIGNAL init_bsn : STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0) := (OTHERS=>'0'); + + SIGNAL bs_sosi : t_dp_sosi; + + -- Verify + SIGNAL verify_sync : STD_LOGIC := '1'; + SIGNAL hold_bs_sop : STD_LOGIC; + +BEGIN + + ----------------------------------------------------------------------------- + -- Stimuli + ----------------------------------------------------------------------------- + rst <= '1', '0' AFTER c_clk_period*7; + clk <= (NOT clk) OR tb_end AFTER c_clk_period/2; + + -- MM control + p_mm : PROCESS + BEGIN + tb_end <= '0'; + tb_state <= s_disable; + pps <= '0'; + + dp_on <= '0'; + dp_on_pps <= '0'; + init_bsn <= TO_UVEC(c_sync_offset, c_bsn_w); + + -- Get synchronous to clk + proc_common_wait_until_low(clk, rst); + proc_common_wait_some_cycles(clk, 500); + + -- Start by making dp_on high + tb_state <= s_start; + dp_on <= '1'; + proc_common_wait_some_cycles(clk, 2000); + + -- Stop by making dp_on low + tb_state <= s_disable; + dp_on <= '0'; + proc_common_wait_some_cycles(clk, 1000); + + -- Now start on PPS + tb_state <= s_pps_start; + dp_on_pps <= '1'; + dp_on <= '1'; + proc_common_wait_some_cycles(clk, 10); + pps <= '1'; + proc_common_wait_some_cycles(clk, 1); + pps <= '0'; + proc_common_wait_some_cycles(clk, 1000); + + -- Stop by making dp_on low + tb_state <= s_disable; + dp_on <= '0'; + dp_on_pps <= '0'; --No PPS trigger next time + proc_common_wait_some_cycles(clk, 1000); + + -- Start by making dp_on high + tb_state <= s_start; + dp_on <= '1'; + proc_common_wait_some_cycles(clk, 2500); + + -- Stop by making dp_on low + tb_state <= s_disable; + dp_on <= '0'; + dp_on_pps <= '0'; + proc_common_wait_some_cycles(clk, 1000); + + -- Now start on next PPS and continue forever + init_bsn <= TO_UVEC(c_sync_offset, c_bsn_w); + tb_state <= s_pps_start; + dp_on_pps <= '1'; + dp_on <= '1'; + proc_common_wait_some_cycles(clk, 20); + pps <= '1'; + proc_common_wait_some_cycles(clk, 1); + pps <= '0'; + + + proc_common_wait_some_cycles(clk, 10000); + tb_end <= '1'; + WAIT; + END PROCESS; + + + ----------------------------------------------------------------------------- + -- Verification + ----------------------------------------------------------------------------- + proc_dp_verify_sop_and_eop(clk, bs_sosi.valid, bs_sosi.sop, bs_sosi.eop, hold_bs_sop); -- Verify that sop and eop come in pairs + proc_dp_verify_sync(c_sync_period, c_sync_offset, clk, verify_sync, bs_sosi.sync, bs_sosi.sop, bs_sosi.bsn); -- Verify sync at sop and at expected BSN + + ----------------------------------------------------------------------------- + -- DUT: dp_bsn_source_v2 + ----------------------------------------------------------------------------- + + dut : ENTITY work.dp_bsn_source_v2 + GENERIC MAP ( + g_block_size => c_block_size, + g_nof_block_per_sync => c_sync_period, + g_bsn_w => c_bsn_w + ) + PORT MAP ( + rst => rst, + clk => clk, + pps => pps, + -- MM control + dp_on => dp_on, + dp_on_pps => dp_on_pps, + init_bsn => init_bsn, + -- Streaming + src_out => bs_sosi + ); + +END tb; diff --git a/libraries/base/dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd b/libraries/base/dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd new file mode 100644 index 0000000000000000000000000000000000000000..3f4d4428377c192461759f9c0c14aaf9e4938772 --- /dev/null +++ b/libraries/base/dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd @@ -0,0 +1,184 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2012 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- +-- Purpose: +-- . Test bench for mms_dp_bsn_source +-- Description: +-- . Verify DP on, off via MM +-- . Verify captured BSN via MM during a sync interval +-- +-- Usage: +-- > as 10 +-- > run -all +-- > view expanded bs_sosi in Wave window + +LIBRARY IEEE, common_lib, mm_lib; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.tb_common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE common_lib.tb_common_mem_pkg.ALL; +USE work.dp_stream_pkg.ALL; +USE work.tb_dp_pkg.ALL; + +ENTITY tb_mms_dp_bsn_source_v2 IS +END tb_mms_dp_bsn_source_v2; + +ARCHITECTURE tb OF tb_mms_dp_bsn_source_v2 IS + + CONSTANT c_clk_period : TIME := 10 ns; + + CONSTANT c_pps_interval : NATURAL := 1000; + CONSTANT c_cross_clock_domain_latency : NATURAL := 20; + + CONSTANT c_block_size : NATURAL := 100; + CONSTANT c_nof_block_per_sync : NATURAL := 15; + CONSTANT c_sync_interval : NATURAL := c_nof_block_per_sync * c_block_size; + CONSTANT c_init_bsn : NATURAL := c_nof_block_per_sync; + + CONSTANT c_mm_addr_dp_on : NATURAL := 0; + CONSTANT c_mm_addr_nof_block_per_sync : NATURAL := 1; + CONSTANT c_mm_addr_bsn_lo : NATURAL := 2; + CONSTANT c_mm_addr_bsn_hi : NATURAL := 3; + + CONSTANT c_mm_dp_off : NATURAL := 0; -- DP off after finishing current block + CONSTANT c_mm_dp_on_immediate : NATURAL := 1; -- DP on immediate by setting bit 0 + CONSTANT c_mm_dp_on_at_pps : NATURAL := 3; -- DP on at next PPS by setting bits 1,0 + + SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL clk : STD_LOGIC := '1'; + SIGNAL rst : STD_LOGIC := '1'; + SIGNAL pps : STD_LOGIC := '0'; + + SIGNAL bs_sosi : t_dp_sosi; + + SIGNAL mm_dp_on_status : NATURAL; + SIGNAL mm_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := (OTHERS=>'0'); + SIGNAL mm_bsn_prev : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := (OTHERS=>'0'); + + SIGNAL mm_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL mm_miso : t_mem_miso; + +BEGIN + + clk <= (NOT clk) OR tb_end AFTER clk_period/2; + rst <= '1', '0' AFTER clk_period*7; + + proc_common_gen_pulse(1, c_pps_interval, '1', rst, clk, pps); + + p_mm_stimuli : PROCESS + BEGIN + WAIT UNTIL rst='0'; + proc_common_wait_some_cycles(clk, 10); + + -- Write initial BSN and number of block per sync interval + proc_mem_mm_bus_wr(c_mm_addr_bsn_lo, c_init_bsn, clk, mm_miso, mm_mosi); + proc_mem_mm_bus_wr(c_mm_addr_bsn_hi, 0, clk, mm_miso, mm_mosi); -- must also write hi part to trigger transfer accross clock domain + proc_mem_mm_bus_wr(c_mm_addr_nof_block_per_sync, c_nof_block_per_sync, clk, mm_miso, mm_mosi); + proc_common_wait_some_cycles(clk, c_cross_clock_domain_latency); + + -------------------------------------------------------------------------- + -- DP on immediate + -------------------------------------------------------------------------- + + -- Wait until after PPS + proc_common_wait_until_hi_lo(clk, pps); + + -- Write DP on immediate + proc_mem_mm_bus_wr(c_mm_addr_dp_on, c_mm_dp_on_immediate, clk, mm_miso, mm_mosi); + proc_common_wait_some_cycles(clk, c_cross_clock_domain_latency); + + -- Read dp on status + proc_mem_mm_bus_rd(c_mm_addr_dp_on, clk, mm_miso, mm_mosi); + proc_mem_mm_bus_rd_latency(1, clk); + mm_dp_on_status <= TO_UINT(mm_miso.rddata(1 DOWNTO 0)); + proc_common_wait_some_cycles(clk, 1); + ASSERT mm_dp_on_status=c_mm_dp_on_immediate REPORT "Wrong DP on status, expected DP on immediate." SEVERITY ERROR; + + -- Read BSN twice in same PPS interval + proc_common_wait_some_cycles(clk, 3*c_block_size); + + proc_mem_mm_bus_rd(c_mm_addr_bsn_lo, clk, mm_miso, mm_mosi); + proc_mem_mm_bus_rd_latency(1, clk); + mm_bsn(c_word_w-1 DOWNTO 0) <= mm_miso.rddata(c_word_w-1 DOWNTO 0); + proc_mem_mm_bus_rd(c_mm_addr_bsn_hi, clk, mm_miso, mm_mosi); + proc_mem_mm_bus_rd_latency(1, clk); + mm_bsn(2*c_word_w-1 DOWNTO c_word_w) <= mm_miso.rddata(c_word_w-1 DOWNTO 0); + + proc_common_wait_some_cycles(clk, c_block_size); + + mm_bsn_prev <= mm_bsn; + proc_mem_mm_bus_rd(c_mm_addr_bsn_lo, clk, mm_miso, mm_mosi); + proc_mem_mm_bus_rd_latency(1, clk); + mm_bsn(c_word_w-1 DOWNTO 0) <= mm_miso.rddata(c_word_w-1 DOWNTO 0); + proc_mem_mm_bus_rd(c_mm_addr_bsn_hi, clk, mm_miso, mm_mosi); + proc_mem_mm_bus_rd_latency(1, clk); + mm_bsn(2*c_word_w-1 DOWNTO c_word_w) <= mm_miso.rddata(c_word_w-1 DOWNTO 0); + proc_common_wait_some_cycles(clk, 1); + + -- Uncomment appropriate assert line dependent on fixed code for capture_bsn in mms_dp_bsn_source: + --ASSERT mm_bsn_prev<mm_bsn REPORT "Wrong BSN, expected incrementing BSN during PPS or sync interval." SEVERITY ERROR; + ASSERT mm_bsn_prev=mm_bsn REPORT "Wrong BSN, expected constant BSN during PPS or sync interval." SEVERITY ERROR; + + -- Run few sync intervals + proc_common_wait_some_cycles(clk, 3*c_sync_interval); + + -- Write DP off + proc_mem_mm_bus_wr(c_mm_addr_dp_on, c_mm_dp_off, clk, mm_miso, mm_mosi); + proc_common_wait_some_cycles(clk, c_block_size); + + -- Read dp on status + proc_mem_mm_bus_rd(c_mm_addr_dp_on, clk, mm_miso, mm_mosi); + proc_mem_mm_bus_rd_latency(1, clk); + mm_dp_on_status <= TO_UINT(mm_miso.rddata(1 DOWNTO 0)); + proc_common_wait_some_cycles(clk, 1); + ASSERT mm_dp_on_status=c_mm_dp_off REPORT "Wrong DP on status, expected DP off." SEVERITY ERROR; + + proc_common_wait_some_cycles(clk, c_sync_interval); + tb_end <= '1'; + WAIT; + END PROCESS; + + u_dut : ENTITY work.mms_dp_bsn_source + GENERIC MAP ( + g_cross_clock_domain => TRUE, -- use FALSE when mm_clk and st_clk are the same, else use TRUE to cross the clock domain + g_block_size => c_block_size, + g_nof_block_per_sync => 1, -- overrule via MM write + g_bsn_w => c_dp_stream_bsn_w + ) + PORT MAP ( + -- Clocks and reset + mm_rst => rst, + mm_clk => clk, + dp_rst => rst, + dp_clk => clk, + dp_pps => pps, + + -- Memory-mapped clock domain + reg_mosi => mm_mosi, -- actual ranges defined by c_mm_reg in dp_bsn_source_reg + reg_miso => mm_miso, -- actual ranges defined by c_mm_reg in dp_bsn_source_reg + + -- Streaming clock domain + bs_sosi => bs_sosi + ); + +END tb; +