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

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [branches/] [Virtex6/] [ML605_ISE13.3/] [ipcore_dir_ISE13.3/] [v6_pcie_v1_7_x4/] [source/] [pcie_gtx_v6.v] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 barabba
//-----------------------------------------------------------------------------
2
//
3
// (c) Copyright 2009-2011 Xilinx, Inc. All rights reserved.
4
//
5
// This file contains confidential and proprietary information
6
// of Xilinx, Inc. and is protected under U.S. and
7
// international copyright and other intellectual property
8
// laws.
9
//
10
// DISCLAIMER
11
// This disclaimer is not a license and does not grant any
12
// rights to the materials distributed herewith. Except as
13
// otherwise provided in a valid license issued to you by
14
// Xilinx, and to the maximum extent permitted by applicable
15
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
16
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
17
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
18
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
19
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
20
// (2) Xilinx shall not be liable (whether in contract or tort,
21
// including negligence, or under any other theory of
22
// liability) for any loss or damage of any kind or nature
23
// related to, arising under or in connection with these
24
// materials, including for any direct, or any indirect,
25
// special, incidental, or consequential loss or damage
26
// (including loss of data, profits, goodwill, or any type of
27
// loss or damage suffered as a result of any action brought
28
// by a third party) even if such damage or loss was
29
// reasonably foreseeable or Xilinx had been advised of the
30
// possibility of the same.
31
//
32
// CRITICAL APPLICATIONS
33
// Xilinx products are not designed or intended to be fail-
34
// safe, or for use in any application requiring fail-safe
35
// performance, such as life-support or safety devices or
36
// systems, Class III medical devices, nuclear facilities,
37
// applications related to the deployment of airbags, or any
38
// other applications that could lead to death, personal
39
// injury, or severe property or environmental damage
40
// (individually and collectively, "Critical
41
// Applications"). Customer assumes the sole risk and
42
// liability of any use of Xilinx products in Critical
43
// Applications, subject only to applicable laws and
44
// regulations governing limitations on product liability.
45
//
46
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
47
// PART OF THIS FILE AT ALL TIMES.
48
//
49
//-----------------------------------------------------------------------------
50
// Project    : Virtex-6 Integrated Block for PCI Express
51
// File       : pcie_gtx_v6.v
52
// Version    : 1.7
53
//-- Description: GTX module for Virtex6 PCIe Block
54
//--
55
//--
56
//--
57
//--------------------------------------------------------------------------------
58
 
59
`timescale 1ns/1ns
60
 
61
module pcie_gtx_v6 #
62
(
63
   parameter                         NO_OF_LANES = 8,         // 1 - x1 , 2 - x2 , 4 - x4 , 8 - x8
64
   parameter                         LINK_CAP_MAX_LINK_SPEED = 4'h1,  // 1 - Gen1, 2 - Gen2
65
   parameter                         REF_CLK_FREQ = 0,        // 0 - 100 MHz , 1 - 125 MHz , 2 - 250 MHz
66
   parameter                         PL_FAST_TRAIN = "FALSE"
67
)
68
(
69
   // Pipe Per-Link Signals     
70
   input   wire                      pipe_tx_rcvr_det       ,
71
   input   wire                      pipe_tx_reset          ,
72
   input   wire                      pipe_tx_rate           ,
73
   input   wire                      pipe_tx_deemph         ,
74
   input   wire [2:0]                pipe_tx_margin         ,
75
   input   wire                      pipe_tx_swing          ,
76
 
77
   // Pipe Per-Lane Signals - Lane 0
78
   output  wire [ 1:0]               pipe_rx0_char_is_k     ,
79
   output  wire [15:0]               pipe_rx0_data          ,
80
   output  wire                      pipe_rx0_valid         ,
81
   output  wire                      pipe_rx0_chanisaligned ,
82
   output  wire [ 2:0]               pipe_rx0_status        ,
83
   output  wire                      pipe_rx0_phy_status    ,
84
   output  wire                      pipe_rx0_elec_idle     ,
85
   input   wire                      pipe_rx0_polarity      ,
86
   input   wire                      pipe_tx0_compliance    ,
87
   input   wire [ 1:0]               pipe_tx0_char_is_k     ,
88
   input   wire [15:0]               pipe_tx0_data          ,
89
   input   wire                      pipe_tx0_elec_idle     ,
90
   input   wire [ 1:0]               pipe_tx0_powerdown     ,
91
 
92
   // Pipe Per-Lane Signals - Lane 1
93
   output  wire [ 1:0]               pipe_rx1_char_is_k     ,
94
   output  wire [15:0]               pipe_rx1_data          ,
95
   output  wire                      pipe_rx1_valid         ,
96
   output  wire                      pipe_rx1_chanisaligned ,
97
   output  wire [ 2:0]               pipe_rx1_status        ,
98
   output  wire                      pipe_rx1_phy_status    ,
99
   output  wire                      pipe_rx1_elec_idle     ,
100
   input   wire                      pipe_rx1_polarity      ,
101
   input   wire                      pipe_tx1_compliance    ,
102
   input   wire [ 1:0]               pipe_tx1_char_is_k     ,
103
   input   wire [15:0]               pipe_tx1_data          ,
104
   input   wire                      pipe_tx1_elec_idle     ,
105
   input   wire [ 1:0]               pipe_tx1_powerdown     ,
106
 
107
   // Pipe Per-Lane Signals - Lane 2
108
   output  wire [ 1:0]               pipe_rx2_char_is_k     ,
109
   output  wire [15:0]               pipe_rx2_data          ,
110
   output  wire                      pipe_rx2_valid         ,
111
   output  wire                      pipe_rx2_chanisaligned ,
112
   output  wire [ 2:0]               pipe_rx2_status        ,
113
   output  wire                      pipe_rx2_phy_status    ,
114
   output  wire                      pipe_rx2_elec_idle     ,
115
   input   wire                      pipe_rx2_polarity      ,
116
   input   wire                      pipe_tx2_compliance    ,
117
   input   wire [ 1:0]               pipe_tx2_char_is_k     ,
118
   input   wire [15:0]               pipe_tx2_data          ,
119
   input   wire                      pipe_tx2_elec_idle     ,
120
   input   wire [ 1:0]               pipe_tx2_powerdown     ,
121
 
122
   // Pipe Per-Lane Signals - Lane 3
123
   output  wire [ 1:0]               pipe_rx3_char_is_k     ,
124
   output  wire [15:0]               pipe_rx3_data          ,
125
   output  wire                      pipe_rx3_valid         ,
126
   output  wire                      pipe_rx3_chanisaligned ,
127
   output  wire [ 2:0]               pipe_rx3_status        ,
128
   output  wire                      pipe_rx3_phy_status    ,
129
   output  wire                      pipe_rx3_elec_idle     ,
130
   input   wire                      pipe_rx3_polarity      ,
131
   input   wire                      pipe_tx3_compliance    ,
132
   input   wire [ 1:0]               pipe_tx3_char_is_k     ,
133
   input   wire [15:0]               pipe_tx3_data          ,
134
   input   wire                      pipe_tx3_elec_idle     ,
135
   input   wire [ 1:0]               pipe_tx3_powerdown     ,
136
 
137
   // Pipe Per-Lane Signals - Lane 4
138
   output  wire [ 1:0]               pipe_rx4_char_is_k     ,
139
   output  wire [15:0]               pipe_rx4_data          ,
140
   output  wire                      pipe_rx4_valid         ,
141
   output  wire                      pipe_rx4_chanisaligned ,
142
   output  wire [ 2:0]               pipe_rx4_status        ,
143
   output  wire                      pipe_rx4_phy_status    ,
144
   output  wire                      pipe_rx4_elec_idle     ,
145
   input   wire                      pipe_rx4_polarity      ,
146
   input   wire                      pipe_tx4_compliance    ,
147
   input   wire [ 1:0]               pipe_tx4_char_is_k     ,
148
   input   wire [15:0]               pipe_tx4_data          ,
149
   input   wire                      pipe_tx4_elec_idle     ,
150
   input   wire [ 1:0]               pipe_tx4_powerdown     ,
151
 
152
   // Pipe Per-Lane Signals - Lane 5
153
   output  wire [ 1:0]               pipe_rx5_char_is_k     ,
154
   output  wire [15:0]               pipe_rx5_data          ,
155
   output  wire                      pipe_rx5_valid         ,
156
   output  wire                      pipe_rx5_chanisaligned ,
157
   output  wire [ 2:0]               pipe_rx5_status        ,
158
   output  wire                      pipe_rx5_phy_status    ,
159
   output  wire                      pipe_rx5_elec_idle     ,
160
   input   wire                      pipe_rx5_polarity      ,
161
   input   wire                      pipe_tx5_compliance    ,
162
   input   wire [ 1:0]               pipe_tx5_char_is_k     ,
163
   input   wire [15:0]               pipe_tx5_data          ,
164
   input   wire                      pipe_tx5_elec_idle     ,
165
   input   wire [ 1:0]               pipe_tx5_powerdown     ,
166
 
167
   // Pipe Per-Lane Signals - Lane 6
168
   output  wire [ 1:0]               pipe_rx6_char_is_k     ,
169
   output  wire [15:0]               pipe_rx6_data          ,
170
   output  wire                      pipe_rx6_valid         ,
171
   output  wire                      pipe_rx6_chanisaligned ,
172
   output  wire [ 2:0]               pipe_rx6_status        ,
173
   output  wire                      pipe_rx6_phy_status    ,
174
   output  wire                      pipe_rx6_elec_idle     ,
175
   input   wire                      pipe_rx6_polarity      ,
176
   input   wire                      pipe_tx6_compliance    ,
177
   input   wire [ 1:0]               pipe_tx6_char_is_k     ,
178
   input   wire [15:0]               pipe_tx6_data          ,
179
   input   wire                      pipe_tx6_elec_idle     ,
180
   input   wire [ 1:0]               pipe_tx6_powerdown     ,
181
 
182
   // Pipe Per-Lane Signals - Lane 7
183
   output  wire [ 1:0]               pipe_rx7_char_is_k     ,
184
   output  wire [15:0]               pipe_rx7_data          ,
185
   output  wire                      pipe_rx7_valid         ,
186
   output  wire                      pipe_rx7_chanisaligned ,
187
   output  wire [ 2:0]               pipe_rx7_status        ,
188
   output  wire                      pipe_rx7_phy_status    ,
189
   output  wire                      pipe_rx7_elec_idle     ,
190
   input   wire                      pipe_rx7_polarity      ,
191
   input   wire                      pipe_tx7_compliance    ,
192
   input   wire [ 1:0]               pipe_tx7_char_is_k     ,
193
   input   wire [15:0]               pipe_tx7_data          ,
194
   input   wire                      pipe_tx7_elec_idle     ,
195
   input   wire [ 1:0]               pipe_tx7_powerdown     ,
196
 
197
   // PCI Express signals
198
   output  wire [ (NO_OF_LANES-1):0] pci_exp_txn            ,
199
   output  wire [ (NO_OF_LANES-1):0] pci_exp_txp            ,
200
   input   wire [ (NO_OF_LANES-1):0] pci_exp_rxn            ,
201
   input   wire [ (NO_OF_LANES-1):0] pci_exp_rxp            ,
202
 
203
   // Non PIPE signals
204
   input   wire                      sys_clk                ,
205
   input   wire                      sys_rst_n              ,
206
   input   wire                      pipe_clk               ,
207
   input   wire                      drp_clk               ,
208
   input   wire                      clock_locked           ,
209
 
210
   output  wire                      gt_pll_lock            ,
211
   input   wire [ 5:0]               pl_ltssm_state         ,
212
   output  reg                       phy_rdy_n              ,
213
   output  wire                      TxOutClk
214
);
215
 
216
  parameter                          TCQ  = 1;      // clock to out delay model
217
 
218
  wire [  7:0]                       gt_rx_phy_status_wire    ;
219
  wire [  7:0]                       gt_rxchanisaligned_wire  ;
220
  wire [127:0]                       gt_rx_data_k_wire        ;
221
  wire [127:0]                       gt_rx_data_wire          ;
222
  wire [  7:0]                       gt_rx_elec_idle_wire     ;
223
  wire [ 23:0]                       gt_rx_status_wire        ;
224
  wire [  7:0]                       gt_rx_valid_wire         ;
225
  wire [  7:0]                       gt_rx_polarity           ;
226
  wire [ 15:0]                       gt_power_down            ;
227
  wire [  7:0]                       gt_tx_char_disp_mode     ;
228
  wire [ 15:0]                       gt_tx_data_k             ;
229
  wire [127:0]                       gt_tx_data               ;
230
  wire                               gt_tx_detect_rx_loopback ;
231
  wire [  7:0]                       gt_tx_elec_idle          ;
232
  wire [  7:0]                       gt_rx_elec_idle_reset    ;
233
  wire [NO_OF_LANES-1:0]             plllkdet;
234
  wire                               RxResetDone;
235
 
236
  reg                                local_pcs_reset;
237
  reg                                local_pcs_reset_done;
238
  reg  [3:0]                         cnt_local_pcs_reset;
239
  reg  [4:0]                         phy_rdy_pre_cnt;
240
  reg  [5:0]                         pl_ltssm_state_q;
241
 
242
  wire                               plm_in_l0 = (pl_ltssm_state_q == 6'h16);
243
  wire                               plm_in_rl = (pl_ltssm_state_q == 6'h1c);
244
  wire                               plm_in_dt = (pl_ltssm_state_q == 6'h2d);
245
  wire                               plm_in_rs = (pl_ltssm_state_q == 6'h1f);
246
 
247
gtx_wrapper_v6 #(
248
 
249
  .NO_OF_LANES(NO_OF_LANES),
250
  .REF_CLK_FREQ(REF_CLK_FREQ),
251
  .PL_FAST_TRAIN(PL_FAST_TRAIN)
252
 
253
)
254
gtx_v6_i (
255
 
256
  // TX
257
 
258
  .TX(pci_exp_txp[((NO_OF_LANES)-1):0]),
259
  .TX_(pci_exp_txn[((NO_OF_LANES)-1):0]),
260
  .TxData(gt_tx_data[((16*NO_OF_LANES)-1):0]),
261
  .TxDataK(gt_tx_data_k[((2*NO_OF_LANES)-1):0]),
262
  .TxElecIdle(gt_tx_elec_idle[((NO_OF_LANES)-1):0]),
263
  .TxCompliance(gt_tx_char_disp_mode[((NO_OF_LANES)-1):0]),
264
 
265
  // RX
266
 
267
  .RX(pci_exp_rxp[((NO_OF_LANES)-1):0]),
268
  .RX_(pci_exp_rxn[((NO_OF_LANES)-1):0]),
269
  .RxData(gt_rx_data_wire[((16*NO_OF_LANES)-1):0]),
270
  .RxDataK(gt_rx_data_k_wire[((2*NO_OF_LANES)-1):0]),
271
  .RxPolarity(gt_rx_polarity[((NO_OF_LANES)-1):0]),
272
  .RxValid(gt_rx_valid_wire[((NO_OF_LANES)-1):0]),
273
  .RxElecIdle(gt_rx_elec_idle_wire[((NO_OF_LANES)-1):0]),
274
  .RxStatus(gt_rx_status_wire[((3*NO_OF_LANES)-1):0]),
275
 
276
  // other
277
  .GTRefClkout(),
278
  .plm_in_l0(plm_in_l0),
279
  .plm_in_rl(plm_in_rl),
280
  .plm_in_dt(plm_in_dt),
281
  .plm_in_rs(plm_in_rs),
282
  .RxPLLLkDet(plllkdet),
283
  .ChanIsAligned(gt_rxchanisaligned_wire[((NO_OF_LANES)-1):0]),
284
  .TxDetectRx(gt_tx_detect_rx_loopback),
285
  .PhyStatus(gt_rx_phy_status_wire[((NO_OF_LANES)-1):0]),
286
  .TXPdownAsynch(~clock_locked),
287
  .PowerDown(gt_power_down[((2*NO_OF_LANES)-1):0]),
288
  .Rate(pipe_tx_rate),
289
  .Reset_n(clock_locked),
290
  .GTReset_n(sys_rst_n),
291
  .PCLK(pipe_clk),
292
  .REFCLK(sys_clk),
293
  .DRPCLK(drp_clk),
294
  .TxDeemph(pipe_tx_deemph),
295
  .TxMargin(pipe_tx_margin[2]),
296
  .TxSwing(pipe_tx_swing),
297
  .local_pcs_reset(local_pcs_reset),
298
  .RxResetDone(RxResetDone),
299
  .SyncDone(SyncDone),
300
  .TxOutClk(TxOutClk)
301
);
302
 
303
assign pipe_rx0_phy_status = gt_rx_phy_status_wire[0] ;
304
assign pipe_rx1_phy_status = (NO_OF_LANES >= 2 ) ? gt_rx_phy_status_wire[1] : 1'b0;
305
assign pipe_rx2_phy_status = (NO_OF_LANES >= 4 ) ? gt_rx_phy_status_wire[2] : 1'b0;
306
assign pipe_rx3_phy_status = (NO_OF_LANES >= 4 ) ? gt_rx_phy_status_wire[3] : 1'b0;
307
assign pipe_rx4_phy_status = (NO_OF_LANES >= 8 ) ? gt_rx_phy_status_wire[4] : 1'b0;
308
assign pipe_rx5_phy_status = (NO_OF_LANES >= 8 ) ? gt_rx_phy_status_wire[5] : 1'b0;
309
assign pipe_rx6_phy_status = (NO_OF_LANES >= 8 ) ? gt_rx_phy_status_wire[6] : 1'b0;
310
assign pipe_rx7_phy_status = (NO_OF_LANES >= 8 ) ? gt_rx_phy_status_wire[7] : 1'b0;
311
 
312
assign pipe_rx0_chanisaligned = gt_rxchanisaligned_wire[0];
313
assign pipe_rx1_chanisaligned = (NO_OF_LANES >= 2 ) ? gt_rxchanisaligned_wire[1] : 1'b0 ;
314
assign pipe_rx2_chanisaligned = (NO_OF_LANES >= 4 ) ? gt_rxchanisaligned_wire[2] : 1'b0 ;
315
assign pipe_rx3_chanisaligned = (NO_OF_LANES >= 4 ) ? gt_rxchanisaligned_wire[3] : 1'b0 ;
316
assign pipe_rx4_chanisaligned = (NO_OF_LANES >= 8 ) ? gt_rxchanisaligned_wire[4] : 1'b0 ;
317
assign pipe_rx5_chanisaligned = (NO_OF_LANES >= 8 ) ? gt_rxchanisaligned_wire[5] : 1'b0 ;
318
assign pipe_rx6_chanisaligned = (NO_OF_LANES >= 8 ) ? gt_rxchanisaligned_wire[6] : 1'b0 ;
319
assign pipe_rx7_chanisaligned = (NO_OF_LANES >= 8 ) ? gt_rxchanisaligned_wire[7] : 1'b0 ;
320
 
321
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
322
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
323
 
324
assign pipe_rx0_char_is_k =  {gt_rx_data_k_wire[1], gt_rx_data_k_wire[0]};
325
assign pipe_rx1_char_is_k =  (NO_OF_LANES >= 2 ) ? {gt_rx_data_k_wire[3], gt_rx_data_k_wire[2]} : 2'b0 ;
326
assign pipe_rx2_char_is_k =  (NO_OF_LANES >= 4 ) ? {gt_rx_data_k_wire[5], gt_rx_data_k_wire[4]} : 2'b0 ;
327
assign pipe_rx3_char_is_k =  (NO_OF_LANES >= 4 ) ? {gt_rx_data_k_wire[7], gt_rx_data_k_wire[6]} : 2'b0 ;
328
assign pipe_rx4_char_is_k =  (NO_OF_LANES >= 8 ) ? {gt_rx_data_k_wire[9], gt_rx_data_k_wire[8]} : 2'b0 ;
329
assign pipe_rx5_char_is_k =  (NO_OF_LANES >= 8 ) ? {gt_rx_data_k_wire[11], gt_rx_data_k_wire[10]} : 2'b0 ;
330
assign pipe_rx6_char_is_k =  (NO_OF_LANES >= 8 ) ? {gt_rx_data_k_wire[13], gt_rx_data_k_wire[12]} : 2'b0 ;
331
assign pipe_rx7_char_is_k =  (NO_OF_LANES >= 8 ) ? {gt_rx_data_k_wire[15], gt_rx_data_k_wire[14]} : 2'b0 ;
332
 
333
assign pipe_rx0_data = {gt_rx_data_wire[ 15: 8], gt_rx_data_wire[ 7: 0]};
334
assign pipe_rx1_data = (NO_OF_LANES >= 2 ) ? {gt_rx_data_wire[31:24], gt_rx_data_wire[23:16]} : 16'h0 ;
335
assign pipe_rx2_data = (NO_OF_LANES >= 4 ) ? {gt_rx_data_wire[47:40], gt_rx_data_wire[39:32]} : 16'h0 ;
336
assign pipe_rx3_data = (NO_OF_LANES >= 4 ) ? {gt_rx_data_wire[63:56], gt_rx_data_wire[55:48]} : 16'h0 ;
337
assign pipe_rx4_data = (NO_OF_LANES >= 8 ) ? {gt_rx_data_wire[79:72], gt_rx_data_wire[71:64]} : 16'h0 ;
338
assign pipe_rx5_data = (NO_OF_LANES >= 8 ) ? {gt_rx_data_wire[95:88], gt_rx_data_wire[87:80]} : 16'h0 ;
339
assign pipe_rx6_data = (NO_OF_LANES >= 8 ) ? {gt_rx_data_wire[111:104], gt_rx_data_wire[103:96]} : 16'h0 ;
340
assign pipe_rx7_data = (NO_OF_LANES >= 8 ) ? {gt_rx_data_wire[127:120], gt_rx_data_wire[119:112]} : 16'h0 ;
341
 
342
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
343
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
344
 
345
assign pipe_rx0_elec_idle = gt_rx_elec_idle_wire[0];
346
assign pipe_rx1_elec_idle = (NO_OF_LANES >= 2 ) ? gt_rx_elec_idle_wire[1] : 1'b1 ;
347
assign pipe_rx2_elec_idle = (NO_OF_LANES >= 4 ) ? gt_rx_elec_idle_wire[2] : 1'b1 ;
348
assign pipe_rx3_elec_idle = (NO_OF_LANES >= 4 ) ? gt_rx_elec_idle_wire[3] : 1'b1 ;
349
assign pipe_rx4_elec_idle = (NO_OF_LANES >= 8 ) ? gt_rx_elec_idle_wire[4] : 1'b1 ;
350
assign pipe_rx5_elec_idle = (NO_OF_LANES >= 8 ) ? gt_rx_elec_idle_wire[5] : 1'b1 ;
351
assign pipe_rx6_elec_idle = (NO_OF_LANES >= 8 ) ? gt_rx_elec_idle_wire[6] : 1'b1 ;
352
assign pipe_rx7_elec_idle = (NO_OF_LANES >= 8 ) ? gt_rx_elec_idle_wire[7] : 1'b1 ;
353
 
354
assign pipe_rx0_status = gt_rx_status_wire[ 2: 0];
355
assign pipe_rx1_status = (NO_OF_LANES >= 2 ) ? gt_rx_status_wire[ 5: 3] : 3'b0 ;
356
assign pipe_rx2_status = (NO_OF_LANES >= 4 ) ? gt_rx_status_wire[ 8: 6] : 3'b0 ;
357
assign pipe_rx3_status = (NO_OF_LANES >= 4 ) ? gt_rx_status_wire[11: 9] : 3'b0 ;
358
assign pipe_rx4_status = (NO_OF_LANES >= 8 ) ? gt_rx_status_wire[14:12] : 3'b0 ;
359
assign pipe_rx5_status = (NO_OF_LANES >= 8 ) ? gt_rx_status_wire[17:15] : 3'b0 ;
360
assign pipe_rx6_status = (NO_OF_LANES >= 8 ) ? gt_rx_status_wire[20:18] : 3'b0 ;
361
assign pipe_rx7_status = (NO_OF_LANES >= 8 ) ? gt_rx_status_wire[23:21] : 3'b0 ;
362
 
363
assign pipe_rx0_valid = gt_rx_valid_wire[0];
364
assign pipe_rx1_valid = (NO_OF_LANES >= 2 ) ? gt_rx_valid_wire[1] : 1'b0 ;
365
assign pipe_rx2_valid = (NO_OF_LANES >= 4 ) ? gt_rx_valid_wire[2] : 1'b0 ;
366
assign pipe_rx3_valid = (NO_OF_LANES >= 4 ) ? gt_rx_valid_wire[3] : 1'b0 ;
367
assign pipe_rx4_valid = (NO_OF_LANES >= 8 ) ? gt_rx_valid_wire[4] : 1'b0 ;
368
assign pipe_rx5_valid = (NO_OF_LANES >= 8 ) ? gt_rx_valid_wire[5] : 1'b0 ;
369
assign pipe_rx6_valid = (NO_OF_LANES >= 8 ) ? gt_rx_valid_wire[6] : 1'b0 ;
370
assign pipe_rx7_valid = (NO_OF_LANES >= 8 ) ? gt_rx_valid_wire[7] : 1'b0 ;
371
 
372
assign gt_rx_polarity[0] = pipe_rx0_polarity;
373
assign gt_rx_polarity[1] = pipe_rx1_polarity;
374
assign gt_rx_polarity[2] = pipe_rx2_polarity;
375
assign gt_rx_polarity[3] = pipe_rx3_polarity;
376
assign gt_rx_polarity[4] = pipe_rx4_polarity;
377
assign gt_rx_polarity[5] = pipe_rx5_polarity;
378
assign gt_rx_polarity[6] = pipe_rx6_polarity;
379
assign gt_rx_polarity[7] = pipe_rx7_polarity;
380
 
381
assign gt_power_down[ 1: 0] = pipe_tx0_powerdown;
382
assign gt_power_down[ 3: 2] = pipe_tx1_powerdown;
383
assign gt_power_down[ 5: 4] = pipe_tx2_powerdown;
384
assign gt_power_down[ 7: 6] = pipe_tx3_powerdown;
385
assign gt_power_down[ 9: 8] = pipe_tx4_powerdown;
386
assign gt_power_down[11:10] = pipe_tx5_powerdown;
387
assign gt_power_down[13:12] = pipe_tx6_powerdown;
388
assign gt_power_down[15:14] = pipe_tx7_powerdown;
389
 
390
assign gt_tx_char_disp_mode = {pipe_tx7_compliance,
391
                               pipe_tx6_compliance,
392
                               pipe_tx5_compliance,
393
                               pipe_tx4_compliance,
394
                               pipe_tx3_compliance,
395
                               pipe_tx2_compliance,
396
                               pipe_tx1_compliance,
397
                               pipe_tx0_compliance};
398
 
399
 
400
assign gt_tx_data_k = {pipe_tx7_char_is_k,
401
                       pipe_tx6_char_is_k,
402
                       pipe_tx5_char_is_k,
403
                       pipe_tx4_char_is_k,
404
                       pipe_tx3_char_is_k,
405
                       pipe_tx2_char_is_k,
406
                       pipe_tx1_char_is_k,
407
                       pipe_tx0_char_is_k};
408
 
409
assign gt_tx_data = {pipe_tx7_data,
410
                     pipe_tx6_data,
411
                     pipe_tx5_data,
412
                     pipe_tx4_data,
413
                     pipe_tx3_data,
414
                     pipe_tx2_data,
415
                     pipe_tx1_data,
416
                     pipe_tx0_data};
417
 
418
assign gt_tx_detect_rx_loopback = pipe_tx_rcvr_det;
419
 
420
assign gt_tx_elec_idle = {pipe_tx7_elec_idle,
421
                          pipe_tx6_elec_idle,
422
                          pipe_tx5_elec_idle,
423
                          pipe_tx4_elec_idle,
424
                          pipe_tx3_elec_idle,
425
                          pipe_tx2_elec_idle,
426
                          pipe_tx1_elec_idle,
427
                          pipe_tx0_elec_idle};
428
 
429
assign gt_pll_lock = &plllkdet[NO_OF_LANES-1:0] | ~phy_rdy_pre_cnt[4];
430
 
431
// Asserted after all workarounds have completed.
432
 
433
always @(posedge pipe_clk or negedge clock_locked) begin
434
 
435
  if (!clock_locked) begin
436
 
437
    phy_rdy_n <= #TCQ 1'b1;
438
 
439
  end else begin
440
 
441
    if (~&plllkdet[NO_OF_LANES-1:0])
442
      phy_rdy_n <= #TCQ 1'b1;
443
    else if (local_pcs_reset_done && RxResetDone && phy_rdy_n &&  SyncDone)
444
      phy_rdy_n <= #TCQ 1'b0;
445
 
446
  end
447
 
448
end
449
 
450
// Handle the warm reset case, where sys_rst_n is asseted when
451
// phy_rdy_n is asserted. phy_rdy_n is to be de-asserted
452
// before gt_pll_lock is de-asserted so that synnchronous
453
// logic see reset de-asset before clock is lost.
454
 
455
always @(posedge pipe_clk or negedge clock_locked) begin
456
 
457
  if (!clock_locked) begin
458
 
459
    phy_rdy_pre_cnt <= #TCQ 5'b11111;
460
 
461
  end else begin
462
 
463
    if (gt_pll_lock && phy_rdy_n)
464
      phy_rdy_pre_cnt <= #TCQ phy_rdy_pre_cnt + 1'b1;
465
 
466
  end
467
 
468
end
469
 
470
always @(posedge pipe_clk or negedge clock_locked) begin
471
 
472
  if (!clock_locked) begin
473
 
474
    cnt_local_pcs_reset <= #TCQ 4'hF;
475
    local_pcs_reset <= #TCQ 1'b0;
476
    local_pcs_reset_done <= #TCQ 1'b0;
477
 
478
  end else begin
479
 
480
    if ((local_pcs_reset == 1'b0) && (cnt_local_pcs_reset == 4'hF))
481
      local_pcs_reset <= #TCQ 1'b1;
482
    else if ((local_pcs_reset == 1'b1) && (cnt_local_pcs_reset != 4'h0)) begin
483
      local_pcs_reset <= #TCQ 1'b1;
484
      cnt_local_pcs_reset <= #TCQ cnt_local_pcs_reset - 1'b1;
485
    end else if ((local_pcs_reset == 1'b1) && (cnt_local_pcs_reset == 4'h0)) begin
486
      local_pcs_reset <= #TCQ 1'b0;
487
      local_pcs_reset_done <= #TCQ 1'b1;
488
    end
489
 
490
  end
491
 
492
end
493
 
494
always @(posedge pipe_clk or negedge clock_locked) begin
495
 
496
  if (!clock_locked)
497
    pl_ltssm_state_q <= #TCQ 6'b0;
498
  else
499
    pl_ltssm_state_q <= #TCQ pl_ltssm_state;
500
 
501
end
502
 
503
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
504
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
505
 
506
endmodule

powered by: WebSVN 2.1.0

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