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

Subversion Repositories pci

[/] [pci/] [trunk/] [apps/] [test/] [rtl/] [verilog/] [test.v] - Blame information for rev 154

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 93 mihad
// synopsys translate_off
2
`include "timescale.v"
3
// synopsys translate_on
4
 
5 132 mihad
`include "pci_user_constants.v"
6
 
7 93 mihad
module test
8
(
9
    pci_clk_i,
10
    clk_i,
11
    rst_i,
12
 
13
    wbm_cyc_o,
14
    wbm_stb_o,
15 132 mihad
 
16
`ifdef PCI_WB_REV_B3
17
 
18
    wbm_cti_o,
19
    wbm_bte_o,
20
 
21
`else
22
 
23 93 mihad
    wbm_cab_o,
24 132 mihad
 
25
`endif
26
 
27 93 mihad
    wbm_we_o,
28
    wbm_adr_o,
29
    wbm_sel_o,
30
    wbm_dat_o,
31
    wbm_dat_i,
32
    wbm_ack_i,
33
    wbm_rty_i,
34
    wbm_err_i,
35
 
36
    wbs_cyc_i,
37
    wbs_stb_i,
38 132 mihad
    wbs_cti_i,
39
    wbs_bte_i,
40 93 mihad
    wbs_we_i,
41
    wbs_adr_i,
42
    wbs_sel_i,
43
    wbs_dat_i,
44
    wbs_dat_o,
45
    wbs_ack_o,
46
    wbs_rty_o,
47
    wbs_err_o,
48
 
49
    // pci trdy, irdy and irdy enable inputs used to count number of transfers on pci bus
50
    pci_irdy_reg_i,
51
    pci_irdy_en_reg_i,
52
    pci_trdy_reg_i,
53
    pci_ad_reg_i
54
);
55
 
56
input           pci_clk_i,
57
                clk_i,
58
                rst_i ;
59
 
60
output          wbm_cyc_o,
61
                wbm_stb_o,
62
                wbm_we_o ;
63
 
64 132 mihad
`ifdef PCI_WB_REV_B3
65
 
66
output [ 2: 0]  wbm_cti_o   ;
67
output [ 1: 0]  wbm_bte_o   ;
68
 
69
assign wbm_bte_o = 2'b00 ;
70
 
71
`else
72
 
73
output  wbm_cab_o   ;
74
 
75
`endif
76
 
77 93 mihad
output  [31:0]  wbm_adr_o ;
78
output  [3:0]   wbm_sel_o ;
79
assign          wbm_sel_o = 4'hF ;
80
output  [31:0]  wbm_dat_o ;
81
input   [31:0]  wbm_dat_i ;
82
input           wbm_ack_i,
83
                wbm_rty_i,
84
                wbm_err_i ;
85
 
86
input           wbs_cyc_i,
87
                wbs_stb_i,
88
                wbs_we_i ;
89
 
90 132 mihad
input   [ 2: 0] wbs_cti_i   ;
91
input   [ 1: 0] wbs_bte_i   ;
92
 
93 93 mihad
input   [31:0]  wbs_adr_i ;
94
input   [3:0]   wbs_sel_i ;
95
input   [31:0]  wbs_dat_i ;
96
output  [31:0]  wbs_dat_o ;
97
output          wbs_ack_o,
98
                wbs_rty_o,
99
                wbs_err_o ;
100
 
101
input pci_irdy_reg_i,
102
      pci_irdy_en_reg_i,
103
      pci_trdy_reg_i ;
104
 
105
input [31:0] pci_ad_reg_i ;
106
 
107
wire sel_registers =  wbs_adr_i[12] ;
108
wire sel_rams      = ~wbs_adr_i[12] ;
109
 
110
wire wbs_write = wbs_cyc_i & wbs_stb_i & wbs_we_i ;
111
 
112
wire wbs_ram0_255_we    = wbs_write & sel_rams & (wbs_adr_i[11:10] == 2'b00) ;
113
wire wbs_ram256_511_we  = wbs_write & sel_rams & (wbs_adr_i[11:10] == 2'b01) ;
114
wire wbs_ram512_767_we  = wbs_write & sel_rams & (wbs_adr_i[11:10] == 3'b10) ;
115
wire wbs_ram768_1023_we = wbs_write & sel_rams & (wbs_adr_i[11:10] == 3'b11) ;
116
 
117
reg  sel_master_transaction_size,
118
     sel_master_transaction_count,
119
     sel_master_opcode,
120
     sel_master_base,
121
     sel_target_burst_transaction_count,
122
     sel_target_test_size,
123
     sel_target_test_start_adr,
124
     sel_target_test_start_dat,
125
     sel_target_test_error_detected,
126
     sel_master_num_of_wb_transfers,
127
     sel_master_num_of_pci_transfers,
128
     sel_master_test_start_dat,
129
     sel_master_test_size,
130
     sel_master_dat_err_detected ;
131
 
132
wire [31:0] wbs_ram0_255_o ;
133
wire [31:0] wbs_ram256_511_o ;
134
wire [31:0] wbs_ram512_767_o ;
135
wire [31:0] wbs_ram768_1023_o ;
136
 
137
wire wbm_write = wbm_cyc_o & wbm_stb_o &  wbm_we_o ;
138
wire wbm_read  = wbm_cyc_o & wbm_stb_o & ~wbm_we_o ;
139
 
140
wire wbm_ram0_255_we    = wbm_ack_i & wbm_read & (wbm_adr_o[11:10] == 2'b00) ;
141
wire wbm_ram256_511_we  = wbm_ack_i & wbm_read & (wbm_adr_o[11:10] == 2'b01) ;
142
wire wbm_ram512_767_we  = wbm_ack_i & wbm_read & (wbm_adr_o[11:10] == 2'b10) ;
143
wire wbm_ram768_1023_we = wbm_ack_i & wbm_read & (wbm_adr_o[11:10] == 2'b11) ;
144
 
145
wire [31:0] wbm_ram0_255_o ;
146
wire [31:0] wbm_ram256_511_o ;
147
wire [31:0] wbm_ram512_767_o ;
148
wire [31:0] wbm_ram768_1023_o ;
149
 
150
reg [31:0] wbm_dat_o ;
151
 
152
always@(wbm_adr_o or wbm_ram0_255_o or wbm_ram256_511_o or wbm_ram512_767_o or wbm_ram768_1023_o)
153
begin
154
    case (wbm_adr_o[11:10])
155
    2'b00:
156
        begin
157
            wbm_dat_o = wbm_ram0_255_o ;
158
        end
159
    2'b01:
160
        begin
161
            wbm_dat_o = wbm_ram256_511_o ;
162
        end
163
    2'b10:
164
        begin
165
            wbm_dat_o = wbm_ram512_767_o ;
166
        end
167
    2'b11:
168
        begin
169
            wbm_dat_o = wbm_ram768_1023_o ;
170
        end
171
    endcase
172
end
173
 
174
reg [10:0]  master_transaction_size ;
175
reg [10:0]  master_transaction_count ;
176
reg         master_opcode ;
177
reg [31:0]  master_base ;
178
reg [31:0]  master_base_next ;
179
reg [10:0]  target_test_size ;
180
reg [31:0]  target_test_start_adr ;
181
reg [31:0]  target_test_expect_adr ;
182
reg [31:0]  target_test_start_dat ;
183
reg [31:0]  target_test_expect_dat ;
184
reg         target_test_adr_error_detected,
185
            target_test_dat_error_detected ;
186
reg [31:0]  master_num_of_wb_transfers,
187
            master_num_of_pci_transfers ;
188
reg [31:0]  master_test_start_dat ;
189
reg [31:0]  pci_clk_master_test_expect_dat ;
190
reg [20:0]  master_test_size ;
191
reg [20:0]  pci_clk_master_test_size ;
192
reg         pci_clk_master_test_done,
193
            wb_clk_master_test_done_sync,
194
            wb_clk_master_test_done,
195
            wb_clk_master_test_start,
196
            pci_clk_master_test_start_sync,
197
            pci_clk_master_test_start,
198
            pci_clk_master_test_started,
199
            wb_clk_master_test_started_sync,
200
            wb_clk_master_test_started,
201
            master_dat_err_detected ;
202
 
203
always@(posedge pci_clk_i or posedge rst_i)
204
begin
205
    if (rst_i)
206
    begin
207
        pci_clk_master_test_expect_dat <= 0 ;
208
        pci_clk_master_test_size       <= 0 ;
209
        pci_clk_master_test_done       <= 1 ;
210
        pci_clk_master_test_start_sync <= 0 ;
211
        pci_clk_master_test_start      <= 0 ;
212
        pci_clk_master_test_started    <= 0 ;
213
        master_dat_err_detected        <= 0 ;
214
    end
215
    else
216
    begin
217
        // sync flop always samples the data
218
        pci_clk_master_test_start_sync <= wb_clk_master_test_start ;
219
        if (pci_clk_master_test_size == 0)
220
        begin
221
            // load test start_flop only when test size is zero
222
            pci_clk_master_test_start   <= pci_clk_master_test_start_sync ;
223
            pci_clk_master_test_started <= 0 ;
224
            pci_clk_master_test_done    <= 1 ;
225
            if (pci_clk_master_test_start)
226
            begin
227
                pci_clk_master_test_size       <= master_test_size ;
228
                pci_clk_master_test_expect_dat <= master_test_start_dat ;
229
 
230
                // error detected bit is cleared when new test starts
231
                master_dat_err_detected <= 0 ;
232
            end
233
        end
234
        else
235
        begin
236
            pci_clk_master_test_done    <= 0 ;
237
            pci_clk_master_test_start   <= 0 ;
238
            pci_clk_master_test_started <= 1 ;
239
            if (~(pci_irdy_reg_i | ~pci_irdy_en_reg_i | pci_trdy_reg_i))
240
            begin
241
                pci_clk_master_test_size <= pci_clk_master_test_size - 1'b1 ;
242
 
243
                if (pci_ad_reg_i != pci_clk_master_test_expect_dat)
244
                    master_dat_err_detected <= 1'b1 ;
245
 
246
                pci_clk_master_test_expect_dat <= {pci_clk_master_test_expect_dat[30:0], pci_clk_master_test_expect_dat[31]} ;
247
            end
248
        end
249
    end
250
end
251
 
252
always@(posedge clk_i or posedge rst_i)
253
begin
254
    if (rst_i)
255
    begin
256
        wb_clk_master_test_done_sync    <= 1'b1 ;
257
        wb_clk_master_test_done         <= 1'b1 ;
258
        wb_clk_master_test_started_sync <= 1'b0 ;
259
        wb_clk_master_test_started      <= 1'b0 ;
260
    end
261
    else
262
    begin
263
        wb_clk_master_test_done_sync    <= pci_clk_master_test_done ;
264
        if (wb_clk_master_test_start)
265
            wb_clk_master_test_done <= 1'b0 ;
266
        else
267
            wb_clk_master_test_done <= wb_clk_master_test_done_sync ;
268
 
269
        wb_clk_master_test_started_sync <= pci_clk_master_test_started ;
270
        wb_clk_master_test_started      <= wb_clk_master_test_started_sync ;
271
    end
272
end
273
 
274
assign wbm_we_o = master_opcode ;
275
 
276
reg [10:0] master_current_transaction_size ;
277
 
278
reg [10:0] target_burst_transaction_count ;
279
reg        wbs_cyc_i_previous ;
280
 
281
reg clr_master_num_of_pci_transfers ;
282
reg clr_master_num_of_pci_transfers_sync ;
283
reg wb_clk_clr_master_num_of_pci_transfers ;
284
 
285
always@(posedge pci_clk_i or posedge rst_i)
286
begin
287
    if (rst_i)
288
    begin
289
        master_num_of_pci_transfers <= 0 ;
290
    end
291
    else if (clr_master_num_of_pci_transfers)
292
    begin
293
        master_num_of_pci_transfers <= 0 ;
294
    end
295
    else if (~(pci_irdy_reg_i | ~pci_irdy_en_reg_i | pci_trdy_reg_i))
296
    begin
297
        master_num_of_pci_transfers <= master_num_of_pci_transfers + 1'b1 ;
298
    end
299
 
300
    if (rst_i)
301
    begin
302
        clr_master_num_of_pci_transfers <= 1'b1 ;
303
        clr_master_num_of_pci_transfers_sync <= 1'b1 ;
304
    end
305
    else
306
    begin
307
        clr_master_num_of_pci_transfers <= clr_master_num_of_pci_transfers_sync ;
308
        clr_master_num_of_pci_transfers_sync <= wb_clk_clr_master_num_of_pci_transfers ;
309
    end
310
end
311
 
312
always@(posedge clk_i or posedge rst_i)
313
begin
314
    if (rst_i)
315
    begin
316
        master_transaction_size                 <= 0 ;
317
        master_transaction_count                <= 0 ;
318
        master_opcode                           <= 0 ;
319
        master_base                             <= 0 ;
320
        master_base_next                        <= 4 ;
321
        target_burst_transaction_count          <= 0 ;
322
        wbs_cyc_i_previous                      <= 0 ;
323
        target_test_size                        <= 0 ;
324
        target_test_start_adr                   <= 0 ;
325
        target_test_start_dat                   <= 0 ;
326
        target_test_adr_error_detected          <= 0 ;
327
        target_test_dat_error_detected          <= 0 ;
328
        target_test_expect_adr                  <= 0 ;
329
        target_test_expect_dat                  <= 0 ;
330
        master_num_of_wb_transfers              <= 0 ;
331
        wb_clk_clr_master_num_of_pci_transfers  <= 1'b1 ;
332
        master_test_size                        <= 0 ;
333
        master_test_start_dat                   <= 0 ;
334
                wb_clk_master_test_start                <= 0 ;
335
    end
336
    else
337
    begin
338
        if (sel_master_transaction_size & wbs_write & sel_registers)
339
        // write new value to transaction size register
340
            master_transaction_size <= wbs_dat_i[10:0] ;
341
 
342
        if (sel_master_transaction_count & wbs_write & sel_registers)
343
        // write new value to transaction count register
344
            master_transaction_count <= wbs_dat_i[10:0] ;
345
        else if (wbm_cyc_o & wbm_stb_o & wbm_ack_i & (master_current_transaction_size == 11'h1))
346
        // decrement the transaction count when ack is received and transaction size is 1
347
            master_transaction_count <= master_transaction_count - 1'b1 ;
348
 
349
        if (sel_master_opcode & wbs_write & sel_registers)
350
        // master opcode write
351
            master_opcode <= wbs_dat_i[0] ;
352
 
353
        if (sel_master_base & wbs_write & sel_registers)
354
        // master base address write
355
            master_base <= {wbs_dat_i[31:2], 2'b00} ;
356
 
357
        if (sel_target_burst_transaction_count & wbs_write & sel_registers)
358
            target_burst_transaction_count <= 0 ;
359 132 mihad
        else if (wbs_cyc_i & ~wbs_cyc_i_previous & (wbs_cti_i == 3'b010) & (wbs_bte_i == 2'b00))
360 93 mihad
            target_burst_transaction_count <= target_burst_transaction_count + 1 ;
361
 
362
        if (sel_target_test_size & wbs_write & sel_registers)
363
            target_test_size <= wbs_dat_i[10:0] ;
364
        else if ((target_test_size != 0) & wbs_cyc_i & wbs_stb_i & wbs_we_i & wbs_ack_o & ~sel_registers)
365
        begin
366
            target_test_size <= target_test_size - 1'b1 ;
367
        end
368
 
369
        if (sel_target_test_start_adr & wbs_write & sel_registers)
370
            target_test_start_adr <= wbs_dat_i ;
371
 
372
        if (sel_target_test_start_dat & wbs_write & sel_registers)
373
            target_test_start_dat <= wbs_dat_i ;
374
 
375
        if (sel_target_test_error_detected & wbs_write & sel_registers)
376
        begin
377
            target_test_adr_error_detected <= 1'b0 ;
378
            target_test_dat_error_detected <= 1'b0 ;
379
        end
380
        else if ((target_test_size != 0) & wbs_cyc_i & wbs_stb_i & wbs_we_i & wbs_ack_o & ~sel_registers)
381
        begin
382
            target_test_adr_error_detected <= (target_test_expect_adr != wbs_adr_i) | target_test_adr_error_detected ;
383
            target_test_dat_error_detected <= (target_test_expect_dat != wbs_dat_i) | target_test_dat_error_detected ;
384
        end
385
 
386
        if (target_test_size == 0)
387
        begin
388
            target_test_expect_adr <= target_test_start_adr ;
389
            target_test_expect_dat <= target_test_start_dat ;
390
        end
391
        else if (wbs_cyc_i & wbs_stb_i & wbs_we_i & wbs_ack_o & ~sel_registers)
392
        begin
393
            target_test_expect_adr <= target_test_expect_adr + 'd4 ;
394
            target_test_expect_dat <= {target_test_expect_dat[30:0], target_test_expect_dat[31]} ;
395
        end
396
 
397
        if (sel_master_num_of_wb_transfers & wbs_write & sel_registers)
398
        begin
399
            master_num_of_wb_transfers <= 0 ;
400
            wb_clk_clr_master_num_of_pci_transfers <= 1'b1 ;
401
        end
402
        else if (wbm_cyc_o & wbm_stb_o & wbm_ack_i)
403
        begin
404
            wb_clk_clr_master_num_of_pci_transfers <= 1'b0 ;
405
            master_num_of_wb_transfers <= master_num_of_wb_transfers + 1'b1 ;
406
        end
407
 
408
        if (wb_clk_master_test_done & wbs_write & sel_master_test_size & sel_registers & ~wb_clk_master_test_start)
409
        begin
410
            master_test_size         <= wbs_dat_i[20:0] ;
411
            wb_clk_master_test_start <= 1'b1 ;
412
        end
413
        else
414
        begin
415
            if (wb_clk_master_test_started & !wb_clk_master_test_done)
416
                wb_clk_master_test_start <= 1'b0 ;
417
        end
418
 
419
        if (sel_master_test_start_dat & wbs_write & sel_registers)
420
            master_test_start_dat <= wbs_dat_i ;
421
 
422
        master_base_next <= master_base + 4 ;
423
 
424
        wbs_cyc_i_previous <= wbs_cyc_i ;
425
    end
426
end
427
 
428
reg [31:0] register_output ;
429
reg [31:0] ram_output ;
430
 
431
always@
432
(
433
    wbs_adr_i or
434
    master_transaction_size or
435
    master_transaction_count or
436
    master_opcode or
437
    master_base or
438
    target_burst_transaction_count or
439
    target_test_size or
440
    target_test_start_adr or
441
    target_test_start_dat or
442
    target_test_adr_error_detected or
443
    target_test_dat_error_detected or
444
    master_num_of_wb_transfers or
445
    master_num_of_pci_transfers or
446
    master_test_size or
447
    master_test_start_dat or
448
    master_dat_err_detected
449
)
450
begin
451
    sel_master_transaction_size        = 1'b0 ;
452
    sel_master_transaction_count       = 1'b0 ;
453
    sel_master_opcode                  = 1'b0 ;
454
    sel_master_base                    = 1'b0 ;
455
    sel_target_burst_transaction_count = 1'b0 ;
456
    sel_target_test_size               = 1'b0 ;
457
    sel_target_test_start_adr          = 1'b0 ;
458
    sel_target_test_start_dat          = 1'b0 ;
459
    sel_target_test_error_detected     = 1'b0 ;
460
    sel_master_num_of_wb_transfers     = 1'b0 ;
461
    sel_master_test_size               = 1'b0 ;
462
    sel_master_test_start_dat          = 1'b0 ;
463
    sel_master_dat_err_detected        = 1'b0 ;
464
    register_output                    = 0 ;
465
 
466
    case (wbs_adr_i[5:2])
467
        4'b0000:
468
        begin
469
            sel_master_transaction_size = 1'b1 ;
470
            register_output             = {21'h0, master_transaction_size} ;
471
        end
472
        4'b0001:
473
        begin
474
            sel_master_transaction_count = 1'b1 ;
475
            register_output              = {21'h0, master_transaction_count} ;
476
        end
477
        4'b0010:
478
        begin
479
            sel_master_opcode = 1'b1 ;
480
            register_output   = {31'h0, master_opcode} ;
481
        end
482
        4'b0011:
483
        begin
484
            sel_master_base = 1'b1 ;
485
            register_output = master_base ;
486
        end
487
        4'b0100:
488
        begin
489
            sel_target_burst_transaction_count = 1'b1 ;
490
            register_output = target_burst_transaction_count ;
491
        end
492
        4'b0101:
493
        begin
494
            sel_target_test_size = 1'b1 ;
495
            register_output = {20'h0, target_test_size} ;
496
        end
497
        4'b0110:
498
        begin
499
            sel_target_test_start_adr = 1'b1 ;
500
            register_output = target_test_start_adr ;
501
        end
502
        4'b0111:
503
        begin
504
            sel_target_test_start_dat = 1'b1 ;
505
            register_output = target_test_start_dat ;
506
        end
507
        4'b1000:
508
        begin
509
            sel_target_test_error_detected = 1'b1 ;
510
            register_output = {30'h0, target_test_adr_error_detected, target_test_dat_error_detected} ;
511
        end
512
        4'b1001:
513
        begin
514
            sel_master_num_of_wb_transfers = 1'b1 ;
515
            register_output = master_num_of_wb_transfers ;
516
        end
517
        4'b1010:
518
        begin
519
            sel_master_num_of_pci_transfers = 1'b1 ;
520
            register_output = master_num_of_pci_transfers ;
521
        end
522
        4'b1011:
523
        begin
524
            sel_master_test_size = 1'b1 ;
525
            register_output      = {11'h0, master_test_size} ;
526
        end
527
        4'b1100:
528
        begin
529
            sel_master_test_start_dat = 1'b1 ;
530
            register_output           = master_test_start_dat ;
531
        end
532
        4'b1101:
533
        begin
534
            sel_master_dat_err_detected = 1'b1 ;
535
            register_output             = {31'h0, master_dat_err_detected} ;
536
        end
537
    endcase
538
end
539
 
540
always@(wbs_adr_i or wbs_ram0_255_o or wbs_ram256_511_o or wbs_ram512_767_o or wbs_ram768_1023_o)
541
begin
542
    case (wbs_adr_i[11:10])
543
        2'b00:ram_output = wbs_ram0_255_o ;
544
        2'b01:ram_output = wbs_ram256_511_o ;
545
        2'b10:ram_output = wbs_ram512_767_o ;
546
        2'b11:ram_output = wbs_ram768_1023_o ;
547
    endcase
548
end
549
 
550
assign wbs_dat_o = sel_registers ? register_output : ram_output ;
551
 
552
reg delayed_ack_for_reads ;
553
 
554
always@(posedge clk_i or posedge rst_i)
555
begin
556
    if (rst_i)
557
        delayed_ack_for_reads <= 1'b0 ;
558
    else if (delayed_ack_for_reads)
559
        delayed_ack_for_reads <= 1'b0 ;
560
    else
561
        delayed_ack_for_reads <= wbs_cyc_i & wbs_stb_i & (~wbs_we_i) ;
562
end
563
 
564
assign wbs_ack_o = wbs_we_i ? (wbs_cyc_i & wbs_stb_i) : delayed_ack_for_reads ;
565
 
566
assign wbs_err_o = 1'b0 ;
567
assign wbs_rty_o = 1'b0 ;
568
 
569 132 mihad
reg wbm_cyc_o, wbm_stb_o;
570
 
571
reg    [ 2: 0]  wbm_cti_o   ;
572
reg             wbm_cab_o   ;
573
 
574 93 mihad
reg [31:0]  wbm_adr_o ;
575
reg [31:0]  wbm_next_adr_o ;
576
 
577
wire wbm_end_cycle   = wbm_cyc_o & wbm_stb_o & wbm_ack_i & (master_current_transaction_size == 11'h1) ;
578
wire wbm_start_cycle = (master_transaction_size != 11'h0) & (master_transaction_count != 11'h0) & ~wbm_cyc_o ;
579
 
580
always@(posedge clk_i or posedge rst_i)
581
begin
582
    if (rst_i)
583
    begin
584
        wbm_cyc_o                       <= 1'b0 ;
585
        wbm_cab_o                       <= 1'b0 ;
586 132 mihad
        wbm_cti_o                       <= 3'h7 ;
587 93 mihad
        wbm_stb_o                       <= 1'b0 ;
588
        wbm_adr_o                       <= 32'h0 ;
589
        master_current_transaction_size <= 11'h0 ;
590
        wbm_next_adr_o                  <= 32'h4 ;
591
    end
592
    else
593
    begin
594
        if (master_transaction_count == 11'h0)
595
        begin
596
            wbm_adr_o      <= master_base ;
597
            wbm_next_adr_o <= master_base_next ;
598
        end
599
        else if (wbm_cyc_o & wbm_stb_o & wbm_ack_i)
600
        begin
601
            wbm_adr_o            <= wbm_next_adr_o ;
602
            wbm_next_adr_o[31:2] <= wbm_next_adr_o[31:2] + 1'b1 ;
603
        end
604
 
605
        if (wbm_start_cycle)
606
        begin
607
            wbm_cyc_o                       <= 1'b1 ;
608
            wbm_cab_o                       <= (master_transaction_size != 11'h1) ;
609 132 mihad
            wbm_cti_o                       <= (master_transaction_size != 11'h1) ? 3'b010 : 3'b111 ;
610 93 mihad
            wbm_stb_o                       <= 1'b1 ;
611
            master_current_transaction_size <= master_transaction_size ;
612
        end
613
        else if (wbm_cyc_o)
614
        begin
615
            if (wbm_end_cycle)
616
            begin
617 132 mihad
                wbm_cyc_o   <= 1'b0     ;
618
                wbm_stb_o   <= 1'b0     ;
619
                wbm_cab_o   <= 1'b0     ;
620
                wbm_cti_o   <= 3'b111   ;
621 93 mihad
            end
622
            else
623
            begin
624
                if (wbm_stb_o & wbm_ack_i)
625
                begin
626
                    master_current_transaction_size <= master_current_transaction_size - 1'b1 ;
627 132 mihad
 
628
                    if (master_current_transaction_size == 2)
629
                        wbm_cti_o <= 3'b111 ;
630 93 mihad
                end
631
            end
632
        end
633
    end
634
end
635
 
636
wire [7:0] master_ram_adr = (wbm_we_o & wbm_ack_i) ? wbm_next_adr_o[9:2] : wbm_adr_o[9:2] ;
637
 
638
RAMB4_S16_S16 ramb4_s16_s16_00
639
(
640
    .CLKA(clk_i),
641
    .RSTA(rst_i),
642
    .ADDRA(wbs_adr_i[9:2]),
643
    .DIA(wbs_dat_i[31:16]),
644
    .ENA(1'b1),
645
    .WEA(wbs_ram0_255_we),
646
    .DOA(wbs_ram0_255_o[31:16]),
647
 
648
    .CLKB(clk_i),
649
    .RSTB(rst_i),
650
    .ADDRB(master_ram_adr),
651
    .DIB(wbm_dat_i[31:16]),
652
    .ENB(1'b1),
653
    .WEB(wbm_ram0_255_we),
654
    .DOB(wbm_ram0_255_o[31:16])
655
);
656
 
657
RAMB4_S16_S16 ramb4_s16_s16_01
658
(
659
    .CLKA(clk_i),
660
    .RSTA(rst_i),
661
    .ADDRA(wbs_adr_i[9:2]),
662
    .DIA(wbs_dat_i[15:0]),
663
    .ENA(1'b1),
664
    .WEA(wbs_ram0_255_we),
665
    .DOA(wbs_ram0_255_o[15:0]),
666
 
667
    .CLKB(clk_i),
668
    .RSTB(rst_i),
669
    .ADDRB(master_ram_adr),
670
    .DIB(wbm_dat_i[15:0]),
671
    .ENB(1'b1),
672
    .WEB(wbm_ram0_255_we),
673
    .DOB(wbm_ram0_255_o[15:0])
674
);
675
 
676
RAMB4_S16_S16 ramb4_s16_s16_10
677
(
678
    .CLKA(clk_i),
679
    .RSTA(rst_i),
680
    .ADDRA(wbs_adr_i[9:2]),
681
    .DIA(wbs_dat_i[31:16]),
682
    .ENA(1'b1),
683
    .WEA(wbs_ram256_511_we),
684
    .DOA(wbs_ram256_511_o[31:16]),
685
 
686
    .CLKB(clk_i),
687
    .RSTB(rst_i),
688
    .ADDRB(master_ram_adr),
689
    .DIB(wbm_dat_i[31:16]),
690
    .ENB(1'b1),
691
    .WEB(wbm_ram256_511_we),
692
    .DOB(wbm_ram256_511_o[31:16])
693
);
694
 
695
RAMB4_S16_S16 ramb4_s16_s16_11
696
(
697
    .CLKA(clk_i),
698
    .RSTA(rst_i),
699
    .ADDRA(wbs_adr_i[9:2]),
700
    .DIA(wbs_dat_i[15:0]),
701
    .ENA(1'b1),
702
    .WEA(wbs_ram256_511_we),
703
    .DOA(wbs_ram256_511_o[15:0]),
704
 
705
    .CLKB(clk_i),
706
    .RSTB(rst_i),
707
    .ADDRB(master_ram_adr),
708
    .DIB(wbm_dat_i[15:0]),
709
    .ENB(1'b1),
710
    .WEB(wbm_ram256_511_we),
711
    .DOB(wbm_ram256_511_o[15:0])
712
);
713
 
714
RAMB4_S16_S16 ramb4_s16_s16_20
715
(
716
    .CLKA(clk_i),
717
    .RSTA(rst_i),
718
    .ADDRA(wbs_adr_i[9:2]),
719
    .DIA(wbs_dat_i[31:16]),
720
    .ENA(1'b1),
721
    .WEA(wbs_ram512_767_we),
722
    .DOA(wbs_ram512_767_o[31:16]),
723
 
724
    .CLKB(clk_i),
725
    .RSTB(rst_i),
726
    .ADDRB(master_ram_adr),
727
    .DIB(wbm_dat_i[31:16]),
728
    .ENB(1'b1),
729
    .WEB(wbm_ram512_767_we),
730
    .DOB(wbm_ram512_767_o[31:16])
731
);
732
 
733
RAMB4_S16_S16 ramb4_s16_s16_21
734
(
735
    .CLKA(clk_i),
736
    .RSTA(rst_i),
737
    .ADDRA(wbs_adr_i[9:2]),
738
    .DIA(wbs_dat_i[15:0]),
739
    .ENA(1'b1),
740
    .WEA(wbs_ram512_767_we),
741
    .DOA(wbs_ram512_767_o[15:0]),
742
 
743
    .CLKB(clk_i),
744
    .RSTB(rst_i),
745
    .ADDRB(master_ram_adr),
746
    .DIB(wbm_dat_i[15:0]),
747
    .ENB(1'b1),
748
    .WEB(wbm_ram512_767_we),
749
    .DOB(wbm_ram512_767_o[15:0])
750
);
751
 
752
RAMB4_S16_S16 ramb4_s16_s16_30
753
(
754
    .CLKA(clk_i),
755
    .RSTA(rst_i),
756
    .ADDRA(wbs_adr_i[9:2]),
757
    .DIA(wbs_dat_i[31:16]),
758
    .ENA(1'b1),
759
    .WEA(wbs_ram768_1023_we),
760
    .DOA(wbs_ram768_1023_o[31:16]),
761
 
762
    .CLKB(clk_i),
763
    .RSTB(rst_i),
764
    .ADDRB(master_ram_adr),
765
    .DIB(wbm_dat_i[31:16]),
766
    .ENB(1'b1),
767
    .WEB(wbm_ram768_1023_we),
768
    .DOB(wbm_ram768_1023_o[31:16])
769
);
770
 
771
RAMB4_S16_S16 ramb4_s16_s16_31
772
(
773
    .CLKA(clk_i),
774
    .RSTA(rst_i),
775
    .ADDRA(wbs_adr_i[9:2]),
776
    .DIA(wbs_dat_i[15:0]),
777
    .ENA(1'b1),
778
    .WEA(wbs_ram768_1023_we),
779
    .DOA(wbs_ram768_1023_o[15:0]),
780
 
781
    .CLKB(clk_i),
782
    .RSTB(rst_i),
783
    .ADDRB(master_ram_adr),
784
    .DIB(wbm_dat_i[15:0]),
785
    .ENB(1'b1),
786
    .WEB(wbm_ram768_1023_we),
787
    .DOB(wbm_ram768_1023_o[15:0])
788
);
789
 
790
endmodule // test

powered by: WebSVN 2.1.0

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