8b10b Transmission Error, Ultrascale to Zynq 7 Series
I'm having trouble trying to set up a unidirectional comms link between a Kintex Ultrascale (KCU105) and a Zynq 7030 (DAVe Bora) using Gigabit Transeivers configured for Aurora.
I have the two ends configured with mostly default Aurora settings, 16 bit user side data path, comma detection and alignment enabled. The only non-standard feature I have set is bypassing of both the Tx and Rx Elastic Buffers. I have the bypass set for reasons I can't go into here.
Both sides of the link come up, PLLs lock etc and the reset state machines complete. My ultrascale part has everything integrated into the core and I have folowed the example design to drive the user design. The Zynq part uses supporting components taken from the example design.
The user side of the design is a very simple state machine at each end which are capable of transmitting (or receiving on the other end) a handful of bytes packed as a message. A message is marked with a header word for which i use an 8b10b k symbol. In idle the transmit state machine sends a comma symbol (x00BC). On the receive side of the link I can see this comma symbol coming out of the userdata bus and the core reports that is has correctly aligned.
When i transmit a message from the Tx side I see the corresponding k symbol 'header' come out on the Rx user data bus correctly, which i follwed by the correct number of bytes (packed into 16 bit words) as i expect and then the a return to the idle comma.
The data words received however are a mix of correct and uncorrect bytes. Certain bytes that are transmitted are received incorrectly. I.e. if i transmit x7774 I receive something like x776a. However not all bytes show this error, I can transmit x8888 or x0000 or x0040 correctly for example. This error is completely repeatable, i.e. If i retransmit the same message again and again I get the same error. If i repower or re-program the devices and transmit the same message, I get the same error.
The receive side of the link does not show any disparity or 'not in table' errors.
I have tried a looback test where I implment the Rx side of my link ont he Ultrscale device and phycially loop back the connections - in this test i receive all the data correctly every time.
Does anyone have any idea what's going on? Are there subtle differences between certain options in the 7 series and Ultrascale Transceivers wizards i am not aware of? Are there know differences in how the encoding/decoding works?