Tengo un FPGA en el que he implementado SATA Host y un SSD como dispositivo. La comunicación entre ellos está ocurriendo en SATA 3.0 (6 Gbps).
Tengo una situación en la que durante la transacción de escritura recibo SYNCp del dispositivo inesperadamente debido a que la transacción de escritura falla.
HegrabadoelescenarioenChipscope.Aquíhayunadescripcióndelosnombresdelasseñales:-
- align_insert->EstoyinsertandoALIGNpdesdemiextremocomolorequiereelprotocoloSATA.Reciénañadidoparainformación.
- tx_data_r0->TXDATAenviadodesdelacapadeenlacedelhost.
- prim_hold_det->EstoregistrasiserecibecualquierHOLDpdeldispositivo.
- prim_cont_det->EstoregistrasiserecibealgúnCONTpdeldispositivo.
- prim_align_det->EstoregistrasiserecibeALIGNpdeldispositivo.
- prim_sync_det->EstoregistrasiserecibealgúnSYNCpdeldispositivo.
- prim_r_err_det->EstoregistrasiserecibecualquierERRpdeldispositivo.
LasituaciónactualmuestraqueeldispositivoestáenviandoHOLDpyI(Host)estáenviandoHOLDAp(x"9595AA7C"). Entonces, de repente recibo, SYNCp del dispositivo. Por lo general, en situaciones normales, el dispositivo envía R_IPp al host cuando el dispositivo tiene espacio disponible en su capa de enlace FIFO.
Pero aquí estoy recibiendo SYNCp. Por lo tanto, he comprobado la especificación SATA 3.0. En la página 370, sección 9.6.4, se proporcionó la transición de estado para la recepción de la capa de enlace, porque quiero entender qué podría estar haciendo el dispositivo. En eso, estoy comprobando el estado "LR4: L_Hold". En este estado, solo hay dos escenarios posibles en los que el dispositivo puede enviar SYNCp, y esas son las condiciones "6 y 7".
Mi duda es si es posible comprender cuál de las condiciones está activando la respuesta SYNCp. He intentado analizar ambas condiciones.
- "6ª condición": SYNCP recibido de Phy. Según esta condición, si el dispositivo recibe SYNCp del host, entonces envía SYNCp a cambio. Pero puede verificar que en "tx_data_r0" el SYNCP no haya sido enviado por el host. Por lo tanto, esta no es mi condición desencadenante. Por ahora, puedo especular que esta no es la condición.
- "Séptima condición": la capa de transporte indica una solicitud para escapar de la corriente cuadro. Esta puede ser la condición desencadenante. Pero la descripción es bastante vaga. No proporciona ningún detalle en cuanto a cuál podría ser la razón para que Transport Layer exija un SYNCEscape. He comprobado la Máquina de estado de la capa de transporte del dispositivo en la especificación, pero tampoco se pudieron encontrar respuestas específicas.
Si alguien ha enfrentado y depurado un escenario similar, sería útil. Estoy abierto a sugerencias sobre la depuración de este escenario en el protocolo SATA.