scc  2024.06
SystemC components library
chi_lwtr.cpp
1 /*
2  * Copyright 2020 Arteris IP
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <chi/chi_tlm.h>
18 #include <tlm/scc/tlm_id.h>
19 #include <tlm/scc/scv/tlm_extension_recording_registry.h>
20 #include <tlm/scc/lwtr/lwtr4tlm2_extension_registry.h>
21 
22 namespace lwtr {
23 using namespace chi;
24 
25 template <class Archive> void record(Archive &ar, tlm::scc::tlm_id_extension const& e) {ar & field("uid", e.id);}
26 
27 template <class Archive> void record(Archive &ar, chi::chi_ctrl_extension const& e) {
28  ar & field("qos", e.get_qos());
29  ar & field("src_id", e.get_src_id());
30  ar & field("txn_id", e.get_txn_id());
31  ar & field("tgt_id", e.req.get_tgt_id());
32  ar & field("lp_id", e.req.get_lp_id());
33  ar & field("return_txn_id", e.req.get_return_txn_id());
34  ar & field("stash_lp_id", e.req.get_stash_lp_id());
35  ar & field("size", e.req.get_size());
36  ar & field("mem_attr", e.req.get_mem_attr());
37  ar & field("req.pcrd_type", e.req.get_pcrd_type());
38  ar & field("order", e.req.get_order());
39  ar & field("endian", e.req.is_endian());
40  ar & field("req.trace_tag", e.req.is_trace_tag());
41  ar & field("return_n_id", e.req.get_return_n_id());
42  ar & field("stash_n_id", e.req.get_stash_n_id());
43  ar & field("opcode", to_char(e.req.get_opcode()));
44  ar & field("stash_nnode_id_valid", e.req.is_stash_n_id_valid());
45  ar & field("stash_lp_id_valid", e.req.is_stash_lp_id_valid());
46  ar & field("non_secure", e.req.is_non_secure());
47  ar & field("exp_comp_ack", e.req.is_exp_comp_ack());
48  ar & field("allow_retry", e.req.is_allow_retry());
49  ar & field("snp_attr", e.req.is_snp_attr());
50  ar & field("excl", e.req.is_excl());
51  ar & field("snoop_me", e.req.is_snoop_me());
52  ar & field("likely_shared", e.req.is_likely_shared());
53  ar & field("txn_rsvdc", e.req.get_rsvdc()); // Reserved for customer use.
54  ar & field("tag_op", e.req.get_tag_op());
55  ar & field("tag_group_id", e.req.get_tag_group_id());
56  ar & field("mpam", e.req.get_mpam());
57  ar & field("rsp.db_id", e.resp.get_db_id());
58  ar & field("rsp.pcrd_type", e.resp.get_pcrd_type());
59  ar & field("rsp.resp_err", to_char(e.resp.get_resp_err()));
60  ar & field("rsp.fwd_state", e.resp.get_fwd_state());
61  ar & field("rsp.data_pull", e.resp.get_data_pull());
62  ar & field("rsp.opcode", to_char(e.resp.get_opcode()));
63  ar & field("rsp.resp", to_char(e.resp.get_resp()));
64  ar & field("rsp.tgt_id", e.resp.get_tgt_id());
65  ar & field("rsp.trace_tag", e.resp.is_trace_tag());
66  ar & field("rsp.tag_op", e.resp.get_tag_op());
67  ar & field("rsp.tag_group_id", e.resp.get_tag_group_id());
68 
69 }
70 
71 template <class Archive> void record(Archive &ar, chi::chi_data_extension const& e) {
72  ar & field("qos", e.get_qos());
73  ar & field("src_id", e.get_src_id());
74  ar & field("txn_id", e.get_txn_id());
75  ar & field("db_id", e.dat.get_db_id());
76  ar & field("resp_err", to_char(e.dat.get_resp_err()));
77  ar & field("resp", to_char(e.dat.get_resp()));
78  ar & field("fwd_state", e.dat.get_fwd_state());
79  ar & field("data_pull", e.dat.get_data_pull());
80  ar & field("data_source", e.dat.get_data_source());
81  ar & field("cc_id", e.dat.get_cc_id());
82  ar & field("data_id", e.dat.get_data_id());
83  ar & field("poison", e.dat.get_poison());
84  ar & field("tgt_id", e.dat.get_tgt_id());
85  ar & field("home_node_id", e.dat.get_home_n_id());
86  ar & field("opcode", to_char(e.dat.get_opcode()));
87  ar & field("rsvdc", e.dat.get_rsvdc());
88  ar & field("data_check", e.dat.get_data_check());
89  ar & field("trace_tag", e.dat.is_trace_tag());
90  ar & field("tag_op", e.dat.get_tag_op());
91  ar & field("tag", e.dat.get_tag());
92  ar & field("tu", e.dat.get_tu());
93 }
94 
95 template <class Archive> void record(Archive &ar, chi::chi_snp_extension const& e) {
96  ar & field("qos", e.get_qos());
97  ar & field("src_id", e.get_src_id());
98  ar & field("txn_id", e.get_txn_id());
99  ar & field("fwd_txn_id", e.req.get_fwd_txn_id());
100  ar & field("stash_lp_id", e.req.get_stash_lp_id());
101  ar & field("vm_id_ext", e.req.get_vm_id_ext());
102  ar & field("stash_lp_id_valid", e.req.is_stash_lp_id_valid());
103  ar & field("opcode", to_char(e.req.get_opcode()));
104  ar & field("fwd_n_id", e.req.get_fwd_n_id());
105  ar & field("non_secure", e.req.is_non_secure());
106  ar & field("do_not_goto_sd", e.req.is_do_not_goto_sd());
107  ar & field("do_not_data_pull", e.req.is_do_not_data_pull());
108  ar & field("ret_to_src", e.req.is_ret_to_src());
109  ar & field("trace_tag", e.req.is_trace_tag());
110  ar & field("rsp.db_id", e.resp.get_db_id());
111  ar & field("rsp.pcrd_type", e.resp.get_pcrd_type());
112  ar & field("rsp.resp_err", to_char(e.resp.get_resp_err()));
113  ar & field("rsp.fwd_state", e.resp.get_fwd_state());
114  ar & field("rsp.data_pull", e.resp.get_data_pull());
115  ar & field("rsp.opcode", to_char(e.resp.get_opcode()));
116  ar & field("rsp.resp", to_char(e.resp.get_resp()));
117  ar & field("rsp.tgt_id", e.resp.get_tgt_id());
118  ar & field("rsp.trace_tag", e.resp.is_trace_tag());
119 }
120 
121 template <class Archive> void record(Archive &ar, chi::chi_credit_extension const& e) {
122  ar & field("type", to_char(e.type));
123  ar & field("count", e.count);
124 }
125 }
126 
127 namespace chi {
128 namespace lwtr {
129 namespace {
130 const std::array<std::string, 3> cmd2char{{"tlm::TLM_READ_COMMAND", "tlm::TLM_WRITE_COMMAND", "tlm::TLM_IGNORE_COMMAND"}};
131 const std::array<std::string, 7> resp2char{
132  {"tlm::TLM_OK_RESPONSE", "tlm::TLM_INCOMPLETE_RESPONSE", "tlm::TLM_GENERIC_ERROR_RESPONSE", "tlm::TLM_ADDRESS_ERROR_RESPONSE", "tlm::TLM_COMMAND_ERROR_RESPONSE", "tlm::TLM_BURST_ERROR_RESPONSE", "tlm::TLM_BYTE_ENABLE_ERROR_RESPONSE"}};
133 const std::array<std::string, 3> gp_option2char{{"tlm::TLM_MIN_PAYLOAD", "tlm::TLM_FULL_PAYLOAD", "tlm::TLM_FULL_PAYLOAD_ACCEPTED"}};
134 const std::array<std::string, 5> phase2char{{"tlm::UNINITIALIZED_PHASE", "tlm::BEGIN_REQ", "tlm::END_REQ", "tlm::BEGIN_RESP", "tlm::END_RESP"}};
135 const std::array<std::string, 4> dmi2char{
136  {"tlm::DMI_ACCESS_NONE", "tlm::DMI_ACCESS_READ", "tlm::DMI_ACCESS_WRITE", "tlm::DMI_ACCESS_READ_WRITE"}};
137 const std::array<std::string, 3> sync2char{{"tlm::TLM_ACCEPTED", "tlm::TLM_UPDATED", "tlm::TLM_COMPLETED"}};
138 
139 } // namespace
140 
142  void recordBeginTx(::lwtr::tx_handle& handle, tlm::tlm_base_protocol_types::tlm_payload_type& trans) override {
143  if(auto* ext = trans.get_extension<tlm::scc::tlm_id_extension>())
144  handle.record_attribute("trans", *ext);
145  }
146  void recordEndTx(::lwtr::tx_handle& handle, tlm::tlm_base_protocol_types::tlm_payload_type& trans) override { }
147 };
148 
150  void recordBeginTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override {
151  if(auto* ext = trans.get_extension<chi::chi_ctrl_extension>())
152  handle.record_attribute("trans.chi_c", *ext);
153  }
154  void recordEndTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override { }
155 };
157  void recordBeginTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override {
158  if(auto* ext = trans.get_extension<chi::chi_data_extension>())
159  handle.record_attribute("trans.chi_c", *ext);
160  }
161  void recordEndTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override { }
162 };
164  void recordBeginTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override {
165  if(auto* ext = trans.get_extension<chi::chi_snp_extension>())
166  handle.record_attribute("trans.chi_s", *ext);
167  }
168  void recordEndTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override { }
169 };
171  void recordBeginTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override {
172  if(auto* ext = trans.get_extension<chi::chi_credit_extension>())
173  handle.record_attribute("trans.chi_credit", *ext);
174  }
175  void recordEndTx(::lwtr::tx_handle& handle, chi_protocol_types::tlm_payload_type& trans) override { }
176 };
177 
178 //using namespace tlm::scc::scv;
179 #if defined(__GNUG__)
180 __attribute__((constructor))
181 #endif
182 bool register_extensions() {
183  tlm::scc::tlm_id_extension ext(nullptr); // NOLINT
185  ext.ID, new chi::lwtr::tlm_id_ext_recording()) ; // NOLINT
186  chi::chi_ctrl_extension chi_c; // NOLINT
188  chi_c.ID, new chi::lwtr::chi_ctrl_ext_recording()); // NOLINT
189  chi::chi_data_extension chi_d; // NOLINT
191  chi_d.ID, new chi::lwtr::chi_data_ext_recording()); // NOLINT
192  chi::chi_snp_extension chi_s; // NOLINT
194  chi_s.ID, new chi::lwtr::chi_snp_ext_recording()); // NOLINT
195  chi::chi_credit_extension chi_l; // NOLINT
197  chi_l.ID, new chi::lwtr::chi_link_ext_recording()); // NOLINT
198  return true; // NOLINT
199 }
200 bool registered = register_extensions();
201 
202 } // namespace lwtr
203 } // namespace axi
The TLM transaction extensions recorder interface.
The TLM transaction extensions recorder registry.
const char * to_char(E t)
TLM2.0 components modeling CHI.
Definition: chi_tlm.cpp:21