16
16
// Signals for a standard AXI4 compliant interface
17
17
//
18
18
19
- interface axi_if # (parameter integer AW = 32 , parameter integer DW = 32 , parameter integer IW = 3 , parameter integer UW = 32 ) (input logic clk, input logic rst_n);
19
+ interface axi_if # (parameter integer AW = 32 , parameter integer DW = 32 , parameter integer IW = 8 , parameter integer UW = 32 ) (input logic clk, input logic rst_n);
20
20
21
21
import axi_pkg :: * ;
22
22
@@ -35,6 +35,7 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
35
35
logic [DW - 1 : 0 ] rdata;
36
36
logic [$bits (axi_resp_e)- 1 : 0 ] rresp;
37
37
logic [IW - 1 : 0 ] rid;
38
+ logic [UW - 1 : 0 ] ruser;
38
39
logic rlast;
39
40
logic rvalid;
40
41
logic rready;
@@ -53,13 +54,15 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
53
54
// AXI W
54
55
logic [DW - 1 : 0 ] wdata;
55
56
logic [DW / 8 - 1 : 0 ] wstrb;
57
+ logic [UW - 1 : 0 ] wuser;
56
58
logic wvalid;
57
59
logic wready;
58
60
logic wlast;
59
61
60
62
// AXI B
61
63
logic [$bits (axi_resp_e)- 1 : 0 ] bresp;
62
64
logic [IW - 1 : 0 ] bid;
65
+ logic [UW - 1 : 0 ] buser;
63
66
logic bvalid;
64
67
logic bready;
65
68
@@ -79,6 +82,7 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
79
82
input rdata,
80
83
input rresp,
81
84
input rid,
85
+ input ruser,
82
86
input rlast,
83
87
input rvalid,
84
88
output rready
@@ -99,12 +103,14 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
99
103
// W
100
104
output wdata,
101
105
output wstrb,
106
+ output wuser,
102
107
output wvalid,
103
108
input wready,
104
109
output wlast,
105
110
// B
106
111
input bresp,
107
112
input bid,
113
+ input buser,
108
114
input bvalid,
109
115
output bready
110
116
);
@@ -125,6 +131,7 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
125
131
output rdata,
126
132
output rresp,
127
133
output rid,
134
+ output ruser,
128
135
output rlast,
129
136
output rvalid,
130
137
input rready
@@ -145,16 +152,20 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
145
152
// W
146
153
input wdata,
147
154
input wstrb,
155
+ input wuser,
148
156
input wvalid,
149
157
output wready,
150
158
input wlast,
151
159
// B
152
160
output bresp,
153
161
output bid,
162
+ output buser,
154
163
output bvalid,
155
164
input bready
156
165
);
157
166
167
+ // synopsys translate_off
168
+
158
169
// Tasks
159
170
`ifdef VERILATOR
160
171
`define EQ__ =
@@ -186,6 +197,7 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
186
197
187
198
wdata `EQ__ '0 ;
188
199
wstrb `EQ__ '0 ;
200
+ wuser `EQ__ '0 ;
189
201
wvalid `EQ__ '0 ;
190
202
wlast `EQ__ '0 ;
191
203
@@ -194,13 +206,15 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
194
206
195
207
// TODO: handle IDs?
196
208
task get_read_beat (output logic [DW - 1 : 0 ] data,
209
+ output logic [UW - 1 : 0 ] user,
197
210
output axi_resp_e resp);
198
211
`TIME_ALGN
199
212
rready `EQ__ 1 ;
200
213
do
201
214
@ (posedge clk);
202
215
while (! rvalid);
203
216
data `EQ__ rdata;
217
+ user `EQ__ ruser;
204
218
resp `EQ__ axi_resp_e ' (rresp);
205
219
`TIME_ALGN
206
220
rready `EQ__ 0 ;
@@ -216,8 +230,10 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
216
230
input logic [IW - 1 : 0 ] id = IW '(0 ),
217
231
input logic lock = 1'b0 ,
218
232
output logic [DW - 1 : 0 ] data [],
233
+ output logic [UW - 1 : 0 ] resp_user [],
219
234
output axi_resp_e resp []);
220
235
axi_resp_e beat_resp;
236
+ logic [UW - 1 : 0 ] beat_user;
221
237
logic [DW - 1 : 0 ] beat_data;
222
238
while (! rst_n) @ (posedge clk);
223
239
do begin
@@ -244,9 +260,10 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
244
260
data = new [len+ 1 ];
245
261
resp = new [len+ 1 ];
246
262
for (int beat= 0 ; beat <= len; beat++ ) begin
247
- get_read_beat (beat_data, beat_resp);
248
- data[beat] = beat_data;
249
- resp[beat] = beat_resp;
263
+ get_read_beat (beat_data, beat_user, beat_resp);
264
+ data[beat] = beat_data;
265
+ resp_user[beat] = beat_user;
266
+ resp[beat] = beat_resp;
250
267
end
251
268
endtask
252
269
@@ -255,27 +272,33 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
255
272
input logic [IW - 1 : 0 ] id = IW '(0 ),
256
273
input logic lock = 1'b0 ,
257
274
output logic [DW - 1 : 0 ] data,
275
+ output logic [UW - 1 : 0 ] resp_user,
258
276
output axi_resp_e resp);
259
277
automatic axi_resp_e burst_resp[];
278
+ automatic logic [UW - 1 : 0 ] burst_ruser[];
260
279
automatic logic [DW - 1 : 0 ] burst_data[];
261
- axi_read (.addr (addr),
262
- .user (user),
263
- .id (id ),
264
- .lock (lock),
265
- .data (burst_data),
266
- .resp (burst_resp));
267
- data = burst_data[0 ];
268
- resp = burst_resp[0 ];
280
+ axi_read (.addr (addr ),
281
+ .user (user ),
282
+ .id (id ),
283
+ .lock (lock ),
284
+ .data (burst_data ),
285
+ .resp_user (burst_ruser),
286
+ .resp (burst_resp ));
287
+ data = burst_data[0 ];
288
+ resp_user = burst_ruser[0 ];
289
+ resp = burst_resp[0 ];
269
290
endtask
270
291
271
292
task send_write_beat (input logic last,
272
293
input logic [DW - 1 : 0 ] data,
294
+ input logic [UW - 1 : 0 ] user,
273
295
input logic [DW / 8 - 1 : 0 ] strb);
274
296
`TIME_ALGN
275
297
wvalid `EQ__ 1 ;
276
298
wlast `EQ__ last;
277
299
wdata `EQ__ data;
278
300
wstrb `EQ__ strb;
301
+ wuser `EQ__ user;
279
302
do
280
303
@ (posedge clk);
281
304
while (! wready);
@@ -284,17 +307,20 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
284
307
wlast `EQ__ '0 ;
285
308
wdata `EQ__ '0 ;
286
309
wstrb `EQ__ '0 ;
310
+ wuser `EQ__ '0 ;
287
311
wait (! wvalid);
288
312
endtask
289
313
290
314
// TODO handle ID
291
- task get_write_resp (output axi_resp_e resp);
315
+ task get_write_resp (output axi_resp_e resp,
316
+ output logic [UW - 1 : 0 ] user);
292
317
`TIME_ALGN
293
318
bready `EQ__ 1 ;
294
319
do
295
320
@ (posedge clk);
296
321
while (! bvalid);
297
322
resp `EQ__ axi_resp_e ' (bresp);
323
+ user `EQ__ buser;
298
324
`TIME_ALGN
299
325
bready `EQ__ 0 ;
300
326
wait (! bready);
@@ -310,7 +336,10 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
310
336
input logic [DW - 1 : 0 ] data [],
311
337
input logic use_strb = 0 ,
312
338
input logic [DW / 8 - 1 : 0 ] strb [],
313
- output axi_resp_e resp);
339
+ input logic use_write_user = 0 ,
340
+ input logic [UW - 1 : 0 ] write_user [],
341
+ output axi_resp_e resp,
342
+ output logic [UW - 1 : 0 ] resp_user);
314
343
while (! rst_n) @ (posedge clk);
315
344
do begin
316
345
`TIME_ALGN
@@ -335,8 +364,8 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
335
364
awvalid `EQ__ '0 ;
336
365
fork
337
366
for (int beat= 0 ; beat <= len; beat++ )
338
- send_write_beat (beat == len, data[beat], use_strb ? strb[beat] : { DW / 8 { 1'b1 }} );
339
- get_write_resp (resp);
367
+ send_write_beat (beat == len, data[beat], use_write_user ? write_user[beat] : UW ' ( 0 ), use_strb ? strb[beat] : { DW / 8 { 1'b1 }} );
368
+ get_write_resp (resp, resp_user );
340
369
join
341
370
endtask
342
371
@@ -345,8 +374,11 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
345
374
input logic [IW - 1 : 0 ] id = IW '(0 ),
346
375
input logic lock = 1'b0 ,
347
376
input logic [DW - 1 : 0 ] data,
348
- output axi_resp_e resp);
377
+ input logic [UW - 1 : 0 ] write_user = UW '(0 ),
378
+ output axi_resp_e resp,
379
+ output logic [UW - 1 : 0 ] resp_user);
349
380
automatic logic [DW / 8 - 1 : 0 ] burst_strb[] = new [1 ]('{{ DW / 8 { 1'b1 }}} );
381
+ automatic logic [UW - 1 : 0 ] burst_user[] = new [1 ]('{ write_user} );
350
382
automatic logic [DW - 1 : 0 ] burst_data[] = new [1 ]('{ data} );
351
383
axi_write (.addr (addr),
352
384
.user (user),
@@ -355,10 +387,15 @@ interface axi_if #(parameter integer AW = 32, parameter integer DW = 32, paramet
355
387
.data (burst_data),
356
388
.use_strb (0 ),
357
389
.strb (burst_strb),
358
- .resp (resp));
390
+ .use_write_user (0 ),
391
+ .write_user (burst_user),
392
+ .resp (resp),
393
+ .resp_user (resp_user));
359
394
endtask
360
395
361
396
`undef EQ__
362
397
`undef TIME_ALGN
363
398
399
+ // synopsys translate_on
400
+
364
401
endinterface
0 commit comments