scc  2024.06
SystemC components library
signal_if.h
1 /*******************************************************************************
2  * Copyright 2021 MINRES Technologies GmbH
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 #ifndef _BUS_AXI_SIGNAL_IF_H_
18 #define _BUS_AXI_SIGNAL_IF_H_
19 
20 #include <scc/signal_opt_ports.h>
21 #include <systemc>
22 
23 namespace axi {
24 
25 const sc_core::sc_time CLK_DELAY = 1_ps;
26 
27 struct master_types {
28  template <typename T> using m2s_t = sc_core::sc_out<T>;
29  template <typename T> using s2m_t = sc_core::sc_in<T>;
30  template <typename T> using m2s_full_t = sc_core::sc_out<T>;
31  template <typename T> using s2m_full_t = sc_core::sc_in<T>;
32  template <typename T> using m2s_opt_t = scc::sc_out_opt<T>;
33  template <typename T> using s2m_opt_t = scc::sc_in_opt<T>;
34 };
35 
37  template <typename T> using m2s_t = sc_core::sc_out<T>;
38  template <typename T> using s2m_t = sc_core::sc_in<T>;
39  template <typename T> using m2s_full_t = scc::sc_out_opt<T>;
40  template <typename T> using s2m_full_t = scc::sc_in_opt<T>;
41  template <typename T> using m2s_opt_t = scc::sc_out_opt<T>;
42  template <typename T> using s2m_opt_t = scc::sc_in_opt<T>;
43 };
44 
45 struct slave_types {
46  template <typename T> using m2s_t = sc_core::sc_in<T>;
47  template <typename T> using s2m_t = sc_core::sc_out<T>;
48  template <typename T> using m2s_full_t = sc_core::sc_in<T>;
49  template <typename T> using s2m_full_t = sc_core::sc_out<T>;
50  template <typename T> using m2s_opt_t = scc::sc_in_opt<T>;
51  template <typename T> using s2m_opt_t = scc::sc_out_opt<T>;
52 };
53 
55  template <typename T> using m2s_t = sc_core::sc_in<T>;
56  template <typename T> using s2m_t = sc_core::sc_out<T>;
57  template <typename T> using m2s_full_t = scc::sc_in_opt<T>;
58  template <typename T> using s2m_full_t = scc::sc_out_opt<T>;
59  template <typename T> using m2s_opt_t = scc::sc_in_opt<T>;
60  template <typename T> using s2m_opt_t = scc::sc_out_opt<T>;
61 };
62 
63 struct signal_types {
64  template <typename T> using m2s_t = sc_core::sc_signal<T>;
65  template <typename T> using s2m_t = sc_core::sc_signal<T>;
66  template <typename T> using m2s_full_t = sc_core::sc_signal<T>;
67  template <typename T> using s2m_full_t = sc_core::sc_signal<T>;
68  template <typename T> using m2s_opt_t = sc_core::sc_signal<T>;
69  template <typename T> using s2m_opt_t = sc_core::sc_signal<T>;
70 };
71 
72 template <bool Cond, class T, class S> struct select_if { typedef S type; };
73 
74 template <class T, class S> struct select_if<true, T, S> { typedef T type; };
75 
76 template <unsigned int BUSWDTH = 32, unsigned int ADDRWDTH = 32, unsigned int IDWDTH = 32, unsigned int USERWDTH = 1> struct axi4_cfg {
77  static_assert(BUSWDTH > 0, "BUSWIDTH shall be larger than 0");
78  static_assert(ADDRWDTH > 0, "ADDRWDTH shall be larger than 0");
79  static_assert(IDWDTH > 0, "IDWDTH shall be larger than 0");
80  constexpr static bool IS_LITE = false;
81  constexpr static unsigned int BUSWIDTH = BUSWDTH;
82  constexpr static unsigned int ADDRWIDTH = ADDRWDTH;
83  constexpr static unsigned int IDWIDTH = IDWDTH;
84  constexpr static unsigned int USERWIDTH = USERWDTH;
85  using data_t = typename select_if<BUSWDTH <= 64, sc_dt::sc_uint<BUSWIDTH>, sc_dt::sc_biguint<BUSWIDTH>>::type;
86  using user_t = typename select_if<USERWIDTH <= 64, sc_dt::sc_uint<USERWIDTH>, sc_dt::sc_biguint<USERWIDTH>>::type;
87  using strb_t = typename select_if<(BUSWDTH / 8) <= 64, sc_dt::sc_uint<BUSWIDTH / 8>, sc_dt::sc_biguint<BUSWIDTH / 8>>::type;
90 };
91 
92 template <unsigned int BUSWDTH = 32, unsigned int ADDRWDTH = 32> struct axi4_lite_cfg {
93  static_assert(BUSWDTH > 0, "BUSWIDTH shall be larger than 0");
94  static_assert(ADDRWDTH > 0, "ADDRWDTH shall be larger than 0");
95  constexpr static bool IS_LITE = true;
96  constexpr static unsigned int BUSWIDTH = BUSWDTH;
97  constexpr static unsigned int ADDRWIDTH = ADDRWDTH;
98  constexpr static unsigned int IDWIDTH = 0;
99  constexpr static unsigned int USERWIDTH = 1;
100  using data_t = typename select_if<BUSWDTH <= 64, sc_dt::sc_uint<BUSWIDTH>, sc_dt::sc_biguint<BUSWIDTH>>::type;
101  using user_t = typename select_if<USERWIDTH <= 64, sc_dt::sc_uint<USERWIDTH>, sc_dt::sc_biguint<USERWIDTH>>::type;
102  using strb_t = typename select_if<(BUSWDTH / 8) <= 64, sc_dt::sc_uint<BUSWIDTH / 8>, sc_dt::sc_biguint<BUSWIDTH / 8>>::type;
105 };
116 template <unsigned int BUSWDTH = 32, unsigned int ADDRWDTH = 32, unsigned int IDWDTH = 32, unsigned int USERWDTH = 1,
117  unsigned int AWSNOOPWDTH = 3, unsigned int RESPWDTH = 4>
118 struct ace_cfg {
119 
120  static_assert(BUSWDTH > 0, "BUSWIDTH shall be larger than 0");
121  // static_assert(CACHELINE > 0);
122  static_assert(ADDRWDTH > 0, "ADDRWDTH shall be larger than 0");
123  static_assert(IDWDTH > 0, "IDWDTH shall be larger than 0");
124  constexpr static bool IS_LITE = false;
125  constexpr static unsigned int BUSWIDTH = BUSWDTH;
126  constexpr static unsigned int ADDRWIDTH = ADDRWDTH;
127  constexpr static unsigned int IDWIDTH = IDWDTH;
128  constexpr static unsigned int USERWIDTH = USERWDTH;
129  constexpr static unsigned int AWSNOOPWIDTH = AWSNOOPWDTH;
130  constexpr static unsigned int RESPWIDTH = RESPWDTH;
131  using data_t = typename select_if<BUSWDTH <= 64, sc_dt::sc_uint<BUSWIDTH>, sc_dt::sc_biguint<BUSWIDTH>>::type;
132  using user_t = typename select_if<USERWIDTH <= 64, sc_dt::sc_uint<USERWIDTH>, sc_dt::sc_biguint<USERWIDTH>>::type;
133  using strb_t = typename select_if<(BUSWDTH / 8) <= 64, sc_dt::sc_uint<BUSWIDTH / 8>, sc_dt::sc_biguint<BUSWIDTH / 8>>::type;
136 };
137 
138 inline std::string concat(const char* prefix, const char* name) { return std::string(prefix) + name; }
139 
141 template <typename CFG, typename TYPES = master_types> struct aw_axi_lite;
142 template <typename CFG, typename TYPES = master_types> struct aw_axi {
143  typename TYPES::template m2s_full_t<sc_dt::sc_uint<CFG::IDWIDTH>> aw_id{"aw_id"};
144  typename TYPES::template m2s_t<sc_dt::sc_uint<CFG::ADDRWIDTH>> aw_addr{"aw_addr"};
145  typename TYPES::template s2m_t<bool> aw_ready{"aw_ready"};
146  typename TYPES::template m2s_full_t<bool> aw_lock{"aw_lock"}; // AXI3 has 2 bits while AXI4 has 1 bit
147  typename TYPES::template m2s_t<bool> aw_valid{"aw_valid"};
148  typename TYPES::template m2s_t<sc_dt::sc_uint<3>> aw_prot{"aw_prot"};
149  typename TYPES::template m2s_full_t<sc_dt::sc_uint<3>> aw_size{"aw_size"};
150  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> aw_cache{"aw_cache"};
151  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> aw_burst{"aw_burst"};
152  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> aw_qos{"aw_qos"};
153  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> aw_region{"aw_region"};
154  typename TYPES::template m2s_full_t<sc_dt::sc_uint<8>> aw_len{"aw_len"};
155  typename TYPES::template m2s_opt_t<typename CFG::user_t> aw_user{"aw_user"};
156 
157  aw_axi() = default;
158  aw_axi(const char* prefix)
159  : aw_id{concat(prefix, "_id").c_str()}
160  , aw_addr{concat(prefix, "_addr").c_str()}
161  , aw_ready{concat(prefix, "_ready").c_str()}
162  , aw_lock{concat(prefix, "_lock").c_str()}
163  , aw_valid{concat(prefix, "_valid").c_str()}
164  , aw_prot{concat(prefix, "_prot").c_str()}
165  , aw_size{concat(prefix, "_size").c_str()}
166  , aw_cache{concat(prefix, "_cache").c_str()}
167  , aw_burst{concat(prefix, "_burst").c_str()}
168  , aw_qos{concat(prefix, "_qos").c_str()}
169  , aw_region{concat(prefix, "_region").c_str()}
170  , aw_len{concat(prefix, "_len").c_str()}
171  , aw_user{concat(prefix, "_user").c_str()} {}
172 
173  template <typename OTYPES> void bind_aw(aw_axi<CFG, OTYPES>& o) {
174  aw_id.bind(o.aw_id);
175  aw_addr.bind(o.aw_addr);
176  aw_ready.bind(o.aw_ready);
177  aw_lock.bind(o.aw_lock); // only AXI3
178  aw_valid.bind(o.aw_valid);
179  aw_prot.bind(o.aw_prot);
180  aw_size.bind(o.aw_size);
181  aw_cache.bind(o.aw_cache);
182  aw_burst.bind(o.aw_burst);
183  aw_qos.bind(o.aw_qos);
184  aw_region.bind(o.aw_region);
185  aw_len.bind(o.aw_len);
186  aw_user.bind(o.aw_user);
187  }
188  template <typename OTYPES> void bind_aw(aw_axi_lite<CFG, OTYPES>& o);
189 };
190 
192 template <typename CFG, typename TYPES = master_types> struct wdata_axi_lite;
193 template <typename CFG, typename TYPES = master_types> struct wdata_axi {
194  typename TYPES::template m2s_opt_t<sc_dt::sc_uint<CFG::IDWIDTH>> w_id{"w_id"};
195  typename TYPES::template m2s_t<typename CFG::data_t> w_data{"w_data"};
196  typename TYPES::template m2s_t<typename CFG::strb_t> w_strb{"w_strb"};
197  typename TYPES::template m2s_full_t<bool> w_last{"w_last"};
198  typename TYPES::template m2s_t<bool> w_valid{"w_valid"};
199  typename TYPES::template s2m_t<bool> w_ready{"w_ready"};
200  typename TYPES::template m2s_opt_t<typename CFG::user_t> w_user{"w_user"};
201  typename TYPES::template m2s_full_t<bool> w_ack{"w_ack"}; // only ACE
202  typename TYPES::template m2s_opt_t<bool> w_trace{"w_trace"};
203 
204  wdata_axi() = default;
205  wdata_axi(const char* prefix)
206  : w_id{concat(prefix, "_id").c_str()}
207  , w_data{concat(prefix, "_data").c_str()}
208  , w_strb{concat(prefix, "_strb").c_str()}
209  , w_last{concat(prefix, "_last").c_str()}
210  , w_valid{concat(prefix, "_valid").c_str()}
211  , w_ready{concat(prefix, "_ready").c_str()}
212  , w_user{concat(prefix, "_user").c_str()}
213  , w_ack{concat(prefix, "_ack").c_str()} // only ACE
214  , w_trace{concat(prefix, "_trace").c_str()} {}
215 
216  template <typename OTYPES> void bind_w(wdata_axi<CFG, OTYPES>& o) {
217  w_id.bind(o.w_id);
218  w_data.bind(o.w_data);
219  w_strb.bind(o.w_strb);
220  w_last.bind(o.w_last);
221  w_valid.bind(o.w_valid);
222  w_ready.bind(o.w_ready);
223  w_user.bind(o.w_user);
224  w_ack.bind(o.w_ack); // only ACE
225  w_trace.bind(o.w_trace);
226  }
227  template <typename OTYPES> void bind_wdata(wdata_axi<CFG, OTYPES>& o) { bind_w(o); }
228  template <typename OTYPES> void bind_w(wdata_axi_lite<CFG, OTYPES>& o);
229  template <typename OTYPES> void bind_wdata(wdata_axi_lite<CFG, OTYPES>& o) { bind_w(o); }
230 };
231 
233 template <typename CFG, typename TYPES = master_types> struct b_axi_lite;
234 template <typename CFG, typename TYPES = master_types> struct b_axi {
235  typename TYPES::template s2m_t<bool> b_valid{"b_valid"};
236  typename TYPES::template m2s_t<bool> b_ready{"b_ready"};
237  typename TYPES::template s2m_full_t<sc_dt::sc_uint<CFG::IDWIDTH>> b_id{"b_id"};
238  typename TYPES::template s2m_t<sc_dt::sc_uint<2>> b_resp{"b_resp"};
239  typename TYPES::template s2m_opt_t<typename CFG::user_t> b_user{"b_user"};
240  typename TYPES::template s2m_opt_t<bool> b_trace{"b_trace"};
241 
242  b_axi() = default;
243  b_axi(const char* prefix)
244  : b_valid{concat(prefix, "_valid").c_str()}
245  , b_ready{concat(prefix, "_ready").c_str()}
246  , b_id{concat(prefix, "_id").c_str()}
247  , b_resp{concat(prefix, "_resp").c_str()}
248  , b_user{concat(prefix, "_user").c_str()}
249  , b_trace{concat(prefix, "_trace").c_str()} {}
250 
251  template <typename OTYPES> void bind_b(b_axi<CFG, OTYPES>& o) {
252  b_valid.bind(o.b_valid);
253  b_ready.bind(o.b_ready);
254  b_id.bind(o.b_id);
255  b_resp.bind(o.b_resp);
256  b_user.bind(o.b_user);
257  b_trace.bind(o.b_trace);
258  }
259  template <typename OTYPES> void bind_b(b_axi_lite<CFG, OTYPES>& o);
260 };
261 
263 template <typename CFG, typename TYPES = master_types> struct ar_axi_lite;
264 template <typename CFG, typename TYPES = master_types> struct ar_axi {
265  typename TYPES::template m2s_full_t<sc_dt::sc_uint<CFG::IDWIDTH>> ar_id{"ar_id"};
266  typename TYPES::template m2s_t<sc_dt::sc_uint<CFG::ADDRWIDTH>> ar_addr{"ar_addr"};
267  typename TYPES::template m2s_full_t<sc_dt::sc_uint<8>> ar_len{"ar_len"};
268  typename TYPES::template m2s_full_t<sc_dt::sc_uint<3>> ar_size{"ar_size"};
269  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> ar_burst{"ar_burst"};
270  typename TYPES::template m2s_full_t<bool> ar_lock{"ar_lock"}; // AXI3 has 2 bits while AXI4 has i bit
271  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> ar_cache{"ar_cache"};
272  typename TYPES::template m2s_t<sc_dt::sc_uint<3>> ar_prot{"ar_prot"};
273  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> ar_qos{"ar_qos"};
274  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> ar_region{"ar_region"};
275  typename TYPES::template m2s_t<bool> ar_valid{"ar_valid"};
276  typename TYPES::template s2m_t<bool> ar_ready{"ar_ready"};
277  typename TYPES::template m2s_opt_t<typename CFG::user_t> ar_user{"ar_user"};
278 
279  ar_axi() = default;
280  ar_axi(const char* prefix)
281  : ar_id{concat(prefix, "_id").c_str()}
282  , ar_addr{concat(prefix, "_addr").c_str()}
283  , ar_len{concat(prefix, "_len").c_str()}
284  , ar_size{concat(prefix, "_size").c_str()}
285  , ar_burst{concat(prefix, "_burst").c_str()}
286  , ar_lock{concat(prefix, "_lock").c_str()} // only AXI3
287  , ar_cache{concat(prefix, "_cache").c_str()}
288  , ar_prot{concat(prefix, "_prot").c_str()}
289  , ar_qos{concat(prefix, "_qos").c_str()}
290  , ar_region{concat(prefix, "_region").c_str()}
291  , ar_valid{concat(prefix, "_valid").c_str()}
292  , ar_ready{concat(prefix, "_ready").c_str()}
293  , ar_user{concat(prefix, "_user").c_str()} {}
294 
295  template <typename OTYPES> void bind_ar(ar_axi<CFG, OTYPES>& o) {
296  ar_id.bind(o.ar_id);
297  ar_addr.bind(o.ar_addr);
298  ar_len.bind(o.ar_len);
299  ar_size.bind(o.ar_size);
300  ar_burst.bind(o.ar_burst);
301  ar_lock.bind(o.ar_lock); // only AXI3
302  ar_cache.bind(o.ar_cache);
303  ar_prot.bind(o.ar_prot);
304  ar_qos.bind(o.ar_qos);
305  ar_region.bind(o.ar_region);
306  ar_valid.bind(o.ar_valid);
307  ar_ready.bind(o.ar_ready);
308  ar_user.bind(o.ar_user);
309  }
310  template <typename OTYPES> void bind_ar(ar_axi_lite<CFG, OTYPES>& o);
311 };
312 
314 template <typename CFG, typename TYPES = master_types> struct rresp_axi_lite;
315 template <typename CFG, typename TYPES = master_types> struct rresp_axi {
316  typename TYPES::template s2m_full_t<sc_dt::sc_uint<CFG::IDWIDTH>> r_id{"r_id"};
317  typename TYPES::template s2m_t<typename CFG::data_t> r_data{"r_data"};
318  typename TYPES::template s2m_t<sc_dt::sc_uint<2>> r_resp{"r_resp"};
319  typename TYPES::template s2m_full_t<bool> r_last{"r_last"};
320  typename TYPES::template s2m_t<bool> r_valid{"r_valid"};
321  typename TYPES::template m2s_t<bool> r_ready{"r_ready"};
322  typename TYPES::template s2m_opt_t<typename CFG::user_t> r_user{"r_user"};
323  typename TYPES::template s2m_opt_t<bool> r_trace{"r_trace"};
324 
325  rresp_axi() = default;
326  rresp_axi(const char* prefix)
327  : r_id{concat(prefix, "_id").c_str()}
328  , r_data{concat(prefix, "_data").c_str()}
329  , r_resp{concat(prefix, "_resp").c_str()}
330  , r_last{concat(prefix, "_last").c_str()}
331  , r_valid{concat(prefix, "_valid").c_str()}
332  , r_ready{concat(prefix, "_ready").c_str()}
333  , r_user{concat(prefix, "_user").c_str()}
334  , r_trace{concat(prefix, "_trace").c_str()} {}
335 
336  template <typename OTYPES> void bind_r(rresp_axi<CFG, OTYPES>& o) {
337  r_id.bind(o.r_id);
338  r_data.bind(o.r_data);
339  r_resp.bind(o.r_resp);
340  r_last.bind(o.r_last);
341  r_valid.bind(o.r_valid);
342  r_ready.bind(o.r_ready);
343  r_user.bind(o.r_user);
344  r_trace.bind(o.r_trace);
345  }
346  template <typename OTYPES> void bind_rresp(rresp_axi<CFG, OTYPES>& o) { bind_r(o); }
347  template <typename OTYPES> void bind_r(rresp_axi_lite<CFG, OTYPES>& o);
348  template <typename OTYPES> void bind_rresp(rresp_axi_lite<CFG, OTYPES>& o) { bind_r(o); }
349 };
350 
351 template <typename CFG, typename TYPES = master_types> struct rresp_ace {
352  typename TYPES::template s2m_full_t<sc_dt::sc_uint<CFG::IDWIDTH>> r_id{"r_id"};
353  typename TYPES::template s2m_t<typename CFG::data_t> r_data{"r_data"};
354  typename TYPES::template s2m_t<sc_dt::sc_uint<CFG::RESPWIDTH>> r_resp{"r_resp"}; // ACE5-Lite has only 2
355  typename TYPES::template s2m_full_t<bool> r_last{"r_last"};
356  typename TYPES::template s2m_t<bool> r_valid{"r_valid"};
357  typename TYPES::template m2s_t<bool> r_ready{"r_ready"};
358  typename TYPES::template s2m_opt_t<typename CFG::user_t> r_user{"r_user"};
359  typename TYPES::template s2m_opt_t<bool> r_trace{"r_trace"}; // ACE5
360  typename TYPES::template m2s_t<bool> r_ack{"r_ack"}; // only ACE
361 
362  rresp_ace() = default;
363  rresp_ace(const char* prefix)
364  : r_id{concat(prefix, "_id").c_str()}
365  , r_data{concat(prefix, "_data").c_str()}
366  , r_resp{concat(prefix, "_resp").c_str()}
367  , r_last{concat(prefix, "_last").c_str()}
368  , r_valid{concat(prefix, "_valid").c_str()}
369  , r_ready{concat(prefix, "_ready").c_str()}
370  , r_user{concat(prefix, "_user").c_str()}
371  , r_trace{concat(prefix, "_trace").c_str()}
372  , r_ack{concat(prefix, "_ack").c_str()} {}
373 
374  template <typename OTYPES> void bind_r(rresp_ace<CFG, OTYPES>& o) {
375  r_id.bind(o.r_id);
376  r_data.bind(o.r_data);
377  r_resp.bind(o.r_resp);
378  r_last.bind(o.r_last);
379  r_valid.bind(o.r_valid);
380  r_ready.bind(o.r_ready);
381  r_user.bind(o.r_user);
382  r_ack.bind(o.r_ack); // only ACE,not for Lite
383  r_trace.bind(o.r_trace);
384  }
385  template <typename OTYPES> void bind_rresp(rresp_ace<CFG, OTYPES>& o) { bind_r(o); }
386 };
387 
389 template <typename CFG, typename TYPES> struct aw_axi_lite {
390  typename TYPES::template m2s_t<sc_dt::sc_uint<CFG::ADDRWIDTH>> aw_addr{"aw_addr"};
391  typename TYPES::template s2m_t<bool> aw_ready{"aw_ready"};
392  typename TYPES::template m2s_t<bool> aw_valid{"aw_valid"};
393  typename TYPES::template m2s_t<sc_dt::sc_uint<3>> aw_prot{"aw_prot"};
394 
395  aw_axi_lite() = default;
396  aw_axi_lite(const char* prefix)
397  : aw_addr{concat(prefix, "_addr").c_str()}
398  , aw_ready{concat(prefix, "_ready").c_str()}
399  , aw_valid{concat(prefix, "_valid").c_str()}
400  , aw_prot{concat(prefix, "_prot").c_str()} {}
401 
402  template <typename OTYPES> void bind_aw(aw_axi<CFG, OTYPES>& o) {
403  aw_addr.bind(o.aw_addr);
404  aw_ready.bind(o.aw_ready);
405  aw_valid.bind(o.aw_valid);
406  aw_prot.bind(o.aw_prot);
407  }
408 };
409 
411 template <typename CFG, typename TYPES> struct wdata_axi_lite {
412  typename TYPES::template m2s_t<typename CFG::data_t> w_data{"w_data"};
413  typename TYPES::template m2s_t<typename CFG::strb_t> w_strb{"w_strb"};
414  typename TYPES::template m2s_t<bool> w_valid{"w_valid"};
415  typename TYPES::template s2m_t<bool> w_ready{"w_ready"};
416 
417  wdata_axi_lite() = default;
418  wdata_axi_lite(const char* prefix)
419  : w_data{concat(prefix, "_data").c_str()}
420  , w_strb{concat(prefix, "_strb").c_str()}
421  , w_valid{concat(prefix, "_valid").c_str()}
422  , w_ready{concat(prefix, "_ready").c_str()} {}
423 
424  template <typename OTYPES> void bind_w(wdata_axi<CFG, OTYPES>& o) {
425  w_data.bind(o.w_data);
426  w_strb.bind(o.w_strb);
427  w_valid.bind(o.w_valid);
428  w_ready.bind(o.w_ready);
429  }
430 };
431 
433 template <typename CFG, typename TYPES> struct b_axi_lite {
434  typename TYPES::template s2m_t<bool> b_valid{"b_valid"};
435  typename TYPES::template m2s_t<bool> b_ready{"b_ready"};
436  typename TYPES::template s2m_t<sc_dt::sc_uint<2>> b_resp{"b_resp"};
437 
438  b_axi_lite() = default;
439  b_axi_lite(const char* prefix)
440  : b_valid{concat(prefix, "_valid").c_str()}
441  , b_ready{concat(prefix, "_ready").c_str()}
442  , b_resp{concat(prefix, "_resp").c_str()} {}
443 
444  template <typename OTYPES> void bind_b(b_axi<CFG, OTYPES>& o) {
445  b_valid.bind(o.b_valid);
446  b_ready.bind(o.b_ready);
447  b_resp.bind(o.b_resp);
448  }
449 };
450 
452 template <typename CFG, typename TYPES> struct ar_axi_lite {
453  typename TYPES::template m2s_t<sc_dt::sc_uint<CFG::ADDRWIDTH>> ar_addr{"ar_addr"};
454  typename TYPES::template m2s_t<sc_dt::sc_uint<3>> ar_prot{"ar_prot"};
455  typename TYPES::template m2s_t<bool> ar_valid{"ar_valid"};
456  typename TYPES::template s2m_t<bool> ar_ready{"ar_ready"};
457 
458  ar_axi_lite() = default;
459  ar_axi_lite(const char* prefix)
460  : ar_addr{concat(prefix, "_addr").c_str()}
461  , ar_prot{concat(prefix, "_prot").c_str()}
462  , ar_valid{concat(prefix, "_valid").c_str()}
463  , ar_ready{concat(prefix, "_ready").c_str()} {}
464 
465  template <typename OTYPES> void bind_ar(ar_axi<CFG, OTYPES>& o) {
466  ar_addr.bind(o.ar_addr);
467  ar_prot.bind(o.ar_prot);
468  ar_valid.bind(o.ar_valid);
469  ar_ready.bind(o.ar_ready);
470  }
471 };
472 
474 template <typename CFG, typename TYPES> struct rresp_axi_lite {
475  typename TYPES::template s2m_t<typename CFG::data_t> r_data{"r_data"};
476  typename TYPES::template s2m_t<sc_dt::sc_uint<2>> r_resp{"r_resp"};
477  typename TYPES::template s2m_t<bool> r_valid{"r_valid"};
478  typename TYPES::template m2s_t<bool> r_ready{"r_ready"};
479 
480  rresp_axi_lite() = default;
481  rresp_axi_lite(const char* prefix)
482  : r_data{concat(prefix, "_data").c_str()}
483  , r_resp{concat(prefix, "_resp").c_str()}
484  , r_valid{concat(prefix, "_valid").c_str()}
485  , r_ready{concat(prefix, "_ready").c_str()} {}
486 
487  template <typename OTYPES> void bind_r(rresp_axi<CFG, OTYPES>& o) {
488  r_data.bind(o.r_data);
489  r_resp.bind(o.r_resp);
490  r_valid.bind(o.r_valid);
491  r_ready.bind(o.r_ready);
492  }
493 };
494 
495 template <typename CFG, typename TYPES = master_types> struct ar_ace {
496  typename TYPES::template m2s_full_t<sc_dt::sc_uint<CFG::IDWIDTH>> ar_id{"ar_id"};
497  typename TYPES::template m2s_t<sc_dt::sc_uint<CFG::ADDRWIDTH>> ar_addr{"ar_addr"};
498  typename TYPES::template m2s_full_t<sc_dt::sc_uint<8>> ar_len{"ar_len"};
499  typename TYPES::template m2s_full_t<sc_dt::sc_uint<3>> ar_size{"ar_size"};
500  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> ar_burst{"ar_burst"};
501  typename TYPES::template m2s_t<bool> ar_lock{"ar_lock"};
502  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> ar_cache{"ar_cache"};
503  typename TYPES::template m2s_t<sc_dt::sc_uint<3>> ar_prot{"ar_prot"};
504  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> ar_qos{"ar_qos"};
505  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> ar_region{"ar_region"};
506  typename TYPES::template m2s_t<bool> ar_valid{"ar_valid"};
507  typename TYPES::template s2m_t<bool> ar_ready{"ar_ready"};
508  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> ar_domain{"ar_domain"};
509  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> ar_snoop{"ar_snoop"};
510  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> ar_bar{"ar_bar"};
511  typename TYPES::template m2s_opt_t<typename CFG::user_t> ar_user{"ar_user"};
512  typename TYPES::template m2s_opt_t<bool> ar_trace{"ar_trace"};
513  typename TYPES::template m2s_opt_t<sc_dt::sc_uint<4>> ar_vmidext{"ar_vmidext"}; // ACE5
514 
515  ar_ace() = default;
516  ar_ace(const char* prefix)
517  : ar_id{concat(prefix, "_id").c_str()}
518  , ar_addr{concat(prefix, "_addr").c_str()}
519  , ar_len{concat(prefix, "_len").c_str()}
520  , ar_size{concat(prefix, "_size").c_str()}
521  , ar_burst{concat(prefix, "_burst").c_str()}
522  , ar_lock{concat(prefix, "_lock").c_str()} // only AXI3
523  , ar_cache{concat(prefix, "_cache").c_str()}
524  , ar_prot{concat(prefix, "_prot").c_str()}
525  , ar_qos{concat(prefix, "_qos").c_str()}
526  , ar_region{concat(prefix, "_region").c_str()}
527  , ar_valid{concat(prefix, "_valid").c_str()}
528  , ar_ready{concat(prefix, "_ready").c_str()}
529  , ar_domain{concat(prefix, "_domain").c_str()}
530  , ar_snoop{concat(prefix, "_snoop").c_str()}
531  , ar_bar{concat(prefix, "_bar").c_str()}
532  , ar_user{concat(prefix, "_user").c_str()}
533  , ar_trace{concat(prefix, "_trace").c_str()}
534  , ar_vmidext{concat(prefix, "_vmidext").c_str()} {}
535 
536  template <typename OTYPES> void bind_ar(ar_ace<CFG, OTYPES>& o) {
537  ar_id.bind(o.ar_id);
538  ar_addr.bind(o.ar_addr);
539  ar_len.bind(o.ar_len);
540  ar_size.bind(o.ar_size);
541  ar_burst.bind(o.ar_burst);
542  ar_lock.bind(o.ar_lock); // only AXI3
543  ar_cache.bind(o.ar_cache);
544  ar_prot.bind(o.ar_prot);
545  ar_qos.bind(o.ar_qos);
546  ar_region.bind(o.ar_region);
547  ar_valid.bind(o.ar_valid);
548  ar_ready.bind(o.ar_ready);
549  ar_domain.bind(o.ar_domain);
550  ar_snoop.bind(o.ar_snoop);
551  ar_bar.bind(o.ar_bar); //
552  ar_user.bind(o.ar_user);
553  ar_trace.bind(o.ar_trace);
554  }
555 };
556 
557 template <typename CFG, typename TYPES = master_types> struct aw_ace {
558  typename TYPES::template m2s_full_t<sc_dt::sc_uint<CFG::IDWIDTH>> aw_id{"aw_id"};
559  typename TYPES::template m2s_t<sc_dt::sc_uint<CFG::ADDRWIDTH>> aw_addr{"aw_addr"};
560  typename TYPES::template s2m_t<bool> aw_ready{"aw_ready"};
561  typename TYPES::template m2s_t<bool> aw_lock{"aw_lock"};
562  typename TYPES::template m2s_t<bool> aw_valid{"aw_valid"};
563  typename TYPES::template m2s_t<sc_dt::sc_uint<3>> aw_prot{"aw_prot"};
564  typename TYPES::template m2s_full_t<sc_dt::sc_uint<3>> aw_size{"aw_size"};
565  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> aw_cache{"aw_cache"};
566  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> aw_burst{"aw_burst"};
567  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> aw_qos{"aw_qos"};
568  typename TYPES::template m2s_full_t<sc_dt::sc_uint<4>> aw_region{"aw_region"};
569  typename TYPES::template m2s_full_t<sc_dt::sc_uint<8>> aw_len{"aw_len"};
570  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> aw_domain{"aw_domain"}; // ace
571  typename TYPES::template m2s_full_t<sc_dt::sc_uint<CFG::AWSNOOPWIDTH>> aw_snoop{"aw_snoop"}; // ace5-lite has 4 bits
572  typename TYPES::template m2s_full_t<sc_dt::sc_uint<2>> aw_bar{"aw_bar"}; // ace
573  typename TYPES::template m2s_t<bool> aw_unique{"aw_unique"}; // ace, not for lite
574  typename TYPES::template m2s_full_t<typename CFG::user_t> aw_user{"aw_user"};
575  typename TYPES::template m2s_t<bool> aw_stashniden{"aw_stashniden"}; // stash only for ACE5L
576  typename TYPES::template m2s_full_t<sc_dt::sc_uint<11>> aw_stashnid{"aw_stashnid"};
577  typename TYPES::template m2s_t<bool> aw_stashlpiden{"aw_stashlpiden"};
578  typename TYPES::template m2s_full_t<sc_dt::sc_uint<5>> aw_stashlpid{"aw_stashlpid"};
579  typename TYPES::template m2s_opt_t<sc_dt::sc_uint<6>> aw_atop{"aw_atop"}; // only for ace lite
580  typename TYPES::template m2s_opt_t<bool> aw_trace{"aw_trace"};
581 
582  aw_ace() = default;
583  aw_ace(const char* prefix)
584  : aw_id{concat(prefix, "_id").c_str()}
585  , aw_addr{concat(prefix, "_addr").c_str()}
586  , aw_ready{concat(prefix, "_ready").c_str()}
587  , aw_lock{concat(prefix, "_lock").c_str()}
588  , aw_valid{concat(prefix, "_valid").c_str()}
589  , aw_prot{concat(prefix, "_prot").c_str()}
590  , aw_size{concat(prefix, "_size").c_str()}
591  , aw_cache{concat(prefix, "_cache").c_str()}
592  , aw_burst{concat(prefix, "_burst").c_str()}
593  , aw_qos{concat(prefix, "_qos").c_str()}
594  , aw_region{concat(prefix, "_region").c_str()}
595  , aw_len{concat(prefix, "_len").c_str()}
596  , aw_domain{concat(prefix, "_domain").c_str()}
597  , aw_snoop{concat(prefix, "_snoop").c_str()}
598  , aw_bar{concat(prefix, "_bar").c_str()}
599  , aw_unique{concat(prefix, "_unique").c_str()}
600  , aw_user{concat(prefix, "_user").c_str()}
601  , aw_stashniden{concat(prefix, "_stashniden").c_str()}
602  , aw_stashnid{concat(prefix, "_stashnid").c_str()}
603  , aw_stashlpiden{concat(prefix, "_stashlpiden").c_str()}
604  , aw_stashlpid{concat(prefix, "_stashlpid").c_str()}
605  , aw_atop{concat(prefix, "_atop").c_str()}
606  , aw_trace{concat(prefix, "_trace").c_str()} {}
607 
608  template <typename OTYPES> void bind_aw(aw_ace<CFG, OTYPES>& o) {
609  aw_id.bind(o.aw_id);
610  aw_addr.bind(o.aw_addr);
611  aw_ready.bind(o.aw_ready);
612  aw_lock.bind(o.aw_lock); // only AXI3
613  aw_valid.bind(o.aw_valid);
614  aw_prot.bind(o.aw_prot);
615  aw_size.bind(o.aw_size);
616  aw_cache.bind(o.aw_cache);
617  aw_burst.bind(o.aw_burst);
618  aw_qos.bind(o.aw_qos);
619  aw_region.bind(o.aw_region);
620  aw_len.bind(o.aw_len);
621  aw_domain.bind(o.aw_domain);
622  aw_snoop.bind(o.aw_snoop);
623  aw_bar.bind(o.aw_bar);
624  aw_unique.bind(o.aw_unique);
625  aw_user.bind(o.aw_user);
626  aw_stashniden.bind(o.aw_stashniden);
627  aw_stashnid.bind(o.aw_stashnid);
628  aw_stashlpiden.bind(o.aw_stashlpiden);
629  aw_stashlpid.bind(o.aw_stashlpid);
630  aw_atop.bind(o.aw_atop);
631  aw_trace.bind(o.aw_trace);
632  }
633 };
634 
636 template <typename CFG, typename TYPES = master_types> struct ac_ace {
637  typename TYPES::template s2m_t<bool> ac_valid{"ac_valid"};
638  typename TYPES::template m2s_t<bool> ac_ready{"ac_ready"};
639  typename TYPES::template s2m_t<sc_dt::sc_uint<CFG::ADDRWIDTH>> ac_addr{"ac_addr"};
640  typename TYPES::template s2m_full_t<sc_dt::sc_uint<4>> ac_snoop{"ac_snoop"};
641  typename TYPES::template s2m_full_t<sc_dt::sc_uint<3>> ac_prot{"ac_prot"};
642  typename TYPES::template s2m_opt_t<sc_dt::sc_uint<4>> ac_vmidext{"ac_vmidext"}; // ACE5
643  typename TYPES::template s2m_opt_t<bool> ac_trace{"ac_trace"}; // ACE5
644 
645  ac_ace() = default;
646  ac_ace(const char* prefix)
647  : ac_valid{concat(prefix, "_valid").c_str()}
648  , ac_ready{concat(prefix, "_ready").c_str()}
649  , ac_addr{concat(prefix, "_addr").c_str()}
650  , ac_snoop{concat(prefix, "_snoop").c_str()}
651  , ac_prot{concat(prefix, "_prot").c_str()}
652  , ac_vmidext{concat(prefix, "avmidext").c_str()}
653  , ac_trace{concat(prefix, "_trace").c_str()} {}
654 
655  template <typename OTYPES> void bind_ac(ac_ace<CFG, OTYPES>& o) {
656  ac_valid.bind(o.ac_valid);
657  ac_ready.bind(o.ac_ready);
658  ac_addr.bind(o.ac_addr);
659  ac_snoop.bind(o.ac_snoop);
660  ac_prot.bind(o.ac_prot);
661  }
662 };
663 
665 template <typename CFG, typename TYPES = master_types> struct cd_ace {
666  typename TYPES::template m2s_t<bool> cd_valid{"cd_valid"};
667  typename TYPES::template s2m_t<bool> cd_ready{"cd_ready"};
668  typename TYPES::template m2s_t<typename CFG::data_t> cd_data{"cd_data"};
669  typename TYPES::template m2s_full_t<bool> cd_last{"cd_last"};
670 
671  cd_ace() = default;
672  cd_ace(const char* prefix)
673  : cd_valid{concat(prefix, "_valid").c_str()}
674  , cd_ready{concat(prefix, "_ready").c_str()}
675  , cd_data{concat(prefix, "_data").c_str()}
676  , cd_last{concat(prefix, "_last").c_str()} {}
677 
678  template <typename OTYPES> void bind_cd(cd_ace<CFG, OTYPES>& o) {
679  cd_valid.bind(o.cd_valid);
680  cd_ready.bind(o.cd_ready);
681  cd_data.bind(o.cd_data);
682  cd_last.bind(o.cd_last);
683  }
684 };
685 
687 template <typename CFG, typename TYPES = master_types> struct cr_ace {
688  typename TYPES::template m2s_t<bool> cr_valid{"cr_valid"};
689  typename TYPES::template s2m_t<bool> cr_ready{"cr_ready"};
690  typename TYPES::template m2s_t<sc_dt::sc_uint<5>> cr_resp{"cr_resp"};
691  typename TYPES::template m2s_opt_t<bool> cr_trace{"cr_trace"}; // ACE5
692 
693  cr_ace() = default;
694  cr_ace(const char* prefix)
695  : cr_valid{concat(prefix, "_valid").c_str()}
696  , cr_ready{concat(prefix, "_ready").c_str()}
697  , cr_resp{concat(prefix, "_resp").c_str()}
698  , cr_trace{concat(prefix, "_trace").c_str()} {}
699 
700  template <typename OTYPES> void bind_cr(cr_ace<CFG, OTYPES>& o) {
701  cr_valid.bind(o.cr_valid);
702  cr_ready.bind(o.cr_ready);
703  cr_resp.bind(o.cr_resp);
704  }
705 };
707 template <typename CFG, typename TYPES = master_types> using wdata_ace = wdata_axi<CFG, TYPES>;
708 template <typename CFG, typename TYPES = master_types> using b_ace = b_axi<CFG, TYPES>;
709 template <typename CFG, typename TYPES = master_types> using wdata_ace_lite = wdata_axi<CFG, TYPES>;
710 template <typename CFG, typename TYPES = master_types> using b_ace_lite = b_axi<CFG, TYPES>;
711 template <typename CFG, typename TYPES = master_types> using rresp_ace_lite = rresp_axi<CFG, TYPES>;
712 template <typename CFG, typename TYPES = master_types> using aw_ace_lite = aw_ace<CFG, TYPES>;
713 template <typename CFG, typename TYPES = master_types> using ar_ace_lite = ar_ace<CFG, TYPES>;
714 
715 template <typename CFG, typename TYPES> template <typename OTYPES> inline void ar_axi<CFG, TYPES>::bind_ar(ar_axi_lite<CFG, OTYPES>& o) {
716  ar_addr.bind(o.ar_addr);
717  ar_prot.bind(o.ar_prot);
718  ar_valid.bind(o.ar_valid);
719  ar_ready.bind(o.ar_ready);
720 }
721 
722 template <typename CFG, typename TYPES>
723 template <typename OTYPES>
724 inline void rresp_axi<CFG, TYPES>::bind_r(rresp_axi_lite<CFG, OTYPES>& o) {
725  r_data.bind(o.r_data);
726  r_resp.bind(o.r_resp);
727  r_valid.bind(o.r_valid);
728  r_ready.bind(o.r_ready);
729 }
730 
731 template <typename CFG, typename TYPES> template <typename OTYPES> inline void aw_axi<CFG, TYPES>::bind_aw(aw_axi_lite<CFG, OTYPES>& o) {
732  aw_addr.bind(o.aw_addr);
733  aw_ready.bind(o.aw_ready);
734  aw_valid.bind(o.aw_valid);
735  aw_prot.bind(o.aw_prot);
736 }
737 
738 template <typename CFG, typename TYPES>
739 template <typename OTYPES>
740 inline void wdata_axi<CFG, TYPES>::bind_w(wdata_axi_lite<CFG, OTYPES>& o) {
741  w_data.bind(o.w_data);
742  w_strb.bind(o.w_strb);
743  w_valid.bind(o.w_valid);
744  w_ready.bind(o.w_ready);
745 }
746 
747 template <typename CFG, typename TYPES> template <typename OTYPES> inline void b_axi<CFG, TYPES>::bind_b(b_axi_lite<CFG, OTYPES>& o) {
748  b_valid.bind(o.b_valid);
749  b_ready.bind(o.b_ready);
750  b_resp.bind(o.b_resp);
751 }
752 
753 } // namespace axi
754 #endif /* _BUS_AXI_SIGNAL_IF_H_ */
TLM2.0 components modeling AHB.
Definition: axi_initiator.h:30
snoop address(AC) channel signals
Definition: signal_if.h:636
read address channel signals
Definition: signal_if.h:452
Write address channel signals.
Definition: signal_if.h:389
write response channel signals
Definition: signal_if.h:433
snoop data(cd) channel signals
Definition: signal_if.h:665
snoop response(cr) channel signals
Definition: signal_if.h:687
Read data channel signals.
Definition: signal_if.h:474
write data channel signals
Definition: signal_if.h:411