library ieee; use ieee.std_logic_1164.all; library vunit_lib; context vunit_lib.vunit_context; context vunit_lib.com_context; package i2c_bus_pkg is constant free_bus_msg : msg_type_t := new_msg_type("free bus"); constant set_scl_freq_msg : msg_type_t := new_msg_type("scl freq"); constant gen_start_cond_msg : msg_type_t := new_msg_type("gen start cond"); constant gen_stop_cond_msg : msg_type_t := new_msg_type("gen stop cond"); constant gen_clocks_msg : msg_type_t := new_msg_type("gen clocks"); constant send_data_msg : msg_type_t := new_msg_type("send data"); constant send_data_clocks_msg : msg_type_t := new_msg_type("send data and clocks"); constant auto_ack_msg : msg_type_t := new_msg_type("auto acknowledge"); constant wait_start_cond_msg : msg_type_t := new_msg_type("wait start cond"); constant wait_stop_cond_msg : msg_type_t := new_msg_type("wait stop cond"); constant wait_clocks_msg : msg_type_t := new_msg_type("wait clocks"); constant check_data_msg : msg_type_t := new_msg_type("check data"); constant check_data_clocks_msg : msg_type_t := new_msg_type("check data and gen clocks"); constant wait_until_idle : msg_type_t := new_msg_type("wait until idle"); impure function get_actor ( constant inst_name : string) return actor_t; procedure free_bus ( constant actor : in actor_t); procedure set_scl_frequency ( constant frequency : in real; constant actor : in actor_t); procedure gen_start_cond ( constant actor : in actor_t); procedure gen_stop_cond ( constant actor : in actor_t); procedure gen_clocks ( constant times : in natural; constant timeout : in time; constant actor : in actor_t); procedure send_data ( constant data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t); procedure send_ack ( constant timeout : in time; constant actor : in actor_t); procedure send_ack_and_clock ( constant timeout : in time; constant actor : in actor_t); procedure send_data_and_clock ( constant data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t); procedure wait_for_start_cond ( constant timeout : in time; constant actor : in actor_t); procedure wait_for_stop_cond ( constant timeout : in time; constant actor : in actor_t); procedure wait_for_clocks ( constant times : in natural; constant timeout : in time; constant actor : in actor_t); procedure check_data ( constant exp_data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t); procedure check_data_gen_clock ( constant exp_data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t); procedure check_ack_gen_clock ( constant timeout : in time; constant actor : in actor_t); procedure check_ack ( constant timeout : in time; constant actor : in actor_t); procedure set_auto_ack ( constant auto_ack : in boolean; constant address : in std_logic_vector(6 downto 0); constant bytes_count : in natural; constant actor : in actor_t); end package i2c_bus_pkg; package body i2c_bus_pkg is impure function get_actor ( constant inst_name : string) return actor_t is begin return find(inst_name); end function get_actor; procedure free_bus ( constant actor : in actor_t) is variable msg : msg_t := new_msg(free_bus_msg); begin send(net, actor, msg); end procedure free_bus; procedure set_scl_frequency ( constant frequency : in real; constant actor : in actor_t) is variable msg : msg_t := new_msg(set_scl_freq_msg); begin push(msg, frequency); send(net, actor, msg); end procedure set_scl_frequency; procedure gen_start_cond ( constant actor : in actor_t) is variable msg : msg_t := new_msg(gen_start_cond_msg); begin send(net, actor, msg); end procedure gen_start_cond; procedure gen_stop_cond ( constant actor : in actor_t) is variable msg : msg_t := new_msg(gen_stop_cond_msg); begin send(net, actor, msg); end procedure gen_stop_cond; procedure gen_clocks ( constant times : in natural; constant timeout : in time; constant actor : in actor_t) is variable msg : msg_t := new_msg(gen_clocks_msg); begin push(msg, times); push(msg, timeout); send(net, actor, msg); end procedure gen_clocks; procedure send_data ( constant data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t) is variable msg : msg_t := new_msg(send_data_msg); variable msg_data : std_logic_vector(1023 downto 0); begin msg_data(data'length - 1 downto 0) := data(data'range); push(msg, data'length); push(msg, msg_data); push(msg, timeout); send(net, actor, msg); end procedure send_data; procedure send_ack ( constant timeout : in time; constant actor : in actor_t) is begin send_data("0", timeout, actor); end procedure send_ack; procedure send_ack_and_clock ( constant timeout : in time; constant actor : in actor_t) is begin send_data_and_clock("0", timeout, actor); end procedure send_ack_and_clock; procedure send_data_and_clock ( constant data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t) is variable msg : msg_t := new_msg(send_data_clocks_msg); variable msg_data : std_logic_vector(1023 downto 0); begin msg_data(data'length - 1 downto 0) := data(data'range); push(msg, data'length); push(msg, msg_data); push(msg, timeout); send(net, actor, msg); end procedure send_data_and_clock; procedure wait_for_start_cond ( constant timeout : in time; constant actor : in actor_t) is variable msg : msg_t := new_msg(wait_start_cond_msg); begin push(msg, timeout); send(net, actor, msg); end procedure wait_for_start_cond; procedure wait_for_stop_cond ( constant timeout : in time; constant actor : in actor_t) is variable msg : msg_t := new_msg(wait_stop_cond_msg); begin push(msg, timeout); send(net, actor, msg); end procedure wait_for_stop_cond; procedure wait_for_clocks ( constant times : in natural; constant timeout : in time; constant actor : in actor_t) is variable msg : msg_t := new_msg(wait_clocks_msg); begin push(msg, times); push(msg, timeout); send(net, actor, msg); end procedure wait_for_clocks; procedure check_data ( constant exp_data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t) is variable msg_data : std_logic_vector(1023 downto 0); variable msg : msg_t := new_msg(check_data_msg); begin msg_data(exp_data'length - 1 downto 0) := exp_data(exp_data'range); push(msg, exp_data'length); push(msg, msg_data); push(msg, timeout); send(net, actor, msg); end procedure check_data; procedure check_data_gen_clock ( constant exp_data : in std_logic_vector; constant timeout : in time; constant actor : in actor_t) is variable msg_data : std_logic_vector(1023 downto 0); variable msg : msg_t := new_msg(check_data_clocks_msg); begin msg_data(exp_data'length - 1 downto 0) := exp_data(exp_data'range); push(msg, exp_data'length); push(msg, msg_data); push(msg, timeout); send(net, actor, msg); end procedure check_data_gen_clock; procedure check_ack_gen_clock ( constant timeout : in time; constant actor : in actor_t) is begin check_data_gen_clock("0", timeout, actor); end procedure check_ack_gen_clock; procedure check_ack ( constant timeout : in time; constant actor : in actor_t) is begin check_data("0", timeout, actor); end procedure check_ack; procedure set_auto_ack ( constant auto_ack : in boolean; constant address : in std_logic_vector(6 downto 0); constant bytes_count : in natural; constant actor : in actor_t) is variable msg : msg_t := new_msg(auto_ack_msg); begin push(msg, auto_ack); push(msg, address); push(msg, bytes_count); send(net, actor, msg); end procedure set_auto_ack; end package body i2c_bus_pkg;