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 bbee27df24723c76d0b29015a0889376ae8d9271..404004d0091ca87287f1c409b95b746f5f5a37ff 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 @@ -86,9 +86,9 @@ entity tb_lofar2_unb2c_sdp_station_tbuf_one is g_tb_index : natural := 0; g_use_bf : boolean := false; g_processing_enable_toggle : boolean := false; - g_verify_crc_error : boolean := true; -- false for correct CRC, true to cause CRC error for all read pages + g_verify_crc_error : boolean := false; -- false for correct CRC, true to cause CRC error for all read pages g_verify_rsn_error : boolean := false; -- false for correct RSN, true to cause RSN error for all read pages - g_sp : natural := 13; -- signal path (SP) index in range(S_pn = 12) for WG sinus, >= 12 + g_sp : natural := 3; -- signal path (SP) index in range(S_pn = 12) for WG sinus, >= 12 -- for DC at g_sp g_ddr_access_rate_pct : natural := 100; -- throttle memory acces rate, full rate is 100 % g_ddr_buffer_size : natural := 256; -- <= 4096, because c_tech_ddr4_sim_4k_64 has 4k = 4096 words of @@ -272,12 +272,42 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is constant c_mm_file_reg_dp_xonoff_tbuf : string := c_mmf_prefix & "REG_DP_XONOFF_TBUF"; constant c_mm_file_reg_nw_10gbe_mac : string := c_mmf_prefix & "REG_NW_10GBE_MAC"; + procedure proc_read_ddr4_wr_fifo_status(signal tb_clk : in std_logic; + signal rd_data : inout std_logic_vector(c_32 - 1 downto 0); + signal ddr_wr_fifo_used : inout natural; + signal ddr_wr_fifo_full : inout std_logic) is + begin + mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 2, rd_data, tb_clk); + ddr_wr_fifo_used <= to_uint(rd_data); + mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 3, rd_data, tb_clk); + ddr_wr_fifo_full <= rd_data(0); + proc_common_wait_some_cycles(tb_clk, 1); + print_str(c_tb_str & "ddr_wr_fifo_full = " & sl_to_str(ddr_wr_fifo_full)); + print_str(c_tb_str & "ddr_wr_fifo_used = " & int_to_str(ddr_wr_fifo_used)); + end procedure; + + procedure proc_read_ddr4_rd_fifo_status(signal tb_clk : in std_logic; + signal rd_data : inout std_logic_vector(c_32 - 1 downto 0); + signal ddr_rd_fifo_used : inout natural; + signal ddr_rd_fifo_full : inout std_logic) is + begin + mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 1, rd_data, tb_clk); + ddr_rd_fifo_used <= to_uint(rd_data); + mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 3, rd_data, tb_clk); + ddr_rd_fifo_full <= rd_data(0); + proc_common_wait_some_cycles(tb_clk, 1); + print_str(c_tb_str & "ddr_rd_fifo_full = " & sl_to_str(ddr_rd_fifo_full)); + print_str(c_tb_str & "ddr_rd_fifo_used = " & int_to_str(ddr_rd_fifo_used)); + end procedure; + signal wg_started : std_logic := '0'; signal rx_done : std_logic := '0'; signal tb_almost_end : std_logic := '0'; signal i_tb_end : std_logic := '0'; signal tb_clk : std_logic := '0'; signal rd_data_setup : std_logic_vector(c_32 - 1 downto 0); + signal rd_data_state : std_logic_vector(c_32 - 1 downto 0); + signal rd_data_fifo : std_logic_vector(c_32 - 1 downto 0); signal rd_data_control : std_logic_vector(c_32 - 1 downto 0); signal rd_data_monitor : std_logic_vector(c_32 - 1 downto 0); signal rd_data_bsn : std_logic_vector(c_32 - 1 downto 0); @@ -298,7 +328,11 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is signal rd_cep_udp_src_port : std_logic_vector(15 downto 0); signal rd_cep_udp_dst_port : std_logic_vector(15 downto 0); - signal rd_ddr_status : std_logic_vector(31 downto 0); + signal ddr_status : std_logic_vector(31 downto 0); + signal ddr_wr_fifo_used : natural; + signal ddr_rd_fifo_used : natural; + signal ddr_wr_fifo_full : std_logic; + signal ddr_rd_fifo_full : std_logic; signal ddr_dvr_done : std_logic := '0'; signal ddr_ctlr_nof_bytes_per_word : natural; @@ -733,18 +767,18 @@ begin -- Read DDR4 memory status ---------------------------------------------------------------------------- mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 0, rd_data_setup, tb_clk); - rd_ddr_status <= rd_data_setup; + ddr_status <= rd_data_setup; proc_common_wait_some_cycles(tb_clk, 1); -- . verify dvr_done for calibration ok - ddr_dvr_done <= rd_ddr_status(0); + ddr_dvr_done <= ddr_status(0); proc_common_wait_some_cycles(tb_clk, 1); assert ddr_dvr_done = '1' report c_tb_str & "Wrong no DDR MB_I" severity ERROR; -- . verify ddr_ctlr_nof_bytes_per_word - ddr_ctlr_nof_bytes_per_word <= TO_UINT(rd_ddr_status(15 downto 8)); + ddr_ctlr_nof_bytes_per_word <= TO_UINT(ddr_status(15 downto 8)); proc_common_wait_some_cycles(tb_clk, 1); assert ddr_ctlr_nof_bytes_per_word = c_exp_ddr_ctlr_nof_bytes_per_word report c_tb_str & "Wrong read ddr_ctlr_nof_bytes_per_word" @@ -811,7 +845,7 @@ begin mmf_mm_wait_until_value( c_mm_file_reg_bsn_scheduler_wg, 0, -- read BSN low part "UNSIGNED", rd_data_bsn, ">=", c_bsn_start_wg, -- this is the wait until condition - c_T_bs_period, tb_clk); + c_T_bs_period, ext_clk); -- WG started wg_started <= '1'; @@ -853,6 +887,7 @@ begin end process; p_mm_tbuf_control : process + variable v_bool : boolean; variable v_recorded_nof_pages : natural; variable v_Begin : natural; variable v_End : natural; @@ -871,6 +906,12 @@ begin -- Wait for DUT power up after reset wait for 200 ns; + ---------------------------------------------------------------------------- + -- Read DDR4 FIFOs status + ---------------------------------------------------------------------------- + proc_read_ddr4_wr_fifo_status(tb_clk, rd_data_fifo, ddr_wr_fifo_used, ddr_wr_fifo_full); + proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full); + ---------------------------------------------------------------------------- -- Record all antennas ---------------------------------------------------------------------------- @@ -926,9 +967,17 @@ begin print_str(c_tb_str & "tbuf_registers_rd.record_enable = " & sl_to_str(tbuf_registers_rd.record_enable)); print_str(c_tb_str & "tbuf_registers_ro.record_busy = " & sl_to_str(tbuf_registers_ro.record_busy)); + -- 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); + -- Recording proc_common_wait_some_cycles(ext_clk, g_rs_block_size * g_rs_record_nof_block); + -- Read DDR4 write FIFO status + proc_read_ddr4_wr_fifo_status(tb_clk, rd_data_fifo, ddr_wr_fifo_used, ddr_wr_fifo_full); + -- Read BSN monitor for recording data mmf_mm_bus_rd(c_mm_file_reg_bsn_monitor_v2_tbuf, 1, rd_data_monitor, tb_clk); -- bsn at sync recording_rsn_at_sync <= to_uint(rd_data_monitor); @@ -992,12 +1041,15 @@ begin mmf_mm_wait_until_value( c_mm_file_reg_tbuf, 18, -- read record_busy "UNSIGNED", rd_data_record_busy, "=", 0, -- this is the wait until condition - c_T_rd_interval, tb_clk); + c_T_rd_interval, ext_clk); tbuf_registers_ro.record_busy <= rd_data_record_busy(0); proc_common_wait_some_cycles(tb_clk, 1); print_str(c_tb_str & "tbuf_registers_rd.record_enable = " & sl_to_str(tbuf_registers_rd.record_enable)); print_str(c_tb_str & "tbuf_registers_ro.record_busy = " & sl_to_str(tbuf_registers_ro.record_busy)); + -- Read DDR4 write FIFO status + proc_read_ddr4_wr_fifo_status(tb_clk, rd_data_fifo, ddr_wr_fifo_used, ddr_wr_fifo_full); + -- Read number of recorded pages mmf_mm_bus_rd(c_mm_file_reg_tbuf, 4, rd_data_control, tb_clk); tbuf_registers_ro.recorded_nof_pages <= to_uint(rd_data_control); @@ -1104,13 +1156,17 @@ begin 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, tb_clk); + c_T_rd_interval, ext_clk); tbuf_registers_ro.dump_done <= rd_data_dump_done(0); proc_common_wait_some_cycles(tb_clk, 1); @@ -1135,6 +1191,9 @@ begin proc_common_wait_some_cycles(ext_clk, g_rs_block_size * 4); rx_done <= '1'; + -- Read DDR4 read FIFO status + proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full); + -- Read strobe_total_counts mmf_mm_bus_rd(c_mm_file_reg_strobe_total_count_tbuf, 0, rd_data_strobe, tb_clk); tbuf_strobe_total_counts.memory_read_nof_packets <= to_uint(rd_data_strobe); diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd index 3a977d64df67b09ce9b375709ed15d9122293b02..54f8c26d7cb9b75285aef0d44dbda5fa6441c395 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd @@ -223,6 +223,7 @@ begin tbuf_registers_ro.nof_pages_in_buffer <= c_nof_pages_in_buffer; tbuf_registers_ro.dump_done <= tbuf_state_rec.dump_done; tbuf_registers_ro.record_busy <= tbuf_state_rec.record_busy; + tbuf_registers_ro.state <= tbuf_state_slv; ddr4_I_cal_ok <= tbuf_state_rec.ddr4_I_cal_ok; tbuf_state_rec.dvr_done <= dvr_cipo.done; 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 ce4e316d9d7cbb263550593a81f50bb8b5e5dd17..368e2f54e923c61d6eddddaf726931149f81a23f 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd @@ -74,7 +74,7 @@ package sdp_tbuf_pkg is s_dump_done); -- = 0, 1, 2, 3, 4, 5, 6 -- TBuf state word [31:0] - type t_sdp_tbuf_state is record -- bit index + type t_sdp_tbuf_state is record -- bit index ddr4_I_cal_ok : std_logic; -- 0 dvr_done : std_logic; -- 1 fsm_arbiter : t_sdp_tbuf_fsm_arbiter; -- 3:2 @@ -89,7 +89,7 @@ package sdp_tbuf_pkg is dump_en : std_logic; -- 23 dump_busy : std_logic; -- 24 dump_done : std_logic; -- 25 - dump_ai : std_logic_vector(2 downto 0); -- 28:26 + dump_ai : natural; -- 28:26 end record; ----------------------------------------------------------------------------- @@ -322,7 +322,11 @@ package sdp_tbuf_pkg is function func_sdp_tbuf_fsm_arbiter_to_slv(fsm : t_sdp_tbuf_fsm_arbiter) return std_logic_vector; function func_sdp_tbuf_fsm_writer_to_slv(fsm : t_sdp_tbuf_fsm_writer) return std_logic_vector; function func_sdp_tbuf_fsm_reader_to_slv(fsm : t_sdp_tbuf_fsm_reader) return std_logic_vector; - function func_sdp_tbuf_map_state(state : t_sdp_tbuf_state) return std_logic_vector; + function func_sdp_tbuf_fsm_arbiter_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_arbiter; + function func_sdp_tbuf_fsm_writer_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_writer; + function func_sdp_tbuf_fsm_reader_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_reader; + function func_sdp_tbuf_map_state(state_rec : t_sdp_tbuf_state) return std_logic_vector; + function func_sdp_tbuf_map_state(state_slv : std_logic_vector) return t_sdp_tbuf_state; function func_sdp_tbuf_map_cep_header(hdr_fields_raw : std_logic_vector) return t_sdp_tbuf_cep_header; end package sdp_tbuf_pkg; @@ -454,6 +458,16 @@ package body sdp_tbuf_pkg is end case; end func_sdp_tbuf_fsm_arbiter_to_slv; + function func_sdp_tbuf_fsm_arbiter_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_arbiter is + variable v_fsm : natural := to_uint(fsm); + begin + case v_fsm is + when 0 => return s_idle; + when 1 => return s_recording; + when others => return s_dumping; + end case; + end func_sdp_tbuf_fsm_arbiter_to_enum; + function func_sdp_tbuf_fsm_writer_to_slv(fsm : t_sdp_tbuf_fsm_writer) return std_logic_vector is constant c_fsm_w : natural := 2; begin @@ -465,6 +479,17 @@ package body sdp_tbuf_pkg is end case; end func_sdp_tbuf_fsm_writer_to_slv; + function func_sdp_tbuf_fsm_writer_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_writer is + variable v_fsm : natural := to_uint(fsm); + begin + case v_fsm is + when 0 => return s_idle; + when 1 => return s_write_start; + when 2 => return s_write_busy; + when others => return s_write_done; + end case; + end func_sdp_tbuf_fsm_writer_to_enum; + function func_sdp_tbuf_fsm_reader_to_slv(fsm : t_sdp_tbuf_fsm_reader) return std_logic_vector is constant c_fsm_w : natural := 3; begin @@ -479,27 +504,62 @@ package body sdp_tbuf_pkg is end case; end func_sdp_tbuf_fsm_reader_to_slv; - function func_sdp_tbuf_map_state(state : t_sdp_tbuf_state) return std_logic_vector is + function func_sdp_tbuf_fsm_reader_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_reader is + variable v_fsm : natural := to_uint(fsm); + begin + case v_fsm is + when 0 => return s_idle; + when 1 => return s_dump_start; + when 2 => return s_dump_antenna; + when 3 => return s_read_block; + when 4 => return s_read_gap; + when 5 => return s_read_done; + when others => return s_dump_done; + end case; + end func_sdp_tbuf_fsm_reader_to_enum; + + function func_sdp_tbuf_map_state(state_rec : t_sdp_tbuf_state) return std_logic_vector is variable v_slv : std_logic_vector(c_word_w - 1 downto 0) := (others => '0'); begin - v_slv( 0) := state.ddr4_I_cal_ok; - v_slv( 1) := state.dvr_done; - v_slv( 3 downto 2) := func_sdp_tbuf_fsm_arbiter_to_slv(state.fsm_arbiter); - v_slv( 5 downto 4) := func_sdp_tbuf_fsm_writer_to_slv(state.fsm_writer); - v_slv( 6) := state.record_enable; - v_slv( 7) := state.record_busy; - v_slv( 8) := state.record_all; - v_slv( 9) := state.record_buf_full; - v_slv(13 downto 10) := state.record_sop_fifo_usedw; - v_slv(16 downto 14) := func_sdp_tbuf_fsm_reader_to_slv(state.fsm_reader); - v_slv(22 downto 17) := state.dump_enables; - v_slv(23) := state.dump_en; - v_slv(24) := state.dump_busy; - v_slv(25) := state.dump_done; - v_slv(28 downto 26) := state.dump_ai; + v_slv( 0) := state_rec.ddr4_I_cal_ok; + v_slv( 1) := state_rec.dvr_done; + v_slv( 3 downto 2) := func_sdp_tbuf_fsm_arbiter_to_slv(state_rec.fsm_arbiter); + v_slv( 5 downto 4) := func_sdp_tbuf_fsm_writer_to_slv(state_rec.fsm_writer); + v_slv( 6) := state_rec.record_enable; + v_slv( 7) := state_rec.record_busy; + v_slv( 8) := state_rec.record_all; + v_slv( 9) := state_rec.record_buf_full; + v_slv(13 downto 10) := state_rec.record_sop_fifo_usedw; + v_slv(16 downto 14) := func_sdp_tbuf_fsm_reader_to_slv(state_rec.fsm_reader); + v_slv(22 downto 17) := state_rec.dump_enables; + v_slv(23) := state_rec.dump_en; + v_slv(24) := state_rec.dump_busy; + v_slv(25) := state_rec.dump_done; + v_slv(28 downto 26) := to_uvec(state_rec.dump_ai, 3); return v_slv; end func_sdp_tbuf_map_state; + function func_sdp_tbuf_map_state(state_slv : std_logic_vector) return t_sdp_tbuf_state is + variable v_rec : t_sdp_tbuf_state; + begin + v_rec.ddr4_I_cal_ok := state_slv( 0); + v_rec.dvr_done := state_slv( 1); + v_rec.fsm_arbiter := func_sdp_tbuf_fsm_arbiter_to_enum(state_slv(3 downto 2)); + v_rec.fsm_writer := func_sdp_tbuf_fsm_writer_to_enum(state_slv(5 downto 4)); + v_rec.record_enable := state_slv( 6); + v_rec.record_busy := state_slv( 7); + v_rec.record_all := state_slv( 8); + v_rec.record_buf_full := state_slv( 9); + v_rec.record_sop_fifo_usedw := state_slv(13 downto 10); + v_rec.fsm_reader := func_sdp_tbuf_fsm_reader_to_enum(state_slv(16 downto 14)); + v_rec.dump_enables := state_slv(22 downto 17); + v_rec.dump_en := state_slv(23); + v_rec.dump_busy := state_slv(24); + v_rec.dump_done := state_slv(25); + v_rec.dump_ai := to_uint(state_slv(28 downto 26)); + return v_rec; + end func_sdp_tbuf_map_state; + function func_sdp_tbuf_map_cep_header(hdr_fields_raw : std_logic_vector) return t_sdp_tbuf_cep_header is constant c_cep_hfa : t_common_field_arr(c_sdp_tbuf_hdr_field_arr'range) := c_sdp_tbuf_hdr_field_arr; variable v : t_sdp_tbuf_cep_header; 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 942e84091728796b4871847e9bc81c6808d372d7..f417a36f52f4e4493850fdaacaeaf90365b8c0df 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd @@ -66,7 +66,7 @@ entity sdp_tbuf_reader is fsm : out t_sdp_tbuf_fsm_reader; dump_busy : out std_logic; dump_done : out std_logic; - dump_ai : out std_logic_vector(2 downto 0) -- for t_sdp_tbuf_state.dump_ai[2:0] + dump_ai : out natural ); end sdp_tbuf_reader; @@ -434,5 +434,5 @@ begin reader_copi <= r.reader_copi; dump_busy <= r.dump_busy; dump_done <= r.dump_done; - dump_ai <= TO_UVEC(r.ai, 3); -- for t_sdp_tbuf_state.dump_ai[2:0] + dump_ai <= r.ai; end str; 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 04aca7bac5162ccfb747d8bd9582ab80dca6d13b..2b8cbab7709419dad1de68c172d1d5a1f783b444 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 @@ -29,6 +29,7 @@ library IEEE, common_lib, dp_lib; use IEEE.std_logic_1164.all; use common_lib.common_pkg.all; use common_lib.common_network_layers_pkg.all; + use common_lib.common_str_pkg.all; use common_lib.tb_common_pkg.all; use dp_lib.dp_stream_pkg.all; use work.sdp_pkg.all; @@ -38,6 +39,12 @@ library IEEE, common_lib, dp_lib; package tb_sdp_tbuf_pkg is function func_sdp_tbuf_calculate_dump_inter_packet_gap(packet_len, link_bps : natural) return natural; + 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; + -- Transient raw data output via 10GbE to CEP (= central processor) function func_sdp_tbuf_compose_cep_header(ip_src_addr : std_logic_vector; ip_header_checksum : natural; @@ -78,6 +85,74 @@ package body tb_sdp_tbuf_pkg is return func_sdp_tbuf_limit_dump_inter_packet_gap(c_gap_size); end func_sdp_tbuf_calculate_dump_inter_packet_gap; + function func_sdp_tbuf_fsm_arbiter_str(fsm_arbiter : natural) return string is + begin + case fsm_arbiter is + when 0 => return "s_idle"; + when 1 => return "s_recording"; + when 2 => return "s_dumping"; + when others => return ""; + end case; + end func_sdp_tbuf_fsm_arbiter_str; + + function func_sdp_tbuf_fsm_writer_str(fsm_writer : natural) return string is + begin + case fsm_writer is + when 0 => return "s_idle"; + when 1 => return "s_write_start"; + when 2 => return "s_write_busy"; + when 3 => return "s_write_done"; + when others => return ""; + end case; + end func_sdp_tbuf_fsm_writer_str; + + function func_sdp_tbuf_fsm_reader_str(fsm_reader : natural) return string is + begin + case fsm_reader is + when 0 => return "s_idle"; + when 1 => return "s_dump_start"; + when 2 => return "s_dump_antenna"; + when 3 => return "s_read_block"; + when 4 => return "s_read_gap"; + when 5 => return "s_read_done"; + when 6 => return "s_dump_done"; + when others => return ""; + end case; + end func_sdp_tbuf_fsm_reader_str; + + function func_sdp_tbuf_print_state(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( + to_uint(func_sdp_tbuf_fsm_writer_to_slv(state_rec.fsm_writer))); + 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)); + return true; + end func_sdp_tbuf_print_state; + + function func_sdp_tbuf_print_state(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); + end func_sdp_tbuf_print_state; + function func_sdp_tbuf_compose_cep_header(ip_src_addr : std_logic_vector; ip_header_checksum : natural; sdp_info : t_sdp_info; -- app header