• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC Design
  3. gm/gds , intrinsic gain plot for transistor using spectre...

Stats

  • Locked Locked
  • Replies 8
  • Subscribers 125
  • Views 10984
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

gm/gds , intrinsic gain plot for transistor using spectre/ADEL

sidm
sidm over 4 years ago

Hi All,

sorry but this question might sound awkward but is there a way to directly plot intrinsic gain (gm/gds) of a transistor using ADE-L or running in spectre as a netlist ?

I have a PDK mosfet for which I am trying to generate the gm/gds versus VGS-VTH plots for different gate lengths.

I have a Hspice netlist as an example below , if this equation can be plotted through a Virtuoso schematic and ADE-L that will be great

.options post brief

.lib 'hspice.txt' nominal

.end

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago

    This has come up countless times before (I'm sure you can find this info with a bit of searching), but here's a very quick outline.

    1. Outputs->To be saved->Select OP Parameters
    2. Click on the transistor - you'll see in the ADE window a new tab showing "Save Operating Points" and you'll see a row with that transistor.
    3. You can then type in the list of operating point parameters you wish to save in the "Operating Points" box for the row containing your transistor (e.g type 'gm gds' (without the quotes, space separated).
    4. Alternatively click on the "..." button, click "Get from simulation" which will run a rapid simulation to retrieve the available operating point params that you can select from a lost
    5. Set up your dc sweep (assuming you're doing a dc sweep)
    6. Run the simulation, and then in the calculator use the "os" (if dc) or "ot" (if transient) buttons, click on the transistor and then pick "gm" or "gds" from the list, and build up your expression - e.g. OS("/M0","gm")/OS("/M0","gds")
    7. You can click on the "gear" icon with a green left arrow to send the expression back to the ADE outputs so that it can be plotted automatically

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • sidm
    sidm over 4 years ago in reply to Andrew Beckett

    Thanks for the reply Andrew, this is very helpful. I was able to replicate the steps you have mentioned.

    Only thing that remains now is to have VGS-VTH on the X-axis instead of VGS that I have presently in the DC sweep.

    As of now I am doing the DC sweep against the DC voltage source on schematic with DC voltage variable as VGS

    any suggestions on how can I make the X axis as VGS-VTH ?

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to sidm

    May depend on the models being used as to the parameter name, but suggest you also save vth as well as gm and gds for the transistor. Then create a second output in ADE called (say) VGS_VTH with an expression like this:

    xval(OS("/M0" "vth")) - OS("/M0" "vth")

    The xval will give you the swept variable (VGS in this case) and you're then subtracting vth from the transistor from it. Plot the two curves, and you'll get gmOverGds and VGS_VTH both versus VGS. Now move your cursor over the x-axis, and click right mouse->Y vs Y. Choose "VGS_VTH" as the trace and plot in a new sub window. This is the curve you want. If you want to have it as an output in ADE to be plotted automatically, you can build the waveVsWave expression like this:

    waveVsWave(?x VGS_VTH ?y gmOverGds)

    and then add that as an ADE output.

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • sidm
    sidm over 4 years ago in reply to Andrew Beckett

    Thank you very much Andrew, this is very helpful .

    one last thing in terms of plotting -

    is there a way to plot the curves with normalized values along with the X axis ?
    For example I am sweeping DC current ID through a nmos using DC sweep with a fixed width of W=4um.
    So Instead of plotting against ID on x axis can I plot versus ID/W ?

    I am trying to generate plots like the following :

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to sidm

    You should be able to use an expression such as pv("/M0" "w" ?result 'instance) to get the width (check in the results browser under the instance results database to see what the parameter names for the transistor are - it shows wt on the schematic, but it might have been mapped to something else). Then you can build the expression for ID/W in a similar fashion to VGS-VTH and plot versus that.

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • sidm
    sidm over 4 years ago in reply to Andrew Beckett

    thanks a lot Andrew, this was very helpful

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • sidm
    sidm over 4 years ago in reply to sidm

    Hi Andrew,

    is there something similar to "OS " & "OT" for AC analysis ?

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to sidm
    sidm said:
    is there something similar to "OS " & "OT" for AC analysis ?

    No, because that would make no sense. The AC analysis results are from a linearised representation of the circuits around an operating point, so showing the operating point parameters during an AC sweep would be pointless (since they don't change). I guess in theory they could change if you swept something that affected the operating point and ran at a single frequency, but then you could do the same thing with a DC sweep to get the operating point parameters.

    In the email notification it was also asking about this expression 

    (mag(i("/T0:d" ?result "ac")) / mag(i("/T1:d" ?result "ac")))

    but you seem to have deleted that from the post now. The first thing to have checked (and you may have done that now) is to check the individual results before trying to divide them. In this case you're mixing schematic names (which begin with a "/" and use "/" as a hierarchy separator, and netlist names (which use "." as a hierarchy separator, and ":" for currents). So that will always fail. You should probably have used either:

    (mag(i("/T0/D" ?result "ac")) / mag(i("/T1/D" ?result "ac")))

    or

    (mag(i("T0:d" ?result "ac")) / mag(i("T1:d" ?result "ac")))

    (the first is a guess as to whether the pin names are D on the symbol).

    This also depends on you having saved the currents through the terminals too.

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information