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 82

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

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

powered by: WebSVN 2.1.0

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