1 from migen
.fhdl
.std
import *
2 from migen
.genlib
.cdc
import *
4 from lib
.sata
.k7sataphy
.std
import *
6 class _PulseSynchronizer(PulseSynchronizer
):
7 def __init__(self
, i
, idomain
, o
, odomain
):
8 PulseSynchronizer
.__init
__(self
, idomain
, odomain
)
14 class K7SATAPHYGTX(Module
):
15 def __init__(self
, pads
, default_speed
):
19 # Channel - Ref Clock Ports
20 self
.gtrefclk0
= Signal()
23 self
.cplllock
= Signal()
24 self
.cpllreset
= Signal()
27 self
.rxuserrdy
= Signal()
28 self
.rxalign
= Signal()
30 # Receive Ports - 8b10b Decoder
31 self
.rxcharisk
= Signal(2)
32 self
.rxdisperr
= Signal(2)
34 # Receive Ports - RX Data Path interface
35 self
.gtrxreset
= Signal()
36 self
.rxdata
= Signal(16)
37 self
.rxoutclk
= Signal()
38 self
.rxusrclk
= Signal()
39 self
.rxusrclk2
= Signal()
41 # Receive Ports - RX Driver,OOB signalling,Coupling and Eq.,CDR
42 self
.rxelecidle
= Signal()
44 # Receive Ports - RX Elastic Buffer and Phase Alignment Ports
45 self
.rxdlyen
= Signal()
46 self
.rxdlysreset
= Signal()
47 self
.rxdlysresetdone
= Signal()
48 self
.rxphalign
= Signal()
49 self
.rxphaligndone
= Signal()
50 self
.rxphalignen
= Signal()
51 self
.rxphdlyreset
= Signal()
53 # Receive Ports - RX PLL Ports
54 self
.rxresetdone
= Signal()
56 # Receive Ports - RX Ports for SATA
57 self
.rxcominitdet
= Signal()
58 self
.rxcomwakedet
= Signal()
61 self
.txuserrdy
= Signal()
63 # Transmit Ports - 8b10b Encoder Control Ports
64 self
.txcharisk
= Signal(2)
66 # Transmit Ports - TX Buffer and Phase Alignment Ports
67 self
.txdlyen
= Signal()
68 self
.txdlysreset
= Signal()
69 self
.txdlysresetdone
= Signal()
70 self
.txphalign
= Signal()
71 self
.txphaligndone
= Signal()
72 self
.txphalignen
= Signal()
73 self
.txphdlyreset
= Signal()
74 self
.txphinit
= Signal()
75 self
.txphinitdone
= Signal()
77 # Transmit Ports - TX Data Path interface
78 self
.gttxreset
= Signal()
79 self
.txdata
= Signal(16)
80 self
.txoutclk
= Signal()
81 self
.txusrclk
= Signal()
82 self
.txusrclk2
= Signal()
84 # Transmit Ports - TX PLL Ports
85 self
.txresetdone
= Signal()
87 # Transmit Ports - TX Ports for PCI Express
88 self
.txelecidle
= Signal(reset
=1)
90 # Transmit Ports - TX Ports for SATA
91 self
.txcomfinish
= Signal()
92 self
.txcominit
= Signal()
93 self
.txcomwake
= Signal()
94 self
.rxrate
= Signal(3)
95 self
.rxratedone
= Signal()
96 self
.txrate
= Signal(3)
97 self
.txratedone
= Signal()
105 rxout_div
= div_config
[default_speed
]
106 txout_div
= div_config
[default_speed
]
109 "SATA1" : 0x0380008BFF40100008,
110 "SATA2" : 0x0380008BFF40200008,
111 "SATA3" : 0X0380008BFF20200010
113 rxcdr_cfg
= cdr_config
[default_speed
]
115 # Internals and clock domain crossing
116 # sys_clk --> sata_tx clk
119 txdlysreset
= Signal()
121 txphalignen
= Signal()
122 txphdlyreset
= Signal()
124 txelecidle
= Signal(reset
=1)
130 MultiReg(self
.txuserrdy
, txuserrdy
, "sata_tx"),
131 MultiReg(self
.txdlyen
, txdlyen
, "sata_tx"),
132 MultiReg(self
.txdlysreset
, txdlysreset
, "sata_tx"),
133 MultiReg(self
.txphalign
, txphalign
, "sata_tx"),
134 MultiReg(self
.txphalignen
, txphalignen
, "sata_tx"),
135 MultiReg(self
.txphdlyreset
, txphdlyreset
, "sata_tx"),
136 MultiReg(self
.txelecidle
, txelecidle
, "sata_tx"),
137 MultiReg(self
.txrate
, txrate
, "sata_tx")
140 _PulseSynchronizer(self
.txcominit
, "sys", txcominit
, "sata_tx"),
141 _PulseSynchronizer(self
.txcomwake
, "sys", txcomwake
, "sata_tx"),
144 # sata_tx clk --> sys clk
145 txdlysresetdone
= Signal()
146 txphaligndone
= Signal()
147 txphinitdone
= Signal()
148 txresetdone
= Signal()
149 txratedone
= Signal()
150 txcomfinish
= Signal()
153 MultiReg(txdlysresetdone
, self
.txdlysresetdone
, "sys"),
154 MultiReg(txphaligndone
, self
.txphaligndone
, "sys"),
155 MultiReg(txphinitdone
, self
.txphinitdone
, "sys"),
156 MultiReg(txresetdone
, self
.txresetdone
, "sys"),
157 MultiReg(txratedone
, self
.txratedone
, "sys"),
161 _PulseSynchronizer(txcomfinish
, "sata_tx", self
.txcomfinish
, "sys"),
164 # sys clk --> sata_rx clk
166 rxelecidle
= Signal()
168 rxdlysreset
= Signal()
170 rxphalignen
= Signal()
171 rxphdlyreset
= Signal()
176 MultiReg(self
.rxuserrdy
, rxuserrdy
, "sata_rx"),
177 MultiReg(self
.rxelecidle
, rxelecidle
, "sata_rx"),
178 MultiReg(self
.rxdlyen
, rxdlyen
, "sata_rx"),
179 MultiReg(self
.rxdlysreset
, rxdlysreset
, "sata_rx"),
180 MultiReg(self
.rxphalign
, rxphalign
, "sata_rx"),
181 MultiReg(self
.rxphalignen
, rxphalignen
, "sata_rx"),
182 MultiReg(self
.rxphdlyreset
, rxphdlyreset
, "sata_rx"),
183 MultiReg(self
.rxrate
, rxrate
, "sata_rx"),
184 MultiReg(self
.rxalign
, rxalign
, "sata_rx"),
188 # sata_rx clk --> sys clk
189 rxdlysresetdone
= Signal()
190 rxphaligndone
= Signal()
191 rxresetdone
= Signal()
192 rxcominitdet
= Signal()
193 rxcomwakedet
= Signal()
194 rxratedone
= Signal()
197 MultiReg(rxdlysresetdone
, self
.rxdlysresetdone
, "sys"),
198 MultiReg(rxphaligndone
, self
.rxphaligndone
, "sys"),
199 MultiReg(rxresetdone
, self
.rxresetdone
, "sys"),
200 MultiReg(rxratedone
, self
.rxratedone
, "sys")
204 _PulseSynchronizer(rxcominitdet
, "sata_rx", self
.rxcominitdet
, "sys"),
205 _PulseSynchronizer(rxcomwakedet
, "sata_rx", self
.rxcomwakedet
, "sys"),
209 self
.rxbyteisaligned
= Signal()
210 self
.rxbyterealign
= Signal()
211 self
.rxcommadet
= Signal()
215 self
.txphdlyreset
.eq(0),
216 self
.txphalignen
.eq(0),
218 self
.txphalign
.eq(0),
224 self
.rxphdlyreset
.eq(0),
226 self
.rxphalign
.eq(0),
227 self
.rxphalignen
.eq(0),
231 self
.qpllclk
= Signal()
232 self
.qpllrefclk
= Signal()
235 gtxe2_channel_parameters
= {
236 # Simulation-Only Attributes
237 "p_SIM_RECEIVER_DETECT_PASS":"TRUE",
238 "p_SIM_TX_EIDLE_DRIVE_LEVEL":"X",
239 "p_SIM_RESET_SPEEDUP":"TRUE",
240 "p_SIM_CPLLREFCLK_SEL":0b001,
241 "p_SIM_VERSION":"4.0",
243 # RX Byte and Word Alignment Attributes
244 "p_ALIGN_COMMA_DOUBLE":"FALSE",
245 "p_ALIGN_COMMA_ENABLE":ones(10),
246 "p_ALIGN_COMMA_WORD":2,
247 "p_ALIGN_MCOMMA_DET":"TRUE",
248 "p_ALIGN_MCOMMA_VALUE":0b1010000011,
249 "p_ALIGN_PCOMMA_DET":"TRUE",
250 "p_ALIGN_PCOMMA_VALUE":0b0101111100,
251 "p_SHOW_REALIGN_COMMA":"FALSE",
252 "p_RXSLIDE_AUTO_WAIT":7,
253 "p_RXSLIDE_MODE":"OFF",
254 "p_RX_SIG_VALID_DLY":10,
256 # RX 8B/10B Decoder Attributes
257 "p_RX_DISPERR_SEQ_MATCH":"TRUE",
258 "p_DEC_MCOMMA_DETECT":"TRUE",
259 "p_DEC_PCOMMA_DETECT":"TRUE",
260 "p_DEC_VALID_COMMA_ONLY":"TRUE",
262 # RX Clock Correction Attributes
263 "p_CBCC_DATA_SOURCE_SEL":"DECODED",
264 "p_CLK_COR_SEQ_2_USE":"FALSE",
265 "p_CLK_COR_KEEP_IDLE":"FALSE",
266 "p_CLK_COR_MAX_LAT":9,
267 "p_CLK_COR_MIN_LAT":7,
268 "p_CLK_COR_PRECEDENCE":"TRUE",
269 "p_CLK_COR_REPEAT_WAIT":0,
270 "p_CLK_COR_SEQ_LEN":1,
271 "p_CLK_COR_SEQ_1_ENABLE":ones(4),
272 "p_CLK_COR_SEQ_1_ENABLE":0,
273 "p_CLK_COR_SEQ_1_1":0,
274 "p_CLK_COR_SEQ_1_1":0,
275 "p_CLK_COR_SEQ_1_2":0,
276 "p_CLK_COR_SEQ_1_3":0,
277 "p_CLK_COR_SEQ_1_4":0,
278 "p_CLK_CORRECT_USE":"FALSE",
279 "p_CLK_COR_SEQ_2_ENABLE":ones(4),
280 "p_CLK_COR_SEQ_2_1":0,
281 "p_CLK_COR_SEQ_2_2":0,
282 "p_CLK_COR_SEQ_2_3":0,
283 "p_CLK_COR_SEQ_2_4":0,
285 # RX Channel Bonding Attributes
286 "p_CHAN_BOND_KEEP_ALIGN":"FALSE",
287 "p_CHAN_BOND_MAX_SKEW":1,
288 "p_CHAN_BOND_SEQ_LEN":1,
289 "p_CHAN_BOND_SEQ_1_1":0,
290 "p_CHAN_BOND_SEQ_1_1":0,
291 "p_CHAN_BOND_SEQ_1_2":0,
292 "p_CHAN_BOND_SEQ_1_3":0,
293 "p_CHAN_BOND_SEQ_1_4":0,
294 "p_CHAN_BOND_SEQ_1_ENABLE":ones(4),
295 "p_CHAN_BOND_SEQ_2_1":0,
296 "p_CHAN_BOND_SEQ_2_2":0,
297 "p_CHAN_BOND_SEQ_2_3":0,
298 "p_CHAN_BOND_SEQ_2_4":0,
299 "p_CHAN_BOND_SEQ_2_ENABLE":ones(4),
300 "p_CHAN_BOND_SEQ_2_USE":"FALSE",
301 "p_FTS_DESKEW_SEQ_ENABLE":ones(4),
302 "p_FTS_LANE_DESKEW_CFG":ones(4),
303 "p_FTS_LANE_DESKEW_EN":"FALSE",
305 # RX Margin Analysis Attributes
307 "p_ES_ERRDET_EN":"FALSE",
308 "p_ES_EYE_SCAN_EN":"TRUE",
309 "p_ES_HORZ_OFFSET":0,
315 "p_ES_VERT_OFFSET":0,
317 # FPGA RX Interface Attributes
318 "p_RX_DATA_WIDTH":20,
321 "p_OUTREFCLK_SEL_INV":0b11,
322 "p_PMA_RSV":0x00018480,
326 "p_RX_BIAS_CFG":0b100,
327 "p_DMONITOR_CFG":0xA00,
329 "p_RX_CM_TRIM":0b010,
331 "p_RX_OS_CFG":0b10000000,
333 "p_TERM_RCAL_OVRD":0,
339 # PCI Express Attributes
340 "p_PCS_PCIE_EN":"FALSE",
343 "p_PCS_RSVD_ATTR":0x100,
345 # RX Buffer Attributes
346 "p_RXBUF_ADDR_MODE":"FAST",
347 "p_RXBUF_EIDLE_HI_CNT":0b1000,
348 "p_RXBUF_EIDLE_LO_CNT":0,
349 "p_RXBUF_EN":"FALSE",
351 "p_RXBUF_RESET_ON_CB_CHANGE":"TRUE",
352 "p_RXBUF_RESET_ON_COMMAALIGN":"FALSE",
353 "p_RXBUF_RESET_ON_EIDLE":"FALSE",
354 "p_RXBUF_RESET_ON_RATE_CHANGE":"TRUE",
355 "p_RXBUFRESET_TIME":1,
356 "p_RXBUF_THRESH_OVFLW":61,
357 "p_RXBUF_THRESH_OVRD":"FALSE",
358 "p_RXBUF_THRESH_UNDFLW":4,
363 "p_RXPHDLY_CFG":0x084820,
364 "p_RXPH_MONITOR_SEL":0,
365 "p_RX_XCLK_SEL":"RXUSR",
367 "p_RX_DEFER_RESET_BUF_EN":"TRUE",
370 "p_RXCDR_CFG":rxcdr_cfg
,
371 "p_RXCDR_FR_RESET_ON_EIDLE":0,
372 "p_RXCDR_HOLD_DURING_EIDLE":0,
373 "p_RXCDR_PH_RESET_ON_EIDLE":0,
374 "p_RXCDR_LOCK_CFG":0b010101,
376 # RX Initialization and Reset Attributes
377 "p_RXCDRFREQRESET_TIME":1,
378 "p_RXCDRPHRESET_TIME":1,
379 "p_RXISCANRESET_TIME":1,
380 "p_RXPCSRESET_TIME":1,
381 "p_RXPMARESET_TIME":3,
383 # RX OOB Signaling Attributes
384 "p_RXOOB_CFG":0b0000110,
386 # RX Gearbox Attributes
387 "p_RXGEARBOX_EN":"FALSE",
390 # PRBS Detection Attribute
391 "p_RXPRBS_ERR_LOOPBACK":0,
393 # Power-Down Attributes
394 "p_PD_TRANS_TIME_FROM_P2":0x03c,
395 "p_PD_TRANS_TIME_NONE_P2":0x3c,
396 "p_PD_TRANS_TIME_TO_P2":0x64,
398 # RX OOB Signaling Attributes
401 "p_SATA_BURST_SEQ_LEN":0b0101,
402 "p_SATA_BURST_VAL":0b100,
403 "p_SATA_EIDLE_VAL":0b100,
404 "p_SATA_MAX_BURST":8,
405 "p_SATA_MAX_INIT":21,
407 "p_SATA_MIN_BURST":4,
408 "p_SATA_MIN_INIT":12,
411 # RX Fabric Clock Output Control Attributes
412 "p_TRANS_TIME_RATE":0x0e,
414 # TX Buffer Attributes
415 "p_TXBUF_EN":"FALSE",
416 "p_TXBUF_RESET_ON_RATE_CHANGE":"FALSE",
418 "p_TXDLY_LCFG":0x030,
421 "p_TXPHDLY_CFG":0x084020,
422 "p_TXPH_MONITOR_SEL":0,
423 "p_TX_XCLK_SEL":"TXUSR",
425 # FPGA TX Interface Attributes
426 "p_TX_DATA_WIDTH":20,
428 # TX Configurable Driver Attributes
431 "p_TX_EIDLE_ASSERT_DELAY":0b110,
432 "p_TX_EIDLE_DEASSERT_DELAY":0b100,
433 "p_TX_LOOPBACK_DRIVE_HIZ":"FALSE",
434 "p_TX_MAINCURSOR_SEL":0,
435 "p_TX_DRIVE_MODE":"DIRECT",
436 "p_TX_MARGIN_FULL_0":0b1001110,
437 "p_TX_MARGIN_FULL_1":0b1001001,
438 "p_TX_MARGIN_FULL_2":0b1000101,
439 "p_TX_MARGIN_FULL_3":0b1000010,
440 "p_TX_MARGIN_FULL_4":0b1000000,
441 "p_TX_MARGIN_LOW_0":0b1000110,
442 "p_TX_MARGIN_LOW_1":0b1000100,
443 "p_TX_MARGIN_LOW_2":0b1000010,
444 "p_TX_MARGIN_LOW_3":0b1000000,
445 "p_TX_MARGIN_LOW_4":0b1000000,
447 # TX Gearbox Attributes
448 "p_TXGEARBOX_EN":"FALSE",
450 # TX Initialization and Reset Attributes
451 "p_TXPCSRESET_TIME":1,
452 "p_TXPMARESET_TIME":1,
454 # TX Receiver Detection Attributes
455 "p_TX_RXDETECT_CFG":0x1832,
456 "p_TX_RXDETECT_REF":0b100,
459 "p_CPLL_CFG":0xBC07DC,
462 "p_CPLL_INIT_CFG":0x00001e,
463 "p_CPLL_LOCK_CFG":0x01e8,
464 "p_CPLL_REFCLK_DIV":1,
465 "p_RXOUT_DIV":rxout_div
,
466 "p_TXOUT_DIV":txout_div
,
467 "p_SATA_CPLL_CFG":"VCO_3000MHZ",
469 # RX Initialization and Reset Attributes
470 "p_RXDFELPMRESET_TIME":0b0001111,
472 # RX Equalizer Attributes
473 "p_RXLPM_HF_CFG":0b00000011110000,
474 "p_RXLPM_LF_CFG":0b00000011110000,
475 "p_RX_DFE_GAIN_CFG":0x020fea,
476 "p_RX_DFE_H2_CFG":0b000000000000,
477 "p_RX_DFE_H3_CFG":0b000001000000,
478 "p_RX_DFE_H4_CFG":0b00011110000,
479 "p_RX_DFE_H5_CFG":0b00011100000,
480 "p_RX_DFE_KL_CFG":0b0000011111110,
481 "p_RX_DFE_LPM_CFG":0x0954,
482 "p_RX_DFE_LPM_HOLD_DURING_EIDLE":1,
483 "p_RX_DFE_UT_CFG":0b10001111000000000,
484 "p_RX_DFE_VP_CFG":0b00011111100000011,
486 # Power-Down Attributes
490 # FPGA RX Interface Attribute
491 "p_RX_INT_DATAWIDTH":0,
493 # FPGA TX Interface Attribute
494 "p_TX_INT_DATAWIDTH":0,
496 # TX Configurable Driver Attributes
497 "p_TX_QPI_STATUS_EN":0,
499 # RX Equalizer Attributes
500 "p_RX_DFE_KL_CFG2":0b00110011000100000001100000001100,
501 "p_RX_DFE_XYD_CFG":0b0000000000000,
503 # TX Configurable Driver Attributes
504 "p_TX_PREDRIVER_MODE":0,
508 Instance("GTXE2_CHANNEL",
511 o_CPLLLOCK
=self
.cplllock
,
516 i_CPLLREFCLKSEL
=0b001,
517 i_CPLLRESET
=self
.cpllreset
,
529 # Channel - Clocking Ports
533 i_GTREFCLK0
=self
.gtrefclk0
,
538 # Channel - DRP Ports
539 i_DRPADDR
=self
.drp
.addr
,
540 i_DRPCLK
=self
.drp
.clk
,
544 o_DRPRDY
=self
.drp
.rdy
,
549 i_QPLLCLK
=self
.qpllclk
,
550 i_QPLLREFCLK
=self
.qpllrefclk
,
554 # Digital Monitor Ports
557 # FPGA TX Interface Datapath Configuration
572 # RX 8B/10B Decoder Ports
575 # RX Initialization and Reset Ports
577 i_RXUSERRDY
=rxuserrdy
,
579 # RX Margin Analysis Ports
580 #o_EYESCANDATAERROR=,
584 # Receive Ports - CDR Ports
592 # Receive Ports - Clock Correction Ports
595 # Receive Ports - FPGA RX Interface Datapath Configuration
598 # Receive Ports - FPGA RX Interface Ports
599 i_RXUSRCLK
=self
.rxusrclk
,
600 i_RXUSRCLK2
=self
.rxusrclk2
,
602 # Receive Ports - FPGA RX interface Ports
603 o_RXDATA
=self
.rxdata
,
605 # Receive Ports - Pattern Checker Ports
609 # Receive Ports - Pattern Checker ports
612 # Receive Ports - RX Equalizer Ports
617 # Receive Ports - RX 8B/10B Decoder Ports
621 # Receive Ports - RX AFE
625 # Receive Ports - RX Buffer Bypass Ports
632 i_RXDLYSRESET
=rxdlysreset
,
633 o_RXDLYSRESETDONE
=rxdlysresetdone
,
634 i_RXPHALIGN
=rxphalign
,
635 o_RXPHALIGNDONE
=rxphaligndone
,
636 i_RXPHALIGNEN
=rxphalignen
,
638 i_RXPHDLYRESET
=rxphdlyreset
,
644 # Receive Ports - RX Byte and Word Alignment Ports
645 o_RXBYTEISALIGNED
=self
.rxbyteisaligned
,
646 o_RXBYTEREALIGN
=self
.rxbyterealign
,
647 o_RXCOMMADET
=self
.rxcommadet
,
649 i_RXMCOMMAALIGNEN
=rxalign
,
650 i_RXPCOMMAALIGNEN
=rxalign
,
652 # Receive Ports - RX Channel Bonding Ports
660 # Receive Ports - RX Channel Bonding Ports
664 # Receive Ports - RX Equalizer Ports
690 # Receive Ports - RX Equilizer Ports
695 # Receive Ports - RX Fabric ClocK Output Control Ports
696 o_RXRATEDONE
=rxratedone
,
698 # Receive Ports - RX Fabric Output Control Ports
699 o_RXOUTCLK
=self
.rxoutclk
,
704 # Receive Ports - RX Gearbox Ports
710 # Receive Ports - RX Gearbox Ports
713 # Receive Ports - RX Initialization and Reset Ports
714 i_GTRXRESET
=self
.gtrxreset
,
719 # Receive Ports - RX Margin Analysis ports
722 # Receive Ports - RX OOB Signaling ports
724 o_RXCOMWAKEDET
=rxcomwakedet
,
726 # Receive Ports - RX OOB Signaling ports
727 o_RXCOMINITDET
=rxcominitdet
,
729 # Receive Ports - RX OOB signalling Ports
730 o_RXELECIDLE
=rxelecidle
,
731 i_RXELECIDLEMODE
=0b00,
733 # Receive Ports - RX Polarity Control Ports
736 # Receive Ports - RX gearbox ports
739 # Receive Ports - RX8B/10B Decoder Ports
741 o_RXCHARISK
=self
.rxcharisk
,
743 # Receive Ports - Rx Channel Bonding Ports
746 # Receive Ports -RX Initialization and Reset Ports
747 o_RXRESETDONE
=rxresetdone
,
754 # TX Buffer Bypass Ports
757 # TX Configurable Driver Ports
763 i_TXQPISTRONGPDOWN
=0,
766 # TX Initialization and Reset Ports
768 i_GTTXRESET
=self
.gttxreset
,
770 i_TXUSERRDY
=txuserrdy
,
772 # Transceiver Reset Mode Operation
776 # Transmit Ports - 8b10b Encoder Control Ports
780 # Transmit Ports - FPGA TX Interface Ports
781 i_TXUSRCLK
=self
.txusrclk
,
782 i_TXUSRCLK2
=self
.txusrclk2
,
784 # Transmit Ports - PCI Express Ports
785 i_TXELECIDLE
=txelecidle
,
790 # Transmit Ports - Pattern Generator Ports
793 # Transmit Ports - TX Buffer Bypass Ports
798 i_TXDLYSRESET
=txdlysreset
,
799 o_TXDLYSRESETDONE
=txdlysresetdone
,
801 i_TXPHALIGN
=txphalign
,
802 o_TXPHALIGNDONE
=txphaligndone
,
803 i_TXPHALIGNEN
=txphalignen
,
805 i_TXPHDLYRESET
=txphdlyreset
,
807 o_TXPHINITDONE
=txphinitdone
,
810 # Transmit Ports - TX Buffer Ports
813 # Transmit Ports - TX Configurable Driver Ports
814 i_TXBUFDIFFCTRL
=0b100,
822 # Transmit Ports - TX Data Path interface
823 i_TXDATA
=self
.txdata
,
825 # Transmit Ports - TX Driver and OOB signaling
829 # Transmit Ports - TX Fabric Clock Output Control Ports
830 o_TXOUTCLK
=self
.txoutclk
,
834 o_TXRATEDONE
=txratedone
,
835 # Transmit Ports - TX Gearbox Ports
836 i_TXCHARISK
=self
.txcharisk
,
842 # Transmit Ports - TX Initialization and Reset Ports
845 o_TXRESETDONE
=txresetdone
,
847 # Transmit Ports - TX OOB signalling Ports
848 o_TXCOMFINISH
=txcomfinish
,
849 i_TXCOMINIT
=txcominit
,
851 i_TXCOMWAKE
=txcomwake
,
852 i_TXPDELECIDLEMODE
=0,
854 # Transmit Ports - TX Polarity Control Ports
857 # Transmit Ports - TX Receiver Detection Ports
860 # Transmit Ports - TX8b/10b Encoder Ports
863 # Transmit Ports - pattern Generator Ports
866 # Tx Configurable Driver Ports
870 **gtxe2_channel_parameters
874 class GTXE2_COMMON(Module
):
875 def __init__(self
, fbdiv
=16):
876 self
.refclk0
= Signal()
878 self
.qpllclk
= Signal()
879 self
.qpllrefclk
= Signal()
892 fbdiv_in
= fbdiv_in_config
[fbdiv
]
894 fbdiv_ratio_config
= {
904 fbdiv_ratio
= fbdiv_ratio_config
[fbdiv
]
907 Instance("GTXE2_COMMON",
908 # Simulation attributes
909 p_SIM_RESET_SPEEDUP
="TRUE",
910 p_SIM_QPLLREFCLK_SEL
=0b001,
913 # Common block attributes
914 p_BIAS_CFG
=0x0000040000001000,
916 p_QPLL_CFG
=0x06801c1,
918 p_QPLL_COARSE_FREQ_OVRD
=0b010000,
919 p_QPLL_COARSE_FREQ_OVRD_EN
=0,
920 p_QPLL_CP
=0b0000011111,
921 p_QPLL_CP_MONITOR_EN
=0,
922 p_QPLL_DMONITOR_SEL
=0,
923 p_QPLL_FBDIV
=fbdiv_in
,
924 p_QPLL_FBDIV_MONITOR_EN
=0,
925 p_QPLL_FBDIV_RATIO
=fbdiv_ratio
,
926 p_QPLL_INIT_CFG
=0x000006,
927 p_QPLL_LOCK_CFG
=0x21e9,
931 # Common block - Dynamic Reconfiguration Port (DRP)
940 # Common block - Ref Clock Ports
944 i_GTREFCLK0
=self
.refclk0
,
949 # Common block - QPLL Ports
955 o_QPLLOUTCLK
=self
.qpllclk
,
956 o_QPLLOUTREFCLK
=self
.qpllrefclk
,
960 i_QPLLREFCLKSEL
=0b001,
964 #o_REFCLKOUTMONITOR=,