1 from migen
.fhdl
.std
import *
2 from migen
.genlib
.cdc
import *
4 from lib
.sata
.common
import *
9 class _PulseSynchronizer(PulseSynchronizer
):
10 def __init__(self
, i
, idomain
, o
, odomain
):
11 PulseSynchronizer
.__init
__(self
, idomain
, odomain
)
17 class K7SATAPHYGTX(Module
):
18 def __init__(self
, pads
, default_speed
):
20 # Channel - Ref Clock Ports
21 self
.gtrefclk0
= Signal()
24 self
.cplllock
= Signal()
25 self
.cpllreset
= Signal()
28 self
.rxuserrdy
= Signal()
29 self
.rxalign
= Signal()
31 # Receive Ports - 8b10b Decoder
32 self
.rxcharisk
= Signal(2)
33 self
.rxdisperr
= Signal(2)
35 # Receive Ports - RX Data Path interface
36 self
.gtrxreset
= Signal()
37 self
.pmarxreset
= Signal()
38 self
.rxdata
= Signal(16)
39 self
.rxoutclk
= Signal()
40 self
.rxusrclk
= Signal()
41 self
.rxusrclk2
= Signal()
43 # Receive Ports - RX Driver,OOB signalling,Coupling and Eq.,CDR
44 self
.rxelecidle
= Signal()
46 # Receive Ports - RX PLL Ports
47 self
.rxresetdone
= Signal()
49 # Receive Ports - RX Ports for SATA
50 self
.rxcominitdet
= Signal()
51 self
.rxcomwakedet
= Signal()
54 self
.txuserrdy
= Signal()
56 # Transmit Ports - 8b10b Encoder Control Ports
57 self
.txcharisk
= Signal(2)
59 # Transmit Ports - TX Data Path interface
60 self
.gttxreset
= Signal()
61 self
.txdata
= Signal(16)
62 self
.txoutclk
= Signal()
63 self
.txusrclk
= Signal()
64 self
.txusrclk2
= Signal()
66 # Transmit Ports - TX PLL Ports
67 self
.txresetdone
= Signal()
69 # Transmit Ports - TX Ports for PCI Express
70 self
.txelecidle
= Signal(reset
=1)
72 # Transmit Ports - TX Ports for SATA
73 self
.txcomfinish
= Signal()
74 self
.txcominit
= Signal()
75 self
.txcomwake
= Signal()
76 self
.txrate
= Signal(3)
77 self
.rxcdrlock
= Signal()
85 rxout_div
= div_config
[default_speed
]
86 txout_div
= div_config
[default_speed
]
89 "SATA1" : 0x0380008BFF40100008,
90 "SATA2" : 0x0388008BFF40200008,
91 "SATA3" : 0X0380008BFF10200010
93 rxcdr_cfg
= cdr_config
[default_speed
]
95 # Internals and clock domain crossing
96 # sys_clk --> sata_tx clk
98 txelecidle
= Signal(reset
=1)
104 MultiReg(self
.txuserrdy
, txuserrdy
, "sata_tx"),
105 MultiReg(self
.txelecidle
, txelecidle
, "sata_tx"),
106 MultiReg(self
.txrate
, txrate
, "sata_tx")
109 _PulseSynchronizer(self
.txcominit
, "sys", txcominit
, "sata_tx"),
110 _PulseSynchronizer(self
.txcomwake
, "sys", txcomwake
, "sata_tx"),
113 # sata_tx clk --> sys clk
114 txresetdone
= Signal()
115 txcomfinish
= Signal()
118 MultiReg(txresetdone
, self
.txresetdone
, "sys"),
122 _PulseSynchronizer(txcomfinish
, "sata_tx", self
.txcomfinish
, "sys"),
125 # sys clk --> sata_rx clk
129 MultiReg(self
.rxuserrdy
, rxuserrdy
, "sata_rx"),
132 # sata_rx clk --> sys clk
133 rxelecidle
= Signal()
134 rxelecidle_i
= Signal()
135 rxelecidle_cnt_i
= Signal(9)
136 rxresetdone
= Signal()
137 rxcominitdet
= Signal()
138 rxcomwakedet
= Signal()
139 rxratedone
= Signal()
143 MultiReg(rxelecidle
, rxelecidle_i
, "sys"),
144 MultiReg(rxresetdone
, self
.rxresetdone
, "sys"),
145 MultiReg(rxcominitdet
, self
.rxcominitdet
, "sys"),
146 MultiReg(rxcomwakedet
, self
.rxcomwakedet
, "sys"),
147 MultiReg(rxcdrlock
, self
.rxcdrlock
, "sys"),
151 If(rxelecidle_i
!= self
.rxelecidle
,
152 If(rxelecidle_cnt_i
== 0,
153 self
.rxelecidle
.eq(rxelecidle_i
),
154 rxelecidle_cnt_i
.eq(255)
156 rxelecidle_cnt_i
.eq(rxelecidle_cnt_i
-1)
159 rxelecidle_cnt_i
.eq(255)
163 self
.rxbyteisaligned
= Signal()
166 self
.qpllclk
= Signal()
167 self
.qpllrefclk
= Signal()
170 gtxe2_channel_parameters
= {
171 # Simulation-Only Attributes
172 "p_SIM_RECEIVER_DETECT_PASS":"TRUE",
173 "p_SIM_TX_EIDLE_DRIVE_LEVEL":"X",
174 "p_SIM_RESET_SPEEDUP":"TRUE",
175 "p_SIM_CPLLREFCLK_SEL":0b001,
176 "p_SIM_VERSION":"4.0",
178 # RX Byte and Word Alignment Attributes
179 "p_ALIGN_COMMA_DOUBLE":"FALSE",
180 "p_ALIGN_COMMA_ENABLE":ones(10),
181 "p_ALIGN_COMMA_WORD":2,
182 "p_ALIGN_MCOMMA_DET":"TRUE",
183 "p_ALIGN_MCOMMA_VALUE":0b1010000011,
184 "p_ALIGN_PCOMMA_DET":"TRUE",
185 "p_ALIGN_PCOMMA_VALUE":0b0101111100,
186 "p_SHOW_REALIGN_COMMA":"FALSE",
187 "p_RXSLIDE_AUTO_WAIT":7,
188 "p_RXSLIDE_MODE":"PCS",
189 "p_RX_SIG_VALID_DLY":10,
191 # RX 8B/10B Decoder Attributes
192 "p_RX_DISPERR_SEQ_MATCH":"TRUE",
193 "p_DEC_MCOMMA_DETECT":"TRUE",
194 "p_DEC_PCOMMA_DETECT":"TRUE",
195 "p_DEC_VALID_COMMA_ONLY":"FALSE",
197 # RX Clock Correction Attributes
198 "p_CBCC_DATA_SOURCE_SEL":"DECODED",
199 "p_CLK_COR_SEQ_2_USE":"FALSE",
200 "p_CLK_COR_KEEP_IDLE":"FALSE",
201 "p_CLK_COR_MAX_LAT":9,
202 "p_CLK_COR_MIN_LAT":7,
203 "p_CLK_COR_PRECEDENCE":"TRUE",
204 "p_CLK_COR_REPEAT_WAIT":0,
205 "p_CLK_COR_SEQ_LEN":1,
206 "p_CLK_COR_SEQ_1_ENABLE":ones(4),
207 "p_CLK_COR_SEQ_1_1":0b0100000000,
208 "p_CLK_COR_SEQ_1_2":0b0000000000,
209 "p_CLK_COR_SEQ_1_3":0b0000000000,
210 "p_CLK_COR_SEQ_1_4":0b0000000000,
211 "p_CLK_CORRECT_USE":"FALSE",
212 "p_CLK_COR_SEQ_2_ENABLE":ones(4),
213 "p_CLK_COR_SEQ_2_1":0b0100000000,
214 "p_CLK_COR_SEQ_2_2":0,
215 "p_CLK_COR_SEQ_2_3":0,
216 "p_CLK_COR_SEQ_2_4":0,
218 # RX Channel Bonding Attributes
219 "p_CHAN_BOND_KEEP_ALIGN":"FALSE",
220 "p_CHAN_BOND_MAX_SKEW":1,
221 "p_CHAN_BOND_SEQ_LEN":1,
222 "p_CHAN_BOND_SEQ_1_1":0,
223 "p_CHAN_BOND_SEQ_1_1":0,
224 "p_CHAN_BOND_SEQ_1_2":0,
225 "p_CHAN_BOND_SEQ_1_3":0,
226 "p_CHAN_BOND_SEQ_1_4":0,
227 "p_CHAN_BOND_SEQ_1_ENABLE":ones(4),
228 "p_CHAN_BOND_SEQ_2_1":0,
229 "p_CHAN_BOND_SEQ_2_2":0,
230 "p_CHAN_BOND_SEQ_2_3":0,
231 "p_CHAN_BOND_SEQ_2_4":0,
232 "p_CHAN_BOND_SEQ_2_ENABLE":ones(4),
233 "p_CHAN_BOND_SEQ_2_USE":"FALSE",
234 "p_FTS_DESKEW_SEQ_ENABLE":ones(4),
235 "p_FTS_LANE_DESKEW_CFG":ones(4),
236 "p_FTS_LANE_DESKEW_EN":"FALSE",
238 # RX Margin Analysis Attributes
240 "p_ES_ERRDET_EN":"FALSE",
241 "p_ES_EYE_SCAN_EN":"TRUE",
242 "p_ES_HORZ_OFFSET":0,
248 "p_ES_VERT_OFFSET":0,
250 # FPGA RX Interface Attributes
251 "p_RX_DATA_WIDTH":20,
254 "p_OUTREFCLK_SEL_INV":0b11,
255 "p_PMA_RSV":0x00018480,
259 "p_RX_BIAS_CFG":0b100,
260 "p_DMONITOR_CFG":0xA00,
262 "p_RX_CM_TRIM":0b010,
264 "p_RX_OS_CFG":0b10000000,
266 "p_TERM_RCAL_OVRD":0,
272 # PCI Express Attributes
273 "p_PCS_PCIE_EN":"FALSE",
276 "p_PCS_RSVD_ATTR":0x100,
278 # RX Buffer Attributes
279 "p_RXBUF_ADDR_MODE":"FAST",
280 "p_RXBUF_EIDLE_HI_CNT":0b1000,
281 "p_RXBUF_EIDLE_LO_CNT":0,
284 "p_RXBUF_RESET_ON_CB_CHANGE":"TRUE",
285 "p_RXBUF_RESET_ON_COMMAALIGN":"FALSE",
286 "p_RXBUF_RESET_ON_EIDLE":"FALSE",
287 "p_RXBUF_RESET_ON_RATE_CHANGE":"TRUE",
288 "p_RXBUFRESET_TIME":1,
289 "p_RXBUF_THRESH_OVFLW":61,
290 "p_RXBUF_THRESH_OVRD":"FALSE",
291 "p_RXBUF_THRESH_UNDFLW":4,
296 "p_RXPHDLY_CFG":0x084820,
297 "p_RXPH_MONITOR_SEL":0,
298 "p_RX_XCLK_SEL":"RXUSR",
300 "p_RX_DEFER_RESET_BUF_EN":"TRUE",
303 "p_RXCDR_CFG":rxcdr_cfg
,
304 "p_RXCDR_FR_RESET_ON_EIDLE":0,
305 "p_RXCDR_HOLD_DURING_EIDLE":0,
306 "p_RXCDR_PH_RESET_ON_EIDLE":0,
307 "p_RXCDR_LOCK_CFG":0b010101,
309 # RX Initialization and Reset Attributes
310 "p_RXCDRFREQRESET_TIME":1,
311 "p_RXCDRPHRESET_TIME":1,
312 "p_RXISCANRESET_TIME":1,
313 "p_RXPCSRESET_TIME":1,
314 "p_RXPMARESET_TIME":3,
316 # RX OOB Signaling Attributes
317 "p_RXOOB_CFG":0b0000110,
319 # RX Gearbox Attributes
320 "p_RXGEARBOX_EN":"FALSE",
323 # PRBS Detection Attribute
324 "p_RXPRBS_ERR_LOOPBACK":0,
326 # Power-Down Attributes
327 "p_PD_TRANS_TIME_FROM_P2":0x03c,
328 "p_PD_TRANS_TIME_NONE_P2":0x3c,
329 "p_PD_TRANS_TIME_TO_P2":0x64,
331 # RX OOB Signaling Attributes
334 "p_SATA_BURST_SEQ_LEN":0b0101,
335 "p_SATA_BURST_VAL":0b100,
336 "p_SATA_EIDLE_VAL":0b100,
337 "p_SATA_MAX_BURST":8,
338 "p_SATA_MAX_INIT":21,
340 "p_SATA_MIN_BURST":4,
341 "p_SATA_MIN_INIT":12,
344 # RX Fabric Clock Output Control Attributes
345 "p_TRANS_TIME_RATE":0x0e,
347 # TX Buffer Attributes
349 "p_TXBUF_RESET_ON_RATE_CHANGE":"TRUE",
351 "p_TXDLY_LCFG":0x030,
354 "p_TXPHDLY_CFG":0x084020,
355 "p_TXPH_MONITOR_SEL":0,
356 "p_TX_XCLK_SEL":"TXOUT",
358 # FPGA TX Interface Attributes
359 "p_TX_DATA_WIDTH":20,
361 # TX Configurable Driver Attributes
364 "p_TX_EIDLE_ASSERT_DELAY":0b110,
365 "p_TX_EIDLE_DEASSERT_DELAY":0b100,
366 "p_TX_LOOPBACK_DRIVE_HIZ":"FALSE",
367 "p_TX_MAINCURSOR_SEL":0,
368 "p_TX_DRIVE_MODE":"DIRECT",
369 "p_TX_MARGIN_FULL_0":0b1001110,
370 "p_TX_MARGIN_FULL_1":0b1001001,
371 "p_TX_MARGIN_FULL_2":0b1000101,
372 "p_TX_MARGIN_FULL_3":0b1000010,
373 "p_TX_MARGIN_FULL_4":0b1000000,
374 "p_TX_MARGIN_LOW_0":0b1000110,
375 "p_TX_MARGIN_LOW_1":0b1000100,
376 "p_TX_MARGIN_LOW_2":0b1000010,
377 "p_TX_MARGIN_LOW_3":0b1000000,
378 "p_TX_MARGIN_LOW_4":0b1000000,
380 # TX Gearbox Attributes
381 "p_TXGEARBOX_EN":"FALSE",
383 # TX Initialization and Reset Attributes
384 "p_TXPCSRESET_TIME":1,
385 "p_TXPMARESET_TIME":1,
387 # TX Receiver Detection Attributes
388 "p_TX_RXDETECT_CFG":0x1832,
389 "p_TX_RXDETECT_REF":0b100,
392 "p_CPLL_CFG":0xBC07DC,
395 "p_CPLL_INIT_CFG":0x00001e,
396 "p_CPLL_LOCK_CFG":0x01e8,
397 "p_CPLL_REFCLK_DIV":1,
398 "p_RXOUT_DIV":rxout_div
,
399 "p_TXOUT_DIV":txout_div
,
400 "p_SATA_CPLL_CFG":"VCO_3000MHZ",
402 # RX Initialization and Reset Attributes
403 "p_RXDFELPMRESET_TIME":0b0001111,
405 # RX Equalizer Attributes
406 "p_RXLPM_HF_CFG":0b00000011110000,
407 "p_RXLPM_LF_CFG":0b00000011110000,
408 "p_RX_DFE_GAIN_CFG":0x020fea,
409 "p_RX_DFE_H2_CFG":0b000000000000,
410 "p_RX_DFE_H3_CFG":0b000001000000,
411 "p_RX_DFE_H4_CFG":0b00011110000,
412 "p_RX_DFE_H5_CFG":0b00011100000,
413 "p_RX_DFE_KL_CFG":0b0000011111110,
414 "p_RX_DFE_LPM_CFG":0x0954,
415 "p_RX_DFE_LPM_HOLD_DURING_EIDLE":0,
416 "p_RX_DFE_UT_CFG":0b10001111000000000,
417 "p_RX_DFE_VP_CFG":0b00011111100000011,
419 # Power-Down Attributes
423 # FPGA RX Interface Attribute
424 "p_RX_INT_DATAWIDTH":0,
426 # FPGA TX Interface Attribute
427 "p_TX_INT_DATAWIDTH":0,
429 # TX Configurable Driver Attributes
430 "p_TX_QPI_STATUS_EN":0,
432 # RX Equalizer Attributes
433 "p_RX_DFE_KL_CFG2":0b00110011000100000001100000001100,
434 "p_RX_DFE_XYD_CFG":0b0000000000000,
436 # TX Configurable Driver Attributes
437 "p_TX_PREDRIVER_MODE":0,
441 Instance("GTXE2_CHANNEL",
444 o_CPLLLOCK
=self
.cplllock
,
449 i_CPLLREFCLKSEL
=0b001,
450 i_CPLLRESET
=self
.cpllreset
,
462 # Channel - Clocking Ports
466 i_GTREFCLK0
=self
.gtrefclk0
,
471 # Channel - DRP Ports
482 i_QPLLCLK
=self
.qpllclk
,
483 i_QPLLREFCLK
=self
.qpllrefclk
,
487 # Digital Monitor Ports
490 # FPGA TX Interface Datapath Configuration
505 # RX 8B/10B Decoder Ports
508 # RX Initialization and Reset Ports
510 i_RXUSERRDY
=rxuserrdy
,
512 # RX Margin Analysis Ports
513 #o_EYESCANDATAERROR=,
517 # Receive Ports - CDR Ports
520 o_RXCDRLOCK
=rxcdrlock
,
525 # Receive Ports - Clock Correction Ports
528 # Receive Ports - FPGA RX Interface Datapath Configuration
531 # Receive Ports - FPGA RX Interface Ports
532 i_RXUSRCLK
=self
.rxusrclk
,
533 i_RXUSRCLK2
=self
.rxusrclk2
,
535 # Receive Ports - FPGA RX interface Ports
536 o_RXDATA
=self
.rxdata
,
538 # Receive Ports - Pattern Checker Ports
542 # Receive Ports - Pattern Checker ports
545 # Receive Ports - RX Equalizer Ports
550 # Receive Ports - RX 8B/10B Decoder Ports
554 # Receive Ports - RX AFE
558 # Receive Ports - RX Buffer Bypass Ports
566 #o_RXDLYSRESETDONE=0,
577 # Receive Ports - RX Byte and Word Alignment Ports
578 o_RXBYTEISALIGNED
=self
.rxbyteisaligned
,
585 # Receive Ports - RX Channel Bonding Ports
593 # Receive Ports - RX Channel Bonding Ports
597 # Receive Ports - RX Equalizer Ports
623 # Receive Ports - RX Equilizer Ports
628 # Receive Ports - RX Fabric ClocK Output Control Ports
631 # Receive Ports - RX Fabric Output Control Ports
632 o_RXOUTCLK
=self
.rxoutclk
,
637 # Receive Ports - RX Gearbox Ports
643 # Receive Ports - RX Gearbox Ports
646 # Receive Ports - RX Initialization and Reset Ports
647 i_GTRXRESET
=self
.gtrxreset
,
650 i_RXPMARESET
=self
.pmarxreset
,
652 # Receive Ports - RX Margin Analysis ports
655 # Receive Ports - RX OOB Signaling ports
657 o_RXCOMWAKEDET
=rxcomwakedet
,
659 # Receive Ports - RX OOB Signaling ports
660 o_RXCOMINITDET
=rxcominitdet
,
662 # Receive Ports - RX OOB signalling Ports
663 o_RXELECIDLE
=rxelecidle
,
664 i_RXELECIDLEMODE
=0b00,
666 # Receive Ports - RX Polarity Control Ports
669 # Receive Ports - RX gearbox ports
672 # Receive Ports - RX8B/10B Decoder Ports
674 o_RXCHARISK
=self
.rxcharisk
,
676 # Receive Ports - Rx Channel Bonding Ports
679 # Receive Ports -RX Initialization and Reset Ports
680 o_RXRESETDONE
=rxresetdone
,
687 # TX Buffer Bypass Ports
690 # TX Configurable Driver Ports
696 i_TXQPISTRONGPDOWN
=0,
699 # TX Initialization and Reset Ports
701 i_GTTXRESET
=self
.gttxreset
,
703 i_TXUSERRDY
=txuserrdy
,
705 # Transceiver Reset Mode Operation
709 # Transmit Ports - 8b10b Encoder Control Ports
713 # Transmit Ports - FPGA TX Interface Ports
714 i_TXUSRCLK
=self
.txusrclk
,
715 i_TXUSRCLK2
=self
.txusrclk2
,
717 # Transmit Ports - PCI Express Ports
718 i_TXELECIDLE
=txelecidle
,
723 # Transmit Ports - Pattern Generator Ports
726 # Transmit Ports - TX Buffer Bypass Ports
735 #o_TXPHALIGNDONE=txphaligndone,
743 # Transmit Ports - TX Buffer Ports
746 # Transmit Ports - TX Configurable Driver Ports
747 i_TXBUFDIFFCTRL
=0b100,
755 # Transmit Ports - TX Data Path interface
756 i_TXDATA
=self
.txdata
,
758 # Transmit Ports - TX Driver and OOB signaling
762 # Transmit Ports - TX Fabric Clock Output Control Ports
763 o_TXOUTCLK
=self
.txoutclk
,
766 i_TXOUTCLKSEL
=0b11, #??
768 # Transmit Ports - TX Gearbox Ports
769 i_TXCHARISK
=self
.txcharisk
,
775 # Transmit Ports - TX Initialization and Reset Ports
778 o_TXRESETDONE
=txresetdone
,
780 # Transmit Ports - TX OOB signalling Ports
781 o_TXCOMFINISH
=txcomfinish
,
782 i_TXCOMINIT
=txcominit
,
784 i_TXCOMWAKE
=txcomwake
,
785 i_TXPDELECIDLEMODE
=0,
787 # Transmit Ports - TX Polarity Control Ports
790 # Transmit Ports - TX Receiver Detection Ports
793 # Transmit Ports - TX8b/10b Encoder Ports
796 # Transmit Ports - pattern Generator Ports
799 # Tx Configurable Driver Ports
803 **gtxe2_channel_parameters
807 class GTXE2_COMMON(Module
):
808 def __init__(self
, fbdiv
=16):
809 self
.refclk0
= Signal()
811 self
.qpllclk
= Signal()
812 self
.qpllrefclk
= Signal()
825 fbdiv_in
= fbdiv_in_config
[fbdiv
]
827 fbdiv_ratio_config
= {
837 fbdiv_ratio
= fbdiv_ratio_config
[fbdiv
]
840 Instance("GTXE2_COMMON",
841 # Simulation attributes
842 p_SIM_RESET_SPEEDUP
="TRUE",
843 p_SIM_QPLLREFCLK_SEL
=0b001,
846 # Common block attributes
847 p_BIAS_CFG
=0x0000040000001000,
849 p_QPLL_CFG
=0x06801c1,
851 p_QPLL_COARSE_FREQ_OVRD
=0b010000,
852 p_QPLL_COARSE_FREQ_OVRD_EN
=0,
853 p_QPLL_CP
=0b0000011111,
854 p_QPLL_CP_MONITOR_EN
=0,
855 p_QPLL_DMONITOR_SEL
=0,
856 p_QPLL_FBDIV
=fbdiv_in
,
857 p_QPLL_FBDIV_MONITOR_EN
=0,
858 p_QPLL_FBDIV_RATIO
=fbdiv_ratio
,
859 p_QPLL_INIT_CFG
=0x000006,
860 p_QPLL_LOCK_CFG
=0x21e9,
864 # Common block - Dynamic Reconfiguration Port (DRP)
873 # Common block - Ref Clock Ports
877 i_GTREFCLK0
=self
.refclk0
,
882 # Common block - QPLL Ports
888 o_QPLLOUTCLK
=self
.qpllclk
,
889 o_QPLLOUTREFCLK
=self
.qpllrefclk
,
893 i_QPLLREFCLKSEL
=0b001,
897 #o_REFCLKOUTMONITOR=,