1 /*****************************************************************
2 -- (c) Copyright 2011 - 2013 Xilinx, Inc. All rights reserved.
4 -- This file contains confidential and proprietary information
5 -- of Xilinx, Inc. and is protected under U.S. and
6 -- international copyright and other intellectual property
10 -- This disclaimer is not a license and does not grant any
11 -- rights to the materials distributed herewith. Except as
12 -- otherwise provided in a valid license issued to you by
13 -- Xilinx, and to the maximum extent permitted by applicable
14 -- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15 -- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16 -- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17 -- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18 -- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19 -- (2) Xilinx shall not be liable (whether in contract or tort,
20 -- including negligence, or under any other theory of
21 -- liability) for any loss or damage of any kind or nature
22 -- related to, arising under or in connection with these
23 -- materials, including for any direct, or any indirect,
24 -- special, incidental, or consequential loss or damage
25 -- (including loss of data, profits, goodwill, or any type of
26 -- loss or damage suffered as a result of any action brought
27 -- by a third party) even if such damage or loss was
28 -- reasonably foreseeable or Xilinx had been advised of the
29 -- possibility of the same.
31 -- CRITICAL APPLICATIONS
32 -- Xilinx products are not designed or intended to be fail-
33 -- safe, or for use in any application requiring fail-safe
34 -- performance, such as life-support or safety devices or
35 -- systems, Class III medical devices, nuclear facilities,
36 -- applications related to the deployment of airbags, or any
37 -- other applications that could lead to death, personal
38 -- injury, or severe property or environmental damage
39 -- (individually and collectively, "Critical
40 -- Applications"). A Customer assumes the sole risk and
41 -- liability of any use of Xilinx products in Critical
42 -- Applications, subject only to applicable laws and
43 -- regulations governing limitations on product liability.
45 -- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46 -- PART OF THIS FILE AT ALL TIMES.
51 // Revision: $Id: //depot/icm/proj/common/head/rtl/v32_cmt/rtl/phy/byte_group_io.v#4 $
56 // This verilog file is a paramertizable I/O termination for
57 // the single byte lane.
58 // to create a N byte-lane wide phy.
61 // Date Engineer Description
62 // 04/01/2010 G. Martin Initial Checkin.
64 //////////////////////////////////////////////////////////////////
65 ******************************************************************/
71 parameter BITLANES =
12'b1111_1111_1111,
72 parameter BITLANES_OUTONLY =
12'b0000_0000_0000,
73 parameter PO_DATA_CTL =
"FALSE",
74 parameter OSERDES_DATA_RATE =
"DDR",
75 parameter OSERDES_DATA_WIDTH =
4,
76 parameter IDELAYE2_IDELAY_TYPE =
"VARIABLE",
77 parameter IDELAYE2_IDELAY_VALUE =
00,
78 parameter IODELAY_GRP =
"IODELAY_MIG",
79 // local usage only, don't pass down
80 parameter BUS_WIDTH =
12,
81 parameter SYNTHESIS =
"FALSE"
84 input [
9:
0]
mem_dq_in,
85 output [
BUS_WIDTH-
1:
0]
mem_dq_out,
86 output [
BUS_WIDTH-
1:
0]
mem_dq_ts,
90 output [(
4*
10)-
1:
0]
iserdes_dout,
// 2 extra 12-bit lanes not used
99 input [
1:
0]
oserdes_dqs,
100 input [
1:
0]
oserdes_dqsts,
101 input [(
4*
BUS_WIDTH)-
1:
0]
oserdes_dq,
102 input [
1:
0]
oserdes_dqts,
104 input oserdes_clk_delayed,
105 input oserdes_clkdiv,
109 input idelayctrl_refclk
117 localparam ISERDES_DQ_DATA_RATE =
"DDR";
118 localparam ISERDES_DQ_DATA_WIDTH =
4;
119 localparam ISERDES_DQ_DYN_CLKDIV_INV_EN =
"FALSE";
120 localparam ISERDES_DQ_DYN_CLK_INV_EN =
"FALSE";
121 localparam ISERDES_DQ_INIT_Q1 =
1'b0;
122 localparam ISERDES_DQ_INIT_Q2 =
1'b0;
123 localparam ISERDES_DQ_INIT_Q3 =
1'b0;
124 localparam ISERDES_DQ_INIT_Q4 =
1'b0;
125 localparam ISERDES_DQ_INTERFACE_TYPE =
"MEMORY_DDR3";
126 localparam ISERDES_NUM_CE =
2;
127 localparam ISERDES_DQ_IOBDELAY =
"IFD";
128 localparam ISERDES_DQ_OFB_USED =
"FALSE";
129 localparam ISERDES_DQ_SERDES_MODE =
"MASTER";
130 localparam ISERDES_DQ_SRVAL_Q1 =
1'b0;
131 localparam ISERDES_DQ_SRVAL_Q2 =
1'b0;
132 localparam ISERDES_DQ_SRVAL_Q3 =
1'b0;
133 localparam ISERDES_DQ_SRVAL_Q4 =
1'b0;
135 wire [
BUS_WIDTH-
1:
0]
data_in_dly;
136 wire [
BUS_WIDTH-
1:
0]
oserdes_dq_buf;
137 wire [
BUS_WIDTH-
1:
0]
oserdes_dqts_buf;
138 wire oserdes_dqs_buf;
139 wire oserdes_dqsts_buf;
143 assign mem_dq_out =
oserdes_dq_buf;
144 assign mem_dq_ts =
oserdes_dqts_buf;
145 assign data_in =
mem_dq_in;
147 assign mem_dqs_out =
oserdes_dqs_buf;
148 assign mem_dqs_ts =
oserdes_dqsts_buf;
149 assign dqs_to_phaser =
mem_dqs_in;
154 iserdes_clk_d <= #(
025)
iserdes_clk;
162 always @(
posedge phy_clk)
begin
169 always @(
posedge phy_clk)
begin
171 idelay_ld_rst <= #
1 1'b1;
173 idelay_ld_rst <= #
1 1'b0;
181 for (
i =
0;
i !=
10 &&
PO_DATA_CTL ==
"TRUE" ;
i=
i+
1)
begin :
input_
182 if (
BITLANES[
i] && !
BITLANES_OUTONLY[
i])
begin :
iserdes_dq_
185 .
DATA_RATE (
ISERDES_DQ_DATA_RATE),
186 .
DATA_WIDTH (
ISERDES_DQ_DATA_WIDTH),
187 .
DYN_CLKDIV_INV_EN (
ISERDES_DQ_DYN_CLKDIV_INV_EN),
188 .
DYN_CLK_INV_EN (
ISERDES_DQ_DYN_CLK_INV_EN),
189 .
INIT_Q1 (
ISERDES_DQ_INIT_Q1),
190 .
INIT_Q2 (
ISERDES_DQ_INIT_Q2),
191 .
INIT_Q3 (
ISERDES_DQ_INIT_Q3),
192 .
INIT_Q4 (
ISERDES_DQ_INIT_Q4),
193 .
INTERFACE_TYPE (
ISERDES_DQ_INTERFACE_TYPE),
194 .
NUM_CE (
ISERDES_NUM_CE),
195 .
IOBDELAY (
ISERDES_DQ_IOBDELAY),
196 .
OFB_USED (
ISERDES_DQ_OFB_USED),
197 .
SERDES_MODE (
ISERDES_DQ_SERDES_MODE),
198 .
SRVAL_Q1 (
ISERDES_DQ_SRVAL_Q1),
199 .
SRVAL_Q2 (
ISERDES_DQ_SRVAL_Q2),
200 .
SRVAL_Q3 (
ISERDES_DQ_SRVAL_Q3),
201 .
SRVAL_Q4 (
ISERDES_DQ_SRVAL_Q4)
206 .
Q1 (
iserdes_dout[
4*
i +
3]),
207 .
Q2 (
iserdes_dout[
4*
i +
2]),
208 .
Q3 (
iserdes_dout[
4*
i +
1]),
209 .
Q4 (
iserdes_dout[
4*
i +
0]),
218 .
CLK (
iserdes_clk_d),
219 .
CLKB (!
iserdes_clk_d),
220 .
CLKDIVP (
iserdes_clkdiv),
222 .
DDLY (
data_in_dly[
i]),
223 .
D (
data_in[
i]),
// dedicated route to iob for debugging
224 // or as needed, select with IOBDELAY
225 .
DYNCLKDIVSEL (
1'b0),
227 // NOTE: OCLK is not used in this design, but is required to meet
228 // a design rule check in map and bitgen. Do not disconnect it.
232 // .RST (iserdes_rst),
237 localparam IDELAYE2_CINVCTRL_SEL =
"FALSE";
238 localparam IDELAYE2_DELAY_SRC =
"IDATAIN";
239 localparam IDELAYE2_HIGH_PERFORMANCE_MODE =
"TRUE";
240 localparam IDELAYE2_PIPE_SEL =
"FALSE";
241 localparam IDELAYE2_ODELAY_TYPE =
"FIXED";
242 localparam IDELAYE2_REFCLK_FREQUENCY =
200.0;
243 localparam IDELAYE2_SIGNAL_PATTERN =
"DATA";
245 (* IODELAY_GROUP = IODELAY_GRP *)
247 .CINVCTRL_SEL ( IDELAYE2_CINVCTRL_SEL),
248 .DELAY_SRC ( IDELAYE2_DELAY_SRC),
249 .HIGH_PERFORMANCE_MODE ( IDELAYE2_HIGH_PERFORMANCE_MODE),
250 .IDELAY_TYPE ( IDELAYE2_IDELAY_TYPE),
251 .IDELAY_VALUE ( IDELAYE2_IDELAY_VALUE),
252 .PIPE_SEL ( IDELAYE2_PIPE_SEL),
253 .REFCLK_FREQUENCY ( IDELAYE2_REFCLK_FREQUENCY ),
254 .SIGNAL_PATTERN ( IDELAYE2_SIGNAL_PATTERN)
259 .DATAOUT (data_in_dly[i]),
260 .C (phy_clk),
// automatically wired by ISE
263 .CNTVALUEIN (
5'b00000),
265 .IDATAIN (data_in[i]),
267 .LD (idelay_ld | idelay_ld_rst),
274 assign iserdes_dout[
4*
i +
3] =
0;
275 assign iserdes_dout[
4*
i +
2] =
0;
276 assign iserdes_dout[
4*
i +
1] =
0;
277 assign iserdes_dout[
4*
i +
0] =
0;
280 endgenerate // iserdes_dq_
282 localparam OSERDES_DQ_DATA_RATE_OQ =
OSERDES_DATA_RATE;
283 localparam OSERDES_DQ_DATA_RATE_TQ =
OSERDES_DQ_DATA_RATE_OQ;
284 localparam OSERDES_DQ_DATA_WIDTH =
OSERDES_DATA_WIDTH;
285 localparam OSERDES_DQ_INIT_OQ =
1'b1;
286 localparam OSERDES_DQ_INIT_TQ =
1'b1;
287 localparam OSERDES_DQ_INTERFACE_TYPE =
"DEFAULT";
288 localparam OSERDES_DQ_ODELAY_USED =
0;
289 localparam OSERDES_DQ_SERDES_MODE =
"MASTER";
290 localparam OSERDES_DQ_SRVAL_OQ =
1'b1;
291 localparam OSERDES_DQ_SRVAL_TQ =
1'b1;
292 // note: obuf used in control path case, no ts input so width irrelevant
293 localparam OSERDES_DQ_TRISTATE_WIDTH = (
OSERDES_DQ_DATA_RATE_OQ ==
"DDR") ?
4 :
1;
295 localparam OSERDES_DQS_DATA_RATE_OQ =
"DDR";
296 localparam OSERDES_DQS_DATA_RATE_TQ =
"DDR";
297 localparam OSERDES_DQS_TRISTATE_WIDTH =
4;
// this is always ddr
298 localparam OSERDES_DQS_DATA_WIDTH =
4;
299 localparam ODDR_CLK_EDGE =
"SAME_EDGE";
300 localparam OSERDES_TBYTE_CTL =
"TRUE";
305 localparam NUM_BITLANES =
PO_DATA_CTL ==
"TRUE" ?
10 : BUS_WIDTH;
307 if ( PO_DATA_CTL ==
"TRUE" )
begin : slave_ts
309 .DATA_RATE_OQ (OSERDES_DQ_DATA_RATE_OQ),
310 .DATA_RATE_TQ (OSERDES_DQ_DATA_RATE_TQ),
311 .DATA_WIDTH (OSERDES_DQ_DATA_WIDTH),
312 .INIT_OQ (OSERDES_DQ_INIT_OQ),
313 .INIT_TQ (OSERDES_DQ_INIT_TQ),
314 .SERDES_MODE (OSERDES_DQ_SERDES_MODE),
315 .SRVAL_OQ (OSERDES_DQ_SRVAL_OQ),
316 .SRVAL_TQ (OSERDES_DQ_SRVAL_TQ),
317 .TRISTATE_WIDTH (OSERDES_DQ_TRISTATE_WIDTH),
325 .SHIFTOUT1 (),
// not extended
326 .SHIFTOUT2 (),
// not extended
330 .CLKDIV (oserdes_clkdiv),
339 .SHIFTIN1 (),
// not extended
340 .SHIFTIN2 (),
// not extended
341 .T1 (oserdes_dqts[
0]),
342 .T2 (oserdes_dqts[
0]),
343 .T3 (oserdes_dqts[
1]),
344 .T4 (oserdes_dqts[
1]),
346 .TBYTEOUT (tbyte_out),
351 for (i =
0; i != NUM_BITLANES; i=i+
1)
begin : output_
352 if ( BITLANES[i])
begin : oserdes_dq_
354 if ( PO_DATA_CTL ==
"TRUE" )
begin : ddr
357 .DATA_RATE_OQ (OSERDES_DQ_DATA_RATE_OQ),
358 .DATA_RATE_TQ (OSERDES_DQ_DATA_RATE_TQ),
359 .DATA_WIDTH (OSERDES_DQ_DATA_WIDTH),
360 .INIT_OQ (OSERDES_DQ_INIT_OQ),
361 .INIT_TQ (OSERDES_DQ_INIT_TQ),
362 .SERDES_MODE (OSERDES_DQ_SERDES_MODE),
363 .SRVAL_OQ (OSERDES_DQ_SRVAL_OQ),
364 .SRVAL_TQ (OSERDES_DQ_SRVAL_TQ),
365 .TRISTATE_WIDTH (OSERDES_DQ_TRISTATE_WIDTH),
366 .TBYTE_CTL (OSERDES_TBYTE_CTL),
372 .OQ (oserdes_dq_buf[i]),
373 .SHIFTOUT1 (),
// not extended
374 .SHIFTOUT2 (),
// not extended
376 .TQ (oserdes_dqts_buf[i]),
378 .CLKDIV (oserdes_clkdiv),
379 .D1 (oserdes_dq[
4 * i +
0]),
380 .D2 (oserdes_dq[
4 * i +
1]),
381 .D3 (oserdes_dq[
4 * i +
2]),
382 .D4 (oserdes_dq[
4 * i +
3]),
387 .SHIFTIN1 (),
// not extended
388 .SHIFTIN2 (),
// not extended
389 .T1 (
/*oserdes_dqts[0]**/),
390 .T2 (
/*oserdes_dqts[0]**/),
391 .T3 (
/*oserdes_dqts[1]**/),
392 .T4 (
/*oserdes_dqts[1]**/),
399 .DATA_RATE_OQ (OSERDES_DQ_DATA_RATE_OQ),
400 .DATA_RATE_TQ (OSERDES_DQ_DATA_RATE_TQ),
401 .DATA_WIDTH (OSERDES_DQ_DATA_WIDTH),
402 .INIT_OQ (
1'b0 /*OSERDES_DQ_INIT_OQ**/),
403 .INIT_TQ (OSERDES_DQ_INIT_TQ),
404 .SERDES_MODE (OSERDES_DQ_SERDES_MODE),
405 .SRVAL_OQ (
1'b0 /*OSERDES_DQ_SRVAL_OQ**/),
406 .SRVAL_TQ (OSERDES_DQ_SRVAL_TQ),
407 .TRISTATE_WIDTH (OSERDES_DQ_TRISTATE_WIDTH)
412 .OQ (oserdes_dq_buf[i]),
413 .SHIFTOUT1 (),
// not extended
414 .SHIFTOUT2 (),
// not extended
418 .CLKDIV (oserdes_clkdiv),
419 .D1 (oserdes_dq[
4 * i +
0]),
420 .D2 (oserdes_dq[
4 * i +
1]),
421 .D3 (oserdes_dq[
4 * i +
2]),
422 .D4 (oserdes_dq[
4 * i +
3]),
427 .SHIFTIN1 (),
// not extended
428 .SHIFTIN2 (),
// not extended
443 if ( PO_DATA_CTL ==
"TRUE" )
begin :
dqs_gen
446 #(.
DDR_CLK_EDGE (
ODDR_CLK_EDGE))
449 .
Q (
oserdes_dqs_buf),
450 .
D1 (
oserdes_dqs[
0]),
451 .
D2 (
oserdes_dqs[
1]),
452 .
C (
oserdes_clk_delayed),
459 #(.
DDR_CLK_EDGE (
ODDR_CLK_EDGE))
461 ( .
Q (
oserdes_dqsts_buf),
462 .
D1 (
oserdes_dqsts[
0]),
463 .
D2 (
oserdes_dqsts[
0]),
464 .
C (
oserdes_clk_delayed),
475 endmodule // byte_group_io