1 |
2 |
dsmv |
|
2 |
|
|
//-----------------------------------------------------------------------------
|
3 |
|
|
//
|
4 |
|
|
// (c) Copyright 2009-2010 Xilinx, Inc. All rights reserved.
|
5 |
|
|
//
|
6 |
|
|
// This file contains confidential and proprietary information
|
7 |
|
|
// of Xilinx, Inc. and is protected under U.S. and
|
8 |
|
|
// international copyright and other intellectual property
|
9 |
|
|
// laws.
|
10 |
|
|
//
|
11 |
|
|
// DISCLAIMER
|
12 |
|
|
// This disclaimer is not a license and does not grant any
|
13 |
|
|
// rights to the materials distributed herewith. Except as
|
14 |
|
|
// otherwise provided in a valid license issued to you by
|
15 |
|
|
// Xilinx, and to the maximum extent permitted by applicable
|
16 |
|
|
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
|
17 |
|
|
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
|
18 |
|
|
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
|
19 |
|
|
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
|
20 |
|
|
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
|
21 |
|
|
// (2) Xilinx shall not be liable (whether in contract or tort,
|
22 |
|
|
// including negligence, or under any other theory of
|
23 |
|
|
// liability) for any loss or damage of any kind or nature
|
24 |
|
|
// related to, arising under or in connection with these
|
25 |
|
|
// materials, including for any direct, or any indirect,
|
26 |
|
|
// special, incidental, or consequential loss or damage
|
27 |
|
|
// (including loss of data, profits, goodwill, or any type of
|
28 |
|
|
// loss or damage suffered as a result of any action brought
|
29 |
|
|
// by a third party) even if such damage or loss was
|
30 |
|
|
// reasonably foreseeable or Xilinx had been advised of the
|
31 |
|
|
// possibility of the same.
|
32 |
|
|
//
|
33 |
|
|
// CRITICAL APPLICATIONS
|
34 |
|
|
// Xilinx products are not designed or intended to be fail-
|
35 |
|
|
// safe, or for use in any application requiring fail-safe
|
36 |
|
|
// performance, such as life-support or safety devices or
|
37 |
|
|
// systems, Class III medical devices, nuclear facilities,
|
38 |
|
|
// applications related to the deployment of airbags, or any
|
39 |
|
|
// other applications that could lead to death, personal
|
40 |
|
|
// injury, or severe property or environmental damage
|
41 |
|
|
// (individually and collectively, "Critical
|
42 |
|
|
// Applications"). Customer assumes the sole risk and
|
43 |
|
|
// liability of any use of Xilinx products in Critical
|
44 |
|
|
// Applications, subject only to applicable laws and
|
45 |
|
|
// regulations governing limitations on product liability.
|
46 |
|
|
//
|
47 |
|
|
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
|
48 |
|
|
// PART OF THIS FILE AT ALL TIMES.
|
49 |
|
|
//
|
50 |
|
|
//-----------------------------------------------------------------------------
|
51 |
|
|
// Project : V5-Block Plus for PCI Express
|
52 |
|
|
// File : pcie_gt_wrapper.v
|
53 |
|
|
//--------------------------------------------------------------------------------
|
54 |
|
|
//--------------------------------------------------------------------------------
|
55 |
|
|
//
|
56 |
|
|
// ____ ____
|
57 |
|
|
// / /\/ /
|
58 |
|
|
// /___/ \ / Vendor : Xilinx
|
59 |
|
|
// \ \ \/ Version : 1.6
|
60 |
|
|
// \ \ Application : Generated by Xilinx PCI Express Wizard
|
61 |
|
|
// / / Filename : pcie_gt_wrapper.v
|
62 |
|
|
// /___/ /\ Module : pcie_gt_wrapper
|
63 |
|
|
// \ \ / \
|
64 |
|
|
// \___\/\___\
|
65 |
|
|
//
|
66 |
|
|
//------------------------------------------------------------------------------
|
67 |
|
|
//
|
68 |
|
|
// Description : Wrapper for Rocket IO GTP Transceivers
|
69 |
|
|
//
|
70 |
|
|
//-----------------------------------------------------------------------------
|
71 |
|
|
|
72 |
|
|
module pcie_gt_wrapper #
|
73 |
|
|
(
|
74 |
|
|
parameter NO_OF_LANES = 8,
|
75 |
|
|
parameter SIM = 0,
|
76 |
|
|
parameter PLL_DIVSEL_FB = 5,
|
77 |
|
|
parameter PLL_DIVSEL_REF = 2,
|
78 |
|
|
parameter CLK25_DIVIDER = 4,
|
79 |
|
|
parameter TXDIFFBOOST = "TRUE"
|
80 |
|
|
)
|
81 |
|
|
(
|
82 |
|
|
//RX signals
|
83 |
|
|
output wire [7:0] gt_rx_elec_idle,
|
84 |
|
|
output wire [23:0] gt_rx_status,
|
85 |
|
|
output wire [63:0] gt_rx_data,
|
86 |
|
|
output wire [7:0] gt_rx_phy_status,
|
87 |
|
|
output wire [7:0] gt_rx_data_k,
|
88 |
|
|
output wire [7:0] gt_rx_valid,
|
89 |
|
|
output wire [7:0] gt_rx_chanisaligned,
|
90 |
|
|
input wire [NO_OF_LANES-1:0] gt_rx_n,
|
91 |
|
|
input wire [NO_OF_LANES-1:0] gt_rx_p,
|
92 |
|
|
|
93 |
|
|
//TX signals
|
94 |
|
|
output wire [NO_OF_LANES-1:0] gt_tx_n,
|
95 |
|
|
output wire [NO_OF_LANES-1:0] gt_tx_p,
|
96 |
|
|
input wire [63:0] gt_tx_data,
|
97 |
|
|
input wire [7:0] gt_tx_data_k,
|
98 |
|
|
input wire [7:0] gt_tx_elec_idle,
|
99 |
|
|
input wire [7:0] gt_tx_detect_rx_loopback,
|
100 |
|
|
input wire [7:0] gt_tx_compliance,
|
101 |
|
|
input wire [7:0] gt_rx_polarity,
|
102 |
|
|
input wire [15:0] gt_power_down,
|
103 |
|
|
input wire [7:0] gt_deskew_lanes,
|
104 |
|
|
input wire [7:0] gt_pipe_reset,
|
105 |
|
|
input wire [7:0] gt_rx_present,
|
106 |
|
|
|
107 |
|
|
//Reset signals
|
108 |
|
|
input wire gsr,
|
109 |
|
|
input wire gtreset,
|
110 |
|
|
input wire clock_lock,
|
111 |
|
|
//Refclk signals
|
112 |
|
|
input wire refclk,
|
113 |
|
|
output wire refclkout_bufg,
|
114 |
|
|
output wire gtclk_bufg,
|
115 |
|
|
output wire [7:0] resetdone,
|
116 |
|
|
output wire [3:0] plllkdet_out,
|
117 |
|
|
input wire gt_usrclk,
|
118 |
|
|
output wire [7:0] rxbyteisaligned,
|
119 |
|
|
output wire [7:0] rxchanbondseq,
|
120 |
|
|
|
121 |
|
|
output wire pcie_reset,
|
122 |
|
|
|
123 |
|
|
//Dynamic reconfiguration port (DRP)
|
124 |
|
|
input wire gt_dclk,
|
125 |
|
|
input wire [NO_OF_LANES*7-1:0] gt_daddr,
|
126 |
|
|
input wire [NO_OF_LANES-1:0] gt_den,
|
127 |
|
|
input wire [NO_OF_LANES-1:0] gt_dwen,
|
128 |
|
|
input wire [NO_OF_LANES*16-1:0] gt_di,
|
129 |
|
|
output wire [NO_OF_LANES*16-1:0] gt_do,
|
130 |
|
|
output wire [NO_OF_LANES-1:0] gt_drdy,
|
131 |
|
|
|
132 |
|
|
input wire [2:0] gt_txdiffctrl_0,
|
133 |
|
|
input wire [2:0] gt_txdiffctrl_1,
|
134 |
|
|
input wire [2:0] gt_txbuffctrl_0,
|
135 |
|
|
input wire [2:0] gt_txbuffctrl_1,
|
136 |
|
|
input wire [2:0] gt_txpreemphesis_0,
|
137 |
|
|
input wire [2:0] gt_txpreemphesis_1
|
138 |
|
|
);
|
139 |
|
|
|
140 |
|
|
|
141 |
|
|
/************************** Start of GT instantiation *************************/
|
142 |
|
|
|
143 |
|
|
//Signal declaration
|
144 |
|
|
wire [NO_OF_LANES-1:0] gt_clk;
|
145 |
|
|
wire [NO_OF_LANES-1:0] gt_refclk_out;
|
146 |
|
|
wire [7:0] gt_rx_enchansync = 8'h01;
|
147 |
|
|
|
148 |
|
|
|
149 |
|
|
wire [2:0] gt_rx_chbond_i [8:0];
|
150 |
|
|
wire [2:0] gt_rx_chbond_o [8:0];
|
151 |
|
|
|
152 |
|
|
wire [7:0] float_rx_data_k = 8'b0;
|
153 |
|
|
wire [63:0] float_rx_data = 64'b0;
|
154 |
|
|
|
155 |
|
|
|
156 |
|
|
wire [7:0] GT_TXN,GT_RXN;
|
157 |
|
|
wire [7:0] GT_TXP,GT_RXP;
|
158 |
|
|
wire [7:0] rTXN;
|
159 |
|
|
wire [7:0] rTXP;
|
160 |
|
|
|
161 |
|
|
wire [7:0] gt_rx_elec_idle_reset;
|
162 |
|
|
wire [3:0] gt_rx_en_elec_idle_resetb;
|
163 |
|
|
|
164 |
|
|
wire [63:0] gt_rx_data_reg;
|
165 |
|
|
wire [7:0] gt_rx_data_k_reg;
|
166 |
|
|
wire [7:0] gt_rx_valid_reg;
|
167 |
|
|
wire [7:0] gt_rx_elec_idle_reg;
|
168 |
|
|
wire [23:0] gt_rx_status_reg;
|
169 |
|
|
wire [7:0] gt_rx_phy_status_reg;
|
170 |
|
|
wire [7:0] gt_rx_chanisaligned_reg;
|
171 |
|
|
wire [7:0] gt_pipe_reset_reg;
|
172 |
|
|
wire [15:0] gt_rx_power_down_reg;
|
173 |
|
|
wire [7:0] gt_rx_polarity_reg;
|
174 |
|
|
wire [63:0] gt_tx_data_reg;
|
175 |
|
|
wire [7:0] gt_tx_data_k_reg;
|
176 |
|
|
wire [7:0] gt_tx_elec_idle_reg;
|
177 |
|
|
wire [7:0] gt_tx_detect_rx_loopback_reg;
|
178 |
|
|
wire [7:0] gt_tx_compliance_reg;
|
179 |
|
|
wire [15:0] gt_tx_power_down_reg;
|
180 |
|
|
|
181 |
|
|
reg [7:0] one = 8'hff;
|
182 |
|
|
reg [63:0] zero = 63'h0000000000000000;
|
183 |
|
|
|
184 |
|
|
wire rst_init = gt_pipe_reset_reg[0];
|
185 |
|
|
wire rxreset_i; // connect to RXRESET of the GT inputs
|
186 |
|
|
reg rxreset;
|
187 |
|
|
reg m1_delayed_elec_idle_reset;
|
188 |
|
|
reg m2_delayed_elec_idle_reset;
|
189 |
|
|
reg delayed_elec_idle_reset;
|
190 |
|
|
|
191 |
|
|
|
192 |
|
|
//////////////////////////////////////////////////////////
|
193 |
|
|
// Flop Locations for GT TX signals
|
194 |
|
|
// Registering TX side signals
|
195 |
|
|
/////////////////////////////////////////////////////////
|
196 |
|
|
|
197 |
|
|
genvar a;
|
198 |
|
|
generate
|
199 |
|
|
for ( a=0; a < NO_OF_LANES ; a=a+1)
|
200 |
|
|
begin: flop
|
201 |
|
|
|
202 |
|
|
FD tx_data0 ( .Q (gt_tx_data_reg[8*a+0]), .D (gt_tx_data[8*a+0]), .C(gt_usrclk));
|
203 |
|
|
FD tx_data1 ( .Q (gt_tx_data_reg[8*a+1]), .D (gt_tx_data[8*a+1]), .C(gt_usrclk));
|
204 |
|
|
FD tx_data2 ( .Q (gt_tx_data_reg[8*a+2]), .D (gt_tx_data[8*a+2]), .C(gt_usrclk));
|
205 |
|
|
FD tx_data3 ( .Q (gt_tx_data_reg[8*a+3]), .D (gt_tx_data[8*a+3]), .C(gt_usrclk));
|
206 |
|
|
FD tx_data4 ( .Q (gt_tx_data_reg[8*a+4]), .D (gt_tx_data[8*a+4]), .C(gt_usrclk));
|
207 |
|
|
FD tx_data5 ( .Q (gt_tx_data_reg[8*a+5]), .D (gt_tx_data[8*a+5]), .C(gt_usrclk));
|
208 |
|
|
FD tx_data6 ( .Q (gt_tx_data_reg[8*a+6]), .D (gt_tx_data[8*a+6]), .C(gt_usrclk));
|
209 |
|
|
FD tx_data7 ( .Q (gt_tx_data_reg[8*a+7]), .D (gt_tx_data[8*a+7]), .C(gt_usrclk));
|
210 |
|
|
|
211 |
|
|
FD tx_data_k ( .Q (gt_tx_data_k_reg[a]), .D (gt_tx_data_k[a]), .C(gt_usrclk));
|
212 |
|
|
|
213 |
|
|
FDCP #(.INIT(1'b1)) tx_elec_idle ( .Q (gt_tx_elec_idle_reg[a]), .D (gt_tx_elec_idle[a]), .C(gt_usrclk), .CLR(1'b0), .PRE(~clock_lock));
|
214 |
|
|
|
215 |
|
|
FD tx_compliance( .Q (gt_tx_compliance_reg[a]), .D (gt_tx_compliance[a]), .C(gt_usrclk));
|
216 |
|
|
|
217 |
|
|
FD tx_detect_rx_loopback ( .Q (gt_tx_detect_rx_loopback_reg[a]), .D (gt_tx_detect_rx_loopback[a]), .C(gt_usrclk));
|
218 |
|
|
|
219 |
|
|
FDCP #(.INIT(1'b1)) tx_power_down0 ( .Q (gt_tx_power_down_reg[2*a+0]), .D (gt_power_down[2*a+0]), .C(gt_usrclk), .CLR(1'b0), .PRE(~clock_lock));
|
220 |
|
|
FDCP #(.INIT(1'b0)) tx_power_down1 ( .Q (gt_tx_power_down_reg[2*a+1]), .D (gt_power_down[2*a+1]), .C(gt_usrclk), .CLR(~clock_lock), .PRE(1'b0));
|
221 |
|
|
|
222 |
|
|
FDCP #(.INIT(1'b1)) rx_power_down0 ( .Q (gt_rx_power_down_reg[2*a+0]), .D (gt_power_down[2*a+0]), .C(gt_usrclk), .CLR(1'b0), .PRE(~clock_lock));
|
223 |
|
|
FDCP #(.INIT(1'b0)) rx_power_down1 ( .Q (gt_rx_power_down_reg[2*a+1]), .D (gt_power_down[2*a+1]), .C(gt_usrclk), .CLR(~clock_lock), .PRE(1'b0));
|
224 |
|
|
|
225 |
|
|
FD rx_polarity ( .Q (gt_rx_polarity_reg[a]), .D (gt_rx_polarity[a]), .C(gt_usrclk));
|
226 |
|
|
|
227 |
|
|
FDCP #(.INIT(1'b1)) reset ( .Q (gt_pipe_reset_reg[a]), .D (gt_pipe_reset[a]), .C(gt_usrclk), .CLR(1'b0), .PRE(~clock_lock));
|
228 |
|
|
|
229 |
|
|
FD rx_data_0 ( .Q (gt_rx_data[8*a+0]), .D (gt_rx_data_reg[8*a+0]), .C(gt_usrclk));
|
230 |
|
|
FD rx_data_1 ( .Q (gt_rx_data[8*a+1]), .D (gt_rx_data_reg[8*a+1]), .C(gt_usrclk));
|
231 |
|
|
FD rx_data_2 ( .Q (gt_rx_data[8*a+2]), .D (gt_rx_data_reg[8*a+2]), .C(gt_usrclk));
|
232 |
|
|
FD rx_data_3 ( .Q (gt_rx_data[8*a+3]), .D (gt_rx_data_reg[8*a+3]), .C(gt_usrclk));
|
233 |
|
|
FD rx_data_4 ( .Q (gt_rx_data[8*a+4]), .D (gt_rx_data_reg[8*a+4]), .C(gt_usrclk));
|
234 |
|
|
FD rx_data_5 ( .Q (gt_rx_data[8*a+5]), .D (gt_rx_data_reg[8*a+5]), .C(gt_usrclk));
|
235 |
|
|
FD rx_data_6 ( .Q (gt_rx_data[8*a+6]), .D (gt_rx_data_reg[8*a+6]), .C(gt_usrclk));
|
236 |
|
|
FD rx_data_7 ( .Q (gt_rx_data[8*a+7]), .D (gt_rx_data_reg[8*a+7]), .C(gt_usrclk));
|
237 |
|
|
|
238 |
|
|
FD rx_data_k ( .Q (gt_rx_data_k[a]), .D (gt_rx_data_k_reg[a]), .C(gt_usrclk));
|
239 |
|
|
|
240 |
|
|
FDCP #(.INIT(1'b1)) rx_elec_idle ( .Q (gt_rx_elec_idle[a]), .D (gt_rx_elec_idle_reg[a]), .C(gt_usrclk), .CLR(1'b0), .PRE(~clock_lock));
|
241 |
|
|
FD rx_valid ( .Q (gt_rx_valid[a]), .D (gt_rx_valid_reg[a]), .C(gt_usrclk));
|
242 |
|
|
|
243 |
|
|
FDCP #(.INIT(1'b1)) rx_phy_status ( .Q (gt_rx_phy_status[a]), .D (gt_rx_phy_status_reg[a]), .C(gt_usrclk), .CLR(1'b0), .PRE(~clock_lock));
|
244 |
|
|
FD rx_chanisaligned ( .Q (gt_rx_chanisaligned[a]), .D (gt_rx_chanisaligned_reg[a]), .C(gt_usrclk));
|
245 |
|
|
|
246 |
|
|
FD rx_status_0 ( .Q (gt_rx_status[3*a+0]), .D (gt_rx_status_reg[3*a+0]), .C(gt_usrclk));
|
247 |
|
|
FD rx_status_1 ( .Q (gt_rx_status[3*a+1]), .D (gt_rx_status_reg[3*a+1]), .C(gt_usrclk));
|
248 |
|
|
FD rx_status_2 ( .Q (gt_rx_status[3*a+2]), .D (gt_rx_status_reg[3*a+2]), .C(gt_usrclk));
|
249 |
|
|
|
250 |
|
|
|
251 |
|
|
end
|
252 |
|
|
endgenerate
|
253 |
|
|
|
254 |
|
|
genvar b;
|
255 |
|
|
generate
|
256 |
|
|
for (b=NO_OF_LANES; b < 8; b=b+1)
|
257 |
|
|
begin: tied_off
|
258 |
|
|
assign gt_tx_data_reg[8*b+7:8*b+0] = 8'b0;
|
259 |
|
|
assign gt_tx_data_k_reg[b] = 1'b0;
|
260 |
|
|
assign gt_tx_elec_idle_reg[b] = 1'b1;
|
261 |
|
|
assign gt_tx_detect_rx_loopback_reg[b] = 1'b0;
|
262 |
|
|
assign gt_tx_compliance_reg[b] = 1'b0;
|
263 |
|
|
assign gt_tx_power_down_reg[2*b+1:2*b+0] = 2'b0;
|
264 |
|
|
assign gt_rx_power_down_reg[2*b+1:2*b+0] = 2'b0;
|
265 |
|
|
assign gt_pipe_reset_reg[b] = 1'b0;
|
266 |
|
|
assign gt_rx_polarity_reg[b] = 1'b0;
|
267 |
|
|
|
268 |
|
|
assign gt_rx_data[8*b+7:8*b+0] = 8'b0;
|
269 |
|
|
assign gt_rx_data_k[b] = 1'b0;
|
270 |
|
|
assign gt_rx_valid[b] = 1'b0;
|
271 |
|
|
assign gt_rx_elec_idle[b] = 1'b1;
|
272 |
|
|
assign gt_rx_status[3*b+2:3*b] = 3'b0;
|
273 |
|
|
assign gt_rx_phy_status[b] = 1'b0;
|
274 |
|
|
assign gt_rx_chanisaligned[b] = 1'b0;
|
275 |
|
|
|
276 |
|
|
end
|
277 |
|
|
endgenerate
|
278 |
|
|
|
279 |
|
|
|
280 |
|
|
|
281 |
|
|
assign rTXN = GT_TXN;
|
282 |
|
|
assign rTXP = GT_TXP;
|
283 |
|
|
|
284 |
|
|
assign gt_tx_n = rTXN[(NO_OF_LANES-1):0];
|
285 |
|
|
assign gt_tx_p = rTXP[(NO_OF_LANES-1):0];
|
286 |
|
|
|
287 |
|
|
assign GT_RXN[(NO_OF_LANES-1):0] = gt_rx_n;
|
288 |
|
|
assign GT_RXP[(NO_OF_LANES-1):0] = gt_rx_p;
|
289 |
|
|
|
290 |
|
|
BUFG bufg1 (.I(gt_clk[0]), .O(gtclk_bufg));
|
291 |
|
|
BUFG bufg2 (.I(gt_refclk_out[0]), .O(refclkout_bufg));
|
292 |
|
|
|
293 |
|
|
|
294 |
|
|
// Channel bonding settings. These settings should be changed
|
295 |
|
|
// based on how the GTs are daisy chained. For more imformation on channel
|
296 |
|
|
// bonding please refer to the V5 Rocket I/O Transceiver User Guide
|
297 |
|
|
|
298 |
|
|
assign gt_rx_chbond_i[0] = 3'b0;
|
299 |
|
|
|
300 |
|
|
genvar c;
|
301 |
|
|
generate
|
302 |
|
|
for ( c=0; c <= NO_OF_LANES-1 ; c=c+1)
|
303 |
|
|
begin: ch_bond
|
304 |
|
|
assign gt_rx_chbond_i[c+1] = (NO_OF_LANES == 1)? 3'b0 : gt_rx_chbond_o[c];
|
305 |
|
|
end
|
306 |
|
|
endgenerate
|
307 |
|
|
|
308 |
|
|
|
309 |
|
|
wire TXENPMAPHASEALIGN;
|
310 |
|
|
wire TXPMASETPHASE;
|
311 |
|
|
reg ignore_resetdone = 1'b0;
|
312 |
|
|
wire tx_sync_reset;
|
313 |
|
|
reg resetdone_reg = 1'b0;
|
314 |
|
|
wire sync_done;
|
315 |
|
|
reg rst_pcie = 1'b1;
|
316 |
|
|
reg [2:0] rstdone_cnt = 3'b000;
|
317 |
|
|
reg mgt_txreset;
|
318 |
|
|
reg [1:0] mgt_txreset_cnt;
|
319 |
|
|
|
320 |
|
|
genvar i;
|
321 |
|
|
generate
|
322 |
|
|
for (i=0; i < NO_OF_LANES; i= i+2)
|
323 |
|
|
begin: GTD
|
324 |
|
|
GTP_DUAL #
|
325 |
|
|
|
326 |
|
|
(
|
327 |
|
|
.SIM_MODE ("FAST" ),
|
328 |
|
|
.SIM_RECEIVER_DETECT_PASS0 ("TRUE" ),
|
329 |
|
|
.SIM_RECEIVER_DETECT_PASS1 ("TRUE" ),
|
330 |
|
|
.SIM_GTPRESET_SPEEDUP (1 ),
|
331 |
|
|
.AC_CAP_DIS_0 ("FALSE" ),
|
332 |
|
|
.AC_CAP_DIS_1 ("FALSE" ),
|
333 |
|
|
.ALIGN_COMMA_WORD_0 (1 ),
|
334 |
|
|
.ALIGN_COMMA_WORD_1 (1 ),
|
335 |
|
|
.CHAN_BOND_1_MAX_SKEW_0 (7 ),
|
336 |
|
|
.CHAN_BOND_1_MAX_SKEW_1 (7 ),
|
337 |
|
|
.CHAN_BOND_2_MAX_SKEW_0 (7 ),
|
338 |
|
|
.CHAN_BOND_2_MAX_SKEW_1 (7 ),
|
339 |
|
|
.CHAN_BOND_LEVEL_0 (NO_OF_LANES==1?0:NO_OF_LANES-(i+1)),
|
340 |
|
|
.CHAN_BOND_LEVEL_1 (NO_OF_LANES==1?0:NO_OF_LANES-(i+2)),
|
341 |
|
|
.CHAN_BOND_MODE_0 (NO_OF_LANES==1?"OFF":(i==0)?"MASTER":"SLAVE"),
|
342 |
|
|
.CHAN_BOND_MODE_1 (NO_OF_LANES==1?"OFF":"SLAVE"),
|
343 |
|
|
.CHAN_BOND_SEQ_2_USE_0 ("TRUE" ),
|
344 |
|
|
.CHAN_BOND_SEQ_2_USE_1 ("TRUE" ),
|
345 |
|
|
.CHAN_BOND_SEQ_LEN_0 (4 ),
|
346 |
|
|
.CHAN_BOND_SEQ_LEN_1 (4 ),
|
347 |
|
|
.CLK25_DIVIDER (CLK25_DIVIDER ),
|
348 |
|
|
.CLKINDC_B ("TRUE" ),
|
349 |
|
|
.CLK_CORRECT_USE_0 ("TRUE" ),
|
350 |
|
|
.CLK_CORRECT_USE_1 ("TRUE" ),
|
351 |
|
|
.CLK_COR_ADJ_LEN_0 (1 ),
|
352 |
|
|
.CLK_COR_ADJ_LEN_1 (1 ),
|
353 |
|
|
.CLK_COR_DET_LEN_0 (1 ),
|
354 |
|
|
.CLK_COR_DET_LEN_1 (1 ),
|
355 |
|
|
.CLK_COR_INSERT_IDLE_FLAG_0 ("FALSE" ),
|
356 |
|
|
.CLK_COR_INSERT_IDLE_FLAG_1 ("FALSE" ),
|
357 |
|
|
.CLK_COR_KEEP_IDLE_0 ("FALSE" ),
|
358 |
|
|
.CLK_COR_KEEP_IDLE_1 ("FALSE" ),
|
359 |
|
|
.CLK_COR_MAX_LAT_0 (18 ),
|
360 |
|
|
.CLK_COR_MAX_LAT_1 (18 ),
|
361 |
|
|
.CLK_COR_MIN_LAT_0 (16 ),
|
362 |
|
|
.CLK_COR_MIN_LAT_1 (16 ),
|
363 |
|
|
.CLK_COR_PRECEDENCE_0 ("TRUE" ),
|
364 |
|
|
.CLK_COR_PRECEDENCE_1 ("TRUE" ),
|
365 |
|
|
.CLK_COR_REPEAT_WAIT_0 (5 ),
|
366 |
|
|
.CLK_COR_REPEAT_WAIT_1 (5 ),
|
367 |
|
|
.CLK_COR_SEQ_2_USE_0 ("FALSE" ),
|
368 |
|
|
.CLK_COR_SEQ_2_USE_1 ("FALSE" ),
|
369 |
|
|
.COMMA_DOUBLE_0 ("FALSE" ),
|
370 |
|
|
.COMMA_DOUBLE_1 ("FALSE" ),
|
371 |
|
|
.DEC_MCOMMA_DETECT_0 ("TRUE" ),
|
372 |
|
|
.DEC_MCOMMA_DETECT_1 ("TRUE" ),
|
373 |
|
|
.DEC_PCOMMA_DETECT_0 ("TRUE" ),
|
374 |
|
|
.DEC_PCOMMA_DETECT_1 ("TRUE" ),
|
375 |
|
|
.DEC_VALID_COMMA_ONLY_0 ("TRUE" ),
|
376 |
|
|
.DEC_VALID_COMMA_ONLY_1 ("TRUE" ),
|
377 |
|
|
.MCOMMA_DETECT_0 ("TRUE" ),
|
378 |
|
|
.MCOMMA_DETECT_1 ("TRUE" ),
|
379 |
|
|
.OOB_CLK_DIVIDER (4 ),
|
380 |
|
|
.OVERSAMPLE_MODE ("FALSE" ),
|
381 |
|
|
.PCI_EXPRESS_MODE_0 ("TRUE" ),
|
382 |
|
|
.PCI_EXPRESS_MODE_1 ("TRUE" ),
|
383 |
|
|
.PCOMMA_DETECT_0 ("TRUE" ),
|
384 |
|
|
.PCOMMA_DETECT_1 ("TRUE" ),
|
385 |
|
|
.PLL_DIVSEL_FB (PLL_DIVSEL_FB ),
|
386 |
|
|
.PLL_DIVSEL_REF (PLL_DIVSEL_REF ),
|
387 |
|
|
.PLL_RXDIVSEL_OUT_0 (1 ),
|
388 |
|
|
.PLL_RXDIVSEL_OUT_1 (1 ),
|
389 |
|
|
.PLL_SATA_0 ("FALSE" ),
|
390 |
|
|
.PLL_SATA_1 ("FALSE" ),
|
391 |
|
|
.PLL_TXDIVSEL_COMM_OUT (1 ),
|
392 |
|
|
.PLL_TXDIVSEL_OUT_0 (1 ),
|
393 |
|
|
.PLL_TXDIVSEL_OUT_1 (1 ),
|
394 |
|
|
|
395 |
|
|
.RCV_TERM_GND_0 ("TRUE" ),
|
396 |
|
|
.RCV_TERM_GND_1 ("TRUE" ),
|
397 |
|
|
.RCV_TERM_MID_0 ("TRUE" ),
|
398 |
|
|
.RCV_TERM_MID_1 ("TRUE" ),
|
399 |
|
|
.RCV_TERM_VTTRX_0 ("FALSE" ),
|
400 |
|
|
.RCV_TERM_VTTRX_1 ("FALSE" ),
|
401 |
|
|
.RX_BUFFER_USE_0 ("TRUE" ),
|
402 |
|
|
.RX_BUFFER_USE_1 ("TRUE" ),
|
403 |
|
|
.RX_DECODE_SEQ_MATCH_0 ("TRUE" ),
|
404 |
|
|
.RX_DECODE_SEQ_MATCH_1 ("TRUE" ),
|
405 |
|
|
.RX_LOSS_OF_SYNC_FSM_0 ("FALSE" ),
|
406 |
|
|
.RX_LOSS_OF_SYNC_FSM_1 ("FALSE" ),
|
407 |
|
|
.RX_LOS_INVALID_INCR_0 (8 ),
|
408 |
|
|
.RX_LOS_INVALID_INCR_1 (8 ),
|
409 |
|
|
.RX_LOS_THRESHOLD_0 (128 ),
|
410 |
|
|
.RX_LOS_THRESHOLD_1 (128 ),
|
411 |
|
|
.RX_SLIDE_MODE_0 ("PCS" ),
|
412 |
|
|
.RX_SLIDE_MODE_1 ("PCS" ),
|
413 |
|
|
.RX_STATUS_FMT_0 ("PCIE" ),
|
414 |
|
|
.RX_STATUS_FMT_1 ("PCIE" ),
|
415 |
|
|
.RX_XCLK_SEL_0 ("RXREC" ),
|
416 |
|
|
.RX_XCLK_SEL_1 ("RXREC" ),
|
417 |
|
|
.SATA_MAX_BURST_0 (7 ),
|
418 |
|
|
.SATA_MAX_BURST_1 (7 ),
|
419 |
|
|
.SATA_MAX_INIT_0 (22 ),
|
420 |
|
|
.SATA_MAX_INIT_1 (22 ),
|
421 |
|
|
.SATA_MAX_WAKE_0 (7 ),
|
422 |
|
|
.SATA_MAX_WAKE_1 (7 ),
|
423 |
|
|
.SATA_MIN_BURST_0 (4 ),
|
424 |
|
|
.SATA_MIN_BURST_1 (4 ),
|
425 |
|
|
.SATA_MIN_INIT_0 (12 ),
|
426 |
|
|
.SATA_MIN_INIT_1 (12 ),
|
427 |
|
|
.SATA_MIN_WAKE_0 (4 ),
|
428 |
|
|
.SATA_MIN_WAKE_1 (4 ),
|
429 |
|
|
.TERMINATION_IMP_0 (50 ),
|
430 |
|
|
.TERMINATION_IMP_1 (50 ),
|
431 |
|
|
.TERMINATION_OVRD ("FALSE" ),
|
432 |
|
|
.TX_BUFFER_USE_0 ("TRUE" ),
|
433 |
|
|
.TX_BUFFER_USE_1 ("TRUE" ),
|
434 |
|
|
.TX_DIFF_BOOST_0 (TXDIFFBOOST ), //TRUE
|
435 |
|
|
.TX_DIFF_BOOST_1 (TXDIFFBOOST ), //TRUE
|
436 |
|
|
.TX_SYNC_FILTERB (1 ),
|
437 |
|
|
.TX_XCLK_SEL_0 ("TXOUT" ),
|
438 |
|
|
.TX_XCLK_SEL_1 ("TXOUT" ),
|
439 |
|
|
.CHAN_BOND_SEQ_1_1_0 (10'b0001001010 ), //D10.2 (end TS1)
|
440 |
|
|
.CHAN_BOND_SEQ_1_1_1 (10'b0001001010 ), //D10.2 (end TS1)
|
441 |
|
|
.CHAN_BOND_SEQ_1_2_0 (10'b0001001010 ), //D10.2 (end TS1)
|
442 |
|
|
.CHAN_BOND_SEQ_1_2_1 (10'b0001001010 ), //D10.2 (end TS1)
|
443 |
|
|
.CHAN_BOND_SEQ_1_3_0 (10'b0001001010 ), //D10.2 (end TS1)
|
444 |
|
|
.CHAN_BOND_SEQ_1_3_1 (10'b0001001010 ), //D10.2 (end TS1)
|
445 |
|
|
.CHAN_BOND_SEQ_1_4_0 (10'b0110111100 ), //K28.5 (COM)
|
446 |
|
|
.CHAN_BOND_SEQ_1_4_1 (10'b0110111100 ), //K28.5 (COM)
|
447 |
|
|
.CHAN_BOND_SEQ_1_ENABLE_0 (4'b1111 ), //Look for 4 byte seq
|
448 |
|
|
.CHAN_BOND_SEQ_1_ENABLE_1 (4'b1111 ), //Look for 4 byte seq
|
449 |
|
|
.CHAN_BOND_SEQ_2_1_0 (10'b0100111100 ), //K28.1 (FTS)
|
450 |
|
|
.CHAN_BOND_SEQ_2_1_1 (10'b0100111100 ), //K28.1 (FTS)
|
451 |
|
|
.CHAN_BOND_SEQ_2_2_0 (10'b0100111100 ), //K28.1 (FTS)
|
452 |
|
|
.CHAN_BOND_SEQ_2_2_1 (10'b0100111100 ), //K28.1 (FTS)
|
453 |
|
|
.CHAN_BOND_SEQ_2_3_0 (10'b0110111100 ), //K28.5 (COM)
|
454 |
|
|
.CHAN_BOND_SEQ_2_3_1 (10'b0110111100 ), //K28.5 (COM)
|
455 |
|
|
.CHAN_BOND_SEQ_2_4_0 (10'b0100011100 ), //K28.0 (SKP)
|
456 |
|
|
.CHAN_BOND_SEQ_2_4_1 (10'b0100011100 ), //K28.0 (SKP)
|
457 |
|
|
.CHAN_BOND_SEQ_2_ENABLE_0 (4'b1111 ), //Look for 4 byte seq
|
458 |
|
|
.CHAN_BOND_SEQ_2_ENABLE_1 (4'b1111 ), //Look for 4 byte seq
|
459 |
|
|
.CLK_COR_SEQ_1_1_0 (10'b0100011100 ), //K28.0 (SKP)
|
460 |
|
|
.CLK_COR_SEQ_1_1_1 (10'b0100011100 ), //K28.0 (SKP)
|
461 |
|
|
.CLK_COR_SEQ_1_2_0 (10'b0000000000 ),
|
462 |
|
|
.CLK_COR_SEQ_1_2_1 (10'b0000000000 ),
|
463 |
|
|
.CLK_COR_SEQ_1_3_0 (10'b0000000000 ),
|
464 |
|
|
.CLK_COR_SEQ_1_3_1 (10'b0000000000 ),
|
465 |
|
|
.CLK_COR_SEQ_1_4_0 (10'b0000000000 ),
|
466 |
|
|
.CLK_COR_SEQ_1_4_1 (10'b0000000000 ),
|
467 |
|
|
.CLK_COR_SEQ_1_ENABLE_0 (4'b1111 ),
|
468 |
|
|
.CLK_COR_SEQ_1_ENABLE_1 (4'b1111 ),
|
469 |
|
|
.CLK_COR_SEQ_2_1_0 (10'b0000000000 ),
|
470 |
|
|
.CLK_COR_SEQ_2_1_1 (10'b0000000000 ),
|
471 |
|
|
.CLK_COR_SEQ_2_2_0 (10'b0000000000 ),
|
472 |
|
|
.CLK_COR_SEQ_2_2_1 (10'b0000000000 ),
|
473 |
|
|
.CLK_COR_SEQ_2_3_0 (10'b0000000000 ),
|
474 |
|
|
.CLK_COR_SEQ_2_3_1 (10'b0000000000 ),
|
475 |
|
|
.CLK_COR_SEQ_2_4_0 (10'b0000000000 ),
|
476 |
|
|
.CLK_COR_SEQ_2_4_1 (10'b0000000000 ),
|
477 |
|
|
.CLK_COR_SEQ_2_ENABLE_0 (4'b1111 ),
|
478 |
|
|
.CLK_COR_SEQ_2_ENABLE_1 (4'b1111 ),
|
479 |
|
|
.COMMA_10B_ENABLE_0 (10'b1111111111 ),
|
480 |
|
|
.COMMA_10B_ENABLE_1 (10'b1111111111 ),
|
481 |
|
|
.COM_BURST_VAL_0 (4'b1111 ),
|
482 |
|
|
.COM_BURST_VAL_1 (4'b1111 ),
|
483 |
|
|
.MCOMMA_10B_VALUE_0 (10'b1010000011 ),
|
484 |
|
|
.MCOMMA_10B_VALUE_1 (10'b1010000011 ),
|
485 |
|
|
.OOBDETECT_THRESHOLD_0 (3'b010 ),
|
486 |
|
|
.OOBDETECT_THRESHOLD_1 (3'b010 ),
|
487 |
|
|
.PCOMMA_10B_VALUE_0 (10'b0101111100 ),
|
488 |
|
|
.PCOMMA_10B_VALUE_1 (10'b0101111100 ),
|
489 |
|
|
.PCS_COM_CFG ( (PLL_DIVSEL_FB == 1)? 28'h1680a07 : 28'h1680a0e ),
|
490 |
|
|
.PMA_CDR_SCAN_0 (27'h6C07640 ),
|
491 |
|
|
.PMA_CDR_SCAN_1 (27'h6C07640 ),
|
492 |
|
|
.PMA_RX_CFG_0 (25'h09F0089 ),
|
493 |
|
|
.PMA_RX_CFG_1 (25'h09F0089 ),
|
494 |
|
|
.PRBS_ERR_THRESHOLD_0 (32'h00000001 ),
|
495 |
|
|
.PRBS_ERR_THRESHOLD_1 (32'h00000001 ),
|
496 |
|
|
.SATA_BURST_VAL_0 (3'b100 ),
|
497 |
|
|
.SATA_BURST_VAL_1 (3'b100 ),
|
498 |
|
|
.SATA_IDLE_VAL_0 (3'b011 ),
|
499 |
|
|
.SATA_IDLE_VAL_1 (3'b011 ),
|
500 |
|
|
.TERMINATION_CTRL (5'b10100 ),
|
501 |
|
|
.TRANS_TIME_FROM_P2_0 (16'h003C ),
|
502 |
|
|
.TRANS_TIME_FROM_P2_1 (16'h003C ),
|
503 |
|
|
.TRANS_TIME_NON_P2_0 (16'h0019 ),
|
504 |
|
|
.TRANS_TIME_NON_P2_1 (16'h0019 ),
|
505 |
|
|
.TRANS_TIME_TO_P2_0 (16'h0064 ),
|
506 |
|
|
.TRANS_TIME_TO_P2_1 (16'h0064 ),
|
507 |
|
|
.TXRX_INVERT_0 (5'b00000 ),
|
508 |
|
|
.TXRX_INVERT_1 (5'b00000 )
|
509 |
|
|
|
510 |
|
|
|
511 |
|
|
)
|
512 |
|
|
|
513 |
|
|
GT_i(
|
514 |
|
|
// GT_DUAL outputs
|
515 |
|
|
.DO(gt_do[16*i+15:16*i]),
|
516 |
|
|
.DRDY(gt_drdy[i]),
|
517 |
|
|
.PHYSTATUS0(gt_rx_phy_status_reg[i+0]),
|
518 |
|
|
.PHYSTATUS1(gt_rx_phy_status_reg[i+1]),
|
519 |
|
|
.PLLLKDET(plllkdet_out[i/2]),
|
520 |
|
|
.REFCLKOUT(gt_refclk_out[i]),
|
521 |
|
|
.RESETDONE0(resetdone[i]),
|
522 |
|
|
.RESETDONE1(resetdone[i+1]),
|
523 |
|
|
.RXBUFSTATUS0(),
|
524 |
|
|
.RXBUFSTATUS1(),
|
525 |
|
|
.RXBYTEISALIGNED0(rxbyteisaligned[i]),
|
526 |
|
|
.RXBYTEISALIGNED1(rxbyteisaligned[i+1]),
|
527 |
|
|
.RXBYTEREALIGN0(),
|
528 |
|
|
.RXBYTEREALIGN1(),
|
529 |
|
|
.RXCHANBONDSEQ0(rxchanbondseq[i]),
|
530 |
|
|
.RXCHANBONDSEQ1(rxchanbondseq[i+1]),
|
531 |
|
|
.RXCHANISALIGNED0(gt_rx_chanisaligned_reg[i+0]),
|
532 |
|
|
.RXCHANISALIGNED1(gt_rx_chanisaligned_reg[i+1]),
|
533 |
|
|
.RXCHANREALIGN0(),
|
534 |
|
|
.RXCHANREALIGN1(),
|
535 |
|
|
.RXCHARISCOMMA0(),
|
536 |
|
|
.RXCHARISCOMMA1(),
|
537 |
|
|
.RXCHARISK0({float_rx_data_k[i+0],gt_rx_data_k_reg[i+0]}),
|
538 |
|
|
.RXCHARISK1({float_rx_data_k[i+1],gt_rx_data_k_reg[i+1]}),
|
539 |
|
|
.RXCHBONDO0(gt_rx_chbond_o[i]),
|
540 |
|
|
.RXCHBONDO1(gt_rx_chbond_o[i+1]),
|
541 |
|
|
.RXCLKCORCNT0(),
|
542 |
|
|
.RXCLKCORCNT1(),
|
543 |
|
|
.RXCOMMADET0(),
|
544 |
|
|
.RXCOMMADET1(),
|
545 |
|
|
.RXDATA0({float_rx_data[8*i+7:8*i],gt_rx_data_reg[8*i+7:8*i]}),
|
546 |
|
|
.RXDATA1({float_rx_data[8*i+15:8*i+8],gt_rx_data_reg[8*i+15:8*i+8]}),
|
547 |
|
|
.RXDISPERR0(),
|
548 |
|
|
.RXDISPERR1(),
|
549 |
|
|
.RXELECIDLE0(gt_rx_elec_idle_reg[i+0]),
|
550 |
|
|
.RXELECIDLE1(gt_rx_elec_idle_reg[i+1]),
|
551 |
|
|
.RXLOSSOFSYNC0(),
|
552 |
|
|
.RXLOSSOFSYNC1(),
|
553 |
|
|
.RXNOTINTABLE0(),
|
554 |
|
|
.RXNOTINTABLE1(),
|
555 |
|
|
.RXOVERSAMPLEERR0(),
|
556 |
|
|
.RXOVERSAMPLEERR1(),
|
557 |
|
|
.RXPRBSERR0(),
|
558 |
|
|
.RXPRBSERR1(),
|
559 |
|
|
.RXRECCLK0(),
|
560 |
|
|
.RXRECCLK1(),
|
561 |
|
|
.RXRUNDISP0(),
|
562 |
|
|
.RXRUNDISP1(),
|
563 |
|
|
.RXSTATUS0(gt_rx_status_reg[3*i+2:3*i]),
|
564 |
|
|
.RXSTATUS1(gt_rx_status_reg[3*i+5:3*i+3]),
|
565 |
|
|
.RXVALID0(gt_rx_valid_reg[i+0]),
|
566 |
|
|
.RXVALID1(gt_rx_valid_reg[i+1]),
|
567 |
|
|
.TXBUFSTATUS0(),
|
568 |
|
|
.TXBUFSTATUS1(),
|
569 |
|
|
.TXKERR0(),
|
570 |
|
|
.TXKERR1(),
|
571 |
|
|
.TXN0(GT_TXN[i+0]),
|
572 |
|
|
.TXN1(GT_TXN[i+1]),
|
573 |
|
|
.TXOUTCLK0(gt_clk[i]),
|
574 |
|
|
.TXOUTCLK1(),
|
575 |
|
|
.TXP0(GT_TXP[i+0]),
|
576 |
|
|
.TXP1(GT_TXP[i+1]),
|
577 |
|
|
.TXRUNDISP0(),
|
578 |
|
|
.TXRUNDISP1(),
|
579 |
|
|
// GT_DUAL inputs
|
580 |
|
|
.CLKIN(refclk),
|
581 |
|
|
.DADDR(gt_daddr[7*i+6:7*i]),
|
582 |
|
|
.DCLK(gt_dclk),
|
583 |
|
|
.DEN(gt_den[i]),
|
584 |
|
|
.DI(gt_di[16*i+15:16*i]),
|
585 |
|
|
.DWE(gt_dwen[i]),
|
586 |
|
|
.GTPRESET(gtreset),
|
587 |
|
|
.INTDATAWIDTH(1'b1),
|
588 |
|
|
.LOOPBACK0(3'b000),
|
589 |
|
|
.LOOPBACK1( (NO_OF_LANES == 1) ? 3'b010 : 3'b000),
|
590 |
|
|
.PLLLKDETEN(1'b1),
|
591 |
|
|
.PLLPOWERDOWN(1'b0),
|
592 |
|
|
.PRBSCNTRESET0(1'b0),
|
593 |
|
|
.PRBSCNTRESET1(1'b0),
|
594 |
|
|
.REFCLKPWRDNB(1'b1),
|
595 |
|
|
.RXBUFRESET0(1'b0),
|
596 |
|
|
.RXBUFRESET1(1'b0),
|
597 |
|
|
.RXCDRRESET0(gt_pipe_reset_reg[i+0] & ~rst_pcie),
|
598 |
|
|
.RXCDRRESET1(gt_pipe_reset_reg[i+1] & ~rst_pcie),
|
599 |
|
|
.RXCHBONDI0(gt_rx_chbond_i[i]),
|
600 |
|
|
.RXCHBONDI1(gt_rx_chbond_i[i+1]),
|
601 |
|
|
.RXCOMMADETUSE0(1'b1),
|
602 |
|
|
.RXCOMMADETUSE1(1'b1),
|
603 |
|
|
.RXDATAWIDTH0(1'b0),
|
604 |
|
|
.RXDATAWIDTH1(1'b0),
|
605 |
|
|
.RXDEC8B10BUSE0(1'b1),
|
606 |
|
|
.RXDEC8B10BUSE1(1'b1),
|
607 |
|
|
.RXENCHANSYNC0(gt_rx_enchansync[i]),
|
608 |
|
|
.RXENCHANSYNC1(gt_rx_enchansync[i+1]),
|
609 |
|
|
.RXENEQB0(1'b1),
|
610 |
|
|
.RXENEQB1(1'b1),
|
611 |
|
|
.RXENMCOMMAALIGN0(1'b1),
|
612 |
|
|
.RXENMCOMMAALIGN1(1'b1),
|
613 |
|
|
.RXENPCOMMAALIGN0(1'b1),
|
614 |
|
|
.RXENPCOMMAALIGN1(1'b1),
|
615 |
|
|
.RXENPRBSTST0(2'b00),
|
616 |
|
|
.RXENPRBSTST1(2'b00),
|
617 |
|
|
.RXENSAMPLEALIGN0(1'b0),
|
618 |
|
|
.RXENSAMPLEALIGN1(1'b0),
|
619 |
|
|
.RXEQMIX0(2'b01),
|
620 |
|
|
.RXEQMIX1(2'b01),
|
621 |
|
|
.RXEQPOLE0(4'b0000),
|
622 |
|
|
.RXEQPOLE1(4'b0000),
|
623 |
|
|
.RXN0(GT_RXN[i+0]),
|
624 |
|
|
.RXN1(GT_RXN[i+1]),
|
625 |
|
|
.RXP0(GT_RXP[i+0]),
|
626 |
|
|
.RXP1(GT_RXP[i+1]),
|
627 |
|
|
.RXPMASETPHASE0(1'b0),
|
628 |
|
|
.RXPMASETPHASE1(1'b0),
|
629 |
|
|
.RXPOLARITY0(gt_rx_polarity_reg[i+0]),
|
630 |
|
|
.RXPOLARITY1(gt_rx_polarity_reg[i+1]),
|
631 |
|
|
.RXPOWERDOWN0(gt_rx_power_down_reg[2*i+1:2*i]),
|
632 |
|
|
.RXPOWERDOWN1(gt_rx_power_down_reg[2*i+3:2*i+2]),
|
633 |
|
|
.RXRESET0(rxreset_i & ~rst_pcie),
|
634 |
|
|
.RXRESET1(rxreset_i & ~rst_pcie),
|
635 |
|
|
.RXSLIDE0(1'b0),
|
636 |
|
|
.RXSLIDE1(1'b0),
|
637 |
|
|
.RXUSRCLK0(gt_usrclk),
|
638 |
|
|
.RXUSRCLK1(gt_usrclk),
|
639 |
|
|
.RXUSRCLK20(gt_usrclk),
|
640 |
|
|
.RXUSRCLK21(gt_usrclk),
|
641 |
|
|
|
642 |
|
|
.RXELECIDLERESET0(gt_rx_elec_idle_reset[i]),
|
643 |
|
|
.RXELECIDLERESET1(gt_rx_elec_idle_reset[i+1]),
|
644 |
|
|
.RXENELECIDLERESETB(gt_rx_en_elec_idle_resetb[i/2]),
|
645 |
|
|
|
646 |
|
|
|
647 |
|
|
.TXBUFDIFFCTRL0(gt_txbuffctrl_0), //3'b100
|
648 |
|
|
.TXBUFDIFFCTRL1(gt_txbuffctrl_1), //3'b100
|
649 |
|
|
.TXBYPASS8B10B0(2'b00),
|
650 |
|
|
.TXBYPASS8B10B1(2'b00),
|
651 |
|
|
.TXCHARDISPMODE0({1'b0,gt_tx_compliance_reg[i+0]}),
|
652 |
|
|
.TXCHARDISPMODE1({1'b0,gt_tx_compliance_reg[i+1]}),
|
653 |
|
|
.TXCHARDISPVAL0(2'b00),
|
654 |
|
|
.TXCHARDISPVAL1(2'b00),
|
655 |
|
|
.TXCHARISK0({1'b0,gt_tx_data_k_reg[i+0]}),
|
656 |
|
|
.TXCHARISK1({1'b0,gt_tx_data_k_reg[i+1]}),
|
657 |
|
|
.TXCOMSTART0(1'b0),
|
658 |
|
|
.TXCOMSTART1(1'b0),
|
659 |
|
|
.TXCOMTYPE0(1'b0),
|
660 |
|
|
.TXCOMTYPE1(1'b0),
|
661 |
|
|
.TXDATA0({8'b0,gt_tx_data_reg[8*i+7:8*i]}),
|
662 |
|
|
.TXDATA1({8'b0,gt_tx_data_reg[8*i+15:8*i+8]}),
|
663 |
|
|
.TXDATAWIDTH0(1'b0),
|
664 |
|
|
.TXDATAWIDTH1(1'b0),
|
665 |
|
|
.TXDETECTRX0(gt_tx_detect_rx_loopback_reg[i+0]),
|
666 |
|
|
.TXDETECTRX1(gt_tx_detect_rx_loopback_reg[i+1]),
|
667 |
|
|
.TXDIFFCTRL0(gt_txdiffctrl_0), //3'b100
|
668 |
|
|
.TXDIFFCTRL1(gt_txdiffctrl_1), //3'b100
|
669 |
|
|
.TXELECIDLE0(gt_tx_elec_idle_reg[i+0]),
|
670 |
|
|
.TXELECIDLE1(gt_tx_elec_idle_reg[i+1]),
|
671 |
|
|
.TXENC8B10BUSE0(1'b1),
|
672 |
|
|
.TXENC8B10BUSE1(1'b1),
|
673 |
|
|
.TXENPMAPHASEALIGN(TXENPMAPHASEALIGN),
|
674 |
|
|
.TXENPRBSTST0(2'b00),
|
675 |
|
|
.TXENPRBSTST1(2'b00),
|
676 |
|
|
.TXINHIBIT0(1'b0),
|
677 |
|
|
.TXINHIBIT1(1'b0),
|
678 |
|
|
.TXPMASETPHASE(TXPMASETPHASE),
|
679 |
|
|
.TXPOLARITY0(1'b0),
|
680 |
|
|
.TXPOLARITY1(1'b0),
|
681 |
|
|
.TXPOWERDOWN0(gt_tx_power_down_reg[2*i+1:2*i]),
|
682 |
|
|
.TXPOWERDOWN1(gt_tx_power_down_reg[2*i+3:2*i+2]),
|
683 |
|
|
.TXPREEMPHASIS0(gt_txpreemphesis_0), //3'b111
|
684 |
|
|
.TXPREEMPHASIS1(gt_txpreemphesis_1), //3'b111
|
685 |
|
|
.TXRESET0(mgt_txreset & ~rst_pcie),
|
686 |
|
|
.TXRESET1(mgt_txreset & ~rst_pcie),
|
687 |
|
|
.TXUSRCLK0(gt_usrclk),
|
688 |
|
|
.TXUSRCLK1(gt_usrclk),
|
689 |
|
|
.TXUSRCLK20(gt_usrclk),
|
690 |
|
|
.TXUSRCLK21(gt_usrclk),
|
691 |
|
|
|
692 |
|
|
.GTPTEST(4'b0)
|
693 |
|
|
);
|
694 |
|
|
|
695 |
|
|
end
|
696 |
|
|
endgenerate
|
697 |
|
|
|
698 |
|
|
|
699 |
|
|
//---------------------------- TOGGLE TXRESET ------------------------------
|
700 |
|
|
always @(posedge gt_usrclk)
|
701 |
|
|
begin
|
702 |
|
|
if (sync_done)
|
703 |
|
|
begin
|
704 |
|
|
if (mgt_txreset_cnt < 2'b11)
|
705 |
|
|
begin
|
706 |
|
|
mgt_txreset <= 1'b1;
|
707 |
|
|
mgt_txreset_cnt <= mgt_txreset_cnt + 1;
|
708 |
|
|
end
|
709 |
|
|
else
|
710 |
|
|
mgt_txreset <= 1'b0;
|
711 |
|
|
end
|
712 |
|
|
else
|
713 |
|
|
begin
|
714 |
|
|
mgt_txreset <= 1'b0;
|
715 |
|
|
mgt_txreset_cnt <= 2'b0;
|
716 |
|
|
end
|
717 |
|
|
end
|
718 |
|
|
|
719 |
|
|
|
720 |
|
|
|
721 |
|
|
|
722 |
|
|
|
723 |
|
|
//---------------------------- TXSYNC module ------------------------------
|
724 |
|
|
// The TXSYNC module performs phase synchronization for all the active TX datapaths. It
|
725 |
|
|
// waits for the user clocks to be stable, then drives the phase align signals on each
|
726 |
|
|
// GTP. When phase synchronization is complete, it asserts SYNC_DONE
|
727 |
|
|
|
728 |
|
|
// Include the TX_SYNC module in your own design to perform phase synchronization if
|
729 |
|
|
// your protocol bypasses the TX Buffers
|
730 |
|
|
|
731 |
|
|
TX_SYNC_GTP tile0_txsync_i
|
732 |
|
|
(
|
733 |
|
|
.TXENPMAPHASEALIGN(TXENPMAPHASEALIGN),
|
734 |
|
|
.TXPMASETPHASE(TXPMASETPHASE),
|
735 |
|
|
.SYNC_DONE(sync_done),
|
736 |
|
|
.USER_CLK(gt_usrclk),
|
737 |
|
|
.RESET(tx_sync_reset)
|
738 |
|
|
//.RESET(~resetdone[0])
|
739 |
|
|
|
740 |
|
|
);
|
741 |
|
|
|
742 |
|
|
|
743 |
|
|
always @ (posedge gt_usrclk or posedge gtreset) begin
|
744 |
|
|
if (gtreset === 1'b1 ) begin
|
745 |
|
|
rst_pcie <= 1'b1;
|
746 |
|
|
end else if (sync_done === 1'b1) begin
|
747 |
|
|
rst_pcie <= 1'b0;
|
748 |
|
|
end else begin
|
749 |
|
|
rst_pcie <= 1'b1;
|
750 |
|
|
end
|
751 |
|
|
end
|
752 |
|
|
|
753 |
|
|
assign tx_sync_reset = (pcie_reset == 1'b1) ? (~clock_lock) : 1'b0;
|
754 |
|
|
assign pcie_reset = rst_pcie;
|
755 |
|
|
|
756 |
|
|
|
757 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
758 |
|
|
// Logic for enabling L0s state
|
759 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
760 |
|
|
|
761 |
|
|
|
762 |
|
|
always @(posedge gt_usrclk or posedge rst_init) begin
|
763 |
|
|
if (rst_init) begin
|
764 |
|
|
m1_delayed_elec_idle_reset <= 1'b0;
|
765 |
|
|
m2_delayed_elec_idle_reset <= 1'b0;
|
766 |
|
|
delayed_elec_idle_reset <= 1'b0;
|
767 |
|
|
rxreset <= 1'b0;
|
768 |
|
|
end else begin
|
769 |
|
|
// synchronize elec_idle_reset
|
770 |
|
|
m1_delayed_elec_idle_reset <= gt_rx_elec_idle_reset[0];
|
771 |
|
|
m2_delayed_elec_idle_reset <= m1_delayed_elec_idle_reset;
|
772 |
|
|
delayed_elec_idle_reset <= m2_delayed_elec_idle_reset;
|
773 |
|
|
// create a one-cycle pulse on rxreset
|
774 |
|
|
rxreset <= ~m2_delayed_elec_idle_reset & delayed_elec_idle_reset;
|
775 |
|
|
end
|
776 |
|
|
end
|
777 |
|
|
|
778 |
|
|
assign rxreset_i = rxreset;
|
779 |
|
|
|
780 |
|
|
// Latch for CDRRESET for L0s
|
781 |
|
|
wire [7:0] icdrreset;
|
782 |
|
|
reg [7:0] cdrreset = 0;
|
783 |
|
|
|
784 |
|
|
generate
|
785 |
|
|
genvar j;
|
786 |
|
|
for (j=0; j < 8; j= j+1)
|
787 |
|
|
begin: gen_cdrreset
|
788 |
|
|
|
789 |
|
|
if (j < NO_OF_LANES) begin: for_GT
|
790 |
|
|
assign icdrreset[j] = resetdone[j] & gt_rx_elec_idle_reg[j];
|
791 |
|
|
|
792 |
|
|
always @( icdrreset or gt_rx_valid_reg) begin : yes_latch
|
793 |
|
|
if ( icdrreset[j] & ~ gt_rx_valid_reg[j] ) begin
|
794 |
|
|
cdrreset[j] <= #50 1'b1;
|
795 |
|
|
end else if ( ~ icdrreset[j] ) begin
|
796 |
|
|
cdrreset[j] <= #50 1'b0;
|
797 |
|
|
end
|
798 |
|
|
end
|
799 |
|
|
|
800 |
|
|
assign gt_rx_elec_idle_reset[j] = cdrreset[j];
|
801 |
|
|
|
802 |
|
|
end else begin : for_tieoff
|
803 |
|
|
assign icdrreset[j] = 1'b0;
|
804 |
|
|
|
805 |
|
|
//synthesis translate_off
|
806 |
|
|
initial cdrreset[j] <= 1'b0;
|
807 |
|
|
//synthesis translate_on
|
808 |
|
|
|
809 |
|
|
assign gt_rx_elec_idle_reset[j] = 1'b0;
|
810 |
|
|
end
|
811 |
|
|
end
|
812 |
|
|
endgenerate
|
813 |
|
|
|
814 |
|
|
generate
|
815 |
|
|
genvar k;
|
816 |
|
|
for (k=0; k < 8; k= k+2)
|
817 |
|
|
begin: gen_resetb
|
818 |
|
|
assign gt_rx_en_elec_idle_resetb[k/2] = ~ ( cdrreset[k] | cdrreset[k+1]);
|
819 |
|
|
end
|
820 |
|
|
endgenerate
|
821 |
|
|
|
822 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
823 |
|
|
// Tying off signals on unused lanes
|
824 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
825 |
|
|
|
826 |
|
|
generate
|
827 |
|
|
if (NO_OF_LANES == 1 || NO_OF_LANES == 2) begin : laneslt4
|
828 |
|
|
assign plllkdet_out[3:1] = 3'b0;
|
829 |
|
|
end else if (NO_OF_LANES == 4) begin : laneseq4
|
830 |
|
|
assign plllkdet_out[3:2] = 2'b0;
|
831 |
|
|
end
|
832 |
|
|
endgenerate
|
833 |
|
|
|
834 |
|
|
|
835 |
|
|
endmodule
|