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 eb5c1cda093d2a3796a355e2a2b59d8381b48bd8..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 @@ -88,7 +88,7 @@ entity tb_lofar2_unb2c_sdp_station_tbuf_one is g_processing_enable_toggle : boolean := false; 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 @@ -306,6 +306,7 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is 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); @@ -886,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; @@ -965,6 +967,11 @@ 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); 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