Skip to content
Snippets Groups Projects
Commit 1c378f0b authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Create and use func_sdp_tbuf_print_state()

parent 2a9a9d9a
Branches
No related tags found
1 merge request!443Resolve L2SDP-1087
Pipeline #116189 passed
......@@ -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);
......
......@@ -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;
......
......@@ -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;
......
......@@ -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;
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment