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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_7/] [bench/] [verilog/] [wb_master_behavioral.v] - Blame information for rev 106

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

Line No. Rev Author Line
1 15 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name "wb_master_behavioral.v"                          ////
4
////                                                              ////
5
////  This file is part of the "PCI bridge" project               ////
6
////  http://www.opencores.org/cores/pci/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Miha Dolenc (mihad@opencores.org)                     ////
10
////                                                              ////
11
//////////////////////////////////////////////////////////////////////
12
////                                                              ////
13
//// Copyright (C) 2000 Miha Dolenc, mihad@opencores.org          ////
14
////                                                              ////
15
//// This source file may be used and distributed without         ////
16
//// restriction provided that this copyright statement is not    ////
17
//// removed from the file and that any derivative work contains  ////
18
//// the original copyright notice and the associated disclaimer. ////
19
////                                                              ////
20
//// This source file is free software; you can redistribute it   ////
21
//// and/or modify it under the terms of the GNU Lesser General   ////
22
//// Public License as published by the Free Software Foundation; ////
23
//// either version 2.1 of the License, or (at your option) any   ////
24
//// later version.                                               ////
25
////                                                              ////
26
//// This source is distributed in the hope that it will be       ////
27
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
28
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
29
//// PURPOSE.  See the GNU Lesser General Public License for more ////
30
//// details.                                                     ////
31
////                                                              ////
32
//// You should have received a copy of the GNU Lesser General    ////
33
//// Public License along with this source; if not, download it   ////
34
//// from http://www.opencores.org/lgpl.shtml                     ////
35
////                                                              ////
36
//////////////////////////////////////////////////////////////////////
37
//
38
// CVS Revision History
39
//
40
// $Log: not supported by cvs2svn $
41 106 mihad
// Revision 1.2  2003/06/12 02:30:39  mihad
42
// Update!
43
//
44 92 mihad
// Revision 1.1  2002/02/01 13:39:43  mihad
45
// Initial testbench import. Still under development
46
//
47 15 mihad
 
48
`include "pci_testbench_defines.v"
49
module WB_MASTER_BEHAVIORAL
50
(
51
    CLK_I,
52
    RST_I,
53
    TAG_I,
54
    TAG_O,
55
    ACK_I,
56
    ADR_O,
57
    CYC_O,
58
    DAT_I,
59
    DAT_O,
60
    ERR_I,
61
    RTY_I,
62
    SEL_O,
63
    STB_O,
64
    WE_O,
65
    CAB_O
66
);
67
 
68
    input                    CLK_I;
69
    input                    RST_I;
70
    input    `WB_TAG_TYPE    TAG_I;
71
    output   `WB_TAG_TYPE    TAG_O;
72
    input                    ACK_I;
73
    output   `WB_ADDR_TYPE   ADR_O;
74
    output                   CYC_O;
75
    input    `WB_DATA_TYPE   DAT_I;
76
    output   `WB_DATA_TYPE   DAT_O;
77
    input                    ERR_I;
78
    input                    RTY_I;
79
    output   `WB_SEL_TYPE    SEL_O;
80
    output                   STB_O;
81
    output                   WE_O;
82
    output                   CAB_O;
83
 
84
// instantiate low level master module
85
WB_MASTER32 wbm_low_level
86
(
87
    .CLK_I(CLK_I),
88
    .RST_I(RST_I),
89
    .TAG_I(TAG_I),
90
    .TAG_O(TAG_O),
91
    .ACK_I(ACK_I),
92
    .ADR_O(ADR_O),
93
    .CYC_O(CYC_O),
94
    .DAT_I(DAT_I),
95
    .DAT_O(DAT_O),
96
    .ERR_I(ERR_I),
97
    .RTY_I(RTY_I),
98
    .SEL_O(SEL_O),
99
    .STB_O(STB_O),
100
    .WE_O(WE_O),
101
    .CAB_O(CAB_O)
102
) ;
103
 
104
// block read and write buffers definition
105
// single write buffer
106
reg `WRITE_STIM_TYPE  blk_write_data    [0:(`MAX_BLK_SIZE - 1)] ;
107
// read stimulus buffer - addresses, tags, selects etc.
108
reg `READ_STIM_TYPE   blk_read_data_in  [0:(`MAX_BLK_SIZE - 1)] ;
109
// read return buffer - data and tags received while performing block reads
110
reg `READ_RETURN_TYPE blk_read_data_out [0:(`MAX_BLK_SIZE - 1)] ;
111
 
112
// single write task
113
task wb_single_write ;
114
    input `WRITE_STIM_TYPE write_data ;
115
    input `WB_TRANSFER_FLAGS   write_flags ;
116
    inout `WRITE_RETURN_TYPE return ;
117
    reg in_use ;
118
    reg cab ;
119
    reg ok ;
120
    integer cyc_count ;
121
    integer rty_count ;
122
    reg retry ;
123 106 mihad
    reg [2:0] use_cti ;
124
    reg [1:0] use_bte ;
125 15 mihad
begin:main
126
 
127
    return`TB_ERROR_BIT = 1'b0 ;
128
    cab = 0 ;
129
    return`CYC_ACTUAL_TRANSFER = 0 ;
130
    rty_count = 0 ;
131
 
132
    // check if task was called before previous call finished
133
    if ( in_use === 1 )
134
    begin
135
        $display("*E, wb_single_write routine re-entered! Time %t ", $time) ;
136
        return`TB_ERROR_BIT = 1'b1 ;
137
        disable main ;
138
    end
139
 
140
    in_use = 1 ;
141
 
142
    retry = 1 ;
143
 
144 106 mihad
    use_cti = {$random} % 8 ;
145
    if (use_cti === 3'b010)
146
        use_cti = 3'b111 ;
147
    else if (use_cti === 3'b001)
148
        use_cti = 3'b000 ;
149
 
150
    use_bte = {$random} % 4 ;
151
 
152
    write_data`WRITE_TAG_STIM = {use_cti, use_bte} ;
153
 
154 15 mihad
    while (retry === 1)
155
    begin
156
        // synchronize operation to clock
157 92 mihad
        if (write_flags`WB_FAST_B2B !== 1'b1)
158
            @(posedge CLK_I) ;
159 15 mihad
 
160 92 mihad
        wbm_low_level.start_cycle(cab, 1'b1, write_flags`WB_FAST_B2B, ok) ;
161 15 mihad
        if ( ok !== 1 )
162
        begin
163
            $display("*E, Failed to initialize cycle! Routine wb_single_write, Time %t ", $time) ;
164
            return`TB_ERROR_BIT = 1'b1 ;
165
            disable main ;
166
        end
167
 
168
        // first insert initial wait states
169
        cyc_count = write_flags`INIT_WAITS ;
170
        while ( cyc_count > 0 )
171
        begin
172
            @(posedge CLK_I) ;
173
            cyc_count = cyc_count - 1 ;
174
        end
175
 
176
        wbm_low_level.wbm_write(write_data, return) ;
177
 
178
        if ( return`CYC_ERR === 0 && return`CYC_ACK === 0 && return`CYC_RTY === 1 && write_flags`WB_TRANSFER_AUTO_RTY === 1 && return`TB_ERROR_BIT === 0)
179
        begin
180
            if ( rty_count === `WB_TB_MAX_RTY )
181
            begin
182
                 $display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_single_write, Time %t ", $time) ;
183
                 retry = 0 ;
184
            end
185
            else
186
            begin
187
                retry     = 1 ;
188
                rty_count = rty_count + 1 ;
189
            end
190
        end
191
        else
192
            retry = 0 ;
193
 
194
        // if test bench error bit is set, there is no meaning in introducing subsequent wait states
195
        if ( return`TB_ERROR_BIT !== 0 )
196
        begin
197
            @(posedge CLK_I) ;
198
            wbm_low_level.end_cycle ;
199
            disable main ;
200
        end
201
 
202
        cyc_count = write_flags`SUBSEQ_WAITS ;
203
        while ( cyc_count > 0 )
204
        begin
205
            @(posedge CLK_I) ;
206
            cyc_count = cyc_count - 1 ;
207
        end
208
 
209
        wbm_low_level.end_cycle ;
210
    end
211
 
212
    in_use = 0 ;
213
 
214
end //main
215
endtask // wb_single_write
216
 
217
task wb_single_read ;
218
    input `READ_STIM_TYPE read_data ;
219
    input `WB_TRANSFER_FLAGS   read_flags ;
220
    inout `READ_RETURN_TYPE return ;
221
    reg in_use ;
222
    reg cab ;
223
    reg ok ;
224
    integer cyc_count ;
225
    integer rty_count ;
226
    reg retry ;
227 106 mihad
    reg [2:0] use_cti ;
228
    reg [1:0] use_bte ;
229 15 mihad
begin:main
230
 
231
    return`TB_ERROR_BIT = 1'b0 ;
232
    cab = 0 ;
233
    rty_count = 0 ;
234
    return`CYC_ACTUAL_TRANSFER = 0 ;
235
 
236
    // check if task was called before previous call finished
237
    if ( in_use === 1 )
238
    begin
239
        $display("*E, wb_single_read routine re-entered! Time %t ", $time) ;
240
        return`TB_ERROR_BIT = 1'b1 ;
241
        disable main ;
242
    end
243
 
244
    in_use = 1 ;
245
 
246
    retry = 1 ;
247
 
248 106 mihad
    use_cti = {$random} % 8 ;
249
    if (use_cti === 3'b010)
250
        use_cti = 3'b111 ;
251
    else if (use_cti === 3'b001)
252
        use_cti = 3'b000 ;
253
 
254
    use_bte = {$random} % 4 ;
255
 
256
    read_data`READ_TAG_STIM = {use_cti, use_bte} ;
257
 
258 15 mihad
    while (retry === 1)
259
    begin
260
        // synchronize operation to clock
261 92 mihad
        if (read_flags`WB_FAST_B2B !== 1'b1)
262
            @(posedge CLK_I) ;
263 15 mihad
 
264 92 mihad
        wbm_low_level.start_cycle(cab, 1'b0, read_flags`WB_FAST_B2B, ok) ;
265 15 mihad
        if ( ok !== 1 )
266
        begin
267
            $display("*E, Failed to initialize cycle! Routine wb_single_read, Time %t ", $time) ;
268
            return`TB_ERROR_BIT = 1'b1 ;
269
            disable main ;
270
        end
271
 
272
        // first insert initial wait states
273
        cyc_count = read_flags`INIT_WAITS ;
274
        while ( cyc_count > 0 )
275
        begin
276
            @(posedge CLK_I) ;
277
            cyc_count = cyc_count - 1 ;
278
        end
279
 
280
        wbm_low_level.wbm_read(read_data, return) ;
281
 
282
        if ( return`CYC_ERR === 0 && return`CYC_ACK === 0 && return`CYC_RTY === 1 && read_flags`WB_TRANSFER_AUTO_RTY === 1 && return`TB_ERROR_BIT === 0)
283
        begin
284
           if ( rty_count === `WB_TB_MAX_RTY )
285
            begin
286
                 $display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_single_read, Time %t ", $time) ;
287
                 retry = 0 ;
288
            end
289
            else
290
            begin
291
                retry     = 1 ;
292
                rty_count = rty_count + 1 ;
293
            end
294
        end
295
        else
296
        begin
297
            retry = 0 ;
298
        end
299
 
300
        // if test bench error bit is set, there is no meaning in introducing subsequent wait states
301
        if ( return`TB_ERROR_BIT !== 0 )
302
        begin
303
            @(posedge CLK_I) ;
304
            wbm_low_level.end_cycle ;
305
            disable main ;
306
        end
307
 
308
        cyc_count = read_flags`SUBSEQ_WAITS ;
309
        while ( cyc_count > 0 )
310
        begin
311
            @(posedge CLK_I) ;
312
            cyc_count = cyc_count - 1 ;
313
        end
314
 
315
        wbm_low_level.end_cycle ;
316
    end
317
 
318
    in_use = 0 ;
319
 
320
end //main
321
endtask // wb_single_read
322
 
323
task wb_RMW_read ;
324
    input `READ_STIM_TYPE read_data ;
325
    input `WB_TRANSFER_FLAGS   read_flags ;
326
    inout `READ_RETURN_TYPE return ;
327
    reg in_use ;
328
    reg cab ;
329
    reg ok ;
330
    integer cyc_count ;
331
    integer rty_count ;
332
    reg retry ;
333 106 mihad
    reg [2:0] use_cti ;
334
    reg [1:0] use_bte ;
335 15 mihad
begin:main
336
 
337
    return`TB_ERROR_BIT = 1'b0 ;
338
    cab = 0 ;
339
    rty_count = 0 ;
340
    return`CYC_ACTUAL_TRANSFER = 0 ;
341
 
342
    // check if task was called before previous call finished
343
    if ( in_use === 1 )
344
    begin
345
        $display("*E, wb_RMW_read routine re-entered! Time %t ", $time) ;
346
        return`TB_ERROR_BIT = 1'b1 ;
347
        disable main ;
348
    end
349
 
350
    in_use = 1 ;
351
 
352
    retry = 1 ;
353
 
354 106 mihad
    use_cti = {$random} % 8 ;
355
    if (use_cti === 3'b010)
356
        use_cti = 3'b111 ;
357
    else if (use_cti === 3'b001)
358
        use_cti = 3'b000 ;
359
 
360
    use_bte = {$random} % 4 ;
361
 
362
    read_data`READ_TAG_STIM = {use_cti, use_bte} ;
363
 
364 15 mihad
    while (retry === 1)
365
    begin
366
        // synchronize operation to clock
367 92 mihad
        if (read_flags`WB_FAST_B2B !== 1'b1)
368
            @(posedge CLK_I) ;
369 15 mihad
 
370 92 mihad
        wbm_low_level.start_cycle(cab, 1'b0, read_flags`WB_FAST_B2B, ok) ;
371 15 mihad
        if ( ok !== 1 )
372
        begin
373
            $display("*E, Failed to initialize cycle! Routine wb_RMW_read, Time %t ", $time) ;
374
            return`TB_ERROR_BIT = 1'b1 ;
375
            disable main ;
376
        end
377
 
378
        // first insert initial wait states
379
        cyc_count = read_flags`INIT_WAITS ;
380
        while ( cyc_count > 0 )
381
        begin
382
            @(posedge CLK_I) ;
383
            cyc_count = cyc_count - 1 ;
384
        end
385
 
386
        wbm_low_level.wbm_read(read_data, return) ;
387
 
388
        if ( return`CYC_ERR === 0 && return`CYC_ACK === 0 && return`CYC_RTY === 1 && read_flags`WB_TRANSFER_AUTO_RTY === 1 && return`TB_ERROR_BIT === 0)
389
        begin
390
           if ( rty_count === `WB_TB_MAX_RTY )
391
            begin
392
                 $display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_RMW_read, Time %t ", $time) ;
393
                 retry = 0 ;
394
            end
395
            else
396
            begin
397
                retry     = 1 ;
398
                rty_count = rty_count + 1 ;
399
            end
400
        end
401
        else
402
        begin
403
            retry = 0 ;
404
        end
405
 
406
        // if test bench error bit is set, there is no meaning in introducing subsequent wait states
407
        if ( return`TB_ERROR_BIT !== 0 )
408
        begin
409
            @(posedge CLK_I) ;
410
            wbm_low_level.end_cycle ;
411
            disable main ;
412
        end
413
 
414
        cyc_count = read_flags`SUBSEQ_WAITS ;
415
        while ( cyc_count > 0 )
416
        begin
417
            @(posedge CLK_I) ;
418
            cyc_count = cyc_count - 1 ;
419
        end
420
 
421
        if (retry === 1)
422
            wbm_low_level.end_cycle ;
423
        else
424
            wbm_low_level.modify_cycle ;
425
    end
426
 
427
    in_use = 0 ;
428
 
429
end //main
430
endtask // wb_RMW_read
431
 
432
task wb_RMW_write ;
433
    input `WRITE_STIM_TYPE write_data ;
434
    input `WB_TRANSFER_FLAGS   write_flags ;
435
    inout `WRITE_RETURN_TYPE return ;
436
    reg in_use ;
437
    reg cab ;
438
    reg ok ;
439
    integer cyc_count ;
440
    integer rty_count ;
441
    reg retry ;
442 106 mihad
    reg [2:0] use_cti ;
443
    reg [1:0] use_bte ;
444 15 mihad
begin:main
445
 
446
    return`TB_ERROR_BIT = 1'b0 ;
447
    cab = 0 ;
448
    return`CYC_ACTUAL_TRANSFER = 0 ;
449
    rty_count = 0 ;
450
 
451
    // check if task was called before previous call finished
452
    if ( in_use === 1 )
453
    begin
454
        $display("*E, wb_RMW_write routine re-entered! Time %t ", $time) ;
455
        return`TB_ERROR_BIT = 1'b1 ;
456
        disable main ;
457
    end
458
 
459
    in_use = 1 ;
460
 
461
    retry = 1 ;
462
 
463 106 mihad
    use_cti = {$random} % 8 ;
464
    if (use_cti === 3'b010)
465
        use_cti = 3'b111 ;
466
    else if (use_cti === 3'b001)
467
        use_cti = 3'b000 ;
468
 
469
    use_bte = {$random} % 4 ;
470
 
471
    write_data`WRITE_TAG_STIM = {use_cti, use_bte} ;
472
 
473 15 mihad
    while (retry === 1)
474
    begin
475
        // synchronize operation to clock
476 92 mihad
        if (write_flags`WB_FAST_B2B !== 1'b1)
477
            @(posedge CLK_I) ;
478
 
479 15 mihad
        ok = 1 ;
480
        if (rty_count !== 0)
481 92 mihad
            wbm_low_level.start_cycle(cab, 1'b1, write_flags`WB_FAST_B2B, ok) ;
482 15 mihad
 
483
        if ( ok !== 1 )
484
        begin
485
            $display("*E, Failed to initialize cycle! Routine wb_single_write, Time %t ", $time) ;
486
            return`TB_ERROR_BIT = 1'b1 ;
487
            disable main ;
488
        end
489
 
490
        // first insert initial wait states
491
        cyc_count = write_flags`INIT_WAITS ;
492
        while ( cyc_count > 0 )
493
        begin
494
            @(posedge CLK_I) ;
495
            cyc_count = cyc_count - 1 ;
496
        end
497
 
498
        wbm_low_level.wbm_write(write_data, return) ;
499
 
500
        if ( return`CYC_ERR === 0 && return`CYC_ACK === 0 && return`CYC_RTY === 1 && write_flags`WB_TRANSFER_AUTO_RTY === 1 && return`TB_ERROR_BIT === 0)
501
        begin
502
            if ( rty_count === `WB_TB_MAX_RTY )
503
            begin
504
                 $display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_single_write, Time %t ", $time) ;
505
                 retry = 0 ;
506
            end
507
            else
508
            begin
509
                retry     = 1 ;
510
                rty_count = rty_count + 1 ;
511
            end
512
        end
513
        else
514
            retry = 0 ;
515
 
516
        // if test bench error bit is set, there is no meaning in introducing subsequent wait states
517
        if ( return`TB_ERROR_BIT !== 0 )
518
        begin
519
            @(posedge CLK_I) ;
520
            wbm_low_level.end_cycle ;
521
            disable main ;
522
        end
523
 
524
        cyc_count = write_flags`SUBSEQ_WAITS ;
525
        while ( cyc_count > 0 )
526
        begin
527
            @(posedge CLK_I) ;
528
            cyc_count = cyc_count - 1 ;
529
        end
530
 
531
        wbm_low_level.end_cycle ;
532
    end
533
 
534
    in_use = 0 ;
535
 
536
end //main
537
endtask // wb_RMW_write
538
 
539
task wb_block_write ;
540
    input  `WB_TRANSFER_FLAGS write_flags ;
541
    inout  `WRITE_RETURN_TYPE return ;
542
 
543
    reg in_use ;
544
    reg `WRITE_STIM_TYPE  current_write ;
545
    reg cab ;
546
    reg ok ;
547
    integer cyc_count ;
548
    integer rty_count ;
549
    reg end_blk ;
550 106 mihad
    reg [2:0] use_cti    ;
551
    reg [1:0] use_bte    ;
552 15 mihad
begin:main
553
 
554
    return`CYC_ACTUAL_TRANSFER = 0 ;
555
    rty_count = 0 ;
556
 
557
    // check if task was called before previous call finished
558
    if ( in_use === 1 )
559
    begin
560
        $display("*E, wb_block_write routine re-entered! Time %t ", $time) ;
561
        return`TB_ERROR_BIT = 1'b1 ;
562
        disable main ;
563
    end
564
 
565
    if (write_flags`WB_TRANSFER_SIZE > `MAX_BLK_SIZE)
566
    begin
567
        $display("*E, number of transfers passed to wb_block_write routine exceeds defined maximum transaction length! Time %t", $time) ;
568
        return`TB_ERROR_BIT = 1'b1 ;
569
        disable main ;
570
    end
571
 
572
    in_use = 1 ;
573 92 mihad
    if (write_flags`WB_FAST_B2B !== 1'b1)
574
        @(posedge CLK_I) ;
575
 
576 15 mihad
    cab = write_flags`WB_TRANSFER_CAB ;
577 106 mihad
 
578
    current_write = blk_write_data[0] ;
579
 
580
    if (cab)
581
    begin:select_burst_type_blk
582
        reg [31:0] burst_start_adr ;
583
 
584
        use_cti = 3'b010 ;
585
 
586
        burst_start_adr = current_write`WRITE_ADDRESS ;
587
        if (burst_start_adr[5:2] === 4'b0000)
588
            use_bte = {$random} % 4 ;
589
        else if (burst_start_adr[4:2] === 3'b000)
590
            use_bte = {$random} % 3 ;
591
        else if (burst_start_adr[3:2] === 2'b00)
592
            use_bte = {$random} % 2 ;
593
        else
594
            use_bte = 2'b00 ;
595
    end
596
    else
597
    begin
598
        if ( (current_write`WRITE_TAG_STIM === 0) | (current_write`WRITE_TAG_STIM === {`WB_TAG_WIDTH{1'bx}}) )
599
        begin
600
            use_cti = {$random} % 8 ;
601
            if (use_cti === 3'b010)
602
                use_cti = 3'b111 ;
603
            else if (use_cti === 3'b001)
604
                use_cti = 3'b000 ;
605
 
606
            use_bte = {$random} % 4 ;
607
        end
608
        else
609
        begin
610
            {use_cti, use_bte} = current_write`WRITE_TAG_STIM ;
611
        end
612
    end
613
 
614 92 mihad
    wbm_low_level.start_cycle(cab, 1'b1, write_flags`WB_FAST_B2B, ok) ;
615 15 mihad
    if ( ok !== 1 )
616
    begin
617
        $display("*E, Failed to initialize cycle! Routine wb_block_write, Time %t ", $time) ;
618
        return`TB_ERROR_BIT = 1'b1 ;
619
        disable main ;
620
    end
621
 
622
    // insert initial wait states
623
    cyc_count = write_flags`INIT_WAITS ;
624
    while ( cyc_count > 0 )
625
    begin
626
        @(posedge CLK_I) ;
627
        cyc_count = cyc_count - 1 ;
628
    end
629
 
630
    end_blk = 0 ;
631
    while (end_blk === 0)
632
    begin
633 106 mihad
 
634 15 mihad
        // collect data for current data beat
635
        current_write = blk_write_data[return`CYC_ACTUAL_TRANSFER] ;
636 106 mihad
 
637
        if (cab)
638
        begin
639
            if ((return`CYC_ACTUAL_TRANSFER + 1'b1) >= write_flags`WB_TRANSFER_SIZE)
640
                use_cti = 3'b111 ;
641
        end
642
 
643
        current_write`WRITE_TAG_STIM = {use_cti, use_bte} ;
644
 
645 15 mihad
        wbm_low_level.wbm_write(current_write, return) ;
646
 
647
        // check result of write operation
648
        // check for severe test error
649
        if (return`TB_ERROR_BIT !== 0)
650
        begin
651
           @(posedge CLK_I) ;
652
           wbm_low_level.end_cycle ;
653
           disable main ;
654
        end
655
 
656
        // slave returned error or error signal had invalid value
657
        if (return`CYC_ERR !== 0)
658
            end_blk = 1 ;
659
 
660
        if (
661
            (return`CYC_RTY !== 0) && (return`CYC_RTY !== 1) ||
662
            (return`CYC_ACK !== 0) && (return`CYC_ACK !== 1) ||
663
            (return`CYC_ERR !== 0) && (return`CYC_ERR !== 1)
664
           )
665
        begin
666
            end_blk = 1 ;
667
            $display("*E, at least one slave response signal was invalid when cycle finished! Routine wb_block_write, Time %t ", $time) ;
668
            $display("ACK = %b \t RTY_O = %b \t ERR_O = %b \t", return`CYC_ACK, return`CYC_RTY, return`CYC_ERR) ;
669
        end
670
 
671
        if ((return`CYC_RTY === 1) && (write_flags`WB_TRANSFER_AUTO_RTY !== 1))
672
            end_blk = 1 ;
673
 
674
        if ((return`CYC_RTY === 1) && (write_flags`WB_TRANSFER_AUTO_RTY === 1))
675
        begin
676
            if ( rty_count === `WB_TB_MAX_RTY )
677
            begin
678
                 $display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_block_write, Time %t ", $time) ;
679
                 end_blk = 1 ;
680
            end
681
            else
682
            begin
683 106 mihad
                if (cab)
684
                begin
685
                    use_bte = 2'b00 ;
686
                end
687
 
688 15 mihad
                rty_count = rty_count + 1 ;
689
            end
690
        end
691
        else
692
            rty_count = 0 ;
693
 
694
        // check if slave responded at all
695
        if (return`CYC_RESPONSE === 0)
696
            end_blk = 1 ;
697
 
698
        // check if all intended data was transfered
699
        if (return`CYC_ACTUAL_TRANSFER === write_flags`WB_TRANSFER_SIZE)
700
            end_blk = 1 ;
701
 
702
        // insert subsequent wait cycles, if transfer is supposed to continue
703
        if ( end_blk === 0 )
704
        begin
705
            cyc_count = write_flags`SUBSEQ_WAITS ;
706
            while ( cyc_count > 0 )
707
            begin
708
                @(posedge CLK_I) ;
709
                cyc_count = cyc_count - 1 ;
710
            end
711
        end
712
 
713
        if ( (end_blk === 0) && (return`CYC_RTY === 1) )
714
        begin
715 92 mihad
            if (write_flags`WB_FAST_B2B !== 1'b1)
716 15 mihad
            begin
717 92 mihad
                wbm_low_level.end_cycle ;
718
                @(posedge CLK_I) ;
719
                wbm_low_level.start_cycle(cab, 1'b1, 1'b0, ok) ;
720
                if ( ok !== 1 )
721
                begin
722
                    $display("*E, Failed to initialize cycle! Routine wb_block_write, Time %t ", $time) ;
723
                    return`TB_ERROR_BIT = 1'b1 ;
724
                    end_blk = 1 ;
725
                end
726 15 mihad
            end
727
        end
728
    end //while
729
 
730
    wbm_low_level.end_cycle ;
731
    in_use = 0 ;
732
end //main
733
endtask //wb_block_write
734
 
735
task wb_block_read ;
736
    input  `WB_TRANSFER_FLAGS      read_flags ;
737
    inout `READ_RETURN_TYPE       return ;
738
 
739
    reg in_use ;
740
    reg `READ_STIM_TYPE  current_read ;
741
    reg cab ;
742
    reg ok ;
743
    integer cyc_count ;
744
    integer rty_count ;
745
    reg end_blk ;
746
    integer transfered ;
747 106 mihad
    reg [2:0] use_cti ;
748
    reg [1:0] use_bte ;
749 15 mihad
begin:main
750
 
751
    return`CYC_ACTUAL_TRANSFER = 0 ;
752
    transfered = 0 ;
753
    rty_count = 0 ;
754
 
755
    // check if task was called before previous call finished
756
    if ( in_use === 1 )
757
    begin
758
        $display("*E, wb_block_read routine re-entered! Time %t ", $time) ;
759
        return`TB_ERROR_BIT = 1'b1 ;
760
        disable main ;
761
    end
762
 
763
    if (read_flags`WB_TRANSFER_SIZE > `MAX_BLK_SIZE)
764
    begin
765
        $display("*E, number of transfers passed to wb_block_read routine exceeds defined maximum transaction length! Time %t", $time) ;
766
        return`TB_ERROR_BIT = 1'b1 ;
767
        disable main ;
768
    end
769
 
770
    in_use = 1 ;
771
    @(posedge CLK_I) ;
772
    cab = read_flags`WB_TRANSFER_CAB ;
773
 
774 106 mihad
    if (cab)
775
    begin:select_burst_type_blk
776
        reg [31:0] burst_start_adr ;
777
 
778
        use_cti = 3'b010 ;
779
 
780
        current_read = blk_read_data_in[0] ;
781
        burst_start_adr = current_read`READ_ADDRESS ;
782
        if (burst_start_adr[5:2] === 4'b0000)
783
            use_bte = {$random} % 4 ;
784
        else if (burst_start_adr[4:2] === 3'b000)
785
            use_bte = {$random} % 3 ;
786
        else if (burst_start_adr[3:2] === 2'b00)
787
            use_bte = {$random} % 2 ;
788
        else
789
            use_bte = 2'b00 ;
790
    end
791
 
792 92 mihad
    wbm_low_level.start_cycle(cab, 1'b0, read_flags`WB_FAST_B2B, ok) ;
793 15 mihad
 
794
    if ( ok !== 1 )
795
    begin
796
        $display("*E, Failed to initialize cycle! Routine wb_block_read, Time %t ", $time) ;
797
        return`TB_ERROR_BIT = 1'b1 ;
798
        disable main ;
799
    end
800
 
801
    // insert initial wait states
802
    cyc_count = read_flags`INIT_WAITS ;
803
    while ( cyc_count > 0 )
804
    begin
805
        @(posedge CLK_I) ;
806
        cyc_count = cyc_count - 1 ;
807
    end
808
 
809
    end_blk = 0 ;
810
    while (end_blk === 0)
811
    begin
812
        // collect data for current data beat
813
        current_read = blk_read_data_in[return`CYC_ACTUAL_TRANSFER] ;
814
 
815 106 mihad
        if (cab)
816
        begin
817
            if ((return`CYC_ACTUAL_TRANSFER + 1'b1) >= read_flags`WB_TRANSFER_SIZE)
818
                use_cti = 3'b111 ;
819
        end
820
 
821
        current_read`READ_TAG_STIM = {use_cti, use_bte} ;
822
 
823 15 mihad
        wbm_low_level.wbm_read(current_read, return) ;
824
 
825
        if ( transfered !== return`CYC_ACTUAL_TRANSFER )
826
        begin
827
            blk_read_data_out[transfered] = return ;
828
            transfered = return`CYC_ACTUAL_TRANSFER ;
829
        end
830
 
831
        // check result of read operation
832
        // check for severe test error
833
        if (return`TB_ERROR_BIT !== 0)
834
        begin
835
           @(posedge CLK_I) ;
836
           wbm_low_level.end_cycle ;
837
           disable main ;
838
        end
839
 
840
        // slave returned error or error signal had invalid value
841
        if (return`CYC_ERR !== 0)
842
            end_blk = 1 ;
843
 
844
        if (
845
            (return`CYC_RTY !== 0) && (return`CYC_RTY !== 1) ||
846
            (return`CYC_ACK !== 0) && (return`CYC_ACK !== 1) ||
847
            (return`CYC_ERR !== 0) && (return`CYC_ERR !== 1)
848
           )
849
        begin
850
            end_blk = 1 ;
851
            $display("*E, at least one slave response signal was invalid when cycle finished! Routine wb_block_read, Time %t ", $time) ;
852
            $display("ACK = %b \t RTY_O = %b \t ERR_O = %b \t", return`CYC_ACK, return`CYC_RTY, return`CYC_ERR) ;
853
        end
854
 
855
        if ((return`CYC_RTY === 1) && (read_flags`WB_TRANSFER_AUTO_RTY !== 1))
856
            end_blk = 1 ;
857
 
858
        if ((return`CYC_RTY === 1) && (read_flags`WB_TRANSFER_AUTO_RTY === 1))
859
        begin
860
            if ( rty_count === `WB_TB_MAX_RTY )
861
            begin
862
                 $display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_block_read, Time %t ", $time) ;
863
                 end_blk = 1 ;
864
            end
865
            else
866
            begin
867 106 mihad
                if (cab)
868
                begin
869
                    use_bte = 2'b00 ;
870
                end
871
 
872 15 mihad
                rty_count = rty_count + 1 ;
873
            end
874
        end
875
        else
876
            rty_count = 0 ;
877
 
878
        // check if slave responded at all
879
        if (return`CYC_RESPONSE === 0)
880
            end_blk = 1 ;
881
 
882
        // check if all intended data was transfered
883
        if (return`CYC_ACTUAL_TRANSFER === read_flags`WB_TRANSFER_SIZE)
884
            end_blk = 1 ;
885
 
886
        // insert subsequent wait cycles, if transfer is supposed to continue
887
        if ( end_blk === 0 )
888
        begin
889
            cyc_count = read_flags`SUBSEQ_WAITS ;
890
            while ( cyc_count > 0 )
891
            begin
892
                @(posedge CLK_I) ;
893
                cyc_count = cyc_count - 1 ;
894
            end
895
        end
896
 
897
        if ( (end_blk === 0) && (return`CYC_RTY === 1) )
898
        begin
899 92 mihad
            if (read_flags`WB_FAST_B2B !== 1'b1)
900 15 mihad
            begin
901 92 mihad
                wbm_low_level.end_cycle ;
902
                @(posedge CLK_I) ;
903
                wbm_low_level.start_cycle(cab, 1'b0, 1'b0, ok) ;
904
                if ( ok !== 1 )
905
                begin
906
                    $display("*E, Failed to initialize cycle! Routine wb_block_read, Time %t ", $time) ;
907
                    return`TB_ERROR_BIT = 1'b1 ;
908
                    end_blk = 1 ;
909
                end
910 15 mihad
            end
911
        end
912
    end //while
913
 
914
    wbm_low_level.end_cycle ;
915
    in_use = 0 ;
916
end //main
917
endtask //wb_block_read
918
 
919 92 mihad
task shift_write_buffer ;
920
    input [31:0] shift_num ;
921
    integer i ;
922
begin
923
    if (shift_num < `MAX_BLK_SIZE)
924
    begin
925
 
926
        for (i = 0 ; i + shift_num < `MAX_BLK_SIZE ; i = i + 1)
927
        begin
928
            blk_write_data[i] = blk_write_data[i + shift_num] ;
929
        end
930
 
931
        for (i = (`MAX_BLK_SIZE - shift_num) ; i < `MAX_BLK_SIZE ; i = i + 1)
932
            blk_write_data[i] = {1024{1'bx}} ;
933
    end
934
end
935
endtask // shift_write_buffer
936
 
937 15 mihad
endmodule
938
 

powered by: WebSVN 2.1.0

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