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 10

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 6 eyalhoc
 
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 10 eyalhoc
         #FFD; wait ((!rd_cmd_full) & (!rd_resp_full));
328 6 eyalhoc
         @(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 10 eyalhoc
         #FFD; wait ((!wr_cmd_full) & (!wr_data_full));
353 6 eyalhoc
         @(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 10 eyalhoc
         #FFD; wait (!wr_fifo_full);
369 6 eyalhoc
         @(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 = (use_addr_base ? addr : 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 10 eyalhoc
         #FFD; wait (!scrbrd_full);
416 6 eyalhoc
         @(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 = (use_addr_base ? addr : 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 10 eyalhoc
 
483 6 eyalhoc
      begin
484 10 eyalhoc
         if (DATA_BITS==32) size_max = 2'b10;
485 6 eyalhoc
         len   = rand(len_min, len_max);
486
         size  = rand(size_min, size_max);
487
         addr  = rand_align(addr_min, addr_max, 1 << size);
488 10 eyalhoc
 
489
         if (ahb_bursts)
490
           begin
491
              len   =
492
                      len[3] ? 15 :
493
                      len[2] ? 7 :
494
                      len[1] ? 3 : 0;
495
              if (len > 0)
496
                size = (DATA_BITS == 64) ? 2'b11 : 2'b10; //AHB bursts always full data
497
 
498
              addr = align(addr, EXPR(DATA_BITS/8)*(len+1)); //address aligned to burst size
499
           end
500 6 eyalhoc
         insert_wr_rd_scrbrd(addr, len, size);
501
      end
502
   endtask
503
 
504
   task insert_rand_chk;
505
      input [31:0]  num;
506
 
507
      rand_chk_num = num;
508
   endtask
509
 
510
   task insert_rand_chk_loop;
511
      input [31:0]  num;
512
 
513
      integer i;
514
      begin
515
         i = 0;
516
         while (i < num)
517
           begin
518
              insert_wr_rd_scrbrd_rand;
519
              i = i + 1;
520
           end
521
      end
522
   endtask
523
 
524
   task insert_wr_single;
525
      input [ADDR_BITS-1:0]  addr;
526
      input [DATA_BITS-1:0]  wdata;
527
 
528
      reg [SIZE_BITS-1:0] size;
529
      begin
530
         size = EXPR((DATA_BITS/32)+1);
531
         insert_wr_data(wdata);
532
         insert_wr_cmd(addr, 0, size);
533
      end
534
   endtask
535
 
536
   task get_rd_resp;
537
      output [DATA_BITS-1:0] rdata;
538
      output [1:0] resp;
539
 
540
      reg [DATA_BITS-1:0] rdata;
541
      reg [1:0] resp;
542
      begin
543 10 eyalhoc
         #FFD; wait (!rd_fifo_empty);
544 6 eyalhoc
         rdata = rd_fifo_data;
545
         resp = rd_fifo_resp;
546
         @(negedge clk); #FFD;
547
         rd_fifo_pop = 1;
548
         @(posedge clk); #FFD;
549
         rd_fifo_pop = 0;
550
      end
551
   endtask
552
 
553
   task get_scrbrd;
554
      output [ADDR_BITS-1:0] addr;
555
      output [DATA_BITS-1:0] rdata;
556
      output [DATA_BITS-1:0] mask;
557
 
558
      reg [ADDR_BITS-1:0] addr;
559
      reg [DATA_BITS-1:0] rdata;
560
      reg [DATA_BITS-1:0] mask;
561
      begin
562 10 eyalhoc
         #FFD; wait (!scrbrd_empty);
563 6 eyalhoc
         addr = scrbrd_addr;
564
         rdata = scrbrd_data;
565
         mask = scrbrd_mask;
566
         @(negedge clk); #FFD;
567
         scrbrd_pop = 1;
568
         @(posedge clk); #FFD;
569
         scrbrd_pop = 0;
570
      end
571
   endtask
572
 
573
   task get_wr_resp;
574
      output [1:0] resp;
575
 
576
      reg [1:0] resp;
577
      begin
578 10 eyalhoc
         #FFD; wait (!wr_resp_empty);
579 6 eyalhoc
         resp = wr_resp_resp;
580
         @(negedge clk); #FFD;
581
         wr_resp_pop = 1;
582
         @(posedge clk); #FFD;
583
         wr_resp_pop = 0;
584
      end
585
   endtask
586
 
587
   task insert_rd_single;
588
      input [ADDR_BITS-1:0]  addr;
589
 
590
      reg [SIZE_BITS-1:0] size;
591
      begin
592
         size = EXPR((DATA_BITS/32)+1);
593
         insert_rd_cmd(addr, 0, size);
594
      end
595
   endtask
596
 
597
   task read_single_ack;
598
      input [ADDR_BITS-1:0]  addr;
599
      output [DATA_BITS-1:0] rdata;
600
      output [1:0]           resp;
601
 
602
      reg [1:0] resp;
603
      begin
604
         insert_rd_single(addr);
605
         get_rd_resp(rdata, resp);
606
      end
607
   endtask
608
 
609
   task write_single_ack;
610
      input [ADDR_BITS-1:0]  addr;
611
      input [DATA_BITS-1:0]  wdata;
612
      output [1:0]           resp;
613
 
614
      reg [1:0] resp;
615
      begin
616
         insert_wr_single(addr, wdata);
617
         get_wr_resp(resp);
618
      end
619
   endtask
620
 
621
   task read_single;
622
      input [ADDR_BITS-1:0]  addr;
623
      output [DATA_BITS-1:0] rdata;
624
 
625
      reg [1:0] resp;
626
      begin
627
         read_single_ack(addr, rdata, resp);
628
      end
629
   endtask
630
 
631
   task check_single;
632
      input [ADDR_BITS-1:0]  addr;
633
      input [DATA_BITS-1:0]  expected;
634
 
635
      reg [1:0] resp;
636
      reg [DATA_BITS-1:0] rdata;
637
      begin
638
         read_single_ack(addr, rdata, resp);
639
         if (rdata !== expected)
640
           $display("MASTER%0d: CHK_SINGLE_ERROR: Address: 0x%0h, Expected: 0x%0h, Received: 0x%0h.\tTime: %0d ns.", MASTER_NUM, addr, expected, rdata, $time);
641
      end
642
   endtask
643
 
644
   task write_and_check_single;
645
      input [ADDR_BITS-1:0]  addr;
646
      input [DATA_BITS-1:0]  data;
647
 
648
      begin
649
         write_single(addr, data);
650
         check_single(addr, data);
651
      end
652
   endtask
653
 
654
   task write_single;
655
      input [ADDR_BITS-1:0]  addr;
656
      input [DATA_BITS-1:0]  wdata;
657
 
658
      reg [1:0] resp;
659
      begin
660
         write_single_ack(addr, wdata, resp);
661
      end
662
   endtask
663
 
664
   task chk_scrbrd;
665
      reg [ADDR_BITS-1:0] addr;
666
      reg [DATA_BITS-1:0] mask;
667
      reg [DATA_BITS-1:0] expected_data;
668
      reg [DATA_BITS-1:0] rdata;
669
      reg [DATA_BITS-1:0] rdata_masked;
670
      reg [1:0] resp;
671
 
672
      begin
673
         if (!wr_resp_empty) get_wr_resp(resp);
674
         get_scrbrd(addr, expected_data, mask);
675
         get_rd_resp(rdata, resp);
676
         expected_data = expected_data & mask; //TBD insert z as dontcare (for print)
677
         rdata_masked = rdata & mask;
678
 
679
         if (expected_data !== rdata_masked)
680
           $display("MASTER%0d: SCRBRD_ERROR: Address: 0x%0h, Expected: 0x%0h, Received: 0x%0h.\tTime: %0d ns.", MASTER_NUM, addr, expected_data, rdata, $time);
681
      end
682
   endtask
683
 
684
   always @(posedge scrbrd_enable)
685
     begin
686
        while (scrbrd_enable)
687
          begin
688
             chk_scrbrd;
689
          end
690
     end
691
 
692
 
693
CREATE prgen_fifo.v DEFCMD(DEFINE STUB)
694
   prgen_fifo_stub #(ADDR_BITS+LEN_BITS+SIZE_BITS, MAX_CMDS)
695
   rd_cmd_list(
696
               .clk(clk),
697
               .reset(reset),
698
               .push(rd_cmd_push),
699
               .pop(rd_cmd_pop),
700
               .din({
701
                     rd_cmd_size_in,
702
                     rd_cmd_len_in,
703
                     rd_cmd_addr_in
704
                     }),
705
               .dout({
706
                      rd_cmd_size,
707
                      rd_cmd_len,
708
                      rd_cmd_addr
709
                      }),
710
               .fullness(rd_cmd_fullness),
711
               .empty(rd_cmd_empty),
712
               .full(rd_cmd_full)
713
               );
714
 
715
   prgen_fifo_stub #(ADDR_BITS+SIZE_BITS, MAX_CMDS)
716
   rd_resp_list(
717
                .clk(clk),
718
                .reset(reset),
719
                .push(rd_resp_push),
720
                .pop(rd_resp_pop),
721
                .din({
722
                      rd_resp_addr_in,
723
                      rd_resp_size_in
724
                      }),
725
                .dout({
726
                       rd_resp_addr,
727
                       rd_resp_size
728
                       }),
729
                .empty(rd_resp_empty),
730
                .full(rd_resp_full)
731
                );
732
 
733
   prgen_fifo_stub #(ADDR_BITS+LEN_BITS+SIZE_BITS, MAX_CMDS)
734
   wr_cmd_list(
735
               .clk(clk),
736
               .reset(reset),
737
               .push(wr_cmd_push),
738
               .pop(wr_cmd_pop),
739
               .din({
740
                     wr_cmd_size_in,
741
                     wr_cmd_len_in,
742
                     wr_cmd_addr_in
743
                     }),
744
               .dout({
745
                      wr_cmd_size,
746
                      wr_cmd_len,
747
                      wr_cmd_addr
748
                      }),
749
               .fullness(wr_cmd_fullness),
750
               .empty(wr_cmd_empty),
751
               .full(wr_cmd_full)
752
               );
753
 
754
   prgen_fifo_stub #(ADDR_BITS+LEN_BITS+SIZE_BITS, MAX_CMDS)
755
   wr_data_list(
756
                .clk(clk),
757
                .reset(reset),
758
                .push(wr_data_push),
759
                .pop(wr_data_pop),
760
                .din({
761
                      wr_data_size_in,
762
                      wr_data_len_in,
763
                      wr_data_addr_in
764
                      }),
765
                .dout({
766
                       wr_data_size,
767
                       wr_data_len,
768
                       wr_data_addr
769
                       }),
770
                .fullness(wr_data_fullness),
771
                .empty(wr_data_empty),
772
                .full(wr_data_full)
773
                );
774
 
775
   prgen_fifo_stub #(2, MAX_CMDS)
776
   wr_resp_list(
777
                .clk(clk),
778
                .reset(reset),
779
                .push(wr_resp_push),
780
                .pop(wr_resp_pop),
781
                .din(wr_resp_resp_in),
782
                .dout(wr_resp_resp),
783
                .empty(wr_resp_empty),
784
                .full(wr_resp_full)
785
                );
786
 
787
 
788
   prgen_fifo_stub #(DATA_BITS, MAX_CMDS*EXPR(2^LEN_BITS))
789
   wr_data_fifo(
790
                .clk(clk),
791
                .reset(reset),
792
                .push(wr_fifo_push),
793
                .pop(wr_fifo_pop),
794
                .din(wr_fifo_data_in),
795
                .dout(wr_fifo_data),
796
                .empty(wr_fifo_empty),
797
                .full(wr_fifo_full)
798
                );
799
 
800
   prgen_fifo_stub #(DATA_BITS+2, MAX_CMDS*EXPR(2^LEN_BITS))
801
   rd_data_fifo(
802
                .clk(clk),
803
                .reset(reset),
804
                .push(rd_fifo_push),
805
                .pop(rd_fifo_pop),
806
                .din({
807
                      rd_fifo_data_in,
808
                      rd_fifo_resp_in
809
                      }),
810
                .dout({
811
                       rd_fifo_data,
812
                       rd_fifo_resp
813
                       }),
814
                .empty(rd_fifo_empty),
815
                .full(rd_fifo_full)
816
                );
817
 
818
   prgen_fifo_stub #(ADDR_BITS+2*DATA_BITS, MAX_CMDS*EXPR(2^LEN_BITS))
819
   scrbrd_fifo(
820
                .clk(clk),
821
                .reset(reset),
822
                .push(scrbrd_push),
823
                .pop(scrbrd_pop),
824
               .din({
825
                     scrbrd_addr_in,
826
                     scrbrd_data_in,
827
                     scrbrd_mask_in
828
                     }),
829
                .dout({
830
                       scrbrd_addr,
831
                       scrbrd_data,
832
                       scrbrd_mask
833
                       }),
834
                .empty(scrbrd_empty),
835
                .full(scrbrd_full)
836
                );
837
 
838
 
839
CREATE axi_master_stall.v
840
   PREFIX_stall
841
     PREFIX_stall (
842
                       .clk(clk),
843
                       .reset(reset),
844
 
845
                       .rd_hold(rd_hold),
846
                       .wr_hold(wr_hold),
847
 
848
                       .ARVALID_pre(ARVALID_pre),
849
                       .RREADY_pre(RREADY_pre),
850
                       .AWVALID_pre(AWVALID_pre),
851
                       .WVALID_pre(WVALID_pre),
852
                       .BREADY_pre(BREADY_pre),
853
 
854
                       .ARREADY(ARREADY),
855
                       .AWREADY(AWREADY),
856
                       .WREADY(WREADY),
857
 
858
                       .ARVALID(ARVALID),
859
                       .RREADY(RREADY),
860
                       .AWVALID(AWVALID),
861
                       .WVALID(WVALID),
862
                       .BREADY(BREADY)
863
                       );
864
 
865
 
866
endmodule
867
 
868
 

powered by: WebSVN 2.1.0

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