diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd index 404004d0091ca87287f1c409b95b746f5f5a37ff..338e89fe3f66208679f904ea46de9d3e151545f1 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd @@ -97,9 +97,10 @@ entity tb_lofar2_unb2c_sdp_station_tbuf_one is g_rs_record_nof_block : natural := 10; g_rs_nof_periods_per_block : real := 1.17; -- number of WG periods per rs_block for WG in g_sp g_dump_inter_packet_gap : natural := 0; - g_dump_page_offset : natural := 0; -- offset relative to recorded_first_page - g_dump_nof_pages : natural := 2; -- <= c_nof_pages_in_buffer - g_dump_enables : std_logic_vector(c_sdp_A_pn - 1 downto 0) := "000001" + g_dump_page_offset : natural := 1; -- offset relative to recorded_first_page + g_dump_nof_pages : natural := 1; -- g_dump_page_offset + g_dump_nof_pages <= c_nof_pages_in_buffer, else + -- there will occur read RSN errors for pages that are not available + g_dump_enables : std_logic_vector(c_sdp_A_pn - 1 downto 0) := "100010" ); port ( tb_end : out std_logic @@ -157,9 +158,10 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is constant c_page_meta_size : natural := func_sdp_tbuf_calculate_page_meta_size(g_rs_block_size); constant c_page_size : natural := c_page_data_size + c_page_meta_size; constant c_nof_pages_in_buffer : natural := func_sdp_tbuf_calculate_nof_pages(c_ddr_buffer_size, c_page_size); - constant c_dump_nof_pages : natural := smallest(g_dump_nof_pages, c_nof_pages_in_buffer); + constant c_dump_nof_pages_rw : natural := g_dump_nof_pages; + constant c_dump_nof_pages_actual : natural := smallest(g_dump_nof_pages, c_nof_pages_in_buffer); constant c_bs_start_latency : natural := c_bs_block_size * 2; - constant c_record_min_nof_pages : natural := g_dump_page_offset + c_dump_nof_pages; + constant c_record_min_nof_pages : natural := g_dump_page_offset + c_dump_nof_pages_rw; constant c_record_min_nof_clk : natural := c_bs_start_latency + g_rs_block_size * c_record_min_nof_pages; constant c_exp_read_rate_Gbps : real := func_sdp_tbuf_dump_rate_bps(g_rs_block_size, g_dump_inter_packet_gap) / @@ -169,8 +171,8 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is constant c_dump_nof_ai : natural := vector_sum(g_dump_enables); constant c_dump_ai_indices : t_nat_integer_arr(g_dump_enables'range) := vector_one_indices(g_dump_enables); - constant c_read_nof_packets_per_ai : natural := c_dump_nof_pages; - constant c_read_total_nof_packets : natural := c_dump_nof_ai * c_dump_nof_pages; + constant c_read_nof_packets_per_ai : natural := c_dump_nof_pages_actual; + constant c_read_total_nof_packets : natural := c_dump_nof_ai * c_dump_nof_pages_actual; constant c_read_nof_crc_errors : natural := sel_a_b(g_verify_crc_error, c_read_total_nof_packets, 0); constant c_read_nof_rsn_errors : natural := sel_a_b(c_verify_err, c_read_total_nof_packets, 0); constant c_dump_nof_packets_per_ai : natural := sel_a_b(c_verify_err, 0, c_read_nof_packets_per_ai); @@ -893,13 +895,15 @@ begin variable v_End : natural; variable v_Period : real := 0.0; variable v_dump_rate_Gbps : real := 0.0; + variable v_dump_start_page : natural; + variable v_dump_start_rsn : std_logic_vector(c_sdp_W_rsn - 1 downto 0); begin -- Init tbuf_registers_wr record tbuf_registers_wr.record_all <= '1'; -- 2 tbuf_registers_wr.record_enable <= '1'; -- 3 tbuf_registers_wr.dump_inter_packet_gap <= g_dump_inter_packet_gap; -- 11 tbuf_registers_wr.dump_start_page <= 0; -- 12 - tbuf_registers_wr.dump_nof_pages <= c_dump_nof_pages; -- 13 + tbuf_registers_wr.dump_nof_pages <= c_dump_nof_pages_rw; -- 13 tbuf_registers_wr.dump_start_rsn <= (others => 'X'); -- 14 tbuf_registers_wr.dump_enables <= (others => '0'); -- 16 @@ -970,7 +974,7 @@ begin -- Read TBuf state mmf_mm_bus_rd(c_mm_file_reg_tbuf, 19, rd_data_state, tb_clk); proc_common_wait_some_cycles(tb_clk, 1); - v_bool := func_sdp_tbuf_print_state(rd_data_state); + v_bool := func_sdp_tbuf_print_state(c_tb_str, rd_data_state); -- Recording proc_common_wait_some_cycles(ext_clk, g_rs_block_size * g_rs_record_nof_block); @@ -1125,14 +1129,22 @@ begin c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency * 2); -- Set dump interval and antenna inputs - -- . when g_verify_crc_error then read from last g_dump_nof_pages in the buffer. These pages still contain 0 + -- . when g_verify_crc_error then read from last c_dump_nof_pages_rw in the buffer. These pages still contain 0, -- because they have not been recorded, so these will yield a CRC error (and also a RSN error) for each page. + v_dump_start_page := tbuf_registers_ro.recorded_first_page + g_dump_page_offset; + if v_dump_start_page >= c_nof_pages_in_buffer then + -- Wrap from begin of buffer when v_dump_start_page is just beyond the end of buffer. Do not use modulo + -- c_nof_pages_in_buffer to be able to simulate effect of a much to large v_dump_start_page due to + -- g_dump_page_offset >= c_nof_pages_in_buffer + v_dump_start_page := v_dump_start_page - c_nof_pages_in_buffer; + end if; tbuf_registers_wr.dump_start_page <= sel_a_b(g_verify_crc_error, - c_nof_pages_in_buffer - g_dump_nof_pages, - tbuf_registers_ro.recorded_first_page + g_dump_page_offset); + c_nof_pages_in_buffer - c_dump_nof_pages_rw, + v_dump_start_page); -- . when g_verify_rsn_error then write a wrong dump_start_rsn. - tbuf_registers_wr.dump_start_rsn <= incr_uvec(tbuf_registers_ro.recorded_first_rsn, - g_dump_page_offset * g_rs_block_size + to_int(g_verify_rsn_error)); + v_dump_start_rsn := incr_uvec(tbuf_registers_ro.recorded_first_rsn, g_dump_page_offset * g_rs_block_size); + v_dump_start_rsn := incr_uvec(v_dump_start_rsn, to_int(g_verify_rsn_error)); + tbuf_registers_wr.dump_start_rsn <= v_dump_start_rsn; tbuf_registers_wr.dump_enables <= g_dump_enables; proc_common_wait_some_cycles(tb_clk, 1); mmf_mm_bus_wr(c_mm_file_reg_tbuf, 12, tbuf_registers_wr.dump_start_page, tb_clk); @@ -1142,50 +1154,52 @@ begin proc_common_wait_cross_clock_domain_latency( c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency * 2); - -- Time dump begin - read_busy <= '1'; - v_Begin := NOW / c_1ns; - proc_common_wait_some_cycles(tb_clk, 1); - - -- Read back enabled dump - mmf_mm_bus_rd(c_mm_file_reg_tbuf, 16, rd_data_control, tb_clk); - tbuf_registers_rd.dump_enables <= rd_data_control(c_sdp_A_pn - 1 downto 0); - proc_common_wait_some_cycles(tb_clk, 1); - assert to_uint(tbuf_registers_rd.dump_enables) = to_uint(tbuf_registers_wr.dump_enables) - report c_tb_str & "Wrong tbuf_registers_rd.dump_enables enabled" - severity ERROR; - print_str(c_tb_str & "tbuf_registers_rd.dump_enables = " & slv_to_str(tbuf_registers_rd.dump_enables)); - - -- Read DDR4 read FIFO status - proc_common_wait_some_cycles(ext_clk, 10); - proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full); - - ---------------------------------------------------------------------------- - -- Wait until dump is done - ---------------------------------------------------------------------------- - mmf_mm_wait_until_value( - c_mm_file_reg_tbuf, 17, -- read dump_done - "UNSIGNED", rd_data_dump_done, "=", 1, -- this is the wait until condition - c_T_rd_interval, ext_clk); - tbuf_registers_ro.dump_done <= rd_data_dump_done(0); - proc_common_wait_some_cycles(tb_clk, 1); + if g_dump_nof_pages > 0 then + -- Time dump begin + read_busy <= '1'; + v_Begin := NOW / c_1ns; + proc_common_wait_some_cycles(tb_clk, 1); - -- Time dump end - read_busy <= '0'; - v_End := NOW / c_1ns; - v_Period := real(v_End - v_Begin); -- dump time in ns - v_dump_rate_Gbps := real(c_dump_total_nof_packets * c_sdp_W_ant * g_rs_block_size) / v_Period; - dump_rate_Gbps <= v_dump_rate_Gbps; - - -- Verify dump rate over sufficient number of packets - if c_dump_total_nof_packets > 5 and g_ddr_access_rate_pct = 100 then - -- . use almost_equal(a/b, 1.0, max_ratio) to verify that a and b differ less than max_ratio/100 percent - assert almost_equal(v_dump_rate_Gbps / c_exp_dump_rate_Gbps, 1.0, c_dump_rate_delta) - report c_tb_str & "Wrong dump rate" + -- Read back enabled dump + mmf_mm_bus_rd(c_mm_file_reg_tbuf, 16, rd_data_control, tb_clk); + tbuf_registers_rd.dump_enables <= rd_data_control(c_sdp_A_pn - 1 downto 0); + proc_common_wait_some_cycles(tb_clk, 1); + assert to_uint(tbuf_registers_rd.dump_enables) = to_uint(tbuf_registers_wr.dump_enables) + report c_tb_str & "Wrong tbuf_registers_rd.dump_enables enabled" severity ERROR; + print_str(c_tb_str & "tbuf_registers_rd.dump_enables = " & slv_to_str(tbuf_registers_rd.dump_enables)); + + -- Read DDR4 read FIFO status + proc_common_wait_some_cycles(ext_clk, 10); + proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full); + + ---------------------------------------------------------------------------- + -- Wait until dump is done + ---------------------------------------------------------------------------- + mmf_mm_wait_until_value( + c_mm_file_reg_tbuf, 17, -- read dump_done + "UNSIGNED", rd_data_dump_done, "=", 1, -- this is the wait until condition + c_T_rd_interval, ext_clk); + tbuf_registers_ro.dump_done <= rd_data_dump_done(0); + proc_common_wait_some_cycles(tb_clk, 1); + + -- Time dump end + read_busy <= '0'; + v_End := NOW / c_1ns; + v_Period := real(v_End - v_Begin); -- dump time in ns + v_dump_rate_Gbps := real(c_dump_total_nof_packets * c_sdp_W_ant * g_rs_block_size) / v_Period; + dump_rate_Gbps <= v_dump_rate_Gbps; + + -- Verify dump rate over sufficient number of packets + if c_dump_total_nof_packets > 5 and g_ddr_access_rate_pct = 100 then + -- . use almost_equal(a/b, 1.0, max_ratio) to verify that a and b differ less than max_ratio/100 percent + assert almost_equal(v_dump_rate_Gbps / c_exp_dump_rate_Gbps, 1.0, c_dump_rate_delta) + report c_tb_str & "Wrong dump rate" + severity ERROR; + end if; + print_str(c_tb_str & "Dump rate = " & real_to_str(v_dump_rate_Gbps, 4, 2) & " Gbps" & + " (Expected " & real_to_str(c_exp_dump_rate_Gbps, 4, 2) & " Gbps)"); end if; - print_str(c_tb_str & "Dump rate = " & real_to_str(v_dump_rate_Gbps, 4, 2) & " Gbps" & - " (Expected " & real_to_str(c_exp_dump_rate_Gbps, 4, 2) & " Gbps)"); -- Wait some time for latency in sdp_tbuf_output and 10GbE Tx - Rx network proc_common_wait_some_cycles(ext_clk, g_rs_block_size * 4); @@ -1315,26 +1329,33 @@ begin variable v_bool : boolean; begin wait until rising_edge(ext_clk); - -- Count rx_dump_sosi packets at sop - if rx_dump_sosi.sop = '1' then - rx_dump_packet_cnt <= rx_dump_packet_cnt + 1; - - -- Determine expected antenna_input_index assuming c_dump_nof_packets_per_ai per ai - v_dump_index := rx_dump_packet_cnt / c_dump_nof_packets_per_ai; - v_ai_local := c_dump_ai_indices(v_dump_index); - exp_dump_ai <= c_ai_offset + v_ai_local; - - -- Determine expected RSN assuming c_dump_nof_packets_per_ai per ai - v_time_index := rx_dump_packet_cnt mod c_dump_nof_packets_per_ai; - exp_dp_rsn <= to_uint(tbuf_registers_wr.dump_start_rsn) + v_time_index * g_rs_block_size; - end if; - -- Verify header at eop - if rx_dump_sosi.eop = '1' then - v_bool := func_sdp_tbuf_verify_cep_header(rx_dump_header, exp_dump_header); + if c_dump_nof_packets_per_ai > 0 then + -- Count rx_dump_sosi packets at sop + if rx_dump_sosi.sop = '1' then + rx_dump_packet_cnt <= rx_dump_packet_cnt + 1; + + -- Determine expected antenna_input_index assuming c_dump_nof_packets_per_ai per ai + v_dump_index := rx_dump_packet_cnt / c_dump_nof_packets_per_ai; + v_ai_local := c_dump_ai_indices(v_dump_index); + exp_dump_ai <= c_ai_offset + v_ai_local; + + -- Determine expected RSN assuming c_dump_nof_packets_per_ai per ai + v_time_index := rx_dump_packet_cnt mod c_dump_nof_packets_per_ai; + exp_dp_rsn <= to_uint(tbuf_registers_wr.dump_start_rsn) + v_time_index * g_rs_block_size; + end if; + -- Verify header at eop + if rx_dump_sosi.eop = '1' then + v_bool := func_sdp_tbuf_verify_cep_header(rx_dump_header, exp_dump_header); + end if; + -- View variables in Wave Window + dump_index <= v_dump_index; + time_index <= v_time_index; + else + -- Expect no dump packets when g_dump_nof_pages = 0 + assert rx_dump_sosi.sop = '0' + report c_tb_str & "Wrong unexpected rx_dump_sosi packet for g_dump_nof_pages = 0" + severity ERROR; end if; - -- View variables in Wave Window - dump_index <= v_dump_index; - time_index <= v_time_index; end process; ----------------------------------------------------------------------------- diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd index 3b95d29feaf5e351d65f25f947ec55d72968420e..6d65f8569b394b554f2792145fb7ca0199c85491 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd @@ -20,8 +20,11 @@ -- Purpose: Regression multi tb for tb_lofar2_unb2c_sdp_station_tbuf_one -- Description: -- Usage: --- > as 4 --- > run -all +-- . Modelsim: +-- > as 4 +-- > run -all +-- . Terminal: +-- > cat transcript | grep Error: library IEEE, common_lib; use IEEE.std_logic_1164.all; @@ -32,7 +35,7 @@ end tb_tb_lofar2_unb2c_sdp_station_tbuf_one; architecture tb of tb_tb_lofar2_unb2c_sdp_station_tbuf_one is -- Multi tb - constant c_tb_w : natural := 10; -- sufficiently long to fit all tb instances + constant c_tb_w : natural := 11; -- sufficiently long to fit all tb instances constant c_tb_end_vec : std_logic_vector(c_tb_w - 1 downto 0) := (others => '1'); signal tb_end_vec : std_logic_vector(c_tb_w - 1 downto 0) := c_tb_end_vec; -- best view as hex in Wave Window @@ -96,6 +99,20 @@ begin generic map(false, 7, false, false, false, false, 3, 100, 4096, 2000, 3, 1.17, 50, 0, 1, "000011") port map (tb_end_vec(7)); + -- g_dump_nof_pages = 10 > c_nof_pages_in_buffer = 7 + u_dump_nof_pages_limit : entity work.tb_lofar2_unb2c_sdp_station_tbuf_one + generic map(false, 8, false, false, false, false, 3, 100, 256, 100, 10, 1.17, 0, 0, 10, "000010") + port map (tb_end_vec(8)); + + -- g_dump_page_offset + g_dump_nof_pages = 6 + 1 = c_nof_pages_in_buffer = 7 + u_dump_page_offset_limit : entity work.tb_lofar2_unb2c_sdp_station_tbuf_one + generic map(false, 9, false, false, false, false, 3, 100, 256, 100, 10, 1.17, 0, 6, 1, "000010") + port map (tb_end_vec(9)); + + u_dump_zero_pages : entity work.tb_lofar2_unb2c_sdp_station_tbuf_one + generic map(false, 10, false, false, false, false, 3, 100, 256, 102, 10, 1.0, 0, 1, 0, "100010") + port map (tb_end_vec(10)); + tb_end <= '1' after 1 us when tb_end_vec = c_tb_end_vec else '0'; proc_common_stop_simulation(tb_end); end tb; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd index 368e2f54e923c61d6eddddaf726931149f81a23f..8a50fed7d6945bba5c6ca11997eeff18937c76d1 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd @@ -141,28 +141,28 @@ package sdp_tbuf_pkg is -- 'to' order as in document [1] to ease view in wave window -- . RW control registers - type t_sdp_tbuf_registers_rw is record -- word index - record_all : std_logic; -- 2 - record_enable : std_logic; -- 3 - dump_inter_packet_gap : natural; -- 11 - dump_start_page : natural; -- 12 - dump_nof_pages : natural; -- 13 - dump_start_rsn : std_logic_vector(63 downto 0); -- 14 - dump_enables : std_logic_vector(c_sdp_A_pn - 1 downto 0); -- 16 + type t_sdp_tbuf_registers_rw is record -- word index + record_all : std_logic; -- 2 + record_enable : std_logic; -- 3 + dump_inter_packet_gap : natural; -- 11 + dump_start_page : natural; -- 12 + dump_nof_pages : natural; -- 13 + dump_start_rsn : std_logic_vector(c_sdp_W_rsn - 1 downto 0); -- 14 + dump_enables : std_logic_vector(c_sdp_A_pn - 1 downto 0); -- 16 end record; -- . RO monitoring registers - type t_sdp_tbuf_registers_ro is record -- word index - nof_samples_per_block : natural; -- 0 - nof_pages_in_buffer : natural; -- 1 - recorded_nof_pages : natural; -- 4 - recorded_first_page : natural; -- 5 - recorded_last_page : natural; -- 6 - recorded_first_rsn : std_logic_vector(63 downto 0); -- 7 - recorded_last_rsn : std_logic_vector(63 downto 0); -- 9 - dump_done : std_logic; -- 17 - record_busy : std_logic; -- 18 - state : std_logic_vector(31 downto 0); -- 19 + type t_sdp_tbuf_registers_ro is record -- word index + nof_samples_per_block : natural; -- 0 + nof_pages_in_buffer : natural; -- 1 + recorded_nof_pages : natural; -- 4 + recorded_first_page : natural; -- 5 + recorded_last_page : natural; -- 6 + recorded_first_rsn : std_logic_vector(c_sdp_W_rsn - 1 downto 0); -- 7 + recorded_last_rsn : std_logic_vector(c_sdp_W_rsn - 1 downto 0); -- 9 + dump_done : std_logic; -- 17 + record_busy : std_logic; -- 18 + state : std_logic_vector(31 downto 0); -- 19 end record; constant c_sdp_tbuf_registers_rw_rst :t_sdp_tbuf_registers_rw := diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd index f417a36f52f4e4493850fdaacaeaf90365b8c0df..5bc156427f2de7e582c80ad8784f7755e094bc80 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd @@ -336,11 +336,17 @@ begin v.dump_done := '0'; v.dump_start_rsn := reg_dump_start_rsn_rw; v.dump_start_page := reg_dump_start_page_rw; + v.dump_nof_pages := reg_dump_nof_pages_rw; if v.dump_start_page >= c_nof_pages_in_buffer then + -- Start page not in buffer range, cannot do dump. v.dump_start_page := 0; + v.dump_nof_pages := 0; end if; - v.dump_nof_pages := reg_dump_nof_pages_rw; - if dump_en = '1' then + if v.dump_nof_pages >= c_nof_pages_in_buffer then + -- Limit nof pages to buffer size + v.dump_nof_pages := c_nof_pages_in_buffer; + end if; + if dump_en = '1' and r.dump_nof_pages > 0 then v.latency_cnt := c_start_latency; v.fsm := s_dump_start; end if; diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd index 2b8cbab7709419dad1de68c172d1d5a1f783b444..7be2601fd9294a70e849e1eb1aae5ec0ae66ce0d 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd @@ -42,8 +42,8 @@ package tb_sdp_tbuf_pkg is function func_sdp_tbuf_fsm_arbiter_str(fsm_arbiter : natural) return string; function func_sdp_tbuf_fsm_writer_str(fsm_writer : natural) return string; function func_sdp_tbuf_fsm_reader_str(fsm_reader : natural) return string; - function func_sdp_tbuf_print_state(state_rec : t_sdp_tbuf_state) return boolean; - function func_sdp_tbuf_print_state(state_slv : std_logic_vector) return boolean; + function func_sdp_tbuf_print_state(prefix : string; state_rec : t_sdp_tbuf_state) return boolean; + function func_sdp_tbuf_print_state(prefix : string; state_slv : std_logic_vector) return boolean; -- Transient raw data output via 10GbE to CEP (= central processor) function func_sdp_tbuf_compose_cep_header(ip_src_addr : std_logic_vector; @@ -120,7 +120,7 @@ package body tb_sdp_tbuf_pkg is end case; end func_sdp_tbuf_fsm_reader_str; - function func_sdp_tbuf_print_state(state_rec : t_sdp_tbuf_state) return boolean is + function func_sdp_tbuf_print_state(prefix : string; state_rec : t_sdp_tbuf_state) return boolean is constant c_fsm_arbiter_str : string := func_sdp_tbuf_fsm_arbiter_str( to_uint(func_sdp_tbuf_fsm_arbiter_to_slv(state_rec.fsm_arbiter))); constant c_fsm_writer_str : string := func_sdp_tbuf_fsm_writer_str( @@ -128,29 +128,30 @@ package body tb_sdp_tbuf_pkg is constant c_fsm_reader_str : string := func_sdp_tbuf_fsm_reader_str( to_uint(func_sdp_tbuf_fsm_reader_to_slv(state_rec.fsm_reader))); begin - print_str("tbuf_state:"); - print_str(". ddr4_I_cal_ok = " & sl_to_str(state_rec.ddr4_I_cal_ok)); - print_str(". dvr_done = " & sl_to_str(state_rec.dvr_done)); - print_str(". fsm_arbiter = " & c_fsm_arbiter_str); - print_str(". fsm_writer = " & c_fsm_writer_str); - print_str(" record_enable = " & sl_to_str(state_rec.record_enable)); - print_str(" record_busy = " & sl_to_str(state_rec.record_busy)); - print_str(" record_all = " & sl_to_str(state_rec.record_all)); - print_str(" record_buf_full = " & sl_to_str(state_rec.record_buf_full)); - print_str(" record_sop_fifo_usedw = " & int_to_str(to_uint(state_rec.record_sop_fifo_usedw))); - print_str(". fsm_reader = " & c_fsm_reader_str); - print_str(" dump_enables = b" & slv_to_str(state_rec.dump_enables)); - print_str(" dump_en = " & sl_to_str(state_rec.dump_en)); - print_str(" dump_busy = " & sl_to_str(state_rec.dump_busy)); - print_str(" dump_done = " & sl_to_str(state_rec.dump_done)); - print_str(" dump_ai = " & int_to_str(state_rec.dump_ai)); + print_str(prefix & "tbuf_state:"); + print_str(prefix & ". ddr4_I_cal_ok = " & sl_to_str(state_rec.ddr4_I_cal_ok)); + print_str(prefix & ". dvr_done = " & sl_to_str(state_rec.dvr_done)); + print_str(prefix & ". fsm_arbiter = " & c_fsm_arbiter_str); + print_str(prefix & ". fsm_writer = " & c_fsm_writer_str); + print_str(prefix & " record_enable = " & sl_to_str(state_rec.record_enable)); + print_str(prefix & " record_busy = " & sl_to_str(state_rec.record_busy)); + print_str(prefix & " record_all = " & sl_to_str(state_rec.record_all)); + print_str(prefix & " record_buf_full = " & sl_to_str(state_rec.record_buf_full)); + print_str(prefix & " record_sop_fifo_usedw = " & int_to_str(to_uint(state_rec.record_sop_fifo_usedw))); + print_str(prefix & ". fsm_reader = " & c_fsm_reader_str); + print_str(prefix & " dump_enables = b" & slv_to_str(state_rec.dump_enables)); + print_str(prefix & " dump_en = " & sl_to_str(state_rec.dump_en)); + print_str(prefix & " dump_busy = " & sl_to_str(state_rec.dump_busy)); + print_str(prefix & " dump_done = " & sl_to_str(state_rec.dump_done)); + print_str(prefix & " dump_ai = " & int_to_str(state_rec.dump_ai)); + print_str(""); return true; end func_sdp_tbuf_print_state; - function func_sdp_tbuf_print_state(state_slv : std_logic_vector) return boolean is + function func_sdp_tbuf_print_state(prefix : string; state_slv : std_logic_vector) return boolean is constant c_state_rec : t_sdp_tbuf_state := func_sdp_tbuf_map_state(state_slv); begin - return func_sdp_tbuf_print_state(c_state_rec); + return func_sdp_tbuf_print_state(prefix, c_state_rec); end func_sdp_tbuf_print_state; function func_sdp_tbuf_compose_cep_header(ip_src_addr : std_logic_vector;