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