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

Subversion Repositories ahb_master

[/] [ahb_master/] [trunk/] [src/] [base/] [axi_master_single.v] - Blame information for rev 5

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

powered by: WebSVN 2.1.0

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