Commit 1417d17e authored by Andrey Filippov's avatar Andrey Filippov
Browse files

finalized DQS input delay vs clock phase adjustment, combined all current...

finalized DQS input delay vs clock phase adjustment, combined all current results together as a function of the clock phase
parent faaa504f
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -600,6 +600,58 @@ def get_dqi_dqsi():
         None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 
         None, None, None, None, None, None, None, None, None, None, None]
}
def get_maxErrDqs():
    return {
'early': [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None,
          None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None,
          None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None,
          None, None, None, None, None, None, None, None, None, None, None, None, None, None,
          [None, 64.362368028137894], [None, 60.302194877085981], [None, 57.647859713806497], [None, 52.291423247639955], [None, 45.786023431197577], [None, 62.652894325335417],
          [None, 60.557409231331356], [None, 58.408281552858178], [None, 60.999981314941245], [None, 65.421884511722794], [50.237142039106317, 63.199432286247571],
          [42.318148107136068, 63.239125888953886], [41.538888443111688, 60.584790725674402], [42.889192801896911, 61.083001361402474], [43.529422881523061, 62.777005155999802],
          [56.403422132681627, 64.428413897485285], [60.611820094492721, 62.691363553713224], [61.92538079530528, 61.924777990725495], [54.735888483939341, 59.743014096351125],
          [56.515433497571749, 61.47385519284785], [62.748846533787678, 63.442643973329268], [54.266395693386677, 61.890510754230952], [55.579956394199009, 59.236175590951468],
          [57.416067300930322, 62.333082837840841], [60.261275728468938, 64.199294894521486], [53.229213376288939, 61.945932460921625], [60.533001322865516, 63.757641247713224],
          [61.557735427846083, 62.815432605484865], [54.657069712311909, 58.852359481592003], [54.425672609429782, 60.656875181887543], [59.467910273833496, 61.246435197959869],
          [53.924572880883488, 64.45713851067498], [55.23813358169582, 62.719016457544093], [55.839925177499225, 58.948775629532548], [61.566879599624116, 60.790128631727512],
          [54.046083021004591, 60.382098985693375], [60.38707627184337, 64.442272136745061], [59.073515571031265, 62.78743925890857], [64.307482321184608, 58.880352828168078],
          [58.580527899059263, 60.758543132262687], [57.452840958494306, 64.765505556914746], [63.105834948279863, 60.705332405862833], [64.419395649092422, 58.935972089982478],
          [57.229903337726483, 60.472290777817484], [55.068968755413863, 66.207436162142642], [60.599986309400691, 60.664636149120639], [59.958689597373933, 64.724809300172552],
          [61.272250298186037, 62.384602396234413], [55.842536287795468, 60.754716813399689], [55.37327622693752, 62.706581721293162], [63.58425838093919, 64.60747945679077],
          [56.97441752583498, 61.096094251843738], [58.287978226647539, 60.13703706580646], [55.37535553690438, 60.976775925322897], [55.840456977829007, 67.482175741765502],
          [59.785192039405473, 63.202782974627048], [53.249010887157141, 63.070874526402008], [51.935450186345037, 60.416539363122524], [57.817824439147756, 60.450092665649841],
          [54.532660085694502, 66.340146180008503], [53.477056696116023, 64.116992627172976], [56.105693408017345, 61.586581081461645], [54.792132707204786, 61.2383770579927],
          [54.961141918287666, 62.151790521307987], [60.02585305639515, 68.657190337750592]],
'late':  None,
'nominal':[[58.315688644802336, 67.941608106525962], [58.699553582372133, 68.216610867075019], [60.013114283184464, 70.870946030354617], [55.522383831337692, 76.227382496521045],
          [61.249338253462469, 82.73278231296365], [61.034502057891714, 67.5297317675778], [57.605481866448571, 71.589904918629486], [56.291921165636239, 74.244240081909084],
          [59.922883974521909, 79.600676548075512], [54.195929552397018, 83.67318795743563], [59.323986578282543, 69.034479028836927], [59.598161170434622, 73.094652179888612],
          [58.284600469622177, 75.748987343168324], [57.930204670535858, 81.105423809334752], [56.480323133327346, 82.16844069617639], [61.330901916723263, 67.260539655001878],
          [57.1547706919566, 70.862730136048185], [55.841209991144268, 73.517065299327783], [63.030702302510207, 78.873501765494325], [61.812833478946203, 84.400362740016817],
          [60.701948729767963, 68.734704692647142], [59.058996045201383, 72.794877843698828], [57.745435344389051, 75.449213006978539], [64.93492765575499, 80.805649473144967],
          [59.90860812570142, 82.468215032366061], [60.656112778776873, 68.968996520593123], [57.545538650434395, 73.029169671644809], [56.231977949622063, 75.683504834924292],
          [63.421470260988002, 81.039941301090835], [61.422065520468408, 82.233923204420421], [59.0723881878383, 69.777825095129515], [61.486287718935813, 73.837998246180973], 
          [62.799848419748145, 76.492333409460684], [55.610356108382206, 81.848769875626999], [49.883401686257542, 81.425094629884256], [59.468916655554352, 67.364298434866157],
          [49.457102358747392, 67.381440082119184], [50.770663059559723, 70.035775245398895], [43.581170748193784, 75.39221171156521], [47.514454116243556, 81.897611528007815],
          [54.692502136879142, 64.117246184170369], [45.355112786426673, 68.177419335222055], [46.668673487239232, 67.127024437697798], [45.748971840204618, 72.108322158970054],
          [51.475926262329509, 78.613721975412659], [47.843894416891828, 63.434627451836832], [50.224282887023733, 65.513403513357559], [48.910722186211629, 68.167738676637043], 
          [56.100214497577568, 69.407469035206191], [61.827168919702231, 75.912868851648795], [49.794998872208467, 63.680659950289225], [59.806813169015427, 67.740833101340911], 
          [58.493252468203096, 67.563610671578488], [61.344311744412394, 71.598061321290174], [55.832450549015419, 78.103461137733007], [56.252879268922939, 64.844137581795167], 
          [60.762362958251757, 65.693923112906475], [62.075923659063861, 68.348258276185959], [56.845540347981768, 69.514314030956371], [60.831802681417201, 76.019713847398975], 
          [59.513305357913865, 67.313140050960271], [60.891652992573398, 67.146095188716004], [61.199083758137675, 69.800430351995715], [59.528416030051488, 75.15686681816203], 
          [65.255370452176379, 81.662266634604634], [56.755340584613137, 68.350709489080089], [57.851524394896131, 69.404187282975613], [59.165085095708463, 72.058522446255097], 
          [63.101323175941246, 77.414958912421639], [61.742212605515391, 83.920358728864244], [60.46566380481292, 67.094767107715484], [65.155845000490075, 71.154940258767169], 
          [63.842284299677743, 73.809275422046653], [59.538713592537619, 79.165711888213195], [53.811759170412955, 84.10815261729806], [61.019085163593758, 69.111367814980326], 
          [59.539590743180355, 73.171540966032012], [60.853151443992687, 75.825876129311496], [53.663659132626748, 81.182312595478265], [47.936704710502084, 82.091551910033218], 
          [61.789043745989915, 71.014923668091456], [54.674145892434325, 75.075096819143369], [55.987706593246656, 77.729431982422852], [48.798214281880718, 83.085868448589395], 
          [48.121640480828944, 80.187996056922088], [56.678274101447158, 69.59142914724805], [50.252678538604385, 73.651602298299736], [51.566239239416717, 76.305937461579219], 
          [48.643203555507114, 81.662373927745762], [44.607277629406795, 81.611490577765494], [54.303834394941731, 58.180895973608642], [52.627118245110267, None], 
          [53.940678945922372, None], [46.751186634556433, None], [47.113542363600516, None], None, None, None, None, None, None, None, None, None, None, None, None, None, 
          None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 
          None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
}
    
    
def get_adjust_cmda_odelay():
    return {
'cmda_odly_period':-1,
+164 −48
Original line number Diff line number Diff line
@@ -296,6 +296,7 @@ class X393LMA(object):
    def showENLresults(self,
                       DQvDQS):
        rslt_names=("early","nominal","late")
        err_name='maxErrDqs'
        numBits=0
        for n in DQvDQS:
            try:
@@ -311,15 +312,23 @@ class X393LMA(object):
                pass
        if not numBits:
            raise Exception("showENLresults(): No no-None data provided")
        numLanes=numBits//8
#        print ("numBits=%d"%(numBits))            
        enl_list=[]
        for k in rslt_names:
            if DQvDQS[k]:
                enl_list.append(k)
                
        print("DQS", end=" ")
        for enl in enl_list:
            for b in range(numBits):
                print("%s%d"%(enl[0].upper(),b),end=" ")
        for enl in enl_list:
            for lane in range(numLanes):
                    if numLanes > 1:
                        print("%s%d_err"%(enl[0].upper(),lane),end=" ")
                    else:    
                        print("%s_err"%(enl[0].upper()),end=" ")
        print()
        for dly in range(len(DQvDQS[enl_list[0]])):
            print ("%d"%(dly),end=" ")
@@ -332,6 +341,25 @@ class X393LMA(object):
                            print("?",end=" ")
                        else:
                            print("%d"%(DQvDQS[enl][dly][b]),end=" ")
            for enl in enl_list:
#                if numLanes>1:
#                    print ("DQvDQS[err_name]=",DQvDQS[err_name])
#                    print ("DQvDQS[err_name][enl]=",DQvDQS[err_name][enl])
#                    print ("DQvDQS[err_name][enl][dly]=",DQvDQS[err_name][enl][dly])
                if DQvDQS[err_name][enl][dly] is None:
                    print ("? "*numLanes,end="")
                else:
                    for lane in range(numLanes):
                        if DQvDQS[err_name][enl][dly] is None:
                            print("?",end=" ")
                        else:
                            if numLanes > 1:
                                if DQvDQS[err_name][enl][dly][lane] is None:
                                    print("?",end=" ")
                                else:
                                    print("%.1f"%(DQvDQS[err_name][enl][dly][lane]),end=" ")
                            else:
                                print("%.1f"%(DQvDQS[err_name][enl][dly]),end=" ")
            print()
        
    
@@ -853,8 +881,9 @@ class X393LMA(object):
            lane_rslt=[]
            numLanes=2
            parametersKey='parameters'
            errorKey='maxErrDqs'
            for lane in range(numLanes):
                lane_rslt.append(self.lma_fit(lane, # byte lane
                lane_rslt.append(self.lma_fit_dqi_dqsi(lane, # byte lane
                                        bin_size,
                                        clk_period,
                                        dly_step_ds,
@@ -865,8 +894,8 @@ class X393LMA(object):
                                        quiet))       
            rslt={}
            for k in lane_rslt[0].keys():
                if k != parametersKey:
                    for r in lane_rslt:
                if (k != parametersKey) and (k != errorKey):
                    for r in lane_rslt: # lane_rslt is list of two dictionaries
                        try:
                            l=len(r[k])
                            break
@@ -892,7 +921,41 @@ class X393LMA(object):
            rslt[parametersKey] = []             
            for lane in range(numLanes):
                rslt[parametersKey].append(lane_rslt[lane][parametersKey])
            rslt[errorKey]={}
#            print ("lane_rslt[0][errorKey]=",lane_rslt[0][errorKey])
            for k in lane_rslt[0][errorKey].keys():
                for r in lane_rslt: # lane_rslt is list of two dictionaries
                    try:
                        l=len(r[errorKey][k])
                        break
                    except:
                        pass
                else:
                    rslt[errorKey][k]=None
                    continue
                rslt[errorKey][k]=[]
                for dly in range(l):
                    w=[]
                    for lane in range(numLanes):
                        if (lane_rslt[lane][errorKey][k] is None) or (lane_rslt[lane][errorKey][k][dly] is None):
                            w.append(None)
                        else:
                            w.append(lane_rslt[lane][errorKey][k][dly])
                    for lane in w:
                        if not lane is None:
                            rslt[errorKey][k].append(w)
                            break
                    else:
                        rslt[errorKey][k].append(None)
                        
#            print ("lane_rslt[0][errorKey]=",lane_rslt[0][errorKey])
#            print ("lane_rslt[1][errorKey]=",lane_rslt[1][errorKey])
#            print ("combined: rslt['maxErrDqs']=",rslt['maxErrDqs'])
#            print ("rslt=",rslt)
            
            return rslt # byte lanes combined        
#        rslt['parameters']=parameters
#        rslt['maxErrDqs']=DQvDQS_ERR # {enl}[dly]
                
                
                
@@ -1057,10 +1120,14 @@ class X393LMA(object):
            self.showYOrVector(ywp,True,fx)
            
        # calculate DQ[i] vs. DQS for -1, 0 and +1 period
        DQvDQS=self.getBestDQforDQS(parameters,
        DQvDQS_withErr=self.getBestDQforDQS(parameters,
                                            primary_set,
                                            quiet)

        DQvDQS=    DQvDQS_withErr['dqForDqs']
        DQvDQS_ERR=DQvDQS_withErr['maxErrDqs']
        if quiet < 4:
#           print ("DQvDQS_ERR=",DQvDQS_ERR)
            enl_list=[]
            for i in range(3):
                if not DQvDQS[i] is None:
@@ -1069,6 +1136,8 @@ class X393LMA(object):
            for enl in enl_list:
                for b in range(8):
                    print("%s%d"%(('E','N','L')[enl],b),end=" ")
            for enl in enl_list:
                print("%s-Err"%(('E','N','L')[enl]),end=" ")
            print()
            for dly in range(DLY_STEPS):
                print ("%d"%(dly),end=" ")
@@ -1081,12 +1150,26 @@ class X393LMA(object):
                                print("?",end=" ")
                            else:
                                print("%d"%(DQvDQS[enl][dly][b]),end=" ")
                for enl in enl_list:
                    if DQvDQS_ERR[enl][dly] is None:
                        print ("? ",end="")
                    else:
                        print ("%f"%(DQvDQS_ERR[enl][dly]), end=" ")
                print()
        rslt={}
        rslt_names=("early","nominal","late")
        for i, d in enumerate(DQvDQS):
            rslt[rslt_names[i]] = d
        rslt['parameters']=parameters
        
        rslt['maxErrDqs']={} # {enl}[dly]
        for i, d in enumerate(DQvDQS_ERR):
            rslt['maxErrDqs'][rslt_names[i]] = d
        if quiet < 4:
            self.showDQDQSValues(parameters)
#        print ("DQvDQS_ERR=",DQvDQS_ERR)
#        print ("rslt['maxErrDqs']=",rslt['maxErrDqs'])
        
        return rslt
#        return DQvDQS 
#        Returns 3-element dictionary of ('early','nominal','late'), each being None or a 160-element list,
@@ -1107,75 +1190,80 @@ class X393LMA(object):
        tDQ=  parameters['tDQ'] # list
        
        tCDQS32=list(parameters['tCDQS'][0:8])+[0]+list(parameters['tCDQS'][8:23])+[0]+list(parameters['tCDQS'][23:30])
#        tDQSHL =parameters['tDQSHL']#single value
#        tDQHL=  parameters['tDQHL'] # list
        
        tFDQs=[]
        tDQSHL =parameters['tDQSHL']#single value
        tDQHL=  parameters['tDQHL'] # list

        tFDQs=[] #corrections in steps?
        for b in range(8):
            tFDQi=list(parameters['tFDQ'][4*b:4*(b+1)])
            tFDQi.append(-tFDQi[0]-tFDQi[1]-tFDQi[2]-tFDQi[3])
            for i in range(5):
                tFDQi[i]/=tSDQ[b]
            tFDQs.append(tFDQi)
            
        #calculate worst bit error caused by duty cycles (asymmetry) of DQS and DQ lines
        #bit delay error just adds to the  0.25*(abs(tDQSHL)+abs(tDQHL))
        asym_err=[]
        for i in range(8):
            asym_err.append(0.25*(abs(tDQSHL)+abs(tDQHL[i])))
        print("asym_err=",asym_err) 
        dqForDqs=[]
        maxErrDqs=[]
        for enl in (0,1,2):
            vDQ=[]
            vErr=[]
            someData=False
            for dly in range(DLY_STEPS):
                tdqs=dly * tSDQS - tDQS - tFDQS5[dly % FINE_STEPS] # t - time from DQS pad to internal DQS clock with zero setup/hold times to DQ FFs
                tdqs-=tCDQS32[dly // FINE_STEPS]
                tdq3=tdqs +(-0.75+enl)*period # (early, nominal, late) 
                tdqs3=tdqs +(-0.75+enl)*period # (early, nominal, late) in ps, centered in the middle
                bDQ=[]
                errDQ=None
#                dbg_worstBit=None
#                dbg_errs=[None]*8
                for b in range(8): # use all 4 variants
                    tdq=(tdq3+tDQ[b])/tSDQ[b]
                    itdq=int(round(tdq)) # in delay steps
                    tdq=(tdqs3+tDQ[b])/tSDQ[b]
                    itdq=int((tdqs3+tDQ[b])/tSDQ[b]) # in delay steps, approximate (not including tFDQ
                    bestDQ=None
                    if (itdq >= 0) and (itdq < DLY_STEPS):
                        bestDiff=None
                        for idq in range (max(itdq-FINE_STEPS,0),min(itdq+FINE_STEPS,DLY_STEPS-1)+1):
                            diff=idq-tFDQs[b][idq % FINE_STEPS]
                            if (bestDQ is None) or (abs(diff) < bestDiff):
                            tdq=idq * tSDQ[b] - tDQ[b] - tFDQs[b][idq % FINE_STEPS]
                            diff=tdq - tdqs3 # idq-tFDQs[b][idq % FINE_STEPS]
                            if (bestDQ is None) or (abs(diff) < abs(bestDiff)):
                                bestDQ=idq
                                bestDiff=abs(diff)
                                bestDiff=diff
                    if bestDQ is None:            
                        bDQ=None
                        break
                    bDQ.append(bestDQ)
                    bDQ.append(bestDQ) #tuple(delay,signed error in ps)
                    """
                    fullBitErr=bestDiff # +asym_err[b] #TODO: Restore the full error!
                    if (errDQ is None) or (abs(fullBitErr) > abs (errDQ)):
                        errDQ= fullBitErr
                    """
                    fullBitErr=abs(bestDiff) +asym_err[b] #TODO: Restore the full error!
#                    dbg_errs[b]=abs(bestDiff)
                    if (errDQ is None) or (fullBitErr > errDQ):
                        errDQ= fullBitErr
#                        dbg_worstBit=b
                    
                    someData=True
                vDQ.append(bDQ)
                vErr.append(errDQ)
##                if dbg_worstBit is None:
##                    vErr.append(None)
##                else:
#                    vErr.append(asym_err[dbg_worstBit])
#                    vErr.append(10*dbg_worstBit)
#                    vErr.append(dbg_errs[2])
##                    vErr.append(dbg_errs[5])
#                print ("enl=%d, dly=%d, err=%s"%(enl,dly,str(errDQ)))
            if someData:    
                dqForDqs.append(vDQ)
                maxErrDqs.append(vErr)
            else:
                dqForDqs.append(None)
        return dqForDqs
    """
        for dly in range(DLY_STEPS):
            tdqs=dly * tSDQS - tDQS - tFDQS5[dly % FINE_STEPS] # t - time from DQS pad to internal DQS clock with zero setup/hold times to DQ FFs
            tdq3=(tdqs-0.75*period, tdqs + 0.25*period,tdqs + 1.25*period) # (early, nominal, late) 
            bDQ=[]
            allBits=[True,True,True]
            for b in range(8): # use all 4 variants
                vDQ=[]
                for enl in (0,1,2):
                    tdq=(tdq3[enl]+tDQ[b])/tSDQ[b]
                    itdq=int(round(tdq)) # in delay steps
                    bestDQ=None
                    if (itdq >= 0) and (itdq < DLY_STEPS):
                        bestDiff=None
                        for idq in range (max(itdq-FINE_STEPS,0),min(itdq+FINE_STEPS,DLY_STEPS-1)+1):
                            diff=idq-tFDQs[b][idq % FINE_STEPS]
                            if (bestDQ is None) or (abs(diff) < bestDiff):
                                bestDQ=idq
                                bestDiff=abs(diff)
                    if bestDQ is None:            
                        allBits[enl] = False
                    vDQ.append(bestDQ)
                bDQ.append(vDQ)
                
            dqForDqs.append(bDQ)               
    """
                
                maxErrDqs.append(None)
        return {'dqForDqs':dqForDqs,'maxErrDqs':maxErrDqs}
        
    """
    ir = ir0 - s/4 + d/4 # ir - convert to ps from steps
@@ -1187,6 +1275,34 @@ class X393LMA(object):
    s=if-ir+of-or
    d=ir-if+of-or
    """
    def showDQDQSValues(self,
                        parameters):
        tFDQS5=list(parameters['tFDQS'])
        tFDQS5.append(-tFDQS5[0]-tFDQS5[1]-tFDQS5[2]-tFDQS5[3])
        tSDQS=parameters['tSDQS']
        tSDQ= parameters['tSDQ'] # list
        tCDQS32=list(parameters['tCDQS'][0:8])+[0]+list(parameters['tCDQS'][8:23])+[0]+list(parameters['tCDQS'][23:30])
        tFDQs=[] #corrections in steps?
        for b in range(8):
            tFDQi=list(parameters['tFDQ'][4*b:4*(b+1)])
            tFDQi.append(-tFDQi[0]-tFDQi[1]-tFDQi[2]-tFDQi[3])
            tFDQs.append(tFDQi)
        print("\nRelative delay vs delay value")
        print ("dly DSQS", end=" ")
        for b in range(8):
            print ("DQ%d"%(b),end=" ")
        print ()
        for dly in range(DLY_STEPS): # no constant delay - just scale and corrections
            print ("%d"%(dly),end=" ")
            tdqs=dly * tSDQS  - tFDQS5[dly % FINE_STEPS] # t - time from DQS pad to internal DQS clock with zero setup/hold times to DQ FFs
            tdqs-=tCDQS32[dly // FINE_STEPS]
            print("%.3f"%(tdqs),end=" ")
            for b in range(8):
                tdq=dly * tSDQ[b] - tFDQs[b][dly % FINE_STEPS]
                print("%.3f"%(tdq),end=" ")
            print()    

    
    def createFxAndJacobian(self,
                            parameters,
                            y_data, # keep in self.variable?
+98 −3

File changed.

Preview size limit exceeded, changes collapsed.