The Designer's Guide Community
Forum
Welcome, Guest. Please Login or Register. Please follow the Forum guidelines.
Jul 22nd, 2024, 7:14am
Pages: 1
Send Topic Print
ADE parametric corner analysis (Read 1408 times)
Visjnoe
Senior Member
****
Offline



Posts: 233

ADE parametric corner analysis
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
Back to top
 
 
View Profile   IP Logged
Andrew Beckett
Senior Fellow
******
Offline

Life, don't talk to
me about Life...

Posts: 1742
Bracknell, UK
Re: ADE parametric corner analysis
Reply #1 - 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.
Back to top
 
 
View Profile WWW   IP Logged
Visjnoe
Senior Member
****
Offline



Posts: 233

Re: ADE parametric corner analysis
Reply #2 - Feb 22nd, 2007, 12:20pm
 
Andrew,

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

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).
Back to top
 
 
View Profile   IP Logged
Andrew Beckett
Senior Fellow
******
Offline

Life, don't talk to
me about Life...

Posts: 1742
Bracknell, UK
Re: ADE parametric corner analysis
Reply #3 - 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.
Back to top
 
 
View Profile WWW   IP Logged
Visjnoe
Senior Member
****
Offline



Posts: 233

Re: ADE parametric corner analysis
Reply #4 - 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 Smiley)

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
Back to top
 
 
View Profile   IP Logged
Andrew Beckett
Senior Fellow
******
Offline

Life, don't talk to
me about Life...

Posts: 1742
Bracknell, UK
Re: ADE parametric corner analysis
Reply #5 - 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.
Back to top
 
 
View Profile WWW   IP Logged
Visjnoe
Senior Member
****
Offline



Posts: 233

Re: ADE parametric corner analysis
Reply #6 - Mar 2nd, 2007, 4:50am
 
Dear Andrew,

thanks a lot.

Regards,

Peter
Back to top
 
 
View Profile   IP Logged
Pages: 1
Send Topic Print
Copyright 2002-2024 Designer’s Guide Consulting, Inc. Designer’s Guide® is a registered trademark of Designer’s Guide Consulting, Inc. All rights reserved. Send comments or questions to editor@designers-guide.org. Consider submitting a paper or model.