diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc_jesd.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc_jesd.vhd index abe195ea5017fe6d077e0ce769589119b463a58a..817155f4a16145c8ad74f626da15f0a3ad245af6 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc_jesd.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc_jesd.vhd @@ -210,11 +210,12 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_adc_jesd IS SIGNAL pio_jesd_ctrl_reset : STD_LOGIC; -- Debug signals to track progress of p_stimuli in Wave Window - SIGNAL dbg_restart : NATURAL := 0; - SIGNAL dbg_bsn_source_en : STD_LOGIC := '0'; - SIGNAL dbg_jesd_ctrl_reset : STD_LOGIC := '0'; - SIGNAL dbg_read_jesd204b : STD_LOGIC := '0'; - SIGNAL dbg_link_reinit : STD_LOGIC := '0'; + SIGNAL dbg_restart : NATURAL := 0; + SIGNAL dbg_bsn_source_en : STD_LOGIC := '0'; + SIGNAL dbg_jesd_ctrl_reset_ignore : STD_LOGIC := '0'; + SIGNAL dbg_jesd_ctrl_reset : STD_LOGIC := '0'; + SIGNAL dbg_read_jesd204b : STD_LOGIC := '0'; + SIGNAL dbg_link_reinit : STD_LOGIC := '0'; -- Read JESD204B IP status per signal input c_si PROCEDURE proc_read_jesd204b(c_si : IN NATURAL; @@ -592,6 +593,31 @@ BEGIN ASSERT v_sp_power_sum_0 > c_lo_factor * c_exp_wg_power_sp_0 REPORT "Wrong SP power for SP 0" SEVERITY ERROR; ASSERT v_sp_power_sum_0 < c_hi_factor * c_exp_wg_power_sp_0 REPORT "Wrong SP power for SP 0" SEVERITY ERROR; + -- Try to reset via JESD_CTRL. This JESD_CTRL should be ignored. + -- Note: Awkward way to set MSbit without negative integer warning, using TO_SINT(v_word). + dbg_jesd_ctrl_reset_ignore <= '1'; -- marker in wave window + -- apply JESD_CTRL reset + v_word := (OTHERS => '0'); + v_word(c_sdp_jesd_ctrl_reset_bi) := '1'; -- reset + mmf_mm_bus_wr(c_mm_file_pio_jesd_ctrl, 0, TO_SINT(v_word), tb_clk); + proc_common_wait_cross_clock_domain_latency(tb_clk, ext_clk); + mmf_mm_bus_rd(c_mm_file_pio_jesd_ctrl, 0, rd_data, tb_clk); + pio_jesd_ctrl <= rd_data; + pio_jesd_ctrl_enable <= rd_data(c_sdp_jesd_ctrl_enable_w-1 DOWNTO 0); + pio_jesd_ctrl_reset <= rd_data(c_sdp_jesd_ctrl_reset_bi); + proc_common_wait_some_cycles(tb_clk, 1); + ASSERT pio_jesd_ctrl_reset = '0' REPORT "JESD_CTRL reset should be ignored when BSN source is on." SEVERITY ERROR; + -- remove JESD_CTRL reset + v_word := (OTHERS => '0'); + v_word(c_sdp_jesd_ctrl_reset_bi) := '0'; -- reset + mmf_mm_bus_wr(c_mm_file_pio_jesd_ctrl, 0, TO_SINT(v_word), tb_clk); + proc_common_wait_cross_clock_domain_latency(tb_clk, ext_clk); + mmf_mm_bus_rd(c_mm_file_pio_jesd_ctrl, 0, rd_data, tb_clk); + pio_jesd_ctrl <= rd_data; + pio_jesd_ctrl_enable <= rd_data(c_sdp_jesd_ctrl_enable_w-1 DOWNTO 0); + pio_jesd_ctrl_reset <= rd_data(c_sdp_jesd_ctrl_reset_bi); + dbg_jesd_ctrl_reset_ignore <= '0'; + ---------------------------------------------------------------------------- -- Restart AIT -- . JESD_CTRL reset stops JESD204B OUT rx_clk and asserts JESD204B OUT @@ -619,6 +645,8 @@ BEGIN pio_jesd_ctrl <= rd_data; pio_jesd_ctrl_enable <= rd_data(c_sdp_jesd_ctrl_enable_w-1 DOWNTO 0); pio_jesd_ctrl_reset <= rd_data(c_sdp_jesd_ctrl_reset_bi); + proc_common_wait_some_cycles(tb_clk, 1); + ASSERT pio_jesd_ctrl_reset = '1' REPORT "JESD_CTRL reset should be applied when BSN source is off." SEVERITY ERROR; WAIT FOR 1 us; -- Read Rx JESD_204B IP status during reset diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd index a611adc936797a35c617fd973cbd03c2fc65cdab..6fa7c9cf74f206ff9710b89107ab1822c7f389f4 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd @@ -141,8 +141,10 @@ ARCHITECTURE str OF node_sdp_adc_input_and_timing IS SIGNAL st_sosi_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); SIGNAL mm_rst_jesd : STD_LOGIC; - SIGNAL mm_jesd_ctrl_reg : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + SIGNAL mm_jesd_ctrl_reg_wr : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + SIGNAL mm_jesd_ctrl_reg_rd : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); SIGNAL jesd204b_disable_arr : STD_LOGIC_VECTOR(c_sdp_S_pn-1 DOWNTO 0); + SIGNAL jesd204b_reset_request : STD_LOGIC := '0'; BEGIN @@ -161,10 +163,21 @@ BEGIN -- complete blocks, so from sop to eop. Therefore, first mms_dp_bsn_source_v2 should be -- disabled to stop and flush the block processing, before applying mm_rst_jesd. - mm_rst_jesd <= mm_rst OR mm_jesd_ctrl_reg(c_sdp_jesd_ctrl_reset_bi); - gen_jesd_disable : FOR I IN 0 TO c_sdp_S_pn-1 GENERATE - jesd204b_disable_arr(i) <= mm_jesd_ctrl_reg(i); - END GENERATE; + -- Only accept JESD204B IP reset when the processing is disabled (indicated by bs_sosi.valid + -- = '0'), to avoid corrupt bs_sosi blocks entering the subsequent processing due to that a + -- JESD204B IP reset causes that the rx_clk stops. + mm_rst_jesd <= mm_rst OR jesd204b_reset_request; + + jesd204b_disable_arr <= mm_jesd_ctrl_reg_wr(c_sdp_S_pn-1 DOWNTO 0); + jesd204b_reset_request <= mm_jesd_ctrl_reg_wr(c_sdp_jesd_ctrl_reset_bi) AND NOT bs_sosi.valid; + + p_mm_jesd_ctrl_reg_rd : PROCESS(mm_jesd_ctrl_reg_wr, jesd204b_reset_request) + BEGIN + -- default readback what was written + mm_jesd_ctrl_reg_rd <= mm_jesd_ctrl_reg_wr; + -- report actual JESD204B reset status + mm_jesd_ctrl_reg_rd(c_sdp_jesd_ctrl_reset_bi) <= jesd204b_reset_request; + END PROCESS; gen_jesd : IF g_no_jesd = FALSE GENERATE ----------------------------------------------------------------------------- @@ -201,8 +214,7 @@ BEGIN serial_tx_arr => open, serial_rx_arr => JESD204B_SERIAL_DATA(c_sdp_S_pn-1 downto 0) ); - - + ----------------------------------------------------------------------------- -- Time delay: dp_shiftram -- . copied from unb1_bn_capture_input (apertif) @@ -221,7 +233,6 @@ BEGIN END LOOP; END PROCESS; - u_dp_shiftram : ENTITY dp_lib.dp_shiftram GENERIC MAP ( g_nof_streams => c_sdp_S_pn, @@ -528,8 +539,8 @@ BEGIN rd_dat => jesd_ctrl_miso.rddata(c_sdp_mm_jesd_ctrl_reg.dat_w-1 DOWNTO 0), rd_val => OPEN, -- data side - out_reg => mm_jesd_ctrl_reg, - in_reg => mm_jesd_ctrl_reg + out_reg => mm_jesd_ctrl_reg_wr, + in_reg => mm_jesd_ctrl_reg_rd ); END str;