The Designer's Guide Community Forum
https://designers-guide.org/forum/YaBB.pl
Simulators >> Circuit Simulators >> ADE parametric corner analysis
https://designers-guide.org/forum/YaBB.pl?num=1171308140

Message started by Visjnoe on Feb 12th, 2007, 11:22am

Title: ADE parametric corner analysis
Post by Visjnoe on Feb 12th, 2007, 11:22am

Dear all,

does anyone know how to set up a parametric analysis over corners using the CADENCE framework?

I'm pretty sure this cannot be set up under ADE using the Corner Analysis Tool and the Parametric Analysis Tool, since these 2 tools seem somewhat distinct and cannot be made to work together (or at least, I have not been able to do this after trying almost every button/window)

My guess would be this can be set up under OCEAN using something as:

paramAnalysis()
cornerRun()

but I'm not sure...has anyone done this before?

Kind Regards

Peter

Title: Re: ADE parametric corner analysis
Post by Andrew Beckett on Feb 22nd, 2007, 11:57am

Yes, it's a bit of a limitation. It can be done in IC610 using ADE-XL, and in IC5141 using VSDE (Virtuoso Schematic Driven Environment, formerly known as Aptivia).

With OCEAN you can do it, but you'd need to do either paramAnalysis with a loop around it switching the corner (by changing the model files, and changing design variables), or by doing a corner sweep using the cor.* functions and then a loop around it using the parametric analysis functions. Or you could just use loops (such as foreach) to vary both parameters and corners...

Regards,

Andrew.

Title: Re: ADE parametric corner analysis
Post by Visjnoe on Feb 22nd, 2007, 12:20pm

Andrew,

I guess a simple paramAnalysis() followed by cornerRun() will not work? :)

Regards

Peter

ps: in the meantime Cadence support indeed told me that IC610-ADEXL has this feature. I must say however that I'm surprised that this feature is not already implemented for a long time, as a basic functionality.

This is an analysis that occurs a lot in analog/mixed-signal design and has to be run over corners (obviously).

Title: Re: ADE parametric corner analysis
Post by Andrew Beckett on Feb 23rd, 2007, 2:14am

Hi Peter,

No, if you do a paramAnalysis followed by a cornerRun, it will do a param analysis followed by a corner run! (i.e. they won't be nested).

I agree, it is long overdue. That said, it's been possible in VSDE for the last few years, so we have had a UI-based solution.
However, many people use OCEAN for doing this kind of thing.

Regards,

Andrew.

Title: Re: ADE parametric corner analysis
Post by Visjnoe on Feb 28th, 2007, 6:53am

Dear Andrew,

I understand why paramRun() followed by cornerRun() won't get me the right results.

I also understand the option with the paramAnalysis() in the foreach loop and changing the modelfiles, vdd and temp for each run (makes the OCEAN script very wordy :))

However, I do not understand/do not see how to proceed on the third option (which seems the most elegant).
You suggest there to have cornerRun() with the parametricAnalysis() 'loop around it'??

Could you please provide some pseudo-code on this approach?

Thanks a lot!

Peter

Title: Re: ADE parametric corner analysis
Post by Andrew Beckett on Mar 2nd, 2007, 3:07am

Hi Peter,

Better than pseudo-code, here's a full example...


Code:
; vim: syntax=skill

;------------------------------------------------------------------------
; Global variables - definitions of locations of model files
;------------------------------------------------------------------------
gpdkModels="$PROJECT/share/gpdk180/models/spectre/gpdk.scs"
vlcModels="$PROJECT/design/vlc_models/vlc.scs"

;------------------------------------------------------------------------
; Define what is in each corner row
;------------------------------------------------------------------------
cornerVars=list(
 list('model gpdkModels)
 list('model vlcModels)
 list('var "vdd")
 list('temp)
 )

;------------------------------------------------------------------------
; Define the corners to process over
;------------------------------------------------------------------------
corners=list(
 list("NN" "TYPICAL" 3.3 27)
 list("FF" "UPPER" 3.6 0)
 list("FF" "UPPER" 3.0 80)
 list("FF" "UPPER" 3.3 27)
 list("SS" "LOWER" 3.6 0)
 list("SS" "LOWER" 3.0 80)
 list("SS" "LOWER" 3.3 27)
 )

;------------------------------------------------------------------------
; A function used within the specification lists
;------------------------------------------------------------------------
procedure(abCalculateIP3()
 ipnVRI(
    v("/RFout" ?result "qpss_fi")
   '(2 -1)
   '(0 1)
   ?rport resultParam("PORT2:r" ?result "qpss_fi")
   ?epoint pv("prf" "value" ?result "variables")
 )
)

procedure(abCalculateIP2()
 ipnVRI(
   v("/RFout" ?result "qpss_fi") - 0.0
   '(-1 1)
   '(1 0)
   ?rport resultParam("PORT2:r" ?result "qpss_fi")
   ?ordspur 2
   ?epoint pv("prf" "value" ?result "variables")
 )
)

;------------------------------------------------------------------------
; Specifications to be calculated over all corners
;------------------------------------------------------------------------
specs=list(
; name function min max
list("ip3" 'abCalculateIP3 4.0 8.5)
list("ip2" 'abCalculateIP2 100.0 140.0)
)

;------------------------------------------------------------------------
; Set up the testbench, variables, and analyses
;------------------------------------------------------------------------
simulator('spectre)
design("wlanLib" "DLNA1_tb1" "schematic")
analysis('dc ?saveOppoint t)
analysis('qpss ?flexbalance "yes"  ?funds list("frf" "frf2")  ?maxharms list("3" "3")  
           ?errpreset "conservative"  ?tstab "0"  )
desVar(        "vdd" 3.3      )
desVar(        "prf" -35      )
desVar(        "pd" 0      )
desVar(        "gc" 0.958      )
desVar(        "frf" 2.45G      )
desVar(        "frf2" 2.475G      )
desVar(        "prf2" "prf"      )
option(      'dochecklimit  "yes" )
; what is going to be saved
saveOption( 'save "selected" )
save( 'v "/RFin" "/vdd" "/RFout" )

hostMode('distributed)

;------------------------------------------------------------------------
; Now iterate over the corners
;------------------------------------------------------------------------
jobs=nil
foreach(corner corners
 models=nil
 ; initialise the corner
 foreach((cornerVar data) cornerVars corner
   case(car(cornerVar)
     (model
       models=tconc(models list(cadr(cornerVar) data))
     )
     (var
       desVar(cadr(cornerVar) data)
     )
     (temp
       temp(data)
     )
     ) ; case
   ) ; foreach
 ; set the model files at the end, having collected all the corner info
 apply('modelFile car(models))
 printf("Submitting corner %L\n" corner)
 ; submit the job - we're operating in distributed mode here.
 jobs=tconc(jobs run())
)

; convert from tconc to ordinary list
jobs=car(jobs)

printf("Waiting for all jobs to complete\n")
;------------------------------------------------------------------------
; now wait for all the jobs to finish
;------------------------------------------------------------------------
apply('wait jobs)

;------------------------------------------------------------------------
; And finally process the results and print the pass/fail data
;------------------------------------------------------------------------
overallPass=t
specTable=makeTable('specTab t)
printf("Processing results\n")
foreach((corner job) corners jobs
 openResults(job)
 foreach(spec specs
   result=funcall(cadr(spec))
   ; create a nicer name for the corner in output
   cornerName=buildString(foreach(mapcar ent corner sprintf(nil "%Y" ent)) " ")
   pass=result>=caddr(spec) && result<=cadddr(spec)
   specTable[car(spec)]=pass && specTable[car(spec)]
   overallPass=pass && overallPass
   printf("Corner %-20s %s=%10n min=%10n max=%10n %s\n" cornerName car(spec) result
       caddr(spec) cadddr(spec)
     if(pass "PASS" "FAIL")
   )
 )
)

; print overall status of each measurement
foreach(spec specs
 printf("Measurement %s - %s\n"
   car(spec) if(specTable[car(spec)] "PASS" "FAIL")
 )
) ; foreach

printf("Overall simulation status: %s\n" if(overallPass "PASS" "FAIL"))


In the example above, it's just got corners - not using the cor.* functions though - but you can see the kind of approach that can be taken. You could add further loops around this to do parametric sweeps too.

Regards,

Andrew.

Title: Re: ADE parametric corner analysis
Post by Visjnoe on Mar 2nd, 2007, 4:50am

Dear Andrew,

thanks a lot.

Regards,

Peter

The Designer's Guide Community Forum » Powered by YaBB 2.2.2!
YaBB © 2000-2008. All Rights Reserved.