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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_5/] [bench/] [verilog/] [pci_unsupported_commands_master.v] - Blame information for rev 154

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 15 mihad
`include "bus_commands.v"
2
module pci_unsupported_commands_master
3
(
4
    CLK,
5
    AD,
6
    CBE,
7
    RST,
8
    REQ,
9
    GNT,
10
    FRAME,
11
    IRDY,
12
    DEVSEL,
13
    TRDY,
14
    STOP,
15
    PAR
16
);
17
 
18 73 mihad
parameter normal       = 0 ;
19
parameter disconnect   = 1 ;
20
parameter retry        = 2 ;
21
parameter target_abort = 3 ;
22
parameter master_abort = 4 ;
23
parameter error        = 5 ;
24
 
25 15 mihad
input CLK ;
26 73 mihad
inout [31:0] AD ;
27
inout [3:0]  CBE ;
28 15 mihad
input  RST ;
29
output REQ ;
30
input  GNT ;
31 73 mihad
inout FRAME ;
32
inout IRDY ;
33 15 mihad
input  DEVSEL ;
34
input  TRDY ;
35
input  STOP ;
36 73 mihad
inout  PAR ;
37 15 mihad
 
38 73 mihad
reg [31:0] AD_int ;
39
reg        AD_en ;
40
 
41
reg [3:0] CBE_int ;
42
reg       CBE_en ;
43
 
44
reg FRAME_int ;
45
reg FRAME_en ;
46
 
47
reg IRDY_int ;
48
reg IRDY_en ;
49
 
50
reg PAR_int ;
51
reg PAR_en ;
52
 
53
assign AD    = AD_en    ? AD_int    : 32'hzzzz_zzzz ;
54
assign CBE   = CBE_en   ? CBE_int   : 4'hz ;
55
assign FRAME = FRAME_en ? FRAME_int : 1'bz ;
56
assign IRDY  = IRDY_en  ? IRDY_int  : 1'bz ;
57
assign PAR   = PAR_en   ? PAR_int   : 1'bz ;
58
 
59 15 mihad
reg         REQ ;
60
 
61 73 mihad
event e_finish_transaction ;
62
event e_transfers_done ;
63
 
64
reg write ;
65
reg make_parity_error_after_last_dataphase ;
66
 
67 15 mihad
initial
68
begin
69 73 mihad
    REQ      = 1'b1 ;
70
    AD_en    = 1'b0 ;
71
    CBE_en   = 1'b0 ;
72
    FRAME_en = 1'b0 ;
73
    IRDY_en  = 1'b0 ;
74
    PAR_en   = 1'b0 ;
75
    write = 1'b0 ;
76
    make_parity_error_after_last_dataphase = 1'b0 ;
77 15 mihad
end
78
 
79 73 mihad
task unsupported_reference ;
80 15 mihad
    input [31:0] addr1 ;
81
    input [31:0] addr2 ;
82
    input [3:0]  bc1 ;
83
    input [3:0]  bc2 ;
84
    input [3:0]  be ;
85
    input [31:0] data ;
86
    input        make_addr_perr1 ;
87
    input        make_addr_perr2 ;
88
    output       ok ;
89
    integer      i ;
90
    reg          dual_address ;
91 73 mihad
    reg  [2:0]   received_termination ;
92
begin:main
93 15 mihad
    ok = 1 ;
94
    dual_address = (bc1 == `BC_DUAL_ADDR_CYC) ;
95 73 mihad
 
96
    get_bus_ownership(ok) ;
97
    if (ok !== 1'b1)
98
        disable main ;
99
 
100
    addr_phase1(addr1, bc1) ;
101
 
102
    if ( dual_address )
103 15 mihad
    begin
104 73 mihad
        write = bc2[0] ;
105
        addr_phase2(addr2, bc2, make_addr_perr1) ;
106
        first_and_last_data_phase(bc2[0], data, be, make_addr_perr2, 1'b0, received_termination) ;
107
        finish_transaction(bc2[0], 1'b0) ;
108 15 mihad
    end
109 73 mihad
    else
110
    begin
111
        write = bc1[0] ;
112
        first_and_last_data_phase(bc1[0], data, be, make_addr_perr1, 1'b0, received_termination) ;
113
        finish_transaction(bc1[0], 1'b0) ;
114
    end
115 15 mihad
 
116 73 mihad
    if (received_termination !== master_abort)
117
    begin
118
        ok = 0 ;
119
    end
120
end
121
endtask // master_reference
122 15 mihad
 
123 73 mihad
// task added for target overflow testing
124
// master writes the addresses to the coresponding locations
125
task normal_write_transfer ;
126
    input  [31:0] start_address ;
127
    input  [3:0]  bus_command ;
128
    input  [31:0] size ;
129
    input  [2:0]  wait_cycles ;
130
    output [31:0] actual_transfer ;
131
    output [2:0]  received_termination ;
132
    reg ok ;
133
    reg [31:0] current_address ;
134
begin:main
135
 
136
    write = 1'b1 ;
137
    get_bus_ownership (ok) ;
138
    if (ok !== 1'b1)
139 15 mihad
    begin
140 73 mihad
        received_termination = error ;
141
        disable main ;
142 15 mihad
    end
143 73 mihad
 
144
    make_parity_error_after_last_dataphase = 1'b0 ;
145
 
146
    addr_phase1(start_address, bus_command) ;
147
    actual_transfer = 0 ;
148
    if (size == 1)
149
    begin
150
        first_and_last_data_phase (1'b1, ~start_address, 4'hF, 1'b0, 1'b0, received_termination) ;
151
        if ((received_termination == normal) || (received_termination == disconnect))
152
            actual_transfer = 1 ;
153
 
154
        -> e_finish_transaction ;
155
    end
156 15 mihad
    else
157
    begin
158 73 mihad
        current_address = start_address ;
159
        first_data_phase (1'b1, ~start_address, 4'hF, 1'b0, 1'b0, received_termination) ;
160
        if ((received_termination == normal) || (received_termination == disconnect))
161
            actual_transfer = 1 ;
162
 
163
        if (received_termination == master_abort)
164
        begin
165
            -> e_transfers_done ;
166
        end
167
 
168
        while ((actual_transfer < (size - 1)) && (received_termination == normal))
169
        begin
170
            current_address = current_address + 4 ;
171
            insert_waits(1'b1, wait_cycles, received_termination) ;
172
            if (received_termination === normal)
173
            begin
174
                subsequent_data_phase(1'b1, ~current_address, 4'hF, 1'b0, received_termination) ;
175
                if ((received_termination == normal) || (received_termination == disconnect))
176
                    actual_transfer = actual_transfer + 1 ;
177
            end
178
        end
179
 
180
        if (received_termination == normal)
181
        begin
182
            insert_waits(1'b1, wait_cycles, received_termination) ;
183
            if (received_termination === normal)
184
            begin
185
                last_data_phase(1'b1, ~current_address, 4'hF, 1'b0, received_termination) ;
186
                if ((received_termination == normal) || (received_termination == disconnect))
187
                    actual_transfer = actual_transfer + 1 ;
188
 
189
                -> e_finish_transaction ;
190
            end
191
            else
192
                -> e_transfers_done ;
193
        end
194 15 mihad
        else
195 73 mihad
            -> e_transfers_done ;
196 15 mihad
    end
197 73 mihad
end
198
endtask // normal_write_transfer
199 15 mihad
 
200 73 mihad
task get_bus_ownership ;
201
    output  ok ;
202
    integer deadlock ;
203
begin
204
    deadlock = 0 ;
205 15 mihad
    @(posedge CLK) ;
206 73 mihad
    while( ((GNT !== 0) || (FRAME !== 1'b1) || (IRDY !== 1'b1)) && (deadlock < 5000) )
207 15 mihad
    begin
208 73 mihad
        REQ <= #6 1'b0 ;
209
        @(posedge CLK) ;
210
        deadlock = deadlock + 1 ;
211 15 mihad
    end
212 73 mihad
 
213
    if (GNT !== 0)
214
    begin
215
        $display("*E, PCI Master could not get ownership of the bus in 5000 cycles") ;
216
        ok = 0 ;
217
    end
218 15 mihad
    else
219
    begin
220 73 mihad
        ok = 1 ;
221 15 mihad
    end
222
 
223 73 mihad
    REQ <= #6 1'b1 ;
224
end
225
endtask // get_bus_ownership
226
 
227
task addr_phase1 ;
228
    input [31:0] address ;
229
    input [3:0]  bus_command ;
230
begin
231
    FRAME_en  <= #6 1'b1 ;
232
    FRAME_int <= #6 1'b0 ;
233
 
234
    AD_en     <= #6 1'b1 ;
235
    AD_int    <= #6 address ;
236
 
237
    CBE_en    <= #6 1'b1 ;
238
    CBE_int   <= #6 bus_command ;
239 15 mihad
    @(posedge CLK) ;
240 73 mihad
end
241
endtask // addr_phase1
242
 
243
task addr_phase2 ;
244
    input [31:0] address ;
245
    input [3:0]  bus_command ;
246
    input        make_parity_error;
247
begin
248
    PAR_int <= #6 ^{AD, CBE, make_parity_error} ;
249
    PAR_en  <= #6 1'b1 ;
250
    AD_int  <= #6 address ;
251
    CBE_int <= #6 bus_command ;
252
    @(posedge CLK) ;
253
end
254
endtask
255
 
256
task first_and_last_data_phase ;
257
    input         rw ;
258
    input  [31:0] data ;
259
    input  [3:0]  be ;
260
    input         make_addr_parity_error ;
261
    input         make_data_parity_error ;
262
    output [2:0]  received_termination ;
263
    integer i ;
264
begin
265
    FRAME_int <= #6 1'b1 ;
266
    first_data_phase (rw, data, be, make_addr_parity_error, make_data_parity_error, received_termination) ;
267
end
268
endtask // first_and_last_data_phase
269
 
270
task first_data_phase ;
271
    input         rw ;
272
    input  [31:0] data ;
273
    input  [3:0]  be ;
274
    input         make_addr_parity_error ;
275
    input         make_data_parity_error ;
276
    output [2:0]  received_termination ;
277
    integer       i ;
278
begin
279
    PAR_int  <= #6 ^{AD, CBE, make_addr_parity_error} ;
280
    PAR_en   <= #6 1'b1 ;
281
    IRDY_en  <= #6 1'b1 ;
282
    IRDY_int <= #6 1'b0 ;
283
    CBE_int  <= #6 be ;
284
    if (rw)
285
        AD_int <= #6 data ;
286 15 mihad
    else
287 73 mihad
        AD_en <= #6 1'b0 ;
288 15 mihad
 
289 73 mihad
    @(posedge CLK) ;
290
    if (!rw)
291
        PAR_en <= #6 1'b0 ;
292
    else
293
        PAR_int <= #6 ^{AD, CBE, make_data_parity_error} ;
294
 
295
    i = 1 ;
296
    while ( (i < 5) && (DEVSEL === 1'b1) )
297 15 mihad
    begin
298
        @(posedge CLK) ;
299
        i = i + 1 ;
300
    end
301
 
302 73 mihad
    if (DEVSEL === 1'b1)
303 15 mihad
    begin
304 73 mihad
        received_termination = master_abort ;
305 15 mihad
    end
306 73 mihad
    else
307
    begin
308
        get_termination(received_termination);
309
    end
310
end
311
endtask // first_data_phase
312 15 mihad
 
313 73 mihad
task subsequent_data_phase ;
314
    input         rw ;
315
    input  [31:0] data ;
316
    input  [3:0]  be ;
317
    input         make_parity_error ;
318
    output [2:0]  received_termination ;
319
begin
320
    if (rw)
321
    begin
322
        PAR_int <= #6 ^{AD, CBE, make_parity_error} ;
323
        AD_int  <= #6 data ;
324
    end
325 15 mihad
 
326 73 mihad
    IRDY_int <= #6 1'b0 ;
327
    CBE_int <= #6 be ;
328
    @(posedge CLK);
329
    get_termination(received_termination);
330
end
331
endtask // subsequent_data_phase
332
 
333
task last_data_phase ;
334
    input         rw ;
335
    input  [31:0] data ;
336
    input  [3:0]  be ;
337
    input         make_parity_error ;
338
    output [2:0]  received_termination ;
339
begin
340
    FRAME_int <= #6 1'b1 ;
341
    IRDY_int  <= #6 1'b0 ;
342
    if (rw)
343
    begin
344
        PAR_int <= #6 ^{AD, CBE, make_parity_error} ;
345
        AD_int <= #6 data ;
346
    end
347
 
348
    CBE_int <= #6 be ;
349
 
350
    @(posedge CLK);
351
    get_termination(received_termination);
352
end
353
endtask // subsequent_data_phase
354
 
355
task get_termination ;
356
    output [2:0] received_termination ;
357
begin
358
    while ((TRDY === 1'b1) && (STOP === 1'b1))
359
        @(posedge CLK) ;
360
 
361
    if ( DEVSEL !== 1'b0 )
362
        received_termination = target_abort ;
363
    else if (TRDY !== 1'b1)
364
    begin
365
        if (STOP !== 1'b1)
366
            received_termination = disconnect ;
367
        else
368
            received_termination = normal ;
369
    end
370
    else
371
        received_termination = retry ;
372
end
373
endtask // get_termination
374
 
375
task finish_transaction ;
376
    input rw ;
377
    input make_parity_error ;
378
begin
379
    if (rw)
380
        PAR_int <= #6 ^{AD, CBE, make_parity_error} ;
381
 
382
    IRDY_int <= #6 1'b1 ;
383
    FRAME_en <= #6 1'b0 ;
384
    AD_en    <= #6 1'b0 ;
385
    CBE_en   <= #6 1'b0 ;
386
 
387 15 mihad
    @(posedge CLK) ;
388 73 mihad
    PAR_en  <= #6 1'b0 ;
389
    IRDY_en <= #6 1'b0 ;
390 15 mihad
end
391 73 mihad
endtask // finish_transaction
392
 
393
always@(e_finish_transaction)
394
begin
395
    finish_transaction (write, make_parity_error_after_last_dataphase) ;
396
end
397
 
398
always@(e_transfers_done)
399
begin
400
 
401
    if (FRAME !== 1'b1)
402
    begin
403
        FRAME_int <= #6 1'b1 ;
404
        IRDY_int  <= #6 1'b0 ;
405
        if (write)
406
            PAR_int <= #6 ^{CBE, AD} ;
407
 
408
        @(posedge CLK) ;
409
    end
410
 
411
    -> e_finish_transaction ;
412
end
413
 
414
task insert_waits ;
415
    input rw ;
416
    input  [2:0] wait_cycles ;
417
    output [2:0] termination ;
418
    reg   [2:0] wait_cycles_left ;
419
    reg         stop_without_trdy_received ;
420
begin
421
    stop_without_trdy_received = 1'b0 ;
422
    wait_cycles_left = wait_cycles ;
423
 
424
    termination = normal ;
425
 
426
    PAR_int <= #6 ^{AD, CBE} ;
427
 
428
    for (wait_cycles_left = wait_cycles ; (wait_cycles_left > 0) && !stop_without_trdy_received ; wait_cycles_left = wait_cycles_left - 1'b1)
429
    begin
430
        IRDY_int <= #6 1'b1 ;
431
        @(posedge CLK) ;
432
 
433
        PAR_int <= #6 ^{AD, CBE, 1'b1} ;
434
 
435
        if ((STOP !== 1'b1) && (TRDY !== 1'b0))
436
        begin
437
            stop_without_trdy_received = 1'b1 ;
438
            if (DEVSEL !== 1'b0)
439
                termination = target_abort ;
440
            else
441
                termination = retry ;
442
        end
443
    end
444
end
445
endtask // insert_waits
446 15 mihad
endmodule
447
 

powered by: WebSVN 2.1.0

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