OpenCores
URL https://opencores.org/ocsvn/axi_master/axi_master/trunk

Subversion Repositories axi_master

[/] [axi_master/] [trunk/] [src/] [base/] [axi_master_single.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 eyalhoc
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Author: Eyal Hochberg                                      ////
4
////          eyal@provartec.com                                 ////
5
////                                                             ////
6
////  Downloaded from: http://www.opencores.org                  ////
7
/////////////////////////////////////////////////////////////////////
8
////                                                             ////
9
//// Copyright (C) 2010 Provartec LTD                            ////
10
//// www.provartec.com                                           ////
11
//// info@provartec.com                                          ////
12
////                                                             ////
13
//// This source file may be used and distributed without        ////
14
//// restriction provided that this copyright statement is not   ////
15
//// removed from the file and that any derivative work contains ////
16
//// the original copyright notice and the associated disclaimer.////
17
////                                                             ////
18
//// This source file is free software; you can redistribute it  ////
19
//// and/or modify it under the terms of the GNU Lesser General  ////
20
//// Public License as published by the Free Software Foundation.////
21
////                                                             ////
22
//// This source is distributed in the hope that it will be      ////
23
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
24
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
25
//// PURPOSE.  See the GNU Lesser General Public License for more////
26
//// details. http://www.gnu.org/licenses/lgpl.html              ////
27
////                                                             ////
28
/////////////////////////////////////////////////////////////////////
29
 
30
OUTFILE PREFIX_single.v
31
 
32
INCLUDE def_axi_master.txt
33
 
34
module PREFIX_single(PORTS);
35
 
36
   parameter                           MASTER_NUM  = 0;
37
   parameter                           MASTER_ID   = 0;
38
   parameter                           MASTER_PEND = 0;
39
 
40
`include "prgen_rand.v"
41
 
42
   parameter                           MAX_CMDS    = 16; //Depth of command FIFO
43
   parameter                           DATA_LOG    = LOG2(EXPR(DATA_BITS/8));
44
   parameter                           PEND_BITS   =
45
                                       (MAX_CMDS <= 16)  ? 4 :
46
                                       (MAX_CMDS <= 32)  ? 5 :
47
                                       (MAX_CMDS <= 64)  ? 6 :
48
                                       (MAX_CMDS <= 128) ? 7 :
49
                                       (MAX_CMDS <= 256) ? 8 :
50
                                       (MAX_CMDS <= 512) ? 9 : 0; //0 is ilegal
51
 
52
 
53
 
54
   input                               clk;
55
   input                               reset;
56
 
57
   port                                GROUP_STUB_AXI;
58
 
59
   output                              idle;
60
   output                              scrbrd_empty;
61
 
62
 
63
 
64
   //random parameters   
65
   integer                             GROUP_AXI_MASTER_RAND = GROUP_AXI_MASTER_RAND.DEFAULT;
66
 
67
   reg                                 AWVALID_pre;
68
   reg                                 WVALID_pre;
69
   wire                                BREADY_pre;
70
   reg                                 ARVALID_pre;
71
   wire                                RREADY_pre;
72
 
73
   reg                                 enable = 0;
74
   reg                                 rd_enable = 0;
75
   reg                                 wr_enable = 0;
76
   reg                                 wait_for_write = 0;
77
 
78
   reg                                 scrbrd_enable = 0;
79
   reg [LEN_BITS-1:0]                   wvalid_cnt;
80
 
81
   reg                                 rd_cmd_push = 0;
82
   wire                                rd_cmd_pop;
83
   wire [PEND_BITS:0]                  rd_cmd_fullness;
84
   wire                                rd_cmd_empty;
85
   wire                                rd_cmd_full;
86
   reg [ADDR_BITS-1:0]                  rd_cmd_addr_in;
87
   reg [LEN_BITS-1:0]                   rd_cmd_len_in;
88
   reg [SIZE_BITS-1:0]                  rd_cmd_size_in;
89
   wire [ADDR_BITS-1:0]         rd_cmd_addr;
90
   wire [LEN_BITS-1:0]                  rd_cmd_len;
91
   wire [SIZE_BITS-1:0]         rd_cmd_size;
92
 
93
   reg                                 rd_resp_push = 0;
94
   wire                                rd_resp_pop;
95
   wire                                rd_resp_empty;
96
   wire                                rd_resp_full;
97
   reg [ADDR_BITS-1:0]                  rd_resp_addr_in;
98
   reg [SIZE_BITS-1:0]                  rd_resp_size_in;
99
   wire [ADDR_BITS-1:0]         rd_resp_addr;
100
   wire [SIZE_BITS-1:0]         rd_resp_size;
101
 
102
   reg                                 wr_cmd_push = 0;
103
   wire                                wr_cmd_pop;
104
   wire [PEND_BITS:0]                  wr_cmd_fullness;
105
   wire                                wr_cmd_empty;
106
   wire                                wr_cmd_full;
107
   reg [ADDR_BITS-1:0]                  wr_cmd_addr_in;
108
   reg [LEN_BITS-1:0]                   wr_cmd_len_in;
109
   reg [SIZE_BITS-1:0]                  wr_cmd_size_in;
110
   wire [ADDR_BITS-1:0]         wr_cmd_addr;
111
   wire [LEN_BITS-1:0]                  wr_cmd_len;
112
   wire [SIZE_BITS-1:0]         wr_cmd_size;
113
 
114
   reg                                 wr_data_push = 0;
115
   wire                                wr_data_pop;
116
   wire [PEND_BITS:0]                  wr_data_fullness;
117
   wire                                wr_data_empty;
118
   wire                                wr_data_full;
119
   reg [ADDR_BITS-1:0]                  wr_data_addr_in;
120
   reg [LEN_BITS-1:0]                   wr_data_len_in;
121
   reg [SIZE_BITS-1:0]                  wr_data_size_in;
122
   wire [ADDR_BITS-1:0]         wr_data_addr;
123
   wire [LEN_BITS-1:0]                  wr_data_len;
124
   wire [SIZE_BITS-1:0]         wr_data_size;
125
   wire [DATA_BITS/8-1:0]               wr_data_strb;
126
   wire [7:0]                           wr_data_bytes;
127
   wire [ADDR_BITS-1:0]         wr_data_addr_prog;
128
   wire [7:0]                           wr_data_offset;
129
 
130
   wire                                wr_resp_push;
131
   reg                                 wr_resp_pop = 0;
132
   wire                                wr_resp_empty;
133
   wire                                wr_resp_full;
134
   wire [1:0]                          wr_resp_resp_in;
135
   wire [1:0]                          wr_resp_resp;
136
 
137
   reg                                 wr_fifo_push = 0;
138
   wire                                wr_fifo_pop;
139
   wire                                wr_fifo_empty;
140
   wire                                wr_fifo_full;
141
   reg [DATA_BITS-1:0]                 wr_fifo_data_in;
142
   wire [DATA_BITS-1:0]                wr_fifo_data;
143
 
144
   wire                                rd_fifo_push;
145
   reg                                 rd_fifo_pop = 0;
146
   wire                                rd_fifo_empty;
147
   wire                                rd_fifo_full;
148
   wire [DATA_BITS-1:0]                rd_fifo_data_in;
149
   wire [1:0]                          rd_fifo_resp_in;
150
   wire [DATA_BITS-1:0]                rd_fifo_data;
151
   wire [1:0]                          rd_fifo_resp;
152
 
153
   reg                                 scrbrd_push = 0;
154
   reg                                 scrbrd_pop = 0;
155
   wire                                scrbrd_empty;
156
   wire                                scrbrd_full;
157
   reg [ADDR_BITS-1:0]                 scrbrd_addr_in;
158
   reg [DATA_BITS-1:0]                 scrbrd_data_in;
159
   reg [DATA_BITS-1:0]                 scrbrd_mask_in;
160
   wire [ADDR_BITS-1:0]                scrbrd_addr;
161
   wire [DATA_BITS-1:0]                scrbrd_data;
162
   wire [DATA_BITS-1:0]                scrbrd_mask;
163
 
164
   integer                             wr_fullness;
165
   integer                             rd_fullness;
166
   integer                             rd_completed;
167
   integer                             wr_completed;
168
   integer                             wr_pend_max = MASTER_PEND;
169
   integer                             rd_pend_max = MASTER_PEND;
170
   wire                                wr_hold;
171
   wire                                rd_hold;
172
 
173
   integer                             rand_chk_num = 0;
174
 
175
 
176
   assign                              idle = rd_cmd_empty & rd_resp_empty & wr_cmd_empty & wr_data_empty & wr_resp_empty;
177
 
178
   always @(rand_chk_num)
179
     if (rand_chk_num > 0)
180
       insert_rand_chk_loop(rand_chk_num);
181
 
182
   always @(posedge enable)
183
     begin
184
        @(posedge clk);
185
        wr_enable = 1;
186
        repeat (50) @(posedge clk);
187
        rd_enable = 1;
188
     end
189
 
190
   //for incremental data
191
   reg [DATA_BITS-1:0]                 base_data = 0;
192
   integer                             ww;
193
   initial
194
     begin
195
        ww=0;
196
        while (ww < DATA_BITS/8)
197
          begin
198
             base_data = base_data + ((MASTER_NUM + ww) << (ww*8));
199
             ww = ww + 1;
200
          end
201
     end
202
 
203
   assign         rd_cmd_pop   = ARVALID & ARREADY;
204
   assign         rd_resp_pop  = RVALID & RREADY & RLAST;
205
   assign         rd_fifo_push = RVALID & RREADY;
206
   assign         wr_cmd_pop   = AWVALID & AWREADY;
207
   assign         wr_data_pop  = WVALID & WREADY & WLAST;
208
   assign         wr_fifo_pop  = WVALID & WREADY;
209
   assign         wr_resp_push = BVALID & BREADY;
210
 
211
   assign         RREADY_pre = 1;
212
   assign         BREADY_pre = 1;
213
 
214
 
215
   always @(posedge clk or posedge reset)
216
     if (reset)
217
       AWVALID_pre <= #FFD 1'b0;
218
     else if ((wr_cmd_fullness == 1) & wr_cmd_pop)
219
       AWVALID_pre <= #FFD 1'b0;
220
     else if ((!wr_cmd_empty) & wr_enable)
221
       AWVALID_pre <= #FFD 1'b1;
222
 
223
 
224
   assign         AWADDR  = wr_cmd_addr;
225
   assign         AWLEN   = wr_cmd_len;
226
   assign         AWSIZE  = wr_cmd_size;
227
   assign         AWID    = MASTER_ID;
228
   assign         AWBURST = 2'd1; //INCR only
229
   assign         AWCACHE = 4'd0; //not supported
230
   assign         AWPROT  = 4'd0; //not supported
231
   assign         AWLOCK  = 2'd0; //not supported
232
 
233
   always @(posedge clk or posedge reset)
234
     if (reset)
235
       ARVALID_pre <= #FFD 1'b0;
236
     else if (((rd_cmd_fullness == 1)) & rd_cmd_pop)
237
       ARVALID_pre <= #FFD 1'b0;
238
     else if ((!rd_cmd_empty) & rd_enable)
239
       ARVALID_pre <= #FFD 1'b1;
240
 
241
   assign         ARADDR  = rd_cmd_addr;
242
   assign         ARLEN   = rd_cmd_len;
243
   assign         ARSIZE  = rd_cmd_size;
244
   assign         ARID    = MASTER_ID;
245
   assign         ARBURST = 2'd1; //INCR only
246
   assign         ARCACHE = 4'd0; //not supported
247
   assign         ARPROT  = 4'd0; //not supported
248
   assign         ARLOCK  = 2'd0; //not supported
249
 
250
   assign         rd_fifo_data_in = RDATA;
251
   assign         rd_fifo_resp_in = BRESP;
252
 
253
   assign         wr_data_bytes = 1'b1 << wr_data_size;
254
 
255
   assign         wr_data_strb =
256
                  wr_data_size == 'd0 ? 1'b1       :
257
                  wr_data_size == 'd1 ? 2'b11      :
258
                  wr_data_size == 'd2 ? 4'b1111    :
259
                  wr_data_size == 'd3 ? {8{1'b1}}  :
260
                  wr_data_size == 'd4 ? {16{1'b1}} : 'd0;
261
 
262
   assign         wr_data_addr_prog = wr_data_addr + (wvalid_cnt * wr_data_bytes);
263
 
264
   always @(posedge clk or posedge reset)
265
     if (reset)
266
       WVALID_pre <= #FFD 1'b0;
267
     else if ((wr_data_fullness == 1) & wr_data_pop)
268
       WVALID_pre <= #FFD 1'b0;
269
     else if ((!wr_data_empty) & wr_enable)
270
       WVALID_pre <= #FFD 1'b1;
271
 
272
 
273
   assign         wr_data_offset = wr_data_addr_prog[DATA_LOG-1:0];
274
 
275
   assign         WID   = MASTER_ID;
276
   assign         WDATA = wr_fifo_empty ? 0 : wr_fifo_data;
277
   assign         WSTRB = wr_data_strb << wr_data_offset;
278
 
279
 
280
   always @(posedge clk or posedge reset)
281
     if (reset)
282
       wvalid_cnt <= #FFD {LEN_BITS{1'b0}};
283
     else if (wr_data_pop)
284
       wvalid_cnt <= #FFD {LEN_BITS{1'b0}};
285
     else if (WVALID & WREADY)
286
       wvalid_cnt <= #FFD wvalid_cnt + 1'b1;
287
 
288
   assign         WLAST = WVALID & (wvalid_cnt == wr_data_len);
289
 
290
   assign         wr_resp_resp_in = BRESP;
291
 
292
   always @(posedge clk or posedge reset)
293
     if (reset)
294
       begin
295
          wr_fullness <= #FFD 0;
296
          rd_fullness <= #FFD 0;
297
          rd_completed <= #FFD 0;
298
          wr_completed <= #FFD 0;
299
       end
300
     else
301
       begin
302
          wr_fullness <= #FFD wr_fullness + wr_cmd_pop - wr_resp_push;
303
          rd_fullness <= #FFD rd_fullness + rd_cmd_pop - rd_resp_pop;
304
          rd_completed <= #FFD rd_completed + rd_resp_pop;
305
          wr_completed <= #FFD wr_completed + wr_resp_push;
306
       end
307
 
308
   assign         wr_hold = wr_fullness >= wr_pend_max;
309
   assign         rd_hold = (rd_fullness >= rd_pend_max) | (wait_for_write & (wr_completed <= rd_completed + rd_fullness));
310
 
311
 
312
 
313
   task insert_rd_cmd;
314
      input [ADDR_BITS-1:0]  addr;
315
      input [LEN_BITS-1:0]   len;
316
      input [SIZE_BITS-1:0]  size;
317
 
318
      begin
319
         rd_cmd_addr_in  = addr;
320
         rd_cmd_len_in   = len;
321
         rd_cmd_size_in  = size;
322
         rd_resp_addr_in = addr;
323
         rd_resp_size_in = size;
324
 
325
         if (rd_cmd_full) enable = 1; //start stub not started yet
326
 
327
         wait ((!rd_cmd_full) & (!rd_resp_full));
328
         @(negedge clk); #FFD;
329
         rd_cmd_push  = 1;
330
         rd_resp_push = 1;
331
         @(posedge clk); #FFD;
332
         rd_cmd_push  = 0;
333
         rd_resp_push = 0;
334
      end
335
   endtask
336
 
337
   task insert_wr_cmd;
338
      input [ADDR_BITS-1:0]  addr;
339
      input [LEN_BITS-1:0]   len;
340
      input [SIZE_BITS-1:0]  size;
341
 
342
      begin
343
         wr_cmd_addr_in  = addr;
344
         wr_cmd_len_in   = len;
345
         wr_cmd_size_in  = size;
346
         wr_data_addr_in = addr;
347
         wr_data_len_in  = len;
348
         wr_data_size_in = size;
349
 
350
         if (wr_cmd_full) enable = 1; //start stub not started yet
351
 
352
         wait ((!wr_cmd_full) & (!wr_data_full));
353
         @(negedge clk); #FFD;
354
         wr_cmd_push  = 1;
355
         wr_data_push = 1;
356
         @(posedge clk); #FFD;
357
         wr_cmd_push  = 0;
358
         wr_data_push = 0;
359
      end
360
   endtask
361
 
362
   task insert_wr_data;
363
      input [DATA_BITS-1:0]  wdata;
364
 
365
      begin
366
         wr_fifo_data_in  = wdata;
367
 
368
         wait (!wr_fifo_full);
369
         @(negedge clk); #FFD;
370
         wr_fifo_push = 1;
371
         @(posedge clk); #FFD;
372
         wr_fifo_push = 0;
373
      end
374
   endtask
375
 
376
   task insert_wr_incr_data;
377
      input [ADDR_BITS-1:0]  addr;
378
      input [LEN_BITS-1:0]   len;
379
      input [SIZE_BITS-1:0]  size;
380
 
381
      integer valid_cnt;
382
      integer wdata_cnt;
383
      reg [7:0] data_cnt;
384
      integer bytes;
385
      reg [DATA_BITS-1:0] add_data;
386
      reg [DATA_BITS-1:0] next_data;
387
      begin
388
         //insert data
389
         valid_cnt = 0;
390
         while (valid_cnt <= len)
391
           begin
392
              bytes = 1'b1 << size;
393
              wdata_cnt = valid_cnt+(addr[DATA_LOG-1:0]/bytes);
394
              data_cnt  = ((wdata_cnt)/(DATA_BITS/(bytes*8))) * (DATA_BITS/8);
395
              add_data  = {DATA_BITS/8{data_cnt}};
396
              next_data = base_data + add_data;
397
              insert_wr_data(next_data);
398
              valid_cnt = valid_cnt+1;
399
           end
400
         //insert command
401
         insert_wr_cmd(addr, len, size);
402
      end
403
   endtask
404
 
405
   task insert_scrbrd;
406
      input [ADDR_BITS-1:0]  addr;
407
      input [DATA_BITS-1:0]  data;
408
      input [DATA_BITS-1:0]  mask;
409
      begin
410
         scrbrd_enable = 1;
411
         scrbrd_addr_in  = addr;
412
         scrbrd_data_in  = data;
413
         scrbrd_mask_in  = mask;
414
 
415
         wait (!scrbrd_full);
416
         @(negedge clk); #FFD;
417
         scrbrd_push = 1;
418
         @(posedge clk); #FFD;
419
         scrbrd_push = 0;
420
      end
421
   endtask
422
 
423
   task insert_scrbrd_incr_data;
424
      input [ADDR_BITS-1:0]  addr;
425
      input [LEN_BITS-1:0]   len;
426
      input [SIZE_BITS-1:0]  size;
427
 
428
      integer valid_cnt;
429
      integer wdata_cnt;
430
      reg [7:0] data_cnt;
431
      integer bytes;
432
      reg [DATA_BITS-1:0] add_data;
433
      reg [DATA_BITS-1:0] next_data;
434
      reg [DATA_BITS:0] strb;
435
      reg [DATA_BITS-1:0] mask;
436
      reg [ADDR_BITS-1:0] next_addr;
437
      begin
438
         valid_cnt = 0;
439
         while (valid_cnt <= len)
440
           begin
441
              bytes = 1'b1 << size;
442
              wdata_cnt = valid_cnt+(addr[DATA_LOG-1:0]/bytes);
443
              data_cnt  = ((wdata_cnt)/(DATA_BITS/(bytes*8))) * (DATA_BITS/8);
444
              add_data  = {DATA_BITS/8{data_cnt}};
445
              next_data = base_data + add_data;
446
              next_addr = addr + (bytes * valid_cnt);
447
              strb = (1 << (bytes*8)) - 1;
448
              mask = strb << (next_addr[DATA_LOG-1:0]*8);
449
              insert_scrbrd(next_addr, next_data, mask);
450
              valid_cnt = valid_cnt+1;
451
           end
452
      end
453
   endtask
454
 
455
   task insert_rd_scrbrd;
456
      input [ADDR_BITS-1:0]  addr;
457
      input [LEN_BITS-1:0]   len;
458
      input [SIZE_BITS-1:0]  size;
459
 
460
      begin
461
         insert_scrbrd_incr_data(addr, len, size);
462
         insert_rd_cmd(addr, len, size);
463
      end
464
   endtask
465
 
466
   task insert_wr_rd_scrbrd;
467
      input [ADDR_BITS-1:0]  addr;
468
      input [LEN_BITS-1:0]   len;
469
      input [SIZE_BITS-1:0]  size;
470
 
471
      begin
472
         wait_for_write=1;
473
         insert_wr_incr_data(addr, len, size);
474
         insert_rd_scrbrd(addr, len, size);
475
      end
476
   endtask
477
 
478
   task insert_wr_rd_scrbrd_rand;
479
      reg [ADDR_BITS-1:0]  addr;
480
      reg [LEN_BITS-1:0]   len;
481
      reg [SIZE_BITS-1:0]  size;
482
 
483
      begin
484
         len   = rand(len_min, len_max);
485
         size  = rand(size_min, size_max);
486
         addr  = rand_align(addr_min, addr_max, 1 << size);
487
         insert_wr_rd_scrbrd(addr, len, size);
488
      end
489
   endtask
490
 
491
   task insert_rand_chk;
492
      input [31:0]  num;
493
 
494
      rand_chk_num = num;
495
   endtask
496
 
497
   task insert_rand_chk_loop;
498
      input [31:0]  num;
499
 
500
      integer i;
501
      begin
502
         i = 0;
503
         while (i < num)
504
           begin
505
              insert_wr_rd_scrbrd_rand;
506
              i = i + 1;
507
           end
508
      end
509
   endtask
510
 
511
   task insert_wr_single;
512
      input [ADDR_BITS-1:0]  addr;
513
      input [DATA_BITS-1:0]  wdata;
514
 
515
      reg [SIZE_BITS-1:0] size;
516
      begin
517
         size = EXPR((DATA_BITS/32)+1);
518
         insert_wr_data(wdata);
519
         insert_wr_cmd(addr, 0, size);
520
      end
521
   endtask
522
 
523
   task get_rd_resp;
524
      output [DATA_BITS-1:0] rdata;
525
      output [1:0] resp;
526
 
527
      reg [DATA_BITS-1:0] rdata;
528
      reg [1:0] resp;
529
      begin
530
         wait (!rd_fifo_empty);
531
         rdata = rd_fifo_data;
532
         resp = rd_fifo_resp;
533
         @(negedge clk); #FFD;
534
         rd_fifo_pop = 1;
535
         @(posedge clk); #FFD;
536
         rd_fifo_pop = 0;
537
      end
538
   endtask
539
 
540
   task get_scrbrd;
541
      output [ADDR_BITS-1:0] addr;
542
      output [DATA_BITS-1:0] rdata;
543
      output [DATA_BITS-1:0] mask;
544
 
545
      reg [ADDR_BITS-1:0] addr;
546
      reg [DATA_BITS-1:0] rdata;
547
      reg [DATA_BITS-1:0] mask;
548
      begin
549
         wait (!scrbrd_empty);
550
         addr = scrbrd_addr;
551
         rdata = scrbrd_data;
552
         mask = scrbrd_mask;
553
         @(negedge clk); #FFD;
554
         scrbrd_pop = 1;
555
         @(posedge clk); #FFD;
556
         scrbrd_pop = 0;
557
      end
558
   endtask
559
 
560
   task get_wr_resp;
561
      output [1:0] resp;
562
 
563
      reg [1:0] resp;
564
      begin
565
         wait (!wr_resp_empty);
566
         resp = wr_resp_resp;
567
         @(negedge clk); #FFD;
568
         wr_resp_pop = 1;
569
         @(posedge clk); #FFD;
570
         wr_resp_pop = 0;
571
      end
572
   endtask
573
 
574
   task insert_rd_single;
575
      input [ADDR_BITS-1:0]  addr;
576
 
577
      reg [SIZE_BITS-1:0] size;
578
      begin
579
         size = EXPR((DATA_BITS/32)+1);
580
         insert_rd_cmd(addr, 0, size);
581
      end
582
   endtask
583
 
584
   task read_single_ack;
585
      input [ADDR_BITS-1:0]  addr;
586
      output [DATA_BITS-1:0] rdata;
587
      output [1:0]           resp;
588
 
589
      reg [1:0] resp;
590
      begin
591
         insert_rd_single(addr);
592
         get_rd_resp(rdata, resp);
593
      end
594
   endtask
595
 
596
   task write_single_ack;
597
      input [ADDR_BITS-1:0]  addr;
598
      input [DATA_BITS-1:0]  wdata;
599
      output [1:0]           resp;
600
 
601
      reg [1:0] resp;
602
      begin
603
         insert_wr_single(addr, wdata);
604
         get_wr_resp(resp);
605
      end
606
   endtask
607
 
608
   task read_single;
609
      input [ADDR_BITS-1:0]  addr;
610
      output [DATA_BITS-1:0] rdata;
611
 
612
      reg [1:0] resp;
613
      begin
614
         read_single_ack(addr, rdata, resp);
615
      end
616
   endtask
617
 
618
   task write_single;
619
      input [ADDR_BITS-1:0]  addr;
620
      input [DATA_BITS-1:0]  wdata;
621
 
622
      reg [1:0] resp;
623
      begin
624
         write_single_ack(addr, wdata, resp);
625
      end
626
   endtask
627
 
628
   task chk_scrbrd;
629
      reg [ADDR_BITS-1:0] addr;
630
      reg [DATA_BITS-1:0] mask;
631
      reg [DATA_BITS-1:0] expected_data;
632
      reg [DATA_BITS-1:0] rdata;
633
      reg [DATA_BITS-1:0] rdata_masked;
634
      reg [1:0] resp;
635
 
636
      begin
637
         if (!wr_resp_empty) get_wr_resp(resp);
638
         get_scrbrd(addr, expected_data, mask);
639
         get_rd_resp(rdata, resp);
640
         expected_data = expected_data & mask; //TBD insert z as dontcare (for print)
641
         rdata_masked = rdata & mask;
642
 
643
         if (expected_data !== rdata_masked)
644
           $display("MASTER%0d: SCRBRD_ERROR: Address: 0x%0h, Expected: 0x%0h, Received: 0x%0h.\tTime: %0d ns.", MASTER_NUM, addr, expected_data, rdata, $time);
645
      end
646
   endtask
647
 
648
   always @(posedge scrbrd_enable)
649
     begin
650
        while (scrbrd_enable)
651
          begin
652
             chk_scrbrd;
653
          end
654
     end
655
 
656
 
657
CREATE prgen_fifo.v DEFCMD(DEFINE STUB)
658
   prgen_fifo_stub #(ADDR_BITS+LEN_BITS+SIZE_BITS, MAX_CMDS)
659
   rd_cmd_list(
660
               .clk(clk),
661
               .reset(reset),
662
               .push(rd_cmd_push),
663
               .pop(rd_cmd_pop),
664
               .din({
665
                     rd_cmd_size_in,
666
                     rd_cmd_len_in,
667
                     rd_cmd_addr_in
668
                     }),
669
               .dout({
670
                      rd_cmd_size,
671
                      rd_cmd_len,
672
                      rd_cmd_addr
673
                      }),
674
               .fullness(rd_cmd_fullness),
675
               .empty(rd_cmd_empty),
676
               .full(rd_cmd_full)
677
               );
678
 
679
   prgen_fifo_stub #(ADDR_BITS+SIZE_BITS, MAX_CMDS)
680
   rd_resp_list(
681
                .clk(clk),
682
                .reset(reset),
683
                .push(rd_resp_push),
684
                .pop(rd_resp_pop),
685
                .din({
686
                      rd_resp_addr_in,
687
                      rd_resp_size_in
688
                      }),
689
                .dout({
690
                       rd_resp_addr,
691
                       rd_resp_size
692
                       }),
693
                .empty(rd_resp_empty),
694
                .full(rd_resp_full)
695
                );
696
 
697
   prgen_fifo_stub #(ADDR_BITS+LEN_BITS+SIZE_BITS, MAX_CMDS)
698
   wr_cmd_list(
699
               .clk(clk),
700
               .reset(reset),
701
               .push(wr_cmd_push),
702
               .pop(wr_cmd_pop),
703
               .din({
704
                     wr_cmd_size_in,
705
                     wr_cmd_len_in,
706
                     wr_cmd_addr_in
707
                     }),
708
               .dout({
709
                      wr_cmd_size,
710
                      wr_cmd_len,
711
                      wr_cmd_addr
712
                      }),
713
               .fullness(wr_cmd_fullness),
714
               .empty(wr_cmd_empty),
715
               .full(wr_cmd_full)
716
               );
717
 
718
   prgen_fifo_stub #(ADDR_BITS+LEN_BITS+SIZE_BITS, MAX_CMDS)
719
   wr_data_list(
720
                .clk(clk),
721
                .reset(reset),
722
                .push(wr_data_push),
723
                .pop(wr_data_pop),
724
                .din({
725
                      wr_data_size_in,
726
                      wr_data_len_in,
727
                      wr_data_addr_in
728
                      }),
729
                .dout({
730
                       wr_data_size,
731
                       wr_data_len,
732
                       wr_data_addr
733
                       }),
734
                .fullness(wr_data_fullness),
735
                .empty(wr_data_empty),
736
                .full(wr_data_full)
737
                );
738
 
739
   prgen_fifo_stub #(2, MAX_CMDS)
740
   wr_resp_list(
741
                .clk(clk),
742
                .reset(reset),
743
                .push(wr_resp_push),
744
                .pop(wr_resp_pop),
745
                .din(wr_resp_resp_in),
746
                .dout(wr_resp_resp),
747
                .empty(wr_resp_empty),
748
                .full(wr_resp_full)
749
                );
750
 
751
 
752
   prgen_fifo_stub #(DATA_BITS, MAX_CMDS*EXPR(2^LEN_BITS))
753
   wr_data_fifo(
754
                .clk(clk),
755
                .reset(reset),
756
                .push(wr_fifo_push),
757
                .pop(wr_fifo_pop),
758
                .din(wr_fifo_data_in),
759
                .dout(wr_fifo_data),
760
                .empty(wr_fifo_empty),
761
                .full(wr_fifo_full)
762
                );
763
 
764
   prgen_fifo_stub #(DATA_BITS+2, MAX_CMDS*EXPR(2^LEN_BITS))
765
   rd_data_fifo(
766
                .clk(clk),
767
                .reset(reset),
768
                .push(rd_fifo_push),
769
                .pop(rd_fifo_pop),
770
                .din({
771
                      rd_fifo_data_in,
772
                      rd_fifo_resp_in
773
                      }),
774
                .dout({
775
                       rd_fifo_data,
776
                       rd_fifo_resp
777
                       }),
778
                .empty(rd_fifo_empty),
779
                .full(rd_fifo_full)
780
                );
781
 
782
   prgen_fifo_stub #(ADDR_BITS+2*DATA_BITS, MAX_CMDS*EXPR(2^LEN_BITS))
783
   scrbrd_fifo(
784
                .clk(clk),
785
                .reset(reset),
786
                .push(scrbrd_push),
787
                .pop(scrbrd_pop),
788
               .din({
789
                     scrbrd_addr_in,
790
                     scrbrd_data_in,
791
                     scrbrd_mask_in
792
                     }),
793
                .dout({
794
                       scrbrd_addr,
795
                       scrbrd_data,
796
                       scrbrd_mask
797
                       }),
798
                .empty(scrbrd_empty),
799
                .full(scrbrd_full)
800
                );
801
 
802
 
803
CREATE axi_master_stall.v
804
   PREFIX_stall
805
     PREFIX_stall (
806
                       .clk(clk),
807
                       .reset(reset),
808
 
809
                       .rd_hold(rd_hold),
810
                       .wr_hold(wr_hold),
811
 
812
                       .ARVALID_pre(ARVALID_pre),
813
                       .RREADY_pre(RREADY_pre),
814
                       .AWVALID_pre(AWVALID_pre),
815
                       .WVALID_pre(WVALID_pre),
816
                       .BREADY_pre(BREADY_pre),
817
 
818
                       .ARREADY(ARREADY),
819
                       .AWREADY(AWREADY),
820
                       .WREADY(WREADY),
821
 
822
                       .ARVALID(ARVALID),
823
                       .RREADY(RREADY),
824
                       .AWVALID(AWVALID),
825
                       .WVALID(WVALID),
826
                       .BREADY(BREADY)
827
                       );
828
 
829
 
830
endmodule
831
 
832
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.