Post Go back to editing

ADRV9025: Sync Header Alignment Issue in JESD204C

Category: Hardware

Hi Team,

I am bringing-up jesd204c on adrv9025 where I am using eval board. 

I am seeing that random sync header alignment issue where I am not seeing bit transition. Even though, jesd204_rx_sh_lock and jesd204_rx_emb_lock signals are asserted.

Also, sometime jesd204_rx_sh_lock  and jesd204_rx_emb_lock are deasserted. 

 

Could you please give me some pointers where we can look into ?

Regards,

MVS

  

Top Replies

    •  Analog Employees 
    Jun 30, 2023 in reply to MKS3134 +1 verified
    What else , I can see apart of jesd204_rx_sh_lock.

    You can try PRBS test to check the link integrity. Use DfrmPrbsErrCountGet API function to retrieve the error status and lane errors. The…

  • Please check the below posts, also check "LINK INITIALIZATION AND DEBUGGING" section of the UG.

     ADRV9026 JRx Link Drop Debugging Hint 

     JESD204C link establishment process for ADRV9026 

  • sometime jesd204_rx_sh_lock  and jesd204_rx_emb_lock are deasserted

    It is failing in sync header lock (sh_lock) phase itself. emb_lock requires sh_lock to be 1. Please check the signal integrity of lanes. Also try using the pre-emphasis and equalization feature and make sure the
    jesd204_rx_sh_lock is asserted. The receiver and transmitter should be at same rate. Hope you are following the recommended sequence for link establishment. Please confirm with the following related posts.

    Link establishment and Debugging of JESD204c

    Debugging JESD204c

  • Hi Vinod,

    jesd204_rx_sh_lock  didn't assert. My global reset and tx/rx ready was ok. What else , I can see apart of jesd204_rx_sh_lock.

    Regards,

    MVS

  • Hey Ram,

    It is not happening every time. Also, jesd204c bringup was OK. 

    jesd204_rx_sh_lock didn't assert. My global reset and tx/rx ready was ok. What else , I can see apart of jesd204_rx_sh_lock.

    Regards,

    MVS

  • What else , I can see apart of jesd204_rx_sh_lock.

    You can try PRBS test to check the link integrity. Use DfrmPrbsErrCountGet API function to retrieve the error status and lane errors. The error status is a 3-bit word, where Bit 0 = Lane inverted, bit 1 = invalid data flag, bit 2 = sample/lane error flag. If status bit 2 is set that means, we have signal integrity issues. Also make sure that bit 0 (lane inverted flag) is not set which would suggest that we have a lane polarity mismatch.

    If the signal integrity issue is still an issue, it is recommended to change the highBoost parameter in the profile. A value of 0 is recommended for low insertion loss (<11dB) lanes whereas a value of 1 is recommended for high insertion loss lanes (>11dB). Have you tried these debug options?

    Please refer to ‘FIRST TIME SYSTEM BRING UP—CHECKING LINK INTEGRITY’ in the ADRV9026 user guide.

    A sample PRBS testing script is shown below:

    ##################################SAMPLE PYTHON PRBS SCRIPT########################################################

        DfrmPrbsCfg=Types.adi_adrv9010_DfrmPrbsCfg_t()

        DfrmPrbsCfg.deframerSel=Types.adi_adrv9010_DeframerSel_e.ADI_ADRV9010_DEFRAMER_0

        DfrmPrbsCfg.polyOrder=Types.adi_adrv9010_DeframerPrbsOrder_e.ADI_ADRV9010_PRBS31

        DfrmPrbsCfg.checkerLocation=Types.adi_adrv9010_DeframerPrbsCheckLoc_e.ADI_ADRV9010_PRBSCHECK_LANEDATA

        adrv9010.DataInterface.DfrmPrbsCheckerStateSet(DfrmPrbsCfg)

                   

        DfrmPrbsErrCounters = Types.adi_adrv9025_DfrmPrbsErrCounters_t()

        DfrmPrbsErrCounters.sampleSource = Types.adi_adrv9010_DeframerPrbsCheckLoc_e.ADI_ADRV9010_PRBSCHECK_LANEDATA

     

        time.sleep(0.001)

     

        #Setup FPGA and DUT PRBS Generator/Checker for PRBS7

        print "Transmit PRBS 7 from FPGA"

        prbs_sel = 5 # prbs 31 and 1 for PRBS 7#

        arg = 1

        while arg < len(sys.argv):

            if sys.argv[arg] == "-pn":

                if sys.srgv[arg+1] == "7":

                    prbs_sel = 1

                elif sys.argv[arg+1] == "9":

                    prbs_sel = 2

                elif sys.argv[arg+1] == "15":

                    prbs_sel = 3

                elif sys.argv[arg+1] == "23":

                    prbs_sel = 4

                elif sys.argv[arg+1] == "31":

                    prbs_sel = 5

                else:

                    print "PRBS polynomial must be 7, 9, 15, 23, or 31"

                    exit(1)

                arg = arg + 2

            elif sys.argv[arg] == "-h" or sys.argv[arg] == "help":

                print "Usage: -pn <polynomial>"

                print " -pn <polynomial>     :  polynomial = 7 (default), 9, 15, 23, 31"

                print " -h, help             :  this help message"

                exit(0)

     

     

        # Turn on PRBS

        print "Starting PRBS"

     

        for x in range(8):

            writefpga((0x43400100 + x*0x100),0x00000004)

            writefpga((0x43400148 + x*0x100),0x20800080)

            writefpga((0x43400140 + x*0x100),0x0003007C)

            writefpga((0x43400110 + x*0x100),0x02015233)

            writefpga((0x43400120 + x*0x100),prbs_sel * 0x01000000)

            writefpga((0x43400100 + x*0x100),0x00000000)

            val = 0

            #I do not know if this is needed

            #while (val & 0x1) == 0:

                #val = readfpga(0x43400104 + x*0x100)

     

     

        #link.platform.board.Fpga.Prbs.PrbsSerializerEnable(0x0F,0x1)

     

        print

        adrv9010.DataInterface.DfrmPrbsCountReset()

     

        print "Error Counters Cleared"

        print "--------------PRBS Error Count Readout (after error cntr clear)"

        adrv9010.DataInterface.DfrmPrbsErrCountGet(DfrmPrbsErrCounters)

        print 'SERDIN_A PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[0]

        print 'SERDIN_B PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[1]

        print 'SERDIN_C PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[2]

        print 'SERDIN_D PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[3]

     

        print 'SERDIN_A PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[0]

        print 'SERDIN_B PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[1]

        print 'SERDIN_C PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[2]

        print 'SERDIN_D PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[3]

        time.sleep(1)

     

        # Inject prbs error if desired:

        injectError = 1

        if injectError:

            for x in range(8):

                temp = readfpga(0x43400120 + x*0x100)

                writefpga((0x43400120 + x*0x100), temp | 0x10000000)

     

        print "--------------PRBS Error Count Readout (error injected)"

        link.platform.board.Adrv9010Device.DataInterface.DfrmPrbsErrCountGet(DfrmPrbsErrCounters)

        print 'SERDIN_A PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[0]

        print 'SERDIN_B PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[1]

        print 'SERDIN_C PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[2]

        print 'SERDIN_D PRBS Err Cnt: ',DfrmPrbsErrCounters.laneErrors[3]

        print 'SERDIN_A PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[0]

        print 'SERDIN_B PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[1]

        print 'SERDIN_C PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[2]

        print 'SERDIN_D PRBS Err Cnt: ',DfrmPrbsErrCounters.errorStatus[3]

                                 ###################################END OF SCRIPT#########################################################