52 using tlm_initiator_socket_t = tlm_utils::simple_initiator_socket_b<
53 generic_lua_model, DEFAULT_TLM_BUSWIDTH, tlm::tlm_base_protocol_types, sc_core::SC_ZERO_OR_MORE_BOUND>;
54 using tlm_target_socket_t = tlm_utils::simple_target_socket_b<
55 generic_lua_model, DEFAULT_TLM_BUSWIDTH, tlm::tlm_base_protocol_types, sc_core::SC_ZERO_OR_MORE_BOUND>;
56 using reg_ptr_t = std::shared_ptr<gs::gs_register<uint32_t>>;
57 using data_t = std::vector<std::tuple<sc_core::sc_time, uint64_t, uint32_t>>;
58 using signals_t = std::vector<std::tuple<sc_core::sc_time, uint32_t, bool>>;
59 using reactions_t = std::pair<data_t, signals_t>;
61 enum class action_source { REGISTER_CB, TARGET_SIGNAL, START_OF_SIM, UNKNOWN };
62 enum class actions { PRE_READ, PRE_WRITE, POST_READ, POST_WRITE, UNKNOWN };
65 std::size_t operator()(
T inst)
const
67 return static_cast<std::size_t
>(inst);
77 bool is_default_value_set;
89 , action(actions::UNKNOWN)
90 , address(0xffffffffffffffffULL)
91 , reg_mask(DEFAULT_REG_MASK)
95 , mask(DEFAULT_REG_MASK)
114 void set_base_address();
119 void before_end_of_elaboration()
override;
120 void start_of_simulation()
override;
122 void set_data_and_signals_actions_from_cci(
const std::string&
cci_name, data_t& data, signals_t& signals);
124 void dispatch_signals_actions(
const std::string&
cci_name, uint32_t sig_num,
bool sig_val);
125 void dispatch_registers_cb_actions(
const std::string&
cci_name,
const std::string& reg_name,
uint64_t address,
126 uint32_t reg_mask,
bool is_default_value_set, uint32_t default_value,
129 void register_input_signal(uint32_t sig_num,
bool value,
const data_t& data,
const signals_t& signals);
132 void trigger_signals(
const signals_t& signals, action_source
act_src);
133 void write_data(
const data_t& data, action_source
act_src);
134 void exec_data_thread(action_source
act_src);
135 void exec_sig_thread(action_source
act_src);
136 void reg_data_thread();
137 void reg_signals_thread();
138 void sos_data_thread();
139 void sos_signals_thread();
140 void target_sig_data_thread();
141 void target_sig_signals_thread();
144 void cci_set(std::string
n,
T value)
146 auto handle = m_broker.get_param_handle(
n);
148 handle.set_cci_value(cci::cci_value(value));
149 else if (!m_broker.has_preset_value(
n)) {
150 m_broker.set_preset_cci_value(
n, cci::cci_value(value));
152 SCP_FATAL(())(
"Trying to re-set a value? {}",
n);
157 tlm_initiator_socket_t initiator_socket;
158 tlm_target_socket_t target_socket;
159 sc_core::sc_vector<TargetSignalSocket<bool>> target_signal_sockets;
160 sc_core::sc_vector<InitiatorSignalSocket<bool>> initiator_signal_sockets;
164 tlm_initiator_socket_t m_initiator_socket;
165 cci::cci_broker_handle m_broker;
166 std::unordered_map<action_source, std::unique_ptr<tlm_utils::peq_with_get<tlm::tlm_generic_payload>>, enum_hash>
168 std::unordered_map<action_source, std::list<generic_lua_model_txn_payload>, enum_hash> m_data_pending_list;
169 std::unordered_map<action_source, std::unique_ptr<tlm_utils::peq_with_get<std::pair<uint32_t, bool>>>, enum_hash>
171 std::unordered_map<action_source, std::list<generic_lua_model_signal_payload>, enum_hash> m_signals_pending_list;
174 std::vector<register_info_t> m_registers;
175 std::unordered_map<uint32_t, std::unordered_map<bool, reactions_t>> m_signals;
176 std::vector<reactions_t> m_start_of_sim_ts_ns;