¿Por qué la primitiva SATA ALIGN se desplaza o intercambia en la salida RXDATA del transceptor GTXE2 de la serie 7?

Estoy usando un transceptor Xilinx 7-Series GTXE2 configurado como host SATA PHY. Este transceptor interactúa con un controlador de host SATA y un dispositivo SATA Gen1.

Durante la inicialización, puedo ver COMRESET, COMINIT y COMWAKE desde el host y el dispositivo. Han sido capturados en RXDATA/TXDATA. TX/RXELECIDLE se anulan correctamente. El controlador de host puede recibir y responder a la secuencia OOB completa.

Después de eso, el host envía D10.2a 1,5 Gbps para iniciar la negociación de velocidad. El dispositivo está respondiendo con A L I GRAMO norte pag primitivas, que se envían a 1,5 Gbps.

Sin embargo, desde RXDATA, solo puedo ver D27.3 D10.2 D10.2 K28.5los símbolos que aparecen para un solo ciclo de reloj, que es 20'haaaaa, seguido de 20'h5f0e4. Después de eso, estoy viendo 20'h55555, seguido de 20'h5f0e4. El carácter D27.3y K28.5parecía ser correcto. D10.2parecía haber sido intercambiado o desplazado. Porque el transceptor GTXE2 no puede decodificar A L I GRAMO norte pag , la negociación de velocidad falló.

He configurado RXCDR_CFGen (72'h0380008BFF40100008). El FPGA está conectado a un dispositivo Gen1.

Implementé una señal de control para liberar RXCDRHOLDcuando encuentro 20'haaaaa seguido de 20'h5f0e4 en el flujo de datos. Después de soltar la holdseñal, se convierte en 20'h55555 y 20'h5f0e4. Si no lo libero RXCDRHOLD, veo basura en RXDATA. Entonces parece que la liberación RXCDRHOLDsolo mejora parte de la A L I GRAMO norte pag caracteres. K28.5y D27.3tenía razón. D10.2es un poco intercambiado o desplazado.

Me encontré con otra publicación, en la que el autor puede haber experimentado problemas similares. Modificó RXCDR_CFG: Configuración de un transceptor GTXE2 de la serie 7 para Serial-ATA (Gen1/2/3)

Me preguntaba si alguien ha experimentado este problema con los transceptores Xilinx 7-Series GTXE2.

¿Podría publicar una forma de onda que contenga RDXDATA, RXELECIDLE, RXCDRHOLDy RXCOMWAKEDET.
¿Cuál es el dispositivo? (HDD, SSD, proveedor, año de fabricación). ¿Utilizó el Xilinx Core Generator o el equivalente de Vivado para generar la instancia GTXE2? => el código generado tiene errores y en parte no es correcto para el protocolo SATA. ¿Cuál es tu tablero de prueba? ¿Cómo conectas tu FPGA a un cable SATA: adaptador SFP, adaptador SMA, ...?
¿ Cuándo exactamente estrenas RXCDRHOLD? Debe esperar hasta que finalice la fase de negociación OOB completa, porque las ráfagas OOB se llenan con A L I GRAMO norte pag simbolos También estoy esperando al menos 63 símbolos ALIGN detectados consecutivos. Entonces, la transmisión ALIGN del dispositivo es estable.
Probamos con otra unidad SATA: Western Digital WD Green WD10EADS Veo que la salida de rxdata_out de instant gtwizard_0_GT está invertida. gtwizard_0_GT es el envoltorio de GTXE2_CHANNEL, generado por vivado. Esperaba que cuando GTX enviara la primitiva ALIGN, apareciera como una ráfaga de: 0011100100 | 1010101010 | 1010101010 | 0101111100 D27.3 D10.2 D10.2 K28.5 Desde chipscope, veo que el bit está invertido: 1100011011 | 0101010101 | 0101010101 | 1010000011
Apliqué un pequeño hack @rxdata. asignar rx_data_out_new = ~rxdata_out. Me pregunto si has visto esto antes. me parece que obtendría un resultado diferente de una unidad SATA diferente.
Finalmente puedo vincular la unidad usando el truco.

Respuestas (1)

Volví a pensar en tu problema de inversión. El problema es que usted, su PCB o su dispositivo cambiaron los cables RX+ y RX- por la entrada del transceptor.

Su GTXE2 está configurado para un bus de 20 bits y sin codificación 8B/10B, por lo que la inversión directa de cada bit visto en su medición se debe a la polaridad incorrecta en los pines de entrada. Puede habilitar la inversión de polaridad ( RXPOLARITY) para RX en el transceptor. La opción se usa para intercambiar los pines, porque los diseñadores de PCB pueden intercambiar los cables para reducir los saltos y las vías.

También debe buscar en el esquema de sus tableros si hay una pista para los cables intercambiados.

Modifiqué el archivo xdc para RXN/P cambiando de set_property PACKAGE_PIN AN3 [get_ports MOCARXN] set_property PACKAGE_PIN AN4 [get_ports MOCARXP] a: set_property PACKAGE_PIN AN3 [get_ports MOCARXP] set_property PACKAGE_PIN AN4 [get_ports MOCARXN] El enlace falló. Según chipscope, veo RXDATA como 20'hA0F1B seguido de 20'h55555. Es el mismo resultado si no cambio la ubicación de RXP/N.
No puedes cambiar los pines a través de XDC. El paso de mapeo necesita la configuración de XDC para encontrar la ubicación correcta, nada más. Los pines del transceptor son fijos y, por lo tanto, XDC no puede intercambiarlos. Debe 1) confirmar si el diseñador de PCB intercambió los cables P y N y, de ser así, 2) debe cambiar/habilitar RXPOLARITY. Es un transceptor genérico.
@sunni ¿Buscaste el RXPOLARITYparámetro y tu esquema? ¿Supongo que no?