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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [wishbone/] [testbecnh/] [dev_wb_cross/] [sim/] [tb.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
//////////////////////////////////////////////////////////////////////////////////
2
// Company:         ;)
3
// Engineer:        Kuzmi4 (original src - des00)
4
// 
5
// Create Date:     14:39:52 05/19/2010 
6
// Design Name:     
7
// Module Name:     tb/wb_cross
8
// Project Name:    DS_DMA
9
// Target Devices:  no
10
// Tool versions:   any with SV support
11
// Description: 
12
//                  
13
//                  Multi-tests for WB_CROSS
14
//                      ==> oriented for 4KB MM division for WBS
15
//
16
// Revision: 
17
// Revision 0.01 - File Created
18
//
19
//////////////////////////////////////////////////////////////////////////////////
20
`timescale 1ns / 1ps
21
 
22
`include "wb_intf.sv"
23
`include "wb_tb_simple_ram_slave.v"
24
 
25
module tb;
26
//////////////////////////////////////////////////////////////////////////////////
27
/**/
28
localparam  lp_MASTER_Q =    8;
29
localparam  lp_SLAVE_Q  =   16;
30
//
31
localparam  lp_ADDR_W   =   32;
32
localparam  lp_DATA_W   =   64;
33
localparam  lp_SEL_W    =    8;
34
 
35
localparam  lp_FULL_ADDR_RANGE  =   33'h1_0000_0000;    // 
36
localparam  lp_MY_MEM_SIZE      =    512;               // 512 WORDS (512x64bit)
37
//localparam  lp_MY_MEM_SIZE      =   4096;               // 4K WORDS
38
                                                        //  ==> wb_tb_simple_ram_slave: bit [pD_W-1 : 0] ram [16*512 : 0] !!!
39
/*
40
parameter  lp_MASTER_Q =   2;
41
parameter  lp_SLAVE_Q  =   8;
42
//
43
parameter  lp_ADDR_W   =   32;
44
parameter  lp_DATA_W   =   64;
45
parameter  lp_SEL_W    =    8;*/
46
//
47
parameter bit [lp_ADDR_W-1 : 0] lp_SLAVE_ADDR_BASE [0 : lp_SLAVE_Q-1] = '{
48
                                                                            32'h000_00,
49
                                                                            32'h010_00,
50
                                                                            32'h020_00,
51
                                                                            32'h030_00,
52
                                                                            32'h040_00,
53
                                                                            32'h050_00,
54
                                                                            32'h060_00,
55
                                                                            32'h070_00,
56
                                                                            32'h080_00,
57
                                                                            32'h090_00,
58
                                                                            32'h0A0_00,
59
                                                                            32'h0B0_00,
60
                                                                            32'h0C0_00,
61
                                                                            32'h0D0_00,
62
                                                                            32'h0E0_00,
63
                                                                            32'h0F0_00
64
 
65
                                                                        } ;
66
 
67
 
68
//////////////////////////////////////////////////////////////////////////////////
69
//
70
parameter   p_Tclk  =   10ns;
71
parameter   p_Trst  =   120ns;
72
//////////////////////////////////////////////////////////////////////////////////
73
    // Declare SYS_CON stuff:
74
    reg     s_sys_clk;
75
    reg     s_sys_rst;
76
    //
77
    logic   [2:0]               wb_m_cti_i  [0 : lp_MASTER_Q-1] ;
78
    logic   [1:0]               wb_m_bte_i  [0 : lp_MASTER_Q-1] ;
79
    logic   [lp_MASTER_Q-1 : 0] wb_m_cyc_i                      ;
80
    logic   [lp_MASTER_Q-1 : 0] wb_m_stb_i                      ;
81
    logic   [lp_MASTER_Q-1 : 0] wb_m_we_i                       ;
82
    logic   [lp_ADDR_W-1 : 0]   wb_m_adr_i  [0 : lp_MASTER_Q-1] ;
83
    logic   [lp_DATA_W-1 : 0]   wb_m_dat_i  [0 : lp_MASTER_Q-1] ;
84
    logic   [lp_SEL_W-1 : 0]    wb_m_sel_i  [0 : lp_MASTER_Q-1] ;
85
    logic   [lp_MASTER_Q-1 : 0] wb_m_ack_o                      ;
86
    logic   [lp_MASTER_Q-1 : 0] wb_m_err_o                      ;
87
    logic   [lp_MASTER_Q-1 : 0] wb_m_rty_o                      ;
88
    logic   [lp_DATA_W-1 : 0]   wb_m_dat_o  [0 : lp_MASTER_Q-1] ;
89
 
90
    logic   [2:0]               wb_s_cti_o  [0 : lp_SLAVE_Q-1]  ;
91
    logic   [1:0]               wb_s_bte_o  [0 : lp_SLAVE_Q-1]  ;
92
    logic   [lp_SLAVE_Q-1 : 0]  wb_s_ack_i                      ;
93
    logic   [lp_SLAVE_Q-1 : 0]  wb_s_err_i                      ;
94
    logic   [lp_SLAVE_Q-1 : 0]  wb_s_rty_i                      ;
95
    logic   [lp_DATA_W-1 : 0]   wb_s_dat_i  [0 : lp_SLAVE_Q-1]  ;
96
    logic   [lp_SLAVE_Q-1 : 0]  wb_s_cyc_o                      ;
97
    logic   [lp_SLAVE_Q-1 : 0]  wb_s_stb_o                      ;
98
    logic   [lp_SLAVE_Q-1 : 0]  wb_s_we_o                       ;
99
    logic   [lp_ADDR_W-1 : 0]   wb_s_adr_o  [0 : lp_SLAVE_Q-1]  ;
100
    logic   [lp_DATA_W-1 : 0]   wb_s_dat_o  [0 : lp_SLAVE_Q-1]  ;
101
    logic   [lp_SEL_W-1 : 0]    wb_s_sel_o  [0 : lp_SLAVE_Q-1]  ;
102
    //
103
    int err_cnt = 0;
104
//////////////////////////////////////////////////////////////////////////////////
105
//
106
// Use CLASS
107
//
108
`include "wb_tb_simple_master.sv"
109
 
110
//////////////////////////////////////////////////////////////////////////////////
111
//
112
// System Clock:
113
//
114
always
115
begin   :   SYS_CLK
116
    #(p_Tclk/2) s_sys_clk <= !s_sys_clk;
117
end
118
//////////////////////////////////////////////////////////////////////////////////
119
//
120
// Instaniate WB_SLAVEs:
121
//
122
  generate
123
    for (genvar i = 0; i < lp_SLAVE_Q; i++) begin : slave_ram_gen
124
      wb_tb_simple_ram_slave
125
      #(
126
        .pA_W   ( lp_ADDR_W ) ,
127
        .pD_W   ( lp_DATA_W ) ,
128
        .pSEL_W ( lp_SEL_W  )
129
      )
130
      ram_slave
131
      (
132
        .clk   ( s_sys_clk         ) ,
133
        .rst   ( s_sys_rst         ) ,
134
        //
135
        .cyc_i ( wb_s_cyc_o [i] ) ,
136
        .stb_i ( wb_s_stb_o [i] ) ,
137
        .we_i  ( wb_s_we_o  [i] ) ,
138
        .adr_i ( {20'b0, wb_s_adr_o [i][11:0]} ) ,   // NB!!! 4KB WORD-ADDR ROUTE for now
139
        .dat_i ( wb_s_dat_o [i] ) ,
140
        .sel_i ( wb_s_sel_o [i] ) ,
141
        //
142
        .ack_o ( wb_s_ack_i [i] ) ,
143
        .err_o ( wb_s_err_i [i] ) ,
144
        .rty_o ( wb_s_rty_i [i] ) ,
145
        .dat_o ( wb_s_dat_i [i] )
146
      );
147
    end
148
  endgenerate
149
//////////////////////////////////////////////////////////////////////////////////
150
//
151
// Deal with WB MASTER stuff:
152
//
153
// wb_master if:
154
wb_m_if #(lp_ADDR_W, lp_DATA_W, lp_SEL_W) m_if[0 : lp_MASTER_Q-1] (s_sys_clk, s_sys_rst);
155
// wb master class:
156
wb_tb_simple_master wbm [lp_MASTER_Q];
157
// route wires
158
  generate
159
    for (genvar i = 0; i < lp_MASTER_Q ; i++) begin :   WBM_ROUTE
160
      assign wb_m_cyc_i[i] = m_if[i].cyc_o;
161
      assign wb_m_stb_i[i] = m_if[i].stb_o;
162
      assign wb_m_we_i [i] = m_if[i].we_o ;
163
      assign wb_m_adr_i[i] = m_if[i].adr_o;
164
      assign wb_m_dat_i[i] = m_if[i].dat_o;
165
      assign wb_m_sel_i[i] = m_if[i].sel_o;
166
 
167
      assign m_if[i].ack_i = wb_m_ack_o[i];
168
      assign m_if[i].err_i = wb_m_err_o[i];
169
      assign m_if[i].rty_i = wb_m_rty_o[i];
170
      assign m_if[i].dat_i = wb_m_dat_o[i];
171
    end
172
  endgenerate
173
// 
174
  generate
175
    for (genvar i = 0; i < lp_MASTER_Q; i++) begin  :   CRE_WBM
176
      initial begin : menthor_hack
177
        wbm[i] = new("master", m_if[i]);
178
      end
179
    end
180
  endgenerate
181
//////////////////////////////////////////////////////////////////////////////////
182
//
183
// Instaniate DEFAULT CLOCKING BLOCK:
184
//
185
  default clocking cb @(s_sys_clk);
186
  endclocking
187
//////////////////////////////////////////////////////////////////////////////////
188
//
189
// Local Initial PowerOnReset:
190
//
191
initial
192
begin   :   init_POR
193
    // 
194
    $timeformat(-9, 3, " ns", 10);
195
    // 
196
    s_sys_clk   <= 0;
197
    s_sys_rst   <= 0;
198
 
199
    // PowerOnReset case
200
    s_sys_rst   <= 1; #p_Trst;
201
    s_sys_rst   <= 0;
202
 
203
end
204
 
205
initial
206
begin   :   CRE_WB_CTI_BTE
207
 
208
    for (int i=0;i<lp_MASTER_Q;i++)
209
        begin
210
            wb_m_cti_i[i] = i+$urandom_range(0, lp_MASTER_Q-1);
211
            wb_m_bte_i[i] = i+1+$urandom_range(0, lp_MASTER_Q-1);
212
        end
213
 
214
end
215
//////////////////////////////////////////////////////////////////////////////////
216
//
217
// Test: 
218
//
219
initial
220
begin   :   TB
221
    // Init MSG:
222
    $display("==> test start.");
223
    // Provide WB_MASTERs INIT:
224
    foreach (wbm[i]) begin
225
      wbm[i].init();
226
    end;
227
    // W8 PowerOnReset:
228
    do @(posedge s_sys_clk);
229
    while (s_sys_rst); #1us;
230
    // Main tests:
231
    single_master_multi_slave_test(1);      // 
232
    multi_master_single_slave_test(1, 0);   // nlock
233
    multi_master_single_slave_test(1, 1);   //  lock
234
    multi_master_multi_slave_test (1, 0);   // nlock
235
    multi_master_multi_slave_test (1, 1);   //  lock
236
    /**/
237
    // Final:
238
    $display("==> test done. errors = %0d", err_cnt);
239
    #100ns;
240
    $finish(2);
241
end
242
 
243
initial
244
begin   :   WB_CTI_BTE_PROCESS
245
    //
246
    // W8 PowerOnReset:
247
    do @(posedge s_sys_clk);
248
    while (s_sys_rst); #1us;
249
    //
250
    // START req stuff:
251
    for (int i=0;i<lp_MASTER_Q;i++)
252
        monitor_wb_cti_bte(i);
253
 
254
end
255
//////////////////////////////////////////////////////////////////////////////////
256
//
257
// 
258
//
259
wb_conmax_top   DUT
260
(
261
// SYS_CON
262
.clk_i      ( s_sys_clk     ),
263
.rst_i      ( s_sys_rst     ),
264
// 
265
// Master #0
266
// Wishbone Master interface
267
.m0_data_i  ( wb_m_dat_i[0] ),
268
.m0_addr_i  ( wb_m_adr_i[0] ),
269
.m0_sel_i   ( wb_m_sel_i[0] ),
270
.m0_we_i    ( wb_m_we_i [0] ),
271
.m0_cyc_i   ( wb_m_cyc_i[0] ),
272
.m0_stb_i   ( wb_m_stb_i[0] ),
273
.m0_cti_i   ( wb_m_cti_i[0] ),
274
.m0_bte_i   ( wb_m_bte_i[0] ),
275
 
276
.m0_data_o  ( wb_m_dat_o[0] ),
277
.m0_ack_o   ( wb_m_ack_o[0] ),
278
.m0_err_o   ( wb_m_err_o[0] ),
279
.m0_rty_o   ( wb_m_rty_o[0] ),
280
//
281
// Master #1
282
// Wishbone Master interface
283
.m1_data_i  ( wb_m_dat_i[1] ),
284
.m1_addr_i  ( wb_m_adr_i[1] ),
285
.m1_sel_i   ( wb_m_sel_i[1] ),
286
.m1_we_i    ( wb_m_we_i [1] ),
287
.m1_cyc_i   ( wb_m_cyc_i[1] ),
288
.m1_stb_i   ( wb_m_stb_i[1] ),
289
.m1_cti_i   ( wb_m_cti_i[1] ),
290
.m1_bte_i   ( wb_m_bte_i[1] ),
291
 
292
.m1_data_o  ( wb_m_dat_o[1] ),
293
.m1_ack_o   ( wb_m_ack_o[1] ),
294
.m1_err_o   ( wb_m_err_o[1] ),
295
.m1_rty_o   ( wb_m_rty_o[1] ),
296
//
297
// Master #2
298
// Wishbone Master interface
299
.m2_data_i  ( wb_m_dat_i[2] ),
300
.m2_addr_i  ( wb_m_adr_i[2] ),
301
.m2_sel_i   ( wb_m_sel_i[2] ),
302
.m2_we_i    ( wb_m_we_i [2] ),
303
.m2_cyc_i   ( wb_m_cyc_i[2] ),
304
.m2_stb_i   ( wb_m_stb_i[2] ),
305
.m2_cti_i   ( wb_m_cti_i[2] ),
306
.m2_bte_i   ( wb_m_bte_i[2] ),
307
 
308
.m2_data_o  ( wb_m_dat_o[2] ),
309
.m2_ack_o   ( wb_m_ack_o[2] ),
310
.m2_err_o   ( wb_m_err_o[2] ),
311
.m2_rty_o   ( wb_m_rty_o[2] ),
312
//
313
// Master #3
314
// Wishbone Master interface
315
.m3_data_i  ( wb_m_dat_i[3] ),
316
.m3_addr_i  ( wb_m_adr_i[3] ),
317
.m3_sel_i   ( wb_m_sel_i[3] ),
318
.m3_we_i    ( wb_m_we_i [3] ),
319
.m3_cyc_i   ( wb_m_cyc_i[3] ),
320
.m3_stb_i   ( wb_m_stb_i[3] ),
321
.m3_cti_i   ( wb_m_cti_i[3] ),
322
.m3_bte_i   ( wb_m_bte_i[3] ),
323
 
324
.m3_data_o  ( wb_m_dat_o[3] ),
325
.m3_ack_o   ( wb_m_ack_o[3] ),
326
.m3_err_o   ( wb_m_err_o[3] ),
327
.m3_rty_o   ( wb_m_rty_o[3] ),
328
//
329
// Master #4
330
// Wishbone Master interface
331
.m4_data_i  ( wb_m_dat_i[4] ),
332
.m4_addr_i  ( wb_m_adr_i[4] ),
333
.m4_sel_i   ( wb_m_sel_i[4] ),
334
.m4_we_i    ( wb_m_we_i [4] ),
335
.m4_cyc_i   ( wb_m_cyc_i[4] ),
336
.m4_stb_i   ( wb_m_stb_i[4] ),
337
.m4_cti_i   ( wb_m_cti_i[4] ),
338
.m4_bte_i   ( wb_m_bte_i[4] ),
339
 
340
.m4_data_o  ( wb_m_dat_o[4] ),
341
.m4_ack_o   ( wb_m_ack_o[4] ),
342
.m4_err_o   ( wb_m_err_o[4] ),
343
.m4_rty_o   ( wb_m_rty_o[4] ),
344
//
345
// Master #5
346
// Wishbone Master interface
347
.m5_data_i  ( wb_m_dat_i[5] ),
348
.m5_addr_i  ( wb_m_adr_i[5] ),
349
.m5_sel_i   ( wb_m_sel_i[5] ),
350
.m5_we_i    ( wb_m_we_i [5] ),
351
.m5_cyc_i   ( wb_m_cyc_i[5] ),
352
.m5_stb_i   ( wb_m_stb_i[5] ),
353
.m5_cti_i   ( wb_m_cti_i[5] ),
354
.m5_bte_i   ( wb_m_bte_i[5] ),
355
 
356
.m5_data_o  ( wb_m_dat_o[5] ),
357
.m5_ack_o   ( wb_m_ack_o[5] ),
358
.m5_err_o   ( wb_m_err_o[5] ),
359
.m5_rty_o   ( wb_m_rty_o[5] ),
360
//
361
// Master #6
362
// Wishbone Master interfac
363
.m6_data_i  ( wb_m_dat_i[6] ),
364
.m6_addr_i  ( wb_m_adr_i[6] ),
365
.m6_sel_i   ( wb_m_sel_i[6] ),
366
.m6_we_i    ( wb_m_we_i [6] ),
367
.m6_cyc_i   ( wb_m_cyc_i[6] ),
368
.m6_stb_i   ( wb_m_stb_i[6] ),
369
.m6_cti_i   ( wb_m_cti_i[6] ),
370
.m6_bte_i   ( wb_m_bte_i[6] ),
371
 
372
.m6_data_o  ( wb_m_dat_o[6] ),
373
.m6_ack_o   ( wb_m_ack_o[6] ),
374
.m6_err_o   ( wb_m_err_o[6] ),
375
.m6_rty_o   ( wb_m_rty_o[6] ),
376
//
377
// Master #7
378
// Wishbone Master interface
379
.m7_data_i  ( wb_m_dat_i[7] ),
380
.m7_addr_i  ( wb_m_adr_i[7] ),
381
.m7_sel_i   ( wb_m_sel_i[7] ),
382
.m7_we_i    ( wb_m_we_i [7] ),
383
.m7_cyc_i   ( wb_m_cyc_i[7] ),
384
.m7_stb_i   ( wb_m_stb_i[7] ),
385
.m7_cti_i   ( wb_m_cti_i[7] ),
386
.m7_bte_i   ( wb_m_bte_i[7] ),
387
 
388
.m7_data_o  ( wb_m_dat_o[7] ),
389
.m7_ack_o   ( wb_m_ack_o[7] ),
390
.m7_err_o   ( wb_m_err_o[7] ),
391
.m7_rty_o   ( wb_m_rty_o[7] ),
392
 
393
//
394
// Slave #0
395
// Wishbone Slave interface
396
.s0_data_o  ( wb_s_dat_o[0] ),
397
.s0_addr_o  ( wb_s_adr_o[0] ),
398
.s0_sel_o   ( wb_s_sel_o[0] ),
399
.s0_we_o    ( wb_s_we_o [0] ),
400
.s0_cyc_o   ( wb_s_cyc_o[0] ),
401
.s0_stb_o   ( wb_s_stb_o[0] ),
402
.s0_cti_o   ( wb_s_cti_o[0] ),
403
.s0_bte_o   ( wb_s_bte_o[0] ),
404
 
405
.s0_data_i  ( wb_s_dat_i[0] ),
406
.s0_ack_i   ( wb_s_ack_i[0] ),
407
.s0_err_i   ( wb_s_err_i[0] ),
408
.s0_rty_i   ( wb_s_rty_i[0] ),
409
//
410
// Slave #1
411
// Wishbone Slave interface
412
.s1_data_o  ( wb_s_dat_o[1] ),
413
.s1_addr_o  ( wb_s_adr_o[1] ),
414
.s1_sel_o   ( wb_s_sel_o[1] ),
415
.s1_we_o    ( wb_s_we_o [1] ),
416
.s1_cyc_o   ( wb_s_cyc_o[1] ),
417
.s1_stb_o   ( wb_s_stb_o[1] ),
418
.s1_cti_o   ( wb_s_cti_o[1] ),
419
.s1_bte_o   ( wb_s_bte_o[1] ),
420
 
421
.s1_data_i  ( wb_s_dat_i[1] ),
422
.s1_ack_i   ( wb_s_ack_i[1] ),
423
.s1_err_i   ( wb_s_err_i[1] ),
424
.s1_rty_i   ( wb_s_rty_i[1] ),
425
//
426
// Slave #2
427
// Wishbone Slave interface
428
.s2_data_o  ( wb_s_dat_o[2] ),
429
.s2_addr_o  ( wb_s_adr_o[2] ),
430
.s2_sel_o   ( wb_s_sel_o[2] ),
431
.s2_we_o    ( wb_s_we_o [2] ),
432
.s2_cyc_o   ( wb_s_cyc_o[2] ),
433
.s2_stb_o   ( wb_s_stb_o[2] ),
434
.s2_cti_o   ( wb_s_cti_o[2] ),
435
.s2_bte_o   ( wb_s_bte_o[2] ),
436
 
437
.s2_data_i  ( wb_s_dat_i[2] ),
438
.s2_ack_i   ( wb_s_ack_i[2] ),
439
.s2_err_i   ( wb_s_err_i[2] ),
440
.s2_rty_i   ( wb_s_rty_i[2] ),
441
//
442
// Slave #3
443
// Wishbone Slave interface
444
.s3_data_o  ( wb_s_dat_o[3] ),
445
.s3_addr_o  ( wb_s_adr_o[3] ),
446
.s3_sel_o   ( wb_s_sel_o[3] ),
447
.s3_we_o    ( wb_s_we_o [3] ),
448
.s3_cyc_o   ( wb_s_cyc_o[3] ),
449
.s3_stb_o   ( wb_s_stb_o[3] ),
450
.s3_cti_o   ( wb_s_cti_o[3] ),
451
.s3_bte_o   ( wb_s_bte_o[3] ),
452
 
453
.s3_data_i  ( wb_s_dat_i[3] ),
454
.s3_ack_i   ( wb_s_ack_i[3] ),
455
.s3_err_i   ( wb_s_err_i[3] ),
456
.s3_rty_i   ( wb_s_rty_i[3] ),
457
//
458
// Slave #4
459
// Wishbone Slave interface
460
.s4_data_o  ( wb_s_dat_o[4] ),
461
.s4_addr_o  ( wb_s_adr_o[4] ),
462
.s4_sel_o   ( wb_s_sel_o[4] ),
463
.s4_we_o    ( wb_s_we_o [4] ),
464
.s4_cyc_o   ( wb_s_cyc_o[4] ),
465
.s4_stb_o   ( wb_s_stb_o[4] ),
466
.s4_cti_o   ( wb_s_cti_o[4] ),
467
.s4_bte_o   ( wb_s_bte_o[4] ),
468
 
469
.s4_data_i  ( wb_s_dat_i[4] ),
470
.s4_ack_i   ( wb_s_ack_i[4] ),
471
.s4_err_i   ( wb_s_err_i[4] ),
472
.s4_rty_i   ( wb_s_rty_i[4] ),
473
//
474
// Slave #5
475
// Wishbone Slave interface
476
.s5_data_o  ( wb_s_dat_o[5] ),
477
.s5_addr_o  ( wb_s_adr_o[5] ),
478
.s5_sel_o   ( wb_s_sel_o[5] ),
479
.s5_we_o    ( wb_s_we_o [5] ),
480
.s5_cyc_o   ( wb_s_cyc_o[5] ),
481
.s5_stb_o   ( wb_s_stb_o[5] ),
482
.s5_cti_o   ( wb_s_cti_o[5] ),
483
.s5_bte_o   ( wb_s_bte_o[5] ),
484
 
485
.s5_data_i  ( wb_s_dat_i[5] ),
486
.s5_ack_i   ( wb_s_ack_i[5] ),
487
.s5_err_i   ( wb_s_err_i[5] ),
488
.s5_rty_i   ( wb_s_rty_i[5] ),
489
//
490
// Slave #6
491
// Wishbone Slave interface
492
.s6_data_o  ( wb_s_dat_o[6] ),
493
.s6_addr_o  ( wb_s_adr_o[6] ),
494
.s6_sel_o   ( wb_s_sel_o[6] ),
495
.s6_we_o    ( wb_s_we_o [6] ),
496
.s6_cyc_o   ( wb_s_cyc_o[6] ),
497
.s6_stb_o   ( wb_s_stb_o[6] ),
498
.s6_cti_o   ( wb_s_cti_o[6] ),
499
.s6_bte_o   ( wb_s_bte_o[6] ),
500
 
501
.s6_data_i  ( wb_s_dat_i[6] ),
502
.s6_ack_i   ( wb_s_ack_i[6] ),
503
.s6_err_i   ( wb_s_err_i[6] ),
504
.s6_rty_i   ( wb_s_rty_i[6] ),
505
//
506
// Slave #7
507
// Wishbone Slave interface
508
.s7_data_o  ( wb_s_dat_o[7] ),
509
.s7_addr_o  ( wb_s_adr_o[7] ),
510
.s7_sel_o   ( wb_s_sel_o[7] ),
511
.s7_we_o    ( wb_s_we_o [7] ),
512
.s7_cyc_o   ( wb_s_cyc_o[7] ),
513
.s7_stb_o   ( wb_s_stb_o[7] ),
514
.s7_cti_o   ( wb_s_cti_o[7] ),
515
.s7_bte_o   ( wb_s_bte_o[7] ),
516
 
517
.s7_data_i  ( wb_s_dat_i[7] ),
518
.s7_ack_i   ( wb_s_ack_i[7] ),
519
.s7_err_i   ( wb_s_err_i[7] ),
520
.s7_rty_i   ( wb_s_rty_i[7] ),
521
//
522
// Slave #8
523
// Wishbone Slave interface
524
.s8_data_o  ( wb_s_dat_o[8] ),
525
.s8_addr_o  ( wb_s_adr_o[8] ),
526
.s8_sel_o   ( wb_s_sel_o[8] ),
527
.s8_we_o    ( wb_s_we_o [8] ),
528
.s8_cyc_o   ( wb_s_cyc_o[8] ),
529
.s8_stb_o   ( wb_s_stb_o[8] ),
530
.s8_cti_o   ( wb_s_cti_o[8] ),
531
.s8_bte_o   ( wb_s_bte_o[8] ),
532
 
533
.s8_data_i  ( wb_s_dat_i[8] ),
534
.s8_ack_i   ( wb_s_ack_i[8] ),
535
.s8_err_i   ( wb_s_err_i[8] ),
536
.s8_rty_i   ( wb_s_rty_i[8] ),
537
//
538
// Slave #9
539
// Wishbone Slave interface
540
.s9_data_o  ( wb_s_dat_o[9] ),
541
.s9_addr_o  ( wb_s_adr_o[9] ),
542
.s9_sel_o   ( wb_s_sel_o[9] ),
543
.s9_we_o    ( wb_s_we_o [9] ),
544
.s9_cyc_o   ( wb_s_cyc_o[9] ),
545
.s9_stb_o   ( wb_s_stb_o[9] ),
546
.s9_cti_o   ( wb_s_cti_o[9] ),
547
.s9_bte_o   ( wb_s_bte_o[9] ),
548
 
549
.s9_data_i  ( wb_s_dat_i[9] ),
550
.s9_ack_i   ( wb_s_ack_i[9] ),
551
.s9_err_i   ( wb_s_err_i[9] ),
552
.s9_rty_i   ( wb_s_rty_i[9] ),
553
//
554
// Slave #10
555
// Wishbone Slave interface
556
.s10_data_o  ( wb_s_dat_o[10] ),
557
.s10_addr_o  ( wb_s_adr_o[10] ),
558
.s10_sel_o   ( wb_s_sel_o[10] ),
559
.s10_we_o    ( wb_s_we_o [10] ),
560
.s10_cyc_o   ( wb_s_cyc_o[10] ),
561
.s10_stb_o   ( wb_s_stb_o[10] ),
562
.s10_cti_o   ( wb_s_cti_o[10] ),
563
.s10_bte_o   ( wb_s_bte_o[10] ),
564
 
565
.s10_data_i  ( wb_s_dat_i[10] ),
566
.s10_ack_i   ( wb_s_ack_i[10] ),
567
.s10_err_i   ( wb_s_err_i[10] ),
568
.s10_rty_i   ( wb_s_rty_i[10] ),
569
//
570
// Slave #11
571
// Wishbone Slave interface
572
.s11_data_o  ( wb_s_dat_o[11] ),
573
.s11_addr_o  ( wb_s_adr_o[11] ),
574
.s11_sel_o   ( wb_s_sel_o[11] ),
575
.s11_we_o    ( wb_s_we_o [11] ),
576
.s11_cyc_o   ( wb_s_cyc_o[11] ),
577
.s11_stb_o   ( wb_s_stb_o[11] ),
578
.s11_cti_o   ( wb_s_cti_o[11] ),
579
.s11_bte_o   ( wb_s_bte_o[11] ),
580
 
581
.s11_data_i  ( wb_s_dat_i[11] ),
582
.s11_ack_i   ( wb_s_ack_i[11] ),
583
.s11_err_i   ( wb_s_err_i[11] ),
584
.s11_rty_i   ( wb_s_rty_i[11] ),
585
//
586
// Slave #12
587
// Wishbone Slave interface
588
.s12_data_o  ( wb_s_dat_o[12] ),
589
.s12_addr_o  ( wb_s_adr_o[12] ),
590
.s12_sel_o   ( wb_s_sel_o[12] ),
591
.s12_we_o    ( wb_s_we_o [12] ),
592
.s12_cyc_o   ( wb_s_cyc_o[12] ),
593
.s12_stb_o   ( wb_s_stb_o[12] ),
594
.s12_cti_o   ( wb_s_cti_o[12] ),
595
.s12_bte_o   ( wb_s_bte_o[12] ),
596
 
597
.s12_data_i  ( wb_s_dat_i[12] ),
598
.s12_ack_i   ( wb_s_ack_i[12] ),
599
.s12_err_i   ( wb_s_err_i[12] ),
600
.s12_rty_i   ( wb_s_rty_i[12] ),
601
//
602
// Slave #13
603
// Wishbone Slave interface
604
.s13_data_o  ( wb_s_dat_o[13] ),
605
.s13_addr_o  ( wb_s_adr_o[13] ),
606
.s13_sel_o   ( wb_s_sel_o[13] ),
607
.s13_we_o    ( wb_s_we_o [13] ),
608
.s13_cyc_o   ( wb_s_cyc_o[13] ),
609
.s13_stb_o   ( wb_s_stb_o[13] ),
610
.s13_cti_o   ( wb_s_cti_o[13] ),
611
.s13_bte_o   ( wb_s_bte_o[13] ),
612
 
613
.s13_data_i  ( wb_s_dat_i[13] ),
614
.s13_ack_i   ( wb_s_ack_i[13] ),
615
.s13_err_i   ( wb_s_err_i[13] ),
616
.s13_rty_i   ( wb_s_rty_i[13] ),
617
//
618
// Slave #14
619
// Wishbone Slave interface
620
.s14_data_o  ( wb_s_dat_o[14] ),
621
.s14_addr_o  ( wb_s_adr_o[14] ),
622
.s14_sel_o   ( wb_s_sel_o[14] ),
623
.s14_we_o    ( wb_s_we_o [14] ),
624
.s14_cyc_o   ( wb_s_cyc_o[14] ),
625
.s14_stb_o   ( wb_s_stb_o[14] ),
626
.s14_cti_o   ( wb_s_cti_o[14] ),
627
.s14_bte_o   ( wb_s_bte_o[14] ),
628
 
629
.s14_data_i  ( wb_s_dat_i[14] ),
630
.s14_ack_i   ( wb_s_ack_i[14] ),
631
.s14_err_i   ( wb_s_err_i[14] ),
632
.s14_rty_i   ( wb_s_rty_i[14] ),
633
//
634
// Slave #15
635
// Wishbone Slave interface
636
.s15_data_o  ( wb_s_dat_o[15] ),
637
.s15_addr_o  ( wb_s_adr_o[15] ),
638
.s15_sel_o   ( wb_s_sel_o[15] ),
639
.s15_we_o    ( wb_s_we_o [15] ),
640
.s15_cyc_o   ( wb_s_cyc_o[15] ),
641
.s15_stb_o   ( wb_s_stb_o[15] ),
642
.s15_cti_o   ( wb_s_cti_o[15] ),
643
.s15_bte_o   ( wb_s_bte_o[15] ),
644
 
645
.s15_data_i  ( wb_s_dat_i[15] ),
646
.s15_ack_i   ( wb_s_ack_i[15] ),
647
.s15_err_i   ( wb_s_err_i[15] ),
648
.s15_rty_i   ( wb_s_rty_i[15] )
649
);
650
    defparam    DUT.dw  =   64;
651
    defparam    DUT.aw  =   32;
652
//////////////////////////////////////////////////////////////////////////////////
653
//
654
//
655
//
656
task monitor_wb_cti_bte (int ii_master_num);
657
    //
658
    fork
659
        // 
660
        automatic int master_num = ii_master_num;
661
        // 
662
        $display("[%t]: %m START, MASTER idx=%h", $time, master_num[7:0]);
663
        forever
664
            begin
665
                ##1;
666
                if (wb_m_ack_o[master_num])
667
                    begin   :   WB_ACK
668
                        // WB_CTI:
669
                        if (wb_m_cti_i[master_num]!=wb_s_cti_o[get_slave_idx(wb_m_adr_i[master_num])])
670
                            begin   :   WB_CTI_ERR
671
                                $display("[%t]: %m, wb_m_cti_i[master_num]==%b", $time, wb_m_cti_i[master_num]);
672
                                $display("[%t]: %m, wb_m_adr_i[master_num]==%h", $time, wb_m_adr_i[master_num]);
673
                                $display("[%t]: %m, get_slave_idx(wb_s_adr_o[master_num])==%h", $time, get_slave_idx(wb_s_adr_o[master_num]));
674
                                $display("[%t]: %m, wb_s_cti_o[get_slave_idx(wb_s_adr_o[master_num])==%b",
675
                                $time,
676
                                wb_s_cti_o[get_slave_idx(wb_s_adr_o[master_num])]
677
                                        );
678
 
679
                                $display("[%t]: %m, master_num==%h", $time, master_num[7:0]); #1ns;
680
                                $stop;
681
                            end
682
                        // WB_BTE:
683
                        if (wb_m_bte_i[master_num]!=wb_s_bte_o[get_slave_idx(wb_s_adr_o[master_num])])
684
                            begin   :   WB_BTE_ERR
685
                                $display("[%t]: %m, master_num==%h", $time, master_num[7:0]);
686
                                $stop;
687
                            end
688
                    end
689
            end
690
    join_none
691
    //
692
endtask
693
/**/
694
//
695
// test when only 1 master is active and access to all slaves, NB!!! ==> USE ==> 512 WORDS
696
//
697
  task single_master_multi_slave_test (int num = 1);
698
    $display("%t single master multi slave test begin", $time);
699
    test_begin();
700
    //
701
    for (int i = 0; i < num; i++) begin
702
      for (int m = 0; m < lp_MASTER_Q; m++) begin
703
        for (int j=0;j<lp_SLAVE_Q;j++) begin
704
            //$display("[%t]: %m, SLAVE[%h] & MASTER[%h] begin", $time, j[7:0], m[7:0]);
705
            // WBS#i check 
706
            wbm[m].generate_data_packet(lp_MY_MEM_SIZE);           // ==> operate with lp_MY_MEM_SIZE WORDS 
707
            wbm[m].max_ws = 2+$urandom_range(0, j);
708
            // use rnd mode
709
            wbm[m].write_data_packet_locked(lp_SLAVE_ADDR_BASE[j], 1);
710
            wbm[m].read_data_packet_locked(lp_SLAVE_ADDR_BASE[j], 1);
711
            ##10;
712
            wbm[m].write_data_packet_nlocked(lp_SLAVE_ADDR_BASE[j], 1);
713
            wbm[m].read_data_packet_nlocked(lp_SLAVE_ADDR_BASE[j], 1);
714
            ##10;
715
            //$display("[%t]: %m, SLAVE[%h] & MASTER[%h] end", $time, j[7:0], m[7:0]);
716
        end
717
      end
718
    end
719
    //
720
    $display("%t single master multi slave test end", $time);
721
    test_end();
722
  endtask
723
 
724
//
725
// test when multi masters is active and access to 1 slave
726
//
727
  task multi_master_single_slave_test (int num = 1, lock = 0);
728
    int slave_size;
729
    int master_size;
730
    int start_address ;
731
  begin
732
    if (lock)
733
      $display("%t multi master single slave test with lock begin", $time);
734
    else
735
      $display("%t multi master single slave test with nlock begin", $time);
736
    test_begin();
737
    //
738
    slave_size  = lp_MY_MEM_SIZE/lp_SLAVE_Q;     // let's all slaves have same size    NB!!! ==> USE lp_MY_MEM_SIZE WORDS
739
    master_size = slave_size/lp_MASTER_Q;  // let's each master use same size of slave
740
    //$display("%m, slave_size==%h", slave_size); $display("%m, master_size==%h", master_size);
741
    for (int i = 0; i < num; i++) begin
742
      for (int s = 0; s < lp_SLAVE_Q; s++) begin
743
        for (int m = 0; m < lp_MASTER_Q; m++) begin
744
          wbm[m].generate_data_packet(master_size);
745
          wbm[m].max_ws = 2;
746
          start_address = lp_SLAVE_ADDR_BASE[s] + m*master_size;
747
 
748
          fork
749
            automatic int _m = m;
750
            automatic int _start_address = start_address;
751
            begin
752
              if (lock) begin
753
                wbm[_m].write_data_packet_locked (_start_address, 1);
754
                wbm[_m].read_data_packet_locked  (_start_address, 1);
755
              end
756
              else begin
757
                wbm[_m].write_data_packet_nlocked (_start_address, 1);
758
                wbm[_m].read_data_packet_nlocked  (_start_address, 1);
759
              end
760
            end
761
          join_none
762
 
763
        end
764
        wait fork;
765
      end
766
    end
767
    //
768
    if (lock)
769
      $display("%t multi master single slave with lock test end", $time);
770
    else
771
      $display("%t multi master single slave with nlock test end", $time);
772
    test_end();
773
  end
774
  endtask
775
 
776
  //
777
  // test when multi masters is active and access to multi slave
778
  //
779
 
780
  task multi_master_multi_slave_test (int num = 1, lock = 0);
781
    int ram_size;
782
    int master_size;
783
    int slave_size;
784
    int start_address ;
785
  begin
786
    if (lock)
787
      $display("%t multi master multi slave test with lock begin", $time);
788
    else
789
      $display("%t multi master multi slave test with nlock begin", $time);
790
    test_begin();
791
    //
792
    ram_size    = lp_MY_MEM_SIZE;     // --> NB!!! ==> USE lp_MY_MEM_SIZE WORDS
793
    master_size = ram_size/lp_MASTER_Q;   // let's each master use same size of ram address
794
    slave_size  = ram_size/lp_SLAVE_Q;    // let's each slave use same size or ram address
795
    //
796
    for (int i = 0; i < num; i++) begin
797
      for (int s = 0; s < lp_SLAVE_Q; s++) begin
798
        for (int m = 0; m < lp_MASTER_Q; m++) begin
799
          wbm[m].generate_data_packet(master_size); //$display("%m, s==%h, master_size==%h", s, master_size);
800
          wbm[m].max_ws = 2;
801
          start_address = (s*slave_size + m*master_size) % ram_size;
802
 
803
          fork
804
            automatic int _m = m;
805
            automatic int _start_address = start_address;
806
            begin
807
              if (lock) begin
808
                wbm[_m].write_data_packet_locked (_start_address, 1);
809
                wbm[_m].read_data_packet_locked  (_start_address, 1);
810
              end
811
              else begin
812
                wbm[_m].write_data_packet_nlocked (_start_address, 1); //$display("%m, write_data_packet_nlocked, _m==%h, _start_address==%h", _m, _start_address);
813
                wbm[_m].read_data_packet_nlocked  (_start_address, 1); //$display("%m, read_data_packet_nlocked,  _m==%h, _start_address==%h", _m, _start_address);
814
              end
815
            end
816
          join_none
817
 
818
        end // m
819
        wait fork;
820
      end // s
821
    end // i
822
    //
823
    if (lock)
824
      $display("%t multi master multi slave with lock test end", $time);
825
    else
826
      $display("%t multi master multi slave with nlock test end", $time);
827
    test_end();
828
  end
829
  endtask
830
//////////////////////////////////////////////////////////////////////////////////
831
//
832
// service functions
833
//
834
 
835
  function void test_begin ();
836
   foreach (wbm[i]) begin
837
      wbm[i].err_cnt = 0;
838
    end
839
  endfunction
840
 
841
  function void test_end ();
842
    foreach (wbm[i]) begin
843
      wbm[i].log();
844
      err_cnt += wbm[i].err_cnt;
845
    end
846
  endfunction
847
/**/
848
function automatic int get_slave_idx( input bit [lp_ADDR_W-1:0] iv_addr);
849
    //
850
        for (int i=1;i<lp_SLAVE_Q;i++) // process all slaves
851
            begin
852
                if (iv_addr>=lp_SLAVE_ADDR_BASE[i-1] & iv_addr<lp_SLAVE_ADDR_BASE[i])   // ADDR in slave[i] range
853
                    return (i-1);
854
            end
855
        // ELSE - return MAX_VALUE
856
        return ('1);
857
    //
858
endfunction
859
/**/
860
//////////////////////////////////////////////////////////////////////////////////
861
endmodule

powered by: WebSVN 2.1.0

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