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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_5/] [bench/] [verilog/] [pci_behaviorial_master.v] - Blame information for rev 19

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

Line No. Rev Author Line
1 19 mihad
//===========================================================================
2
// $Id: pci_behaviorial_master.v,v 1.1 2002-02-01 15:07:51 mihad Exp $
3
//
4
// Copyright 2001 Blue Beaver.  All Rights Reserved.
5
//
6
// Summary:  A PCI Behaviorial Master.  This module accepts commands from
7
//           the top-level Stimulus generator.  Based on arguments supplied
8
//           to it, it generates a reference containing paramaters to the
9
//           Target in the middle 16 bits of PCI Address.  It also arbitrates
10
//           for the bus, sends data when writing, and compares returned data
11
//           when reading.
12
//           This interface does not understand retries after Target Disconnect
13
//           commands, and does not implement a disconnect counter.
14
//
15
// This library is free software; you can distribute it and/or modify it
16
// under the terms of the GNU Lesser General Public License as published
17
// by the Free Software Foundation; either version 2.1 of the License, or
18
// (at your option) any later version.
19
//
20
// This library is distributed in the hope that it will be useful, but
21
// WITHOUT ANY WARRANTY; without even the implied warranty of
22
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23
// See the GNU Lesser General Public License for more details.
24
//
25
// You should have received a copy of the GNU Lesser General Public License
26
// along with this library.  If not, write to
27
// Free Software Foundation, Inc.
28
// 59 Temple Place, Suite 330
29
// Boston, MA 02111-1307 USA
30
//
31
// Author's note about this license:  The intention of the Author and of
32
// the Gnu Lesser General Public License is that users should be able to
33
// use this code for any purpose, including combining it with other source
34
// code, combining it with other logic, translated it into a gate-level
35
// representation, or projected it into gates in a programmable or
36
// hardwired chip, as long as the users of the resulting source, compiled
37
// source, or chip are given the means to get a copy of this source code
38
// with no new restrictions on redistribution of this source.
39
//
40
// If you make changes, even substantial changes, to this code, or use
41
// substantial parts of this code as an inseparable part of another work
42
// of authorship, the users of the resulting IP must be given the means
43
// to get a copy of the modified or combined source code, with no new
44
// restrictions on redistribution of the resulting source.
45
//
46
// Separate parts of the combined source code, compiled code, or chip,
47
// which are NOT derived from this source code do NOT need to be offered
48
// to the final user of the chip merely because they are used in
49
// combination with this code.  Other code is not forced to fall under
50
// the GNU Lesser General Public License when it is linked to this code.
51
// The license terms of other source code linked to this code might require
52
// that it NOT be made available to users.  The GNU Lesser General Public
53
// License does not prevent this code from being used in such a situation,
54
// as long as the user of the resulting IP is given the means to get a
55
// copy of this component of the IP with no new restrictions on
56
// redistribution of this source.
57
//
58
// This code was developed using VeriLogger Pro, by Synapticad.
59
// Their support is greatly appreciated.
60
//
61
// NOTE:  This Test Chip instantiates one PCI interface and connects it
62
//        to its IO pads and to logic representing a real application.
63
//
64
// NOTE TODO: Horrible.  Tasks can't depend on their Arguments being safe
65
//        if there are several instances ofthe tasl running at once.
66
// NOTE TODO: Verify that Fast-Back-To-Back references are done correctly
67
// NOTE TODO: Verify that PERR and SERR are driven correctly, and that signals
68
//        reflecting their detection are available for use in the Config Regs
69
//  Detect and report PERR and SERR reports as enabled.  3.7.4
70
//  Start adding the address register needed to handle retries
71
//  Start trying to understand the latency register.  Why not simply
72
//    get off the bus when grant goes away?
73
// Do not do a retry or disconnect if all 4 BE wires are 1's.  End of 3.8
74
// Start adding Latency Counter
75
// Complain if SERR caused by address parity error not seen when expected
76
// complain if data parity error not seen when expected
77
//
78
//===========================================================================
79
 
80
`timescale 1ns/1ps
81
 
82
module pci_behaviorial_master (
83
  ad_now, ad_prev, master_ad_out, master_ad_oe,
84
  master_cbe_l_out, master_cbe_oe,
85
  calc_input_parity_prev,
86
  par_now, par_prev,
87
  frame_now, frame_prev, master_frame_out, master_frame_oe,
88
  irdy_now, irdy_prev, master_irdy_out, master_irdy_oe,
89
  devsel_now, devsel_prev, trdy_now, trdy_prev, stop_now, stop_prev,
90
  perr_now, perr_prev, master_perr_out, master_perr_oe, master_serr_oe,
91
  master_req_out, master_gnt_now,
92
  pci_reset_comb, pci_ext_clk,
93
// Signals from the master to the target to set bits in the Status Register
94
  master_got_parity_error, master_asserted_serr, master_got_master_abort,
95
  master_got_target_abort, master_caused_parity_error,
96
  master_enable, master_fast_b2b_en, master_perr_enable, master_serr_enable,
97
  master_latency_value,
98
// Signals used by the test bench instead of using "." notation
99
  master_debug_force_bad_par,
100
  test_master_number, test_address, test_command,
101
  test_data, test_byte_enables_l, test_size,
102
  test_make_addr_par_error, test_make_data_par_error,
103
  test_master_initial_wait_states, test_master_subsequent_wait_states,
104
  test_target_initial_wait_states, test_target_subsequent_wait_states,
105
  test_target_devsel_speed, test_fast_back_to_back,
106
  test_target_termination,
107
  test_expect_master_abort,
108
  test_start, test_accepted_l, test_error_event,
109
  test_device_id,
110
  master_received_data,
111
  master_received_data_valid,
112
  master_check_received_data
113
);
114
 
115
`include "pci_blue_options.vh"
116
`include "pci_blue_constants.vh"
117
 
118
  input  [PCI_BUS_DATA_RANGE:0] ad_now;
119
  input  [PCI_BUS_DATA_RANGE:0] ad_prev;
120
  output [PCI_BUS_DATA_RANGE:0] master_ad_out;
121
  output  master_ad_oe;
122
  output [PCI_BUS_CBE_RANGE:0] master_cbe_l_out;
123
  output  master_cbe_oe;
124
  input   calc_input_parity_prev;
125
  input   par_now, par_prev;
126
  input   frame_now, frame_prev;
127
  output  master_frame_out, master_frame_oe;
128
  input   irdy_now, irdy_prev;
129
  output  master_irdy_out, master_irdy_oe;
130
  input   devsel_now, devsel_prev, trdy_now, trdy_prev, stop_now, stop_prev;
131
  input   perr_now, perr_prev;
132
  output  master_perr_out, master_perr_oe, master_serr_oe;
133
  output  master_req_out;
134
  input   master_gnt_now;
135
  input   pci_reset_comb, pci_ext_clk;
136
// Signals from the master to the target to set bits in the Status Register
137
  output  master_got_parity_error, master_asserted_serr, master_got_master_abort;
138
  output  master_got_target_abort, master_caused_parity_error;
139
  input   master_enable, master_fast_b2b_en, master_perr_enable, master_serr_enable;
140
  input  [7:0] master_latency_value;  // NOTE WORKING
141
// Signals used by the test bench instead of using "." notation
142
  output  master_debug_force_bad_par;
143
  input  [2:0] test_master_number;
144
  input  [PCI_BUS_DATA_RANGE:0] test_address;
145
  input  [PCI_BUS_CBE_RANGE:0] test_command;
146
  input  [PCI_BUS_DATA_RANGE:0] test_data;
147
  input  [PCI_BUS_CBE_RANGE:0] test_byte_enables_l;
148
  input  [9:0] test_size;
149
  input   test_make_addr_par_error, test_make_data_par_error;
150
  input  [3:0] test_master_initial_wait_states;
151
  input  [3:0] test_master_subsequent_wait_states;
152
  input  [3:0] test_target_initial_wait_states;
153
  input  [3:0] test_target_subsequent_wait_states;
154
  input  [1:0] test_target_devsel_speed;
155
  input   test_fast_back_to_back;
156
  input  [2:0] test_target_termination;
157
  input   test_expect_master_abort;
158
  input   test_start;
159
  output  test_accepted_l;
160
  output  test_error_event;
161
  input  [2:0] test_device_id;
162
  output [PCI_BUS_DATA_RANGE:0] master_received_data ;
163
  output master_received_data_valid ;
164
  input  master_check_received_data ;
165
 
166
  reg    [PCI_BUS_DATA_RANGE:0] master_ad_out;
167
  reg     master_ad_oe;
168
  reg    [PCI_BUS_CBE_RANGE:0] master_cbe_l_out;
169
  reg     master_cbe_oe;
170
  reg     master_frame_out, master_irdy_out;
171
  wire    master_frame_oe, master_irdy_oe, master_perr_oe, master_serr_oe;
172
  reg     master_perr_out;
173
  reg     master_req_out;
174
  reg     master_debug_force_bad_par;
175
  reg     [PCI_BUS_DATA_RANGE:0] master_received_data ;
176
  reg                            master_received_data_valid ;
177
 
178
// Let test commander know when this PCI Master has accepted the command.
179
  reg     test_accepted_next, test_accepted_int;
180
// Display on negative edge so easy to see
181
  always @(negedge pci_ext_clk or posedge pci_reset_comb)
182
  begin
183
    if (pci_reset_comb)
184
    begin
185
      test_accepted_int <= 1'b0;
186
      master_received_data_valid <= 1'b0 ;
187
    end
188
    else
189
    begin
190
      test_accepted_int <= test_accepted_next;
191
    end
192
  end
193
  assign  test_accepted_l = test_accepted_int ? 1'b0 : 1'bZ;
194
 
195
// Make temporary Bip every time an error is detected
196
  reg     test_error_event;
197
  initial test_error_event <= 1'bZ;
198
  reg     error_detected;
199
  initial error_detected <= 1'b0;
200
  always @(error_detected)
201
  begin
202
    test_error_event <= 1'b0;
203
    #2;
204
    test_error_event <= 1'bZ;
205
  end
206
 
207
// Make the FRAME_OE and IRDY_OE output enable signals.  They must
208
//   become asserted as soon as each of those signals become asserted, and
209
//   must stay asserted one clock after the signal becomes deasserted.
210
  reg     prev_frame_asserted, prev_irdy_asserted;
211
  always @(posedge pci_ext_clk or posedge pci_reset_comb)
212
  begin
213
    if (pci_reset_comb)
214
    begin
215
      prev_frame_asserted <= 1'b0;
216
      prev_irdy_asserted <= 1'b0;
217
    end
218
    else
219
    begin
220
      prev_frame_asserted <= master_frame_out;
221
      prev_irdy_asserted <= master_irdy_out;
222
    end
223
  end
224
  assign  master_frame_oe = master_frame_out | prev_frame_asserted;
225
  assign  master_irdy_oe = master_irdy_out | prev_irdy_asserted;
226
 
227
// Make the PERR_OE signal.
228
// See the PCI Local Bus Spec Revision 2.2 section 3.7.4.1
229
// At time N, master_perr_check_next is set
230
// At time N+1, external data is latched, and trdy is also latched
231
// At time N+1, master_perr_check is latched
232
// At time N+2, calc_input_parity_prev is valid
233
// Also at N+2, external parity is valid
234
// Target can assert data slowly the first reference.
235
// Qualify PERR with TRDY (?)
236
  reg     master_perr_prev, master_perr_check_next, master_perr_check;
237
  reg     master_oe_prev, master_oe_prev_prev;
238
  reg     master_perr_detected, master_target_perr_received;
239
  reg     master_debug_force_bad_perr ;
240
 
241
  always @(posedge pci_ext_clk or posedge pci_reset_comb)
242
  begin
243
    if (pci_reset_comb)
244
        master_debug_force_bad_perr <= 1'b0 ;
245
    else
246
        master_debug_force_bad_perr <= master_debug_force_bad_par ;
247
  end
248
 
249
  always @(posedge pci_ext_clk or posedge pci_reset_comb)
250
  begin
251
    if (pci_reset_comb)
252
    begin
253
      master_perr_check <= 1'b0;
254
      master_perr_detected <= 1'b0;
255
      master_target_perr_received <= 1'b0;
256
      master_perr_out <= 1'b0;
257
      master_perr_prev <= 1'b0;
258
      master_oe_prev <= 1'b0;
259
      master_oe_prev_prev <= 1'b0;
260
    end
261
    else
262
    begin
263
      master_perr_check <= master_perr_check_next;
264
      master_perr_detected <= master_perr_check & trdy_prev
265
                         & (calc_input_parity_prev != par_now);
266
      master_oe_prev <= master_ad_oe;
267
      master_oe_prev_prev <= master_oe_prev;
268
      master_target_perr_received <= master_oe_prev_prev & perr_now;
269
      master_perr_out <= master_perr_check & trdy_prev & master_perr_enable
270
                         & (calc_input_parity_prev != ( par_now ^ master_debug_force_bad_perr));
271
      master_perr_prev <= master_perr_out;
272
    end
273
  end
274
  assign  master_perr_oe = master_perr_out | master_perr_prev;
275
 
276
// Tell the Config Status Register when errors occur
277
  assign  master_got_parity_error = master_perr_detected;
278
  assign  master_serr_oe = 1'b0;        // This master NEVER asserts SERR
279
  assign  master_asserted_serr = 1'b0;  // This master NEVER asserts SERR
280
  reg     master_got_master_abort, master_got_target_abort, master_got_target_retry;  // assigned in state machine
281
// PERR_detected or PERR pin seen while master
282
// See the PCI Local Bus Spec Revision 2.2 section 6.2.3
283
  assign  master_caused_parity_error = master_perr_out
284
                               | (master_target_perr_received & master_perr_enable);
285
 
286
// Remember whether this device drove the AD Bus last clock, which allows
287
// Zero-Wait-State Back-to-Back references
288
  wire    This_Master_Drove_The_AD_Bus_The_Last_Clock = master_ad_oe;
289
 
290
// Model of a Master Source of Data, which writes whatever it wants on bursts
291
task Compare_Read_Data_With_Expected_Data;
292
  input  [PCI_BUS_DATA_RANGE:0] target_read_data;
293
  input  [PCI_BUS_DATA_RANGE:0] master_check_data;
294
  input  [PCI_BUS_CBE_RANGE:0]  mask_l;// Added by Tadej M. on 11.12.2001
295
  begin                                                                                                                                                 // Added by Tadej M. on 11.12.2001
296
    if (~pci_reset_comb & ((target_read_data[31:24] !=  master_check_data[31:24]) & ~mask_l[3]) &
297
                                          ((target_read_data[23:16] !=  master_check_data[23:16]) & ~mask_l[2]) &
298
                                          ((target_read_data[15:8]  !=  master_check_data[15:8])  & ~mask_l[1]) &
299
                                          ((target_read_data[7:0]   !=  master_check_data[7:0])   & ~mask_l[0]) )
300
    begin
301
      $display ("*** test master %h - Master Read Data 'h%x not as expected 'h%x, at %t",
302
                  test_device_id[2:0], target_read_data[PCI_BUS_DATA_RANGE:0],
303
                  master_check_data[PCI_BUS_DATA_RANGE:0], $time);
304
      error_detected <= ~error_detected;
305
    end
306
    `NO_ELSE;
307
  end
308
endtask
309
 
310
// Tasks can't have local storage!  have to be module global
311
  reg    [PCI_BUS_DATA_RANGE:0] up_temp;
312
task Update_Write_Data;
313
  input  [PCI_BUS_DATA_RANGE:0] master_write_data;
314
  input  [PCI_BUS_CBE_RANGE:0] master_mask_l;
315
  output [PCI_BUS_DATA_RANGE:0] master_write_data_next;
316
  output [PCI_BUS_CBE_RANGE:0] master_mask_l_next;
317
  begin
318
    up_temp[31:24] = master_write_data[31:24] + 8'h01;
319
    up_temp[23:16] = master_write_data[23:16] + 8'h01;
320
    up_temp[15: 8] = master_write_data[15: 8] + 8'h01;
321
    up_temp[ 7: 0] = master_write_data[ 7: 0] + 8'h01;
322
// Wrap adds so that things repeat in the 256 Byte (64 Word) Target SRAM
323
    master_write_data_next[PCI_BUS_DATA_RANGE:0] = up_temp[PCI_BUS_DATA_RANGE:0];// & 32'h3F3F3F3F; commented by Tadej M. on 07.12.2001
324
    master_mask_l_next[PCI_BUS_CBE_RANGE:0] = {master_mask_l[2:0], master_mask_l[3]};
325
  end
326
endtask
327
 
328
// Counter to detect unexpected master aborts
329
  reg    [2:0] Master_Abort_Counter;
330
 
331
task Init_Master_Abort_Counter;
332
  begin
333
    Master_Abort_Counter <= 3'h1;
334
  end
335
endtask
336
 
337
task Inc_Master_Abort_Counter;
338
  begin
339
    if (Master_Abort_Counter < 3'h7)  // count up cycles since Address
340
    begin
341
      Master_Abort_Counter <= Master_Abort_Counter + 3'h1;
342
    end
343
    `NO_ELSE;
344
  end
345
endtask
346
 
347
task Check_Master_Abort_Counter;
348
  output  got_master_abort;
349
  begin
350
    got_master_abort = (Master_Abort_Counter >= 3'h5);
351
  end
352
endtask
353
 
354
// Signals used by Master test code to apply correct info to the PCI bus
355
  reg    [23:9] hold_master_address;
356
  reg    [PCI_BUS_CBE_RANGE:0] hold_master_command;
357
  reg    [PCI_BUS_DATA_RANGE:0] hold_master_data;
358
  reg    [PCI_BUS_CBE_RANGE:0] hold_master_byte_enables_l;
359
  reg    [9:0] hold_master_size;
360
  reg     hold_master_addr_par_err, hold_master_data_par_err;
361
  reg    [3:0] hold_master_initial_waitstates;
362
  reg    [3:0] hold_master_subsequent_waitstates;
363
  reg    [3:0] hold_master_target_initial_waitstates;
364
  reg    [3:0] hold_master_target_subsequent_waitstates;
365
  reg    [1:0] hold_master_target_devsel_speed;
366
  reg     hold_master_fast_b2b;
367
  reg    [2:0] hold_master_target_termination;
368
  reg     hold_master_expect_master_abort;
369
  reg    [PCI_BUS_DATA_RANGE:0] modified_master_address;
370
 
371
// Tasks to do behaviorial PCI references
372
// NOTE all tasks end with an @(posedge pci_ext_clk) statement
373
//      to let any signals asserted during that task settle out.
374
// If a task DOESN'T end with @(posedge pci_ext_clk), then it must
375
//      be called just before some other task which does.
376
 
377
parameter TEST_MASTER_SPINLOOP_MAX = 20;
378
 
379
task Clock_Wait_Unless_Reset;
380
  begin
381
    if (~pci_reset_comb)
382
    begin
383
      @ (posedge pci_ext_clk or posedge pci_reset_comb) ;
384
    end
385
    `NO_ELSE;
386
  end
387
endtask
388
 
389
task Assert_FRAME;
390
  begin
391
    master_frame_out <= 1'b1;
392
  end
393
endtask
394
 
395
task Deassert_FRAME;
396
  begin
397
    master_frame_out <= 1'b0;
398
  end
399
endtask
400
 
401
task Assert_IRDY;
402
  begin
403
    master_irdy_out <= 1'b1;
404
  end
405
endtask
406
 
407
task Deassert_IRDY;
408
  begin
409
    master_irdy_out <= 1'b0;
410
  end
411
endtask
412
 
413
task Assert_Master_Continue_Or_Terminate;
414
  input do_master_terminate;
415
  begin
416
    if (do_master_terminate)
417
    begin
418
      Deassert_FRAME;    Assert_IRDY;
419
    end
420
    else
421
    begin
422
      Assert_FRAME;      Assert_IRDY;
423
    end
424
  end
425
endtask
426
 
427
task Indicate_Start;
428
  begin
429
`ifdef VERBOSE_TEST_DEVICE
430
    $display (" test %h - Task Started, at %t", test_device_id[2:0], $time);
431
`endif // VERBOSE_TEST_DEVICE
432
      test_accepted_next <= 1'b1;
433
  end
434
endtask
435
 
436
task Indicate_Done;
437
  begin
438
// `ifdef VERBOSE_TEST_DEVICE
439
//     $display (" test %h - Task Done, at %t", test_device_id[2:0], $time);
440
// `endif // VERBOSE_TEST_DEVICE
441
      test_accepted_next <= 1'b0;
442
  end
443
endtask
444
 
445
task Master_Req_Bus;  // must be followed by an address assertion task
446
  begin
447
`ifdef VERBOSE_TEST_DEVICE
448
    $display (" test %h - Requesting the bus, at %t",
449
                test_device_id[2:0], $time);
450
`endif // VERBOSE_TEST_DEVICE
451
      master_req_out <= 1'b1;
452
  end
453
endtask
454
 
455
task Master_Unreq_Bus;  // must be followed by SOMETHING???
456
  begin
457
`ifdef VERBOSE_TEST_DEVICE
458
    $display (" test %h - Un-Requesting the bus, at %t",
459
                test_device_id[2:0], $time);
460
`endif // VERBOSE_TEST_DEVICE
461
      master_req_out <= 1'b0;
462
  end
463
endtask
464
 
465
parameter TEST_MASTER_IMMEDIATE_ADDRESS = 1'b0;
466
parameter TEST_MASTER_STEP_ADDRESS      = 1'b1;
467
 
468
// Tasks can't have local storage!  have to be module global
469
  integer ii; // sequential code, so OK to use "=" assignment operator
470
  reg     first_step_delay;
471
task Master_Assert_Address;
472
  input  [PCI_BUS_DATA_RANGE:0] address;
473
  input  [PCI_BUS_CBE_RANGE:0] command;
474
  input   address_speed, enable_fast_back_to_back, force_addr_par_error;
475
  begin
476
`ifdef VERBOSE_TEST_DEVICE
477
    $display (" test %h - Driving Address 'h%x, CBE 'h%x, at %t",
478
              test_device_id[2:0], address[PCI_BUS_DATA_RANGE:0],
479
              command[PCI_BUS_CBE_RANGE:0], $time);
480
`endif // VERBOSE_TEST_DEVICE
481
    first_step_delay = (address_speed == TEST_MASTER_STEP_ADDRESS);
482
    for (ii = 0; ii < TEST_MASTER_SPINLOOP_MAX; ii = ii + 1)
483
    begin
484
      if (master_gnt_now
485
           & (  (~frame_now & ~irdy_now)  // and bus previously idle
486
// ... or we previously were driving data, so fast back-to-back is possible.
487
              | (  ~frame_now & irdy_now
488
                  & This_Master_Drove_The_AD_Bus_The_Last_Clock
489
                  & enable_fast_back_to_back & master_fast_b2b_en) ) )
490
      begin
491
        if (first_step_delay == 1'b1)
492
        begin  // stepping, so drive address with some unknown bits
493
          master_ad_out[PCI_BUS_DATA_RANGE:0] <= address[PCI_BUS_DATA_RANGE:0] ^ 32'hXX00XX00;
494
          master_ad_oe <= 1'b1;
495
          master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= command[PCI_BUS_CBE_RANGE:0] ^ 4'bX0X0;
496
          master_cbe_oe <= 1'b1;
497
          master_debug_force_bad_par <= 1'b1;
498
          master_got_master_abort <= 1'b0;
499
          master_got_target_abort <= 1'b0;
500
          master_got_target_retry <= 1'b0;
501
          master_perr_check_next <= 1'b0;
502
          Deassert_FRAME;
503
          Deassert_IRDY;
504
          first_step_delay = 1'b0;  // next time through, make frame
505
        end
506
        else
507
        begin  // drive address AND frame
508
          master_ad_out[PCI_BUS_DATA_RANGE:0] <= address[PCI_BUS_DATA_RANGE:0];
509
          master_ad_oe <= 1'b1;
510
          master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= command[PCI_BUS_CBE_RANGE:0];
511
          master_cbe_oe <= 1'b1;
512
          master_debug_force_bad_par <= force_addr_par_error;
513
          master_got_master_abort <= 1'b0;
514
          master_got_target_abort <= 1'b0;
515
          master_got_target_retry <= 1'b0;
516
          master_perr_check_next <= 1'b0;
517
          Assert_FRAME;
518
          Deassert_IRDY;
519
          Init_Master_Abort_Counter;  // just completed master cycle 1
520
          first_step_delay = 1'b0;  // next time through, make frame
521
          ii = TEST_MASTER_SPINLOOP_MAX + 1;  // break
522
        end
523
      end
524
      else
525
      begin  // might have lost things after first step.  Undrive everything.
526
        master_ad_out[PCI_BUS_DATA_RANGE:0] <= `BUS_IMPOSSIBLE_VALUE;
527
        master_ad_oe <= 1'b0;
528
        master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= PCI_COMMAND_RESERVED_READ_4;  // easy to see
529
        master_cbe_oe <= 1'b0;
530
        master_debug_force_bad_par <= 1'b0;
531
        master_got_master_abort <= 1'b0;
532
        master_got_target_abort <= 1'b0;
533
        master_got_target_retry <= 1'b0;
534
        master_perr_check_next <= 1'b0;
535
        Deassert_FRAME;
536
        Deassert_IRDY;
537
        first_step_delay = (address_speed == TEST_MASTER_STEP_ADDRESS);
538
      end
539
      Clock_Wait_Unless_Reset;  // wait for outputs to settle
540
      Indicate_Done;  // indicate done as early as possible, while still after start
541
    end
542
`ifdef NORMAL_PCI_CHECKS
543
    if (~pci_reset_comb & (ii == TEST_MASTER_SPINLOOP_MAX))
544
    begin
545
      $display ("*** test %h - PCI Gnt never arrived, at %t",
546
                  test_device_id[2:0], $time);
547
      error_detected <= ~error_detected;
548
    end
549
    `NO_ELSE;
550
`endif // NORMAL_PCI_CHECKS
551
  end
552
endtask
553
 
554
// While asserting FRAME, wait zero or more clocks as commanded by master
555
//   tasks can't have local storage!  have to be module global
556
  reg    [3:0] cnt;
557
task Execute_Master_Waitstates_But_Quit_On_Target_Abort;
558
  input   drive_ad_bus;
559
  input  [PCI_BUS_CBE_RANGE:0] master_mask_l;
560
  input  [3:0] num_waitstates;
561
  begin
562
    for (cnt = 4'h0; cnt < num_waitstates[3:0]; cnt = cnt + 4'h1)
563
    begin
564
      if (~devsel_now & stop_now)
565
      begin
566
        cnt = num_waitstates[3:0];  // immediate exit on Target Abort
567
      end
568
      else
569
      begin
570
        master_ad_out[PCI_BUS_DATA_RANGE:0] <= `BUS_WAIT_STATE_VALUE;
571
        master_ad_oe <= drive_ad_bus;
572
        master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= master_mask_l[PCI_BUS_CBE_RANGE:0];
573
        master_cbe_oe <= 1'b1;
574
        master_debug_force_bad_par <= 1'b0;
575
        master_got_master_abort <= 1'b0;
576
        master_got_target_abort <= 1'b0;
577
        master_got_target_retry <= 1'b0;
578
        master_perr_check_next <= ~drive_ad_bus;
579
        Assert_FRAME;                  // frame, but no action
580
        Deassert_IRDY;
581
        Inc_Master_Abort_Counter;
582
        Clock_Wait_Unless_Reset;  // wait for outputs to settle
583
      end
584
    end
585
  end
586
endtask
587
 
588
task Check_Target_Abort;
589
  input   got_target_abort;
590
  input  [9:0] words_transferred;
591
  input  [9:0] words_expected;
592
  begin
593
    if (~got_target_abort)
594
    begin
595
      $display ("*** test master %h - Target Abort not received when expected, at %t",
596
                  test_device_id[2:0], $time);
597
      error_detected <= ~error_detected;
598
    end
599
    else if (words_transferred[9:0] != words_expected[9:0])
600
    begin
601
      $display ("*** test master %h - Target Abort received, but Word Count %d not %d, at %t",
602
                  test_device_id[2:0], words_transferred, words_expected, $time);
603
      error_detected <= ~error_detected;
604
    end
605
    `NO_ELSE;
606
  end
607
endtask
608
 
609
task Check_Target_Retry;
610
  input   got_target_retry;
611
  input  [9:0] words_transferred;
612
  input  [9:0] words_expected;
613
  begin
614
    if (~got_target_retry)
615
    begin
616
      $display ("*** test master %h - Target Retry not received when expected, at %t",
617
                  test_device_id[2:0], $time);
618
      error_detected <= ~error_detected;
619
    end
620
    else if (words_transferred[9:0] != words_expected[9:0])
621
    begin
622
      $display ("*** test master %h - Target Retry received, but Word Count %d not %d, at %t",
623
                  test_device_id[2:0], words_transferred, words_expected, $time);
624
      error_detected <= ~error_detected;
625
    end
626
    `NO_ELSE;
627
  end
628
endtask
629
 
630
task Check_Target_Stop;
631
  input   got_target_stop;
632
  input  [9:0] words_transferred;
633
  input  [9:0] words_expected;
634
  begin
635
    if (~got_target_stop)
636
    begin
637
      $display ("*** test master %h - Target Stop not received when expected, at %t",
638
                  test_device_id[2:0], $time);
639
      error_detected <= ~error_detected;
640
    end
641
    else if (words_transferred[9:0] != words_expected[9:0])
642
    begin
643
      $display ("*** test master %h - Target Stop received, but Word Count %d not %d, at %t",
644
                  test_device_id[2:0], words_transferred, words_expected, $time);
645
      error_detected <= ~error_detected;
646
    end
647
    `NO_ELSE;
648
  end
649
endtask
650
 
651
// The initiator asked for a certain termination scheme.  Did it do that?
652
task Check_Master_Burst_Termination_Cause;
653
  input   got_master_abort, got_master_terminate;
654
  input   got_target_retry, got_target_stop, got_target_abort;
655
  input  [9:0] words_transferred;
656
  begin
657
    if (~pci_reset_comb)
658
    begin
659
// Check for Master Abort status
660
      if (~hold_master_expect_master_abort & got_master_abort)
661
      begin
662
        $display ("*** test master %h - Master Abort received when none was expected, at %t",
663
                    test_device_id[2:0], $time);
664
        error_detected <= ~error_detected;
665
      end
666
      `NO_ELSE;
667
      if (hold_master_expect_master_abort & ~got_master_abort)
668
      begin
669
        $display ("*** test master %h - Master Abort not received when expected, at %t",
670
                    test_device_id[2:0], $time);
671
        error_detected <= ~error_detected;
672
      end
673
      `NO_ELSE;
674
// Check for Target Abort status
675
      if (hold_master_target_termination[2:0] == `Test_Target_Abort_On)
676
        Check_Target_Abort (got_target_abort, words_transferred[9:0], hold_master_size - 1);
677
 
678
      if (hold_master_target_termination[2:0] == `Test_Target_Abort_Before)
679
      begin
680
        if (hold_master_size[9:0] >= 10'h2)  // too small, don't get a chance to do 2
681
        begin
682
          Check_Target_Abort (got_target_abort, words_transferred[9:0], hold_master_size - 2);
683
        end
684
        else
685
        begin
686
          Check_Target_Stop (got_master_terminate,
687
                             words_transferred[9:0], hold_master_size[9:0]);
688
        end
689
      end
690
      `NO_ELSE;
691
// Check for Target Retry status
692
      if (hold_master_target_termination[2:0] == `Test_Target_Retry_On)
693
      begin
694
        Check_Target_Retry (got_target_retry, words_transferred[9:0], hold_master_size - 1);
695
      end
696
      `NO_ELSE;
697
 
698
      if (hold_master_target_termination[2:0] == `Test_Target_Retry_Before)
699
      begin
700
        if (hold_master_size[9:0] >= 10'h2)  // too small, don't get a chance to do 2
701
        begin
702
          Check_Target_Retry (got_target_retry, words_transferred[9:0], hold_master_size - 2);
703
        end
704
        else
705
        begin
706
          Check_Target_Stop (got_master_terminate,
707
                             words_transferred[9:0], hold_master_size[9:0]);
708
        end
709
      end
710
      `NO_ELSE;
711
// Check for Target Disconnect status
712
      if (hold_master_target_termination[2:0] == `Test_Target_Disc_On)
713
      begin
714
        Check_Target_Stop (got_target_stop, words_transferred[9:0], hold_master_size);
715
      end
716
      `NO_ELSE;
717
 
718
      if (hold_master_target_termination[2:0] == `Test_Target_Disc_Before)
719
      begin
720
        if (hold_master_size[9:0] >= 10'h2)  // too small, don't get a chance to do 2
721
        begin
722
          Check_Target_Stop (got_target_stop, words_transferred[9:0], hold_master_size - 1);
723
        end
724
        else
725
        begin
726
          Check_Target_Stop (got_master_terminate,
727
                             words_transferred[9:0], hold_master_size[9:0]);
728
        end
729
      end
730
    `NO_ELSE;
731
// Check for retry due to starting a delayed read
732
      if (hold_master_target_termination[2:0] == `Test_Target_Start_Delayed_Read)
733
      begin
734
        Check_Target_Retry (got_target_retry, words_transferred[9:0], 10'h0);
735
      end
736
      `NO_ELSE;
737
 
738
// Check for normal completion caused by the Master
739
      if (   (hold_master_target_termination[2:0] == `Test_Target_Normal_Completion)
740
           & ~hold_master_expect_master_abort )
741
      begin
742
        if (got_target_abort)
743
        begin
744
          $display ("*** test master %h - Target Abort received when doing normal transfer, at %t",
745
                      test_device_id[2:0], $time);
746
          error_detected <= ~error_detected;
747
        end
748
        `NO_ELSE;
749
        if (got_target_retry)
750
        begin
751
          $display ("*** test master %h - Target Retry received when doing normal transfer, at %t",
752
                      test_device_id[2:0], $time);
753
          error_detected <= ~error_detected;
754
        end
755
        `NO_ELSE;
756
        if (words_transferred[9:0] != hold_master_size[9:0])
757
        begin
758
          $display ("*** test master %h - Normal Transfer, but Word Count %d not %d, at %t",
759
                      test_device_id[2:0], words_transferred, hold_master_size, $time);
760
          error_detected <= ~error_detected;
761
        end
762
        `NO_ELSE;
763
      end
764
      `NO_ELSE;
765
    end
766
  end
767
endtask
768
 
769
// Linger until DEVSEL.
770
// Tasks can't have local storage!  have to be module global
771
  integer iii;
772
task Linger_Until_DEVSEL_Or_Master_Abort_Or_Target_Abort;
773
  input   drive_ad_bus;
774
  input  [PCI_BUS_DATA_RANGE:0] master_write_data;
775
  input  [PCI_BUS_CBE_RANGE:0] master_mask_l;
776
  input   do_master_terminate;
777
  output  got_master_abort;
778
  begin
779
`ifdef VERBOSE_TEST_DEVICE
780
    $display (" test %h - Lingering waiting for DEVSEL, at %t",
781
              test_device_id[2:0], $time);
782
`endif // VERBOSE_TEST_DEVICE
783
    for (iii = 0; iii < TEST_MASTER_SPINLOOP_MAX; iii = iii + 1)
784
    begin
785
      if (~devsel_now)  // no master yet
786
      begin
787
        if (stop_now)  // target abort!
788
        begin
789
          iii = TEST_MASTER_SPINLOOP_MAX + 1;  // break
790
          got_master_abort = 1'b0;  // target abort handled before master abort
791
        end
792
        else
793
        begin
794
          Check_Master_Abort_Counter (got_master_abort);
795
          if (got_master_abort)  // immediate exit on master abort
796
          begin
797
            iii = TEST_MASTER_SPINLOOP_MAX + 1;  // break
798
          end
799
          else
800
          begin
801
            master_ad_out[PCI_BUS_DATA_RANGE:0] <= master_write_data[PCI_BUS_DATA_RANGE:0];
802
            master_ad_oe <= drive_ad_bus;
803
            master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= master_mask_l[PCI_BUS_CBE_RANGE:0];
804
            master_cbe_oe <= 1'b1;
805
            master_debug_force_bad_par <= hold_master_data_par_err;
806
            master_got_master_abort <= 1'b0;
807
            master_got_target_abort <= 1'b0;
808
            master_got_target_retry <= 1'b0;
809
            master_perr_check_next <= ~drive_ad_bus;
810
            Assert_Master_Continue_Or_Terminate (do_master_terminate);
811
            Inc_Master_Abort_Counter;
812
            Clock_Wait_Unless_Reset;  // wait for outputs to settle
813
          end
814
        end
815
      end
816
      else
817
      begin
818
        iii = TEST_MASTER_SPINLOOP_MAX + 1;  // break
819
        got_master_abort = 1'b0;  // success
820
      end
821
    end
822
    if (iii == TEST_MASTER_SPINLOOP_MAX)
823
    begin
824
      got_master_abort = 1'b1;  // fail if fall off end
825
    end
826
    `NO_ELSE;
827
`ifdef NORMAL_PCI_CHECKS
828
    if (~pci_reset_comb & (iii == TEST_MASTER_SPINLOOP_MAX))
829
    begin
830
      $display ("*** test master %h - Bus didn't get DEVSEL during Master ref, at %t",
831
                  test_device_id[2:0], $time);
832
      error_detected <= ~error_detected;
833
    end
834
    `NO_ELSE;
835
`endif // NORMAL_PCI_CHECKS
836
  end
837
endtask
838
 
839
// Linger until TRDY or STOP are asserted.
840
// Tasks can't have local storage!  have to be module global
841
  integer iiii;
842
task Linger_Until_Target_Waitstates_Done;
843
  input   drive_ad_bus;
844
  input  [PCI_BUS_DATA_RANGE:0] master_write_data;
845
  input  [PCI_BUS_CBE_RANGE:0] master_mask_l;
846
  input   do_master_terminate;
847
  begin
848
    for (iiii = 0; iiii < TEST_MASTER_SPINLOOP_MAX; iiii = iiii + 1)
849
    begin
850
      if (~trdy_now & ~stop_now)  // stick in master wait states
851
      begin
852
        master_ad_out[PCI_BUS_DATA_RANGE:0] <= master_write_data[PCI_BUS_DATA_RANGE:0];
853
        master_ad_oe <= drive_ad_bus;
854
        master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= master_mask_l[PCI_BUS_CBE_RANGE:0];
855
        master_cbe_oe <= 1'b1;
856
        master_debug_force_bad_par <= hold_master_data_par_err;
857
        master_got_master_abort <= 1'b0;
858
        master_got_target_abort <= 1'b0;
859
        master_got_target_retry <= 1'b0;
860
        master_perr_check_next <= ~drive_ad_bus;
861
        Assert_Master_Continue_Or_Terminate (do_master_terminate);
862
        Clock_Wait_Unless_Reset;  // wait for outputs to settle
863
      end
864
      else
865
      begin
866
        iiii = TEST_MASTER_SPINLOOP_MAX + 1;  // break
867
      end
868
    end
869
`ifdef NORMAL_PCI_CHECKS
870
    if (~pci_reset_comb & (iiii == TEST_MASTER_SPINLOOP_MAX))
871
    begin
872
      $display ("*** test master %h - Bus didn't get DEVSEL during Master ref, at %t",
873
                  test_device_id[2:0], $time);
874
      error_detected <= ~error_detected;
875
    end
876
    `NO_ELSE;
877
`endif // NORMAL_PCI_CHECKS
878
  end
879
endtask
880
 
881
// Transfer a word with or without target termination, and act on Master Termination
882
// This task MIGHT be entered when DEVSEL is Deasserted and STOP is Asserted!
883
// Handle this Target Abort if it occurs.
884
task Execute_Master_Ref_Undrive_All_In_Any_Termination_Unless_Fast_B2B;
885
  input   drive_ad_bus;
886
  input   watching_for_master_abort;
887
  input   do_master_terminate;
888
  input   enable_fast_back_to_back;
889
  input  [PCI_BUS_DATA_RANGE:0] master_write_data;
890
  input  [PCI_BUS_CBE_RANGE:0] master_mask_l;
891
  output [PCI_BUS_DATA_RANGE:0] target_read_data;
892
  output  got_master_abort, got_target_retry, got_target_stop, got_target_abort;
893
  output  want_fast_back_to_back;
894
  begin
895
    if (~devsel_now & stop_now)
896
    begin  // Target Abort.
897
      got_master_abort = 1'b0;
898
      got_target_retry = 1'b0; got_target_stop = 1'b0; got_target_abort = 1'b1;
899
      do_master_terminate = 1'b0;  // force clean termination activity as if master abort
900
    end
901
    else
902
    begin
903
      master_ad_out[PCI_BUS_DATA_RANGE:0] <= master_write_data[PCI_BUS_DATA_RANGE:0];
904
      master_ad_oe <= drive_ad_bus;
905
      master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= master_mask_l[PCI_BUS_CBE_RANGE:0];
906
      master_cbe_oe <= 1'b1;
907
      master_debug_force_bad_par <= hold_master_data_par_err;
908
      master_got_master_abort <= 1'b0;
909
      master_got_target_abort <= 1'b0;
910
      master_got_target_retry <= 1'b0;
911
      master_perr_check_next <= ~drive_ad_bus;
912
      Assert_Master_Continue_Or_Terminate (do_master_terminate);
913
      Inc_Master_Abort_Counter;
914
      Clock_Wait_Unless_Reset;  // wait for outputs to settle
915
      if (watching_for_master_abort)
916
      begin
917
        Linger_Until_DEVSEL_Or_Master_Abort_Or_Target_Abort (drive_ad_bus,
918
                                      master_write_data[PCI_BUS_DATA_RANGE:0],
919
                                      master_mask_l[PCI_BUS_CBE_RANGE:0],
920
                                      do_master_terminate, got_master_abort);
921
      end
922
      else
923
      begin
924
        got_master_abort = 1'b0;
925
      end
926
      if (got_master_abort)
927
      begin
928
        got_target_retry = 1'b0; got_target_stop = 1'b0; got_target_abort = 1'b0;
929
      end
930
      else
931
      begin
932
        Linger_Until_Target_Waitstates_Done (drive_ad_bus,
933
                                           master_write_data[PCI_BUS_DATA_RANGE:0],
934
                                           master_mask_l[PCI_BUS_CBE_RANGE:0],
935
                                           do_master_terminate);
936
        target_read_data[PCI_BUS_DATA_RANGE:0] = ad_now[PCI_BUS_DATA_RANGE:0];  // unconditionally grab.
937
        if (~devsel_now & stop_now)
938
        begin
939
          got_target_retry = 1'b0; got_target_stop = 1'b0; got_target_abort = 1'b1;
940
        end
941
        else if (devsel_now & trdy_now & stop_now)
942
        begin
943
          got_target_retry = 1'b0; got_target_stop = 1'b1; got_target_abort = 1'b0;
944
        end
945
        else if (devsel_now & ~trdy_now & stop_now)
946
        begin
947
          got_target_retry = 1'b1; got_target_stop = 1'b0; got_target_abort = 1'b0;
948
        end
949
        else if (devsel_now & trdy_now & ~stop_now)
950
        begin
951
          got_target_retry = 1'b0; got_target_stop = 1'b0; got_target_abort = 1'b0;
952
        end
953
        else
954
        begin
955
          if (~pci_reset_comb)
956
          begin
957
            $display ("*** test %h - Master got unexpected Target Handshake Signals, at %t",
958
                        test_device_id[2:0], $time);
959
            error_detected <= ~error_detected;
960
          end
961
          `NO_ELSE;
962
          got_target_retry = 1'b0; got_target_stop = 1'b0; got_target_abort = 1'b1;
963
        end
964
      end
965
    end
966
    if ((got_master_abort | got_target_retry | got_target_stop | got_target_abort)
967
          & ~do_master_terminate)  // If not do_master_terminate, FRAME still asserted
968
    begin  // turn-around cycle on FRAME
969
      master_ad_out[PCI_BUS_DATA_RANGE:0] <= master_write_data[PCI_BUS_DATA_RANGE:0];
970
      master_ad_oe <= drive_ad_bus;
971
      master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= master_mask_l[PCI_BUS_CBE_RANGE:0];
972
      master_cbe_oe <= 1'b1;
973
      master_debug_force_bad_par <= hold_master_data_par_err;
974
      master_got_master_abort <= 1'b0;
975
      master_got_target_abort <= 1'b0;
976
      master_got_target_retry <= 1'b0;
977
      master_perr_check_next <= ~drive_ad_bus;
978
      Deassert_FRAME;  // do the work that master_terminate would have already done
979
      Assert_IRDY;
980
      Clock_Wait_Unless_Reset;  // wait for outputs to settle
981
    end
982
    if (got_master_abort | got_target_retry | got_target_stop | got_target_abort
983
         | do_master_terminate)  // If do_master_terminate, FRAME already deasserted
984
    begin
985
// If doing immediate Address phase due to fast back-to-back, don't drive bus here
986
// Extremely subtle point.
987
// Cannot do a fast back-to-back transfer if Address Lines are being stepped!
988
// Fast-Back-To-Back only works if the device is able to grab the bus the next cycle.
989
// It must do this because the PCI Arbiter thinks the bus is busy, and might grant
990
//   mastership to another party without a wait state assuming that an idle state
991
//   must be inserted by the present device before it re-drives the bus.
992
// The other party will drive the bus the next clock if it does NOT see FRAME
993
//   asserted now.  Frame will always be delayed by address-stepping devices.
994
// See the PCI Local Bus Spec Revision 2.2 section 3.4.1 and 3.4.2.
995
//   no fast B2B if master or target abort, to give time to report error to Config Reg
996
      if (~got_master_abort & ~got_target_abort
997
             & master_gnt_now & enable_fast_back_to_back & master_fast_b2b_en
998
             & This_Master_Drove_The_AD_Bus_The_Last_Clock
999
             & test_start & (test_master_number[2:0] == test_device_id[2:0])
1000
             & (   (test_command[3:0] != PCI_COMMAND_CONFIG_READ)
1001
                 & (test_command[3:0] != PCI_COMMAND_CONFIG_WRITE) ) )
1002
      begin
1003
        want_fast_back_to_back = 1'b1;
1004
// No clock here to let the next command dispatch quickly.  The dispatcher has a wait
1005
      end
1006
      else
1007
      begin
1008
// Otherwise enforce an idle state
1009
        master_ad_out[PCI_BUS_DATA_RANGE:0] <= `BUS_IMPOSSIBLE_VALUE;
1010
        master_ad_oe <= 1'b0;
1011
        master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= PCI_COMMAND_RESERVED_READ_4;  // easy to see
1012
        master_cbe_oe <= 1'b0;
1013
        master_debug_force_bad_par <= 1'b0;
1014
        master_got_master_abort <= got_master_abort;
1015
        master_got_target_abort <= got_target_abort;
1016
        master_got_target_retry <= got_target_retry;
1017
        master_perr_check_next <= 1'b0;
1018
        Deassert_FRAME;
1019
        Deassert_IRDY;
1020
        want_fast_back_to_back = 1'b0;
1021
      end
1022
    end
1023
    else
1024
    begin
1025
      want_fast_back_to_back = 1'b0;
1026
    end
1027
  end
1028
endtask
1029
 
1030
parameter TEST_MASTER_DOING_CONFIG_READ  = 3'b000;
1031
parameter TEST_MASTER_DOING_CONFIG_WRITE = 3'b001;
1032
parameter TEST_MASTER_DOING_MEM_READ     = 3'b010;
1033
parameter TEST_MASTER_DOING_MEM_WRITE    = 3'b011;
1034
parameter TEST_MASTER_DOING_MEM_READ_LN  = 3'b100; // Added by Tadej M., 06.12.2001
1035
parameter TEST_MASTER_DOING_MEM_READ_MUL = 3'b110; // Added by Tadej M., 06.12.2001
1036
 
1037
task Report_On_Master_PCI_Ref_Start;
1038
  input  [2:0] reference_type;
1039
  begin
1040
    case (reference_type[2:0])
1041
    TEST_MASTER_DOING_CONFIG_READ:
1042
      $display (" test master %h - Starting Config Read, at %t",
1043
                    test_device_id[2:0], $time);
1044
    TEST_MASTER_DOING_CONFIG_WRITE:
1045
      $display (" test master %h - Starting Config Write, at %t",
1046
                    test_device_id[2:0], $time);
1047
    TEST_MASTER_DOING_MEM_READ:
1048
      $display (" test master %h - Starting Memory Read, at %t",
1049
                    test_device_id[2:0], $time);
1050
    TEST_MASTER_DOING_MEM_WRITE:
1051
      $display (" test master %h - Starting Memory Write, at %t",
1052
                    test_device_id[2:0], $time);
1053
    TEST_MASTER_DOING_MEM_READ_LN:
1054
      $display (" test master %h - Starting Memory Read Line, at %t",
1055
                    test_device_id[2:0], $time);
1056
    TEST_MASTER_DOING_MEM_READ_MUL:
1057
      $display (" test master %h - Starting Memory Read Line Multiple, at %t",
1058
                    test_device_id[2:0], $time);
1059
    default:
1060
      $display (" test master %h - Doing Unknown Reference, at %t",
1061
                    test_device_id[2:0], $time);
1062
    endcase
1063
`ifdef VERBOSE_TEST_DEVICE
1064
    Report_Master_Reference_Paramaters;
1065
`endif // VERBOSE_TEST_DEVICE
1066
  end
1067
endtask
1068
 
1069
task Report_On_Master_PCI_Ref_Finish;
1070
  input   got_master_abort;
1071
  input   got_target_abort;
1072
  input   got_target_retry;
1073
  input   got_target_stop;
1074
  input  [9:0] words_transferred;
1075
  begin
1076
    if (got_master_abort)
1077
    begin
1078
      $display (" test master %h - Got Master Abort, at %t",
1079
                    test_device_id[2:0], $time);
1080
    end
1081
    `NO_ELSE;
1082
    if (got_target_abort)
1083
    begin
1084
      $display (" test master %h - Got Target Abort, at %t",
1085
                    test_device_id[2:0], $time);
1086
    end
1087
    `NO_ELSE;
1088
    if (got_target_retry)
1089
    begin
1090
      $display (" test master %h - Got Target Retry, at %t",
1091
                    test_device_id[2:0], $time);
1092
    end
1093
    `NO_ELSE;
1094
    if (got_target_stop)
1095
    begin
1096
      $display (" test master %h - Got Target Stop, at %t",
1097
                    test_device_id[2:0], $time);
1098
    end
1099
    `NO_ELSE;
1100
    if (~got_master_abort & ~got_target_abort & ~got_target_retry & ~got_target_stop)
1101
    begin
1102
      $display (" test master %h - Normal Success, at %t",
1103
                    test_device_id[2:0], $time);
1104
    end
1105
    `NO_ELSE;
1106
    if (words_transferred != 10'h0)
1107
    begin
1108
      $display (" test master %h - Transferred %h words, at %t",
1109
                    test_device_id[2:0], words_transferred[9:0], $time);
1110
    end
1111
    `NO_ELSE;
1112
  end
1113
endtask
1114
 
1115
// Tasks can't have local storage!  have to be module global
1116
  reg     step_address;
1117
  reg    [3:0] wait_states_this_time;
1118
  reg    [9:0] words_transferred;
1119
  reg     drive_ad_bus, watching_for_master_abort, do_master_terminate_this_time;
1120
  reg    [PCI_BUS_DATA_RANGE:0] target_read_data;
1121
  reg    [PCI_BUS_DATA_RANGE:0] master_write_data;
1122
  reg    [PCI_BUS_CBE_RANGE:0] master_mask_l;
1123
  reg    [PCI_BUS_DATA_RANGE:0] master_write_data_next;
1124
  reg    [PCI_BUS_CBE_RANGE:0] master_mask_l_next;
1125
  reg     got_master_abort, got_target_retry, got_target_stop, got_target_abort;
1126
  reg     got_master_terminate;
1127
task Execute_Master_PCI_Ref;
1128
  input  [2:0] reference_type;
1129
  output  want_fast_back_to_back;
1130
  begin
1131
    Master_Req_Bus;
1132
    if (   (reference_type[2:0] == TEST_MASTER_DOING_CONFIG_READ)
1133
         | (reference_type[2:0] == TEST_MASTER_DOING_CONFIG_WRITE) )
1134
    begin
1135
      step_address = TEST_MASTER_STEP_ADDRESS;
1136
    end
1137
    else
1138
    begin
1139
      step_address = TEST_MASTER_IMMEDIATE_ADDRESS;
1140
    end
1141
    Master_Assert_Address (modified_master_address[PCI_BUS_DATA_RANGE:0],
1142
                     hold_master_command[PCI_BUS_CBE_RANGE:0],
1143
                     step_address, hold_master_fast_b2b, hold_master_addr_par_err);
1144
    Master_Unreq_Bus;  // After FRAME is asserted!
1145
`ifdef REPORT_TEST_DEVICE
1146
// Do Report after Address to let the time of the report line up with the bus event.
1147
    Report_On_Master_PCI_Ref_Start (reference_type[2:0]);
1148
`endif // REPORT_TEST_DEVICE
1149
    drive_ad_bus = (reference_type[2:0] == TEST_MASTER_DOING_CONFIG_WRITE)
1150
                 | (reference_type[2:0] == TEST_MASTER_DOING_MEM_WRITE);
1151
    words_transferred = 9'h0;
1152
    wait_states_this_time = hold_master_initial_waitstates[3:0];
1153
    do_master_terminate_this_time =
1154
                 ((words_transferred[9:0] + 4'h1) == hold_master_size[9:0]);
1155
    watching_for_master_abort = 1'b1;
1156
    master_write_data[PCI_BUS_DATA_RANGE:0] = hold_master_data[PCI_BUS_DATA_RANGE:0];
1157
    master_mask_l[PCI_BUS_CBE_RANGE:0] = hold_master_byte_enables_l[PCI_BUS_CBE_RANGE:0];
1158
    got_master_abort = 1'b0;
1159
    got_target_retry = 1'b0;
1160
    got_target_stop = 1'b0;
1161
    got_target_abort = 1'b0;
1162
    got_master_terminate = 1'b0;
1163
    while (   ~got_master_abort & ~got_target_retry & ~got_target_stop
1164
            & ~got_target_abort & ~got_master_terminate)
1165
    begin
1166
      Execute_Master_Waitstates_But_Quit_On_Target_Abort (drive_ad_bus,
1167
                           master_mask_l[3:0], wait_states_this_time[3:0]);
1168
      Execute_Master_Ref_Undrive_All_In_Any_Termination_Unless_Fast_B2B (drive_ad_bus,
1169
                            watching_for_master_abort, do_master_terminate_this_time,
1170
                            hold_master_fast_b2b, master_write_data[PCI_BUS_DATA_RANGE:0],
1171
                            master_mask_l[PCI_BUS_CBE_RANGE:0],
1172
                            target_read_data[PCI_BUS_DATA_RANGE:0],
1173
                            got_master_abort, got_target_retry,
1174
                            got_target_stop, got_target_abort,
1175
                            want_fast_back_to_back);
1176
      got_master_terminate = do_master_terminate_this_time;
1177
      if (~got_master_abort & ~got_target_retry & ~got_target_abort)
1178
      begin
1179
        if (~drive_ad_bus)
1180
        begin
1181
          if ( master_check_received_data )
1182
              Compare_Read_Data_With_Expected_Data (target_read_data[PCI_BUS_DATA_RANGE:0],
1183
                                                master_write_data[PCI_BUS_DATA_RANGE:0],
1184
                                                master_mask_l[PCI_BUS_CBE_RANGE:0]);
1185
 
1186
          master_received_data = target_read_data ;
1187
          master_received_data_valid <= ~master_received_data_valid ;
1188
        end
1189
        `NO_ELSE;
1190
        wait_states_this_time = hold_master_subsequent_waitstates[3:0];
1191
        words_transferred = words_transferred + 10'b1;
1192
        do_master_terminate_this_time =
1193
                        ((words_transferred[9:0] + 4'h1) == hold_master_size[9:0]);
1194
        watching_for_master_abort = 1'b0;
1195
        Update_Write_Data (master_write_data[PCI_BUS_DATA_RANGE:0],
1196
                           master_mask_l[PCI_BUS_CBE_RANGE:0],
1197
                           master_write_data_next[PCI_BUS_DATA_RANGE:0],
1198
                           master_mask_l_next[PCI_BUS_CBE_RANGE:0]);
1199
        master_write_data[PCI_BUS_DATA_RANGE:0] = master_write_data_next[PCI_BUS_DATA_RANGE:0];
1200
        master_mask_l[PCI_BUS_CBE_RANGE:0] = master_mask_l_next[PCI_BUS_CBE_RANGE:0];
1201
      end
1202
      `NO_ELSE;
1203
    end
1204
`ifdef NORMAL_PCI_CHECKS
1205
    Check_Master_Burst_Termination_Cause (got_master_abort, got_master_terminate,
1206
                    got_target_retry, got_target_stop, got_target_abort,
1207
                    words_transferred[9:0]);
1208
`endif // NORMAL_PCI_CHECKS
1209
`ifdef VERBOSE_TEST_DEVICE
1210
    Report_On_Master_PCI_Ref_Finish (got_master_abort, got_target_abort,
1211
                                     got_target_retry, got_target_stop,
1212
                                     words_transferred[9:0]);
1213
`endif // VERBOSE_TEST_DEVICE
1214
  end
1215
endtask
1216
 
1217
// Task to print debug info
1218
// NOTE This must change if bit allocation changes
1219
task Report_Master_Reference_Paramaters;
1220
  begin
1221
    if (hold_master_address[23:9] != 15'h0000)
1222
    begin
1223
// hold_master_address, hold_master_command, hold_master_data,
1224
// hold_master_byte_enables_l, hold_master_size
1225
      $display ("  First Master Data Wait States %h, Subsequent Master Data Wait States %h",
1226
            hold_master_initial_waitstates[3:0],
1227
            hold_master_subsequent_waitstates[3:0]);
1228
      $display ("  Master Fast B-to_B En %h, Expect Master Abort %h",
1229
            hold_master_fast_b2b, hold_master_expect_master_abort);
1230
      $display ("  Target Devsel Speed %h, Target Termination %h,",
1231
            hold_master_target_devsel_speed[1:0],
1232
            hold_master_target_termination[2:0]);
1233
      $display ("  First Target Data Wait States %h, Subsequent Target Data Wait States %h",
1234
            hold_master_target_initial_waitstates[3:0],
1235
            hold_master_target_subsequent_waitstates[3:0]);
1236
      $display ("  Addr Par Error %h, Data Par Error %h",
1237
            hold_master_addr_par_err, hold_master_data_par_err);
1238
    end
1239
    `NO_ELSE;
1240
  end
1241
endtask
1242
 
1243
task Complain_That_Test_Not_Written;
1244
  output  want_fast_back_to_back;
1245
  begin
1246
    $display ("*** test master %h - Diag not written yet: 'h%x, at %t",
1247
                test_device_id[2:0], hold_master_command[3:0], $time);
1248
    error_detected <= ~error_detected;
1249
    master_ad_out[PCI_BUS_DATA_RANGE:0] <= `BUS_IMPOSSIBLE_VALUE;
1250
    master_ad_oe <= 1'b0;
1251
    master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= PCI_COMMAND_RESERVED_READ_4;  // easy to see
1252
    master_cbe_oe <= 1'b0;
1253
    master_debug_force_bad_par <= 1'b0;
1254
    master_got_master_abort <= 1'b0;
1255
    master_got_target_abort <= 1'b0;
1256
    master_got_target_retry <= 1'b0;
1257
    master_perr_check_next <= 1'b0;
1258
    Deassert_FRAME;
1259
    Deassert_IRDY;
1260
    Clock_Wait_Unless_Reset;  // wait for outputs to settle
1261
    Indicate_Done;  // indicate done as early as possible, while still after start
1262
    want_fast_back_to_back = 1'b0;
1263
  end
1264
endtask
1265
 
1266
task Reset_Master_To_Idle;
1267
  begin
1268
    master_req_out <= 1'b0;
1269
    master_ad_out[PCI_BUS_DATA_RANGE:0]   <= `PCI_BUS_DATA_ZERO;
1270
    master_ad_oe <= 1'b0;
1271
    master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= `PCI_BUS_CBE_ZERO;
1272
    master_cbe_oe <= 1'b0;
1273
    master_frame_out <= 1'b0;      master_irdy_out <= 1'b0;
1274
    master_got_master_abort <= 1'b0;
1275
    master_got_target_abort <= 1'b0;
1276
    master_got_target_retry <= 1'b0;
1277
    master_perr_check_next <= 1'b0;
1278
    test_accepted_next <= 1'b0;
1279
  end
1280
endtask
1281
 
1282
// We want the Target to do certain behavior to let us test the interface.
1283
// We will use Address Bits to encode Target Wait State, Target Completion,
1284
//   and Target Error info.
1285
//
1286
// Our Test Chips will use an 8-Bit Base Address Register, which
1287
//   will result in a 16 MByte memory map for each BAR.
1288
// Our Targets only have 256 bytes of SRAM.  That leaves 16 Address
1289
//   Bits to play with.
1290
// Allocate Address Bits to mean the following:
1291
// Bit  [23]    When 1, the Target acts upon the fancy encoded info below
1292
// Bits [22:19] Target Wait States for First Data Item
1293
// Bits [18:15] Target Wait States for Subsequent Data Items
1294
// Bits [14:12] What sort of Target Termination to make
1295
// Bits [11:10] Devsel Speed
1296
// Bit  [9]     Whether to make or expect a Data Parity Error
1297
// Bit  [8]     Whether to expect an Address Parity Error
1298
 
1299
// fire off Master tasks in response to top-level testbench
1300
  reg     want_fast_back_to_back;
1301
  always @(posedge pci_ext_clk or posedge pci_reset_comb)
1302
  begin
1303
    if (  ~pci_reset_comb & test_start
1304
        & (test_master_number[2:0] == test_device_id[2:0]))
1305
    begin
1306
      want_fast_back_to_back = 1'b1;
1307
      while (want_fast_back_to_back)
1308
      begin
1309
        Indicate_Start;
1310
// Grab address and data in case it takes a while to get bus mastership
1311
// Intentionally use "=" assignment so these variables are available to tasks
1312
        hold_master_address[23:9] = test_address[23:9];
1313
        hold_master_command[3:0] = test_command[3:0];
1314
        hold_master_data[PCI_BUS_DATA_RANGE:0] = test_data[PCI_BUS_DATA_RANGE:0];
1315
        hold_master_byte_enables_l[PCI_BUS_CBE_RANGE:0] =
1316
                                      test_byte_enables_l[PCI_BUS_CBE_RANGE:0];
1317
        hold_master_size[9:0] = test_size[9:0];
1318
        hold_master_addr_par_err = test_make_addr_par_error;
1319
        hold_master_data_par_err = test_make_data_par_error;
1320
        hold_master_initial_waitstates[3:0] = test_master_initial_wait_states[3:0];
1321
        hold_master_subsequent_waitstates[3:0] = test_master_subsequent_wait_states[3:0];
1322
        hold_master_target_initial_waitstates[3:0] = test_target_initial_wait_states[3:0];
1323
        hold_master_target_subsequent_waitstates[3:0] = test_target_subsequent_wait_states[3:0];
1324
        hold_master_target_devsel_speed[1:0] = test_target_devsel_speed[1:0];
1325
        hold_master_fast_b2b = test_fast_back_to_back;
1326
        hold_master_target_termination[2:0] = test_target_termination[2:0];
1327
        hold_master_expect_master_abort = test_expect_master_abort;
1328
        if (hold_master_size[9:0] == 0)  // This means read causing delayed read
1329
        begin
1330
          hold_master_size = 1;
1331
          hold_master_target_termination = `Test_Target_Retry_Before_First;
1332
        end
1333
        `NO_ELSE;
1334
        // changed by Miha D. - no need for encoded addresses
1335
        modified_master_address = test_address ;
1336
        /*
1337
        modified_master_address[31:24] = test_address[31:24];
1338
        modified_master_address[`TARGET_ENCODED_PARAMATERS_ENABLE] = 1'b1;
1339
        modified_master_address[`TARGET_ENCODED_INIT_WAITSTATES] =
1340
                                          test_target_initial_wait_states[3:0];
1341
        modified_master_address[`TARGET_ENCODED_SUBS_WAITSTATES] =
1342
                                          test_target_subsequent_wait_states[3:0];
1343
        modified_master_address[`TARGET_ENCODED_TERMINATION]  =
1344
                                          test_target_termination[2:0];
1345
        modified_master_address[`TARGET_ENCODED_DEVSEL_SPEED] =
1346
                                          test_target_devsel_speed[1:0];
1347
        modified_master_address[`TARGET_ENCODED_DATA_PAR_ERR] =
1348
                                          test_make_data_par_error;
1349
        modified_master_address[`TARGET_ENCODED_ADDR_PAR_ERR] =
1350
                                          test_make_addr_par_error;
1351
        modified_master_address[7:0] = test_address[7:0];
1352
        */
1353
        case (test_command[3:0])
1354
        PCI_COMMAND_INTERRUPT_ACKNOWLEDGE:
1355
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1356
        PCI_COMMAND_SPECIAL_CYCLE:
1357
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1358
        PCI_COMMAND_IO_READ:
1359
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_MEM_READ,
1360
                                             want_fast_back_to_back);
1361
        PCI_COMMAND_IO_WRITE:
1362
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_MEM_WRITE,
1363
                                             want_fast_back_to_back);
1364
        PCI_COMMAND_RESERVED_READ_4:
1365
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1366
        PCI_COMMAND_RESERVED_WRITE_5:
1367
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1368
        PCI_COMMAND_MEMORY_READ:
1369
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_MEM_READ,
1370
                                             want_fast_back_to_back);
1371
        PCI_COMMAND_MEMORY_WRITE:
1372
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_MEM_WRITE,
1373
                                             want_fast_back_to_back);
1374
        PCI_COMMAND_RESERVED_READ_8:
1375
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1376
        PCI_COMMAND_RESERVED_WRITE_9:
1377
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1378
        PCI_COMMAND_CONFIG_READ:
1379
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_CONFIG_READ,
1380
                                             want_fast_back_to_back);
1381
        PCI_COMMAND_CONFIG_WRITE:
1382
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_CONFIG_WRITE,
1383
                                             want_fast_back_to_back);
1384
        PCI_COMMAND_MEMORY_READ_MULTIPLE: // Added by Tadej M., 06.12.2001
1385
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_MEM_READ_MUL,
1386
                                             want_fast_back_to_back);
1387
//          Complain_That_Test_Not_Written (want_fast_back_to_back);
1388
        PCI_COMMAND_DUAL_ADDRESS_CYCLE:
1389
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1390
        PCI_COMMAND_MEMORY_READ_LINE: // Added by Tadej M., 06.12.2001
1391
          Execute_Master_PCI_Ref (TEST_MASTER_DOING_MEM_READ_LN,
1392
                                             want_fast_back_to_back);
1393
//          Complain_That_Test_Not_Written (want_fast_back_to_back);
1394
        PCI_COMMAND_MEMORY_WRITE_INVALIDATE:
1395
          Complain_That_Test_Not_Written (want_fast_back_to_back);
1396
        default:
1397
          begin
1398
            $display ("*** test master %h - Unknown External Device Activity 'h%x, at %t",
1399
                        test_device_id[2:0], test_command, $time);
1400
            error_detected <= ~error_detected;
1401
          end
1402
        endcase
1403
        if (pci_reset_comb)
1404
        begin
1405
          want_fast_back_to_back = 1'b0;
1406
        end
1407
        `NO_ELSE;
1408
      end
1409
    end // while want_fast_back_to_back
1410
    else if (~frame_now & ~irdy_now & master_gnt_now)
1411
    begin  // park bus
1412
      master_ad_out[PCI_BUS_DATA_RANGE:0] <= `BUS_PARK_VALUE;
1413
      master_ad_oe <= 1'b1;
1414
      master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= PCI_COMMAND_RESERVED_READ_4;
1415
      master_cbe_oe <= 1'b1;
1416
    end
1417
    else
1418
    begin  // unpark if grant is removed
1419
      master_ad_out[PCI_BUS_DATA_RANGE:0] <= `BUS_IMPOSSIBLE_VALUE;
1420
      master_ad_oe <= 1'b0;
1421
      master_cbe_l_out[PCI_BUS_CBE_RANGE:0] <= PCI_COMMAND_RESERVED_READ_4;
1422
      master_cbe_oe <= 1'b0;
1423
    end
1424
// NOTE WORKING need to handle master_got_target_retry here
1425
 
1426
// Because this is sequential code, have to reset all regs if the above falls
1427
//   through due to a reset.  This would not be needed in synthesizable code.
1428
    if (pci_reset_comb)
1429
    begin
1430
      Reset_Master_To_Idle;
1431
    end
1432
    `NO_ELSE;
1433
  end
1434
endmodule
1435
 

powered by: WebSVN 2.1.0

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