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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_00/] [bench/] [verilog/] [pci_behaviorial_device.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_device.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 top-level PCI Behaviorial interface.  This module instantiates
7
//           a number of behaviorial IO pads and a behaviorial PCI Master
8
//           and behaviorial PCI Target.  Not much going on here.
9
//
10
// This library is free software; you can distribute it and/or modify it
11
// under the terms of the GNU Lesser General Public License as published
12
// by the Free Software Foundation; either version 2.1 of the License, or
13
// (at your option) any later version.
14
//
15
// This library is distributed in the hope that it will be useful, but
16
// WITHOUT ANY WARRANTY; without even the implied warranty of
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18
// See the GNU Lesser General Public License for more details.
19
//
20
// You should have received a copy of the GNU Lesser General Public License
21
// along with this library.  If not, write to
22
// Free Software Foundation, Inc.
23
// 59 Temple Place, Suite 330
24
// Boston, MA 02111-1307 USA
25
//
26
// Author's note about this license:  The intention of the Author and of
27
// the Gnu Lesser General Public License is that users should be able to
28
// use this code for any purpose, including combining it with other source
29
// code, combining it with other logic, translated it into a gate-level
30
// representation, or projected it into gates in a programmable or
31
// hardwired chip, as long as the users of the resulting source, compiled
32
// source, or chip are given the means to get a copy of this source code
33
// with no new restrictions on redistribution of this source.
34
//
35
// If you make changes, even substantial changes, to this code, or use
36
// substantial parts of this code as an inseparable part of another work
37
// of authorship, the users of the resulting IP must be given the means
38
// to get a copy of the modified or combined source code, with no new
39
// restrictions on redistribution of the resulting source.
40
//
41
// Separate parts of the combined source code, compiled code, or chip,
42
// which are NOT derived from this source code do NOT need to be offered
43
// to the final user of the chip merely because they are used in
44
// combination with this code.  Other code is not forced to fall under
45
// the GNU Lesser General Public License when it is linked to this code.
46
// The license terms of other source code linked to this code might require
47
// that it NOT be made available to users.  The GNU Lesser General Public
48
// License does not prevent this code from being used in such a situation,
49
// as long as the user of the resulting IP is given the means to get a
50
// copy of this component of the IP with no new restrictions on
51
// redistribution of this source.
52
//
53
// This code was developed using VeriLogger Pro, by Synapticad.
54
// Their support is greatly appreciated.
55
//
56
// NOTE:  This Test Chip instantiates one PCI interface and connects it
57
//        to its IO pads and to logic representing a real application.
58
//
59
// NOTE:  Needs to be improved to allow back-to-back transfers from
60
//        the same Master.  I think the request is being held off
61
//        too long!  But it might also be fast-back-to-back.
62
//
63
//===========================================================================
64
 
65
`timescale 1ns/1ps
66
 
67
module pci_behaviorial_device (
68
  pci_ext_ad, pci_ext_cbe_l, pci_ext_par,
69
  pci_ext_frame_l, pci_ext_irdy_l,
70
  pci_ext_devsel_l, pci_ext_trdy_l, pci_ext_stop_l,
71
  pci_ext_perr_l, pci_ext_serr_l,
72
  pci_ext_idsel,
73
  pci_ext_inta_l,
74
  pci_ext_req_l, pci_ext_gnt_l,
75
  pci_ext_reset_l, pci_ext_clk,
76
// Signals used by the test bench instead of using "." notation
77
  test_observe_oe_sigs,
78
  test_master_number, test_address, test_command,
79
  test_data, test_byte_enables_l, test_size,
80
  test_make_addr_par_error, test_make_data_par_error,
81
  test_master_initial_wait_states, test_master_subsequent_wait_states,
82
  test_target_initial_wait_states, test_target_subsequent_wait_states,
83
  test_target_devsel_speed, test_fast_back_to_back,
84
  test_target_termination,
85
  test_expect_master_abort,
86
  test_start, test_accepted_l, test_error_event,
87
  test_device_id,
88
  test_target_response,
89
 
90
  master_received_data,
91
  master_received_data_valid,
92
  master_check_received_data
93
);
94
 
95
`include "pci_blue_options.vh"
96
`include "pci_blue_constants.vh"
97
 
98
  inout  [PCI_BUS_DATA_RANGE:0] pci_ext_ad;
99
  inout  [PCI_BUS_CBE_RANGE:0] pci_ext_cbe_l;
100
  inout   pci_ext_par;
101
  inout   pci_ext_frame_l, pci_ext_irdy_l;
102
  inout   pci_ext_devsel_l, pci_ext_trdy_l, pci_ext_stop_l;
103
  inout   pci_ext_perr_l, pci_ext_serr_l;
104
  input   pci_ext_idsel;
105
  inout   pci_ext_inta_l;
106
  output  pci_ext_req_l;
107
  input   pci_ext_gnt_l;
108
  input   pci_ext_reset_l, pci_ext_clk;
109
// Test wires to make it easier to understand who is driving the bus
110
  output [5:0] test_observe_oe_sigs;
111
  input  [2:0] test_master_number;
112
  input  [PCI_BUS_DATA_RANGE:0] test_address;
113
  input  [PCI_BUS_CBE_RANGE:0] test_command;
114
  input  [PCI_BUS_DATA_RANGE:0] test_data;
115
  input  [PCI_BUS_CBE_RANGE:0] test_byte_enables_l;
116
  input  [9:0] test_size;
117
  input   test_make_addr_par_error, test_make_data_par_error;
118
  input  [3:0] test_master_initial_wait_states;
119
  input  [3:0] test_master_subsequent_wait_states;
120
  input  [3:0] test_target_initial_wait_states;
121
  input  [3:0] test_target_subsequent_wait_states;
122
  input  [1:0] test_target_devsel_speed;
123
  input   test_fast_back_to_back;
124
  input  [2:0] test_target_termination;
125
  input   test_expect_master_abort;
126
  input   test_start;
127
  output  test_accepted_l;
128
  output  test_error_event;
129
  input  [2:0] test_device_id;
130
  input  [25:0] test_target_response ;
131
  output [PCI_BUS_DATA_RANGE:0] master_received_data ;
132
  output master_received_data_valid ;
133
  input  master_check_received_data ;
134
 
135
// Make temporary Bip every time an error is detected
136
  reg     test_error_event;
137
  initial test_error_event <= 1'bZ;
138
  wire    master_error_event, target_error_event;
139
  reg     error_detected;
140
  initial error_detected <= 1'b0;
141
  always @(error_detected or master_error_event or target_error_event)
142
  begin
143
    test_error_event <= 1'b0;
144
    #2;
145
    test_error_event <= 1'bZ;
146
  end
147
 
148
// Assign local variables to board-level signals
149
// NOTE:  all of these output pads are combinational, not clocked, on output
150
  wire pci_reset_comb = ~pci_ext_reset_l;
151
 
152
  wire    master_req;
153
  wire    master_req_dly1, master_req_dly2;
154
  assign #`PAD_MIN_DATA_DLY master_req_dly1 = master_req;
155
  assign #`PAD_MAX_DATA_DLY master_req_dly2 = master_req;
156
  assign  pci_ext_req_l = (master_req_dly1 !== master_req_dly2)
157
                        ? 1'bX : ~master_req_dly2;
158
 
159
  wire    master_gnt_now = ~pci_ext_gnt_l;
160
 
161
  wire   [PCI_BUS_DATA_RANGE:0] pci_ad_out;
162
  wire   [PCI_BUS_DATA_RANGE:0] pci_ad_out_dly1, pci_ad_out_dly2;
163
  assign #`PAD_MIN_DATA_DLY pci_ad_out_dly1[PCI_BUS_DATA_RANGE:0] = pci_ad_out[PCI_BUS_DATA_RANGE:0];
164
  assign #`PAD_MAX_DATA_DLY pci_ad_out_dly2[PCI_BUS_DATA_RANGE:0] = pci_ad_out[PCI_BUS_DATA_RANGE:0];
165
  wire    pci_ad_oe;
166
  wire    pci_ad_oe_dly1, pci_ad_oe_dly2;
167
  assign #`PAD_MIN_OE_DLY pci_ad_oe_dly1 = pci_ad_oe;
168
  assign #`PAD_MAX_OE_DLY pci_ad_oe_dly2 = pci_ad_oe;
169
  wire    force_ad_x = (pci_ad_oe_dly1 !== pci_ad_oe_dly2)
170
                     | (pci_ad_oe & (pci_ad_out_dly1 !== pci_ad_out_dly2));
171
  assign  pci_ext_ad[PCI_BUS_DATA_RANGE:0] = force_ad_x ? `PCI_BUS_DATA_X
172
                           : (pci_ad_oe_dly2
173
                           ? pci_ad_out_dly2[PCI_BUS_DATA_RANGE:0]
174
                           : `PCI_BUS_DATA_Z);
175
// NOTE ad_now must have a bypass from internal data in the synthesized design
176
  wire   [PCI_BUS_DATA_RANGE:0] ad_now = pci_ext_ad[PCI_BUS_DATA_RANGE:0];
177
  reg    [PCI_BUS_DATA_RANGE:0] ad_prev;
178
 
179
  wire   [PCI_BUS_CBE_RANGE:0] master_cbe_l_out;
180
  wire   [PCI_BUS_CBE_RANGE:0] master_cbe_l_dly1, master_cbe_l_dly2;
181
  assign #`PAD_MIN_DATA_DLY master_cbe_l_dly1[PCI_BUS_CBE_RANGE:0] = master_cbe_l_out[PCI_BUS_CBE_RANGE:0];
182
  assign #`PAD_MAX_DATA_DLY master_cbe_l_dly2[PCI_BUS_CBE_RANGE:0] = master_cbe_l_out[PCI_BUS_CBE_RANGE:0];
183
  wire    master_cbe_oe;
184
  wire    master_cbe_oe_dly1, master_cbe_oe_dly2;
185
  assign #`PAD_MIN_OE_DLY master_cbe_oe_dly1 = master_cbe_oe;
186
  assign #`PAD_MAX_OE_DLY master_cbe_oe_dly2 = master_cbe_oe;
187
  wire    force_cbe_x = (master_cbe_oe_dly1 !== master_cbe_oe_dly2)
188
                      | (master_cbe_oe & (master_cbe_l_dly1 !== master_cbe_l_dly2));
189
  assign  pci_ext_cbe_l[PCI_BUS_CBE_RANGE:0] = force_cbe_x ? `PCI_BUS_CBE_X
190
                             : (master_cbe_oe_dly2
191
                             ? master_cbe_l_dly2[PCI_BUS_CBE_RANGE:0]
192
                             : `PCI_BUS_CBE_Z);
193
// NOTE cbe_l_now must have a bypass from internal data in the synthesized design
194
  wire   [PCI_BUS_CBE_RANGE:0] cbe_l_now = pci_ext_cbe_l[PCI_BUS_CBE_RANGE:0];
195
  reg    [PCI_BUS_CBE_RANGE:0] cbe_l_prev;
196
  always @(posedge pci_ext_clk)
197
  begin
198
    ad_prev[PCI_BUS_DATA_RANGE:0] <= pci_ext_ad[PCI_BUS_DATA_RANGE:0];
199
    cbe_l_prev[PCI_BUS_CBE_RANGE:0] <= pci_ext_cbe_l[PCI_BUS_CBE_RANGE:0];
200
  end
201
 
202
  wire    idsel_now, idsel_prev, idsel_now_l, idsel_prev_l;
203
delayed_test_pad test_pad_idsel (
204
  .external_sig    (pci_ext_idsel),     .data_in_comb    (idsel_now_l),
205
  .data_in_prev    (idsel_prev_l),      .data_out_comb   (1'b0),
206
  .data_oe_comb    (1'b0),              .pci_ext_clk     (pci_ext_clk)
207
);
208
  assign  idsel_now = ~idsel_now_l;
209
  assign  idsel_prev = ~idsel_prev_l;
210
 
211
  reg     pci_par_out, pci_par_oe;
212
  wire    par_now, par_prev, par_now_l, par_prev_l;
213
delayed_test_pad test_pad_par (
214
  .external_sig    (pci_ext_par),       .data_in_comb    (par_now_l),
215
  .data_in_prev    (par_prev_l),        .data_out_comb   (pci_par_out),
216
  .data_oe_comb    (pci_par_oe),        .pci_ext_clk     (pci_ext_clk)
217
);
218
  assign  par_now = ~par_now_l;  // oups, want NON-inverted version of this
219
  assign  par_prev = ~par_prev_l;
220
 
221
  wire    master_frame_out, master_frame_oe;
222
  wire    frame_now, frame_prev;
223
delayed_test_pad test_pad_frame (
224
  .external_sig    (pci_ext_frame_l),   .data_in_comb    (frame_now),
225
  .data_in_prev    (frame_prev),        .data_out_comb   (~master_frame_out),
226
  .data_oe_comb    (master_frame_oe),   .pci_ext_clk     (pci_ext_clk)
227
);
228
 
229
  wire    master_irdy_out, master_irdy_oe;
230
  wire    irdy_now, irdy_prev;
231
delayed_test_pad test_pad_irdy (
232
  .external_sig    (pci_ext_irdy_l),    .data_in_comb    (irdy_now),
233
  .data_in_prev    (irdy_prev),         .data_out_comb   (~master_irdy_out),
234
  .data_oe_comb    (master_irdy_oe),    .pci_ext_clk     (pci_ext_clk)
235
);
236
 
237
  wire    target_devsel_out, target_d_t_s_oe;
238
  wire    devsel_now, devsel_prev;
239
delayed_test_pad test_pad_devsel (
240
  .external_sig    (pci_ext_devsel_l),  .data_in_comb    (devsel_now),
241
  .data_in_prev    (devsel_prev),       .data_out_comb  (~target_devsel_out),
242
  .data_oe_comb    (target_d_t_s_oe),   .pci_ext_clk     (pci_ext_clk)
243
);
244
 
245
  wire    target_trdy_out;  // shares target_d_t_s_oe
246
  wire    trdy_prev, trdy_now;
247
delayed_test_pad test_pad_trdy (
248
  .external_sig    (pci_ext_trdy_l),    .data_in_comb    (trdy_now),
249
  .data_in_prev    (trdy_prev),         .data_out_comb   (~target_trdy_out),
250
  .data_oe_comb    (target_d_t_s_oe),   .pci_ext_clk     (pci_ext_clk)
251
);
252
 
253
  wire    target_stop_out;  // shares target_d_t_s_oe
254
  wire    stop_now, stop_prev;
255
delayed_test_pad test_pad_stop (
256
  .external_sig    (pci_ext_stop_l),    .data_in_comb    (stop_now),
257
  .data_in_prev    (stop_prev),         .data_out_comb   (~target_stop_out),
258
  .data_oe_comb    (target_d_t_s_oe),   .pci_ext_clk     (pci_ext_clk)
259
);
260
 
261
  wire    pci_perr_out, pci_perr_oe;
262
  wire    perr_now, perr_prev;
263
delayed_test_pad test_pad_perr (
264
  .external_sig    (pci_ext_perr_l),    .data_in_comb    (perr_now),
265
  .data_in_prev    (perr_prev),         .data_out_comb   (~pci_perr_out),
266
  .data_oe_comb    (pci_perr_oe),       .pci_ext_clk     (pci_ext_clk)
267
);
268
 
269
  wire    pci_serr_oe;
270
  wire    serr_now, serr_prev;
271
delayed_test_pad test_pad_serr (
272
  .external_sig    (pci_ext_serr_l),    .data_in_comb    (serr_now),
273
  .data_in_prev    (serr_prev),         .data_out_comb   (1'b0),
274
  .data_oe_comb    (pci_serr_oe),       .pci_ext_clk     (pci_ext_clk)
275
);
276
 
277
// Make visible the internal OE signals.  This makes it MUCH easier to
278
//   see who is using the bus during simulation.
279
// OE Observation signals are
280
// {frame_oe, irdy_oe, devsel_t_s_oe, ad_oe, cbe_oe, perr_oe}
281
  assign  test_observe_oe_sigs[5:0] = {master_frame_oe, master_irdy_oe,
282
               target_d_t_s_oe, pci_ad_oe, master_cbe_oe, pci_perr_oe};
283
 
284
// Variables to give access to shared IO pins
285
  wire   [PCI_BUS_DATA_RANGE:0] master_ad_out;
286
  wire    master_par_out_next;
287
  wire    master_perr_out;
288
  wire    master_ad_oe, master_perr_oe, master_serr_oe;
289
  wire    master_debug_force_bad_par;
290
  wire   [PCI_BUS_DATA_RANGE:0] target_ad_out;
291
  wire    target_par_out_next;
292
  wire    target_perr_out;
293
  wire    target_ad_oe, target_perr_oe, target_serr_oe;
294
  wire    target_debug_force_bad_par;
295
 
296
// Shared Bus Wires which can be driven by the Master or the Target
297
  assign  pci_ad_out[PCI_BUS_DATA_RANGE:0] = master_ad_oe
298
                     ? master_ad_out[PCI_BUS_DATA_RANGE:0]
299
                     : (target_ad_oe
300
                     ? target_ad_out[PCI_BUS_DATA_RANGE:0]
301
                     : `PCI_BUS_DATA_X);
302
  assign  pci_ad_oe = master_ad_oe | target_ad_oe;
303
  always @(posedge pci_ext_clk or posedge pci_reset_comb)
304
  begin
305
    if (pci_reset_comb)
306
    begin
307
      pci_par_oe <= 1'b0;
308
    end
309
    else
310
    begin
311
      pci_par_oe <= master_ad_oe | target_ad_oe;
312
    end
313
  end
314
  assign  master_par_out_next = (^master_ad_out[PCI_BUS_DATA_RANGE:0])
315
                              ^ (^master_cbe_l_out[PCI_BUS_CBE_RANGE:0])
316
                              ^ master_debug_force_bad_par;
317
  assign  target_par_out_next = (^target_ad_out[PCI_BUS_DATA_RANGE:0])
318
                              ^ (^cbe_l_now[PCI_BUS_CBE_RANGE:0])
319
                              ^ target_debug_force_bad_par;
320
  always @(posedge pci_ext_clk)
321
  begin
322
    pci_par_out <= master_ad_oe ? master_par_out_next
323
                       : (target_ad_oe ? target_par_out_next : 1'bX);
324
  end
325
  assign  pci_perr_out = master_perr_oe ? master_perr_out
326
                       : (target_perr_oe ? target_perr_out : 1'bX);
327
  assign  pci_perr_oe = master_perr_oe | target_perr_oe;
328
  assign  pci_serr_oe = master_serr_oe | target_serr_oe;
329
 
330
// synopsys translate_off
331
// Test for obvious errors in this test device
332
  always @(posedge pci_ext_clk)
333
  begin
334
    if (master_ad_oe & target_ad_oe)
335
    begin
336
      $display ("*** test %h - Master and Target drive AD bus at the same time, at %t",
337
                  test_device_id[2:0], $time);
338
      error_detected <= ~error_detected;
339
    end
340
    `NO_ELSE;
341
    if (master_perr_oe & target_perr_oe)
342
    begin
343
      $display ("*** test %h - Master and Target drive PERR at the same time, at %t",
344
                  test_device_id[2:0], $time);
345
      error_detected <= ~error_detected;
346
    end
347
    `NO_ELSE;
348
    if (master_serr_oe & target_serr_oe)
349
    begin
350
      $display ("*** test %h - Master and Target drive SERR at the same time, at %t",
351
                  test_device_id[2:0], $time);
352
      error_detected <= ~error_detected;
353
    end
354
    `NO_ELSE;
355
  end
356
// synopsys translate_on
357
 
358
// Share a parity generator on inputs (Is this legal?  Can't receive CBE in Master)
359
  wire    calc_input_parity_prev = (^ad_prev[PCI_BUS_DATA_RANGE:0])
360
                                 ^ (^cbe_l_prev[PCI_BUS_CBE_RANGE:0]) ;
361
                                 // added by miha d for bad PERR generation
362
                                 //^ target_debug_force_bad_par ;
363
 
364
// Master needs to report conditions to Target, which contains the Config Register
365
// If the system is a target only, these bits should all be wired to 0
366
  wire    master_got_parity_error, master_asserted_serr, master_got_master_abort;
367
  wire    master_got_target_abort, master_caused_parity_error;
368
  wire    master_enable, master_fast_b2b_en, master_perr_enable, master_serr_enable;
369
  wire   [7:0] master_latency_value;
370
 
371
pci_behaviorial_master pci_behaviorial_master (
372
  .ad_now                     (ad_now[PCI_BUS_DATA_RANGE:0]),
373
  .ad_prev                    (ad_prev[PCI_BUS_DATA_RANGE:0]),
374
  .calc_input_parity_prev     (calc_input_parity_prev),
375
  .master_ad_out              (master_ad_out[PCI_BUS_DATA_RANGE:0]),
376
  .master_ad_oe               (master_ad_oe),
377
  .master_cbe_l_out           (master_cbe_l_out[PCI_BUS_CBE_RANGE:0]),
378
  .master_cbe_oe              (master_cbe_oe),
379
  .par_now                    (par_now),
380
  .par_prev                   (par_prev),
381
  .frame_now                  (frame_now),
382
  .frame_prev                 (frame_prev),
383
  .master_frame_out           (master_frame_out),
384
  .master_frame_oe            (master_frame_oe),
385
  .irdy_now                   (irdy_now),
386
  .irdy_prev                  (irdy_prev),
387
  .master_irdy_out            (master_irdy_out),
388
  .master_irdy_oe             (master_irdy_oe),
389
  .devsel_now                 (devsel_now),
390
  .devsel_prev                (devsel_prev),
391
  .trdy_now                   (trdy_now),
392
  .trdy_prev                  (trdy_prev),
393
  .stop_now                   (stop_now),
394
  .stop_prev                  (stop_prev),
395
  .perr_now                   (perr_now),
396
  .perr_prev                  (perr_prev),
397
  .master_perr_out            (master_perr_out),
398
  .master_perr_oe             (master_perr_oe),
399
  .master_serr_oe             (master_serr_oe),
400
  .master_req_out             (master_req),
401
  .master_gnt_now             (master_gnt_now),
402
  .pci_reset_comb             (pci_reset_comb),
403
  .pci_ext_clk                (pci_ext_clk),
404
// Signals from the master to the target to set bits in the Status Register
405
  .master_got_parity_error    (master_got_parity_error),
406
  .master_asserted_serr       (master_asserted_serr),
407
  .master_got_master_abort    (master_got_master_abort),
408
  .master_got_target_abort    (master_got_target_abort),
409
  .master_caused_parity_error (master_caused_parity_error),
410
  .master_enable              (master_enable),
411
  .master_fast_b2b_en         (master_fast_b2b_en),
412
  .master_perr_enable         (master_perr_enable),
413
  .master_serr_enable         (master_serr_enable),
414
  .master_latency_value       (master_latency_value[7:0]),
415
// Signals used by the test bench instead of using "." notation
416
  .master_debug_force_bad_par (master_debug_force_bad_par),
417
  .test_master_number         (test_master_number[2:0]),
418
  .test_address               (test_address[PCI_BUS_DATA_RANGE:0]),
419
  .test_command               (test_command[PCI_BUS_CBE_RANGE:0]),
420
  .test_data                  (test_data[PCI_BUS_DATA_RANGE:0]),
421
  .test_byte_enables_l        (test_byte_enables_l[PCI_BUS_CBE_RANGE:0]),
422
  .test_size                  (test_size),
423
  .test_make_addr_par_error   (test_make_addr_par_error),
424
  .test_make_data_par_error   (test_make_data_par_error),
425
  .test_master_initial_wait_states     (test_master_initial_wait_states[3:0]),
426
  .test_master_subsequent_wait_states  (test_master_subsequent_wait_states[3:0]),
427
  .test_target_initial_wait_states     (test_target_initial_wait_states[3:0]),
428
  .test_target_subsequent_wait_states  (test_target_subsequent_wait_states[3:0]),
429
  .test_target_devsel_speed   (test_target_devsel_speed[1:0]),
430
  .test_fast_back_to_back     (test_fast_back_to_back),
431
  .test_target_termination    (test_target_termination[2:0]),
432
  .test_expect_master_abort   (test_expect_master_abort),
433
  .test_start                 (test_start),
434
  .test_accepted_l            (test_accepted_l),
435
  .test_error_event           (master_error_event),
436
  .test_device_id             (test_device_id[2:0]),
437
// target read data and data valid signals for testbench
438
  .master_received_data       (master_received_data),
439
  .master_received_data_valid (master_received_data_valid),
440
  .master_check_received_data (master_check_received_data)
441
);
442
 
443
pci_behaviorial_target pci_behaviorial_target (
444
  .ad_now                     (ad_now[PCI_BUS_DATA_RANGE:0]),
445
  .ad_prev                    (ad_prev[PCI_BUS_DATA_RANGE:0]),
446
  .calc_input_parity_prev     (calc_input_parity_prev),
447
  .target_ad_out              (target_ad_out[PCI_BUS_DATA_RANGE:0]),
448
  .target_ad_oe               (target_ad_oe),
449
  .cbe_l_now                  (cbe_l_now[PCI_BUS_CBE_RANGE:0]),
450
  .cbe_l_prev                 (cbe_l_prev[PCI_BUS_CBE_RANGE:0]),
451
  .par_now                    (par_now),
452
  .par_prev                   (par_prev),
453
  .frame_now                  (frame_now),
454
  .frame_prev                 (frame_prev),
455
  .irdy_now                   (irdy_now),
456
  .irdy_prev                  (irdy_prev),
457
  .target_devsel_out          (target_devsel_out),
458
  .target_d_t_s_oe            (target_d_t_s_oe),
459
  .target_trdy_out            (target_trdy_out),
460
  .target_stop_out            (target_stop_out),
461
  .target_perr_out            (target_perr_out),
462
  .target_perr_oe             (target_perr_oe),
463
  .target_serr_oe             (target_serr_oe),
464
  .idsel_now                  (idsel_now),
465
  .idsel_prev                 (idsel_prev),
466
  .pci_reset_comb             (pci_reset_comb),
467
  .pci_ext_clk                (pci_ext_clk),
468
// Signals from the master to the target to set bits in the Status Register
469
  .master_got_parity_error    (master_got_parity_error),
470
  .master_asserted_serr       (master_asserted_serr),
471
  .master_got_master_abort    (master_got_master_abort),
472
  .master_got_target_abort    (master_got_target_abort),
473
  .master_caused_parity_error (master_caused_parity_error),
474
  .master_enable              (master_enable),
475
  .master_fast_b2b_en         (master_fast_b2b_en),
476
  .master_perr_enable         (master_perr_enable),
477
  .master_serr_enable         (master_serr_enable),
478
  .master_latency_value       (master_latency_value[7:0]),
479
// Signals used by the test bench instead of using "." notation
480
  .target_debug_force_bad_par (target_debug_force_bad_par),
481
  .test_error_event           (target_error_event),
482
  .test_device_id             (test_device_id[2:0]),
483
  .test_response              (test_target_response)
484
);
485
endmodule
486
 
487
module delayed_test_pad (
488
  external_sig, data_out_comb, data_oe_comb, data_in_comb, data_in_prev,
489
  pci_ext_clk
490
);
491
  inout   external_sig;
492
  input   data_out_comb, data_oe_comb;
493
  output  data_in_comb, data_in_prev;
494
  input   pci_ext_clk;
495
 
496
  wire    data_out_dly1, data_out_dly2;
497
  assign #`PAD_MIN_DATA_DLY data_out_dly1 = data_out_comb;
498
  assign #`PAD_MAX_DATA_DLY data_out_dly2 = data_out_comb;
499
 
500
  wire    data_oe_dly1, data_oe_dly2;
501
  assign #`PAD_MIN_OE_DLY data_oe_dly1 = data_oe_comb;
502
  assign #`PAD_MAX_OE_DLY data_oe_dly2 = data_oe_comb;
503
 
504
  wire    force_data_x = (data_oe_dly1 !== data_oe_dly2)
505
                       | (data_oe_comb & (data_out_dly1 !== data_out_dly2));
506
  assign  external_sig = force_data_x ? 1'bX
507
                       : (data_oe_dly2 ? data_out_dly2 : 1'bZ);
508
  assign  data_in_comb = ~external_sig;
509
 
510
  reg     pci_ad_out_oe_hold, pci_ad_out_hold, pci_ad_in_hold, data_in_prev;
511
  always @(posedge pci_ext_clk)
512
  begin
513
    data_in_prev <= ~external_sig;
514
    pci_ad_out_oe_hold <= data_oe_comb;
515
    pci_ad_out_hold <= data_out_comb;
516
    pci_ad_in_hold <= external_sig;
517
    if (pci_ad_out_oe_hold & (pci_ad_out_hold !== pci_ad_in_hold))
518
    begin
519
      $display ("*** Test Device Pad drives one value while receiving another %h, %h, %h, at %t",
520
                  pci_ad_out_oe_hold, pci_ad_out_hold, pci_ad_in_hold, $time);
521
    end
522
    `NO_ELSE;
523
  end
524
endmodule
525
 

powered by: WebSVN 2.1.0

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