This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SRIO link errors from C6678 to FPGA

Hi,

My FPGA-wielding coworker and I are seeing intermittent SRIO link errors in data going from a C6678 to a (Xilinx) FPGA on a custom board, even at relatively low line rates.

When the DSP sends SWRITEs containing a 32-bit up-counting sequence, the FPGA reports disparity errors within about 10 seconds and drops the link as a result.  If the SWRITEs contain a fixed 64-bit pattern (specifically, 0xABCDEF0123456789) or a pseudo-random sequence (x[0]=1, x[n]=x[n-1]*0x100011, for 32-bit x[n]), we do not see this kind of problem.  We can also turn on the PRBS with length 2**23-1, and go for minutes (at least) with zero bit errors in this direction.  If I run a debug build of the DSP code, which causes larger gaps between packets, the 32-bit up-counting sequence works.  A similar up-counting pattern from the FPGA to the DSP does not seem to cause any link problems, although I did frequently see RX TESTFAIL toggle (in SRIO_SERDES_STS) with the 2**23-1 PRBS.

We first saw these problems at 5 Gbaud, but also see them at 2.5 Gbaud.  (An older board design, with a C6474 and an earlier-generation FPGA, operates well at 3.125 Gbaud -- and the layout rules were of course stricter for the new board.)  1x or 4x port width does not seem to matter.  The two ends of the SRIO link are running from the same clock source, although (obviously) with different delays and different PLLs in front.

The FPGA guys here say this looks almost identical to a problem they saw with a SerDes link between FPGAs, which they solved by enabling data scrambling over that link.  I understand that -- contrary to what SPRUGW1B says -- the Keystone I family does not support SRIO IDLE2 patterns or bit scrambling, so that is not an option here.

Does anyone have suggestions on how to fix this problem?

Thanks in advance,

Michael

  • Hi,

    C667x SRIO does not support IDLE2 sequences. It supports only IDLE1 sequences and the max baud rate supported is 5 gbps. Section 1.2 "RapidIO Feature Support in SRIO" of SRIO users guide mentions "Support for IDLE1 and IDLE2", which is incorrect and will be updated in the next revision of the SRIO users guide.

    Thanks,
  • Yes, someone said the same thing in May 2012. That correction somehow did not make it into SPRUGW1B, which was released six months later.

    It looks as though the problem that I was seeing a known limitation in the Xilinx 7 Series GTX/GTH/GTP transceivers. By default, they use a decision feedback equalizer on the receive side. The DFE drifts off if the input sequence has too many 1010 bit patterns. They have an alternative low-power mode (which apparently uses a simpler linear equalizer) that is suitable for short-run links. Switching the FPGA's receive equalizer from DFE to LPM seems to have fixed the issue -- at least, the link has been good for several minutes so far.
  • Did this solve the issue then?  Just trying to confirm.  Since SRIO uses 8b/10b, you would get many data transitions, guaranteed 3 transitions every code group I believe.  So, if the DFE drifts with too many 1010 patterns, I could see this causing issues.  Since the DFE uses feedback, it has the property of bit error duplication on the RX side too.  So if one bit error is detected (correctly or incorrectly), another bit error will also happen X cycles later depending on the polynomial of the feedback.  Without the protocol being able to handle this (scrambling, IDLE2,and long control symbol support), DFE really shouldn't be used.  TI doesn't support the RapidIO long reach specs that include these items.  TI's IP is v2.1 compliant.


    Regards,

    Travis

  • Travis,

    Turning DFE off does appear to have solved the issue.

    Michael