• 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. Monte Carlo simulation for device mismatch

Stats

  • Locked Locked
  • Replies 18
  • Subscribers 130
  • Views 29239
  • 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

Monte Carlo simulation for device mismatch

sdineshkumar
sdineshkumar over 10 years ago

I am trying to simulate a SRAM PUF in cadence 5.1. I want to create threshold variations between two back to back connected inverters. I decided to vary threshold of any one of the PMOS . I want to apply monte carlo simulation with guassian distribution to any one of the PMOS. I dont know  how to apply montecarlo variation to a particular PMOS?

Is there any way to do it in virtuoso 5.1

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 10 years ago

    OK, a lot of separate questions here, so let me attempt to answer them in the order you posted them last night:

    Unknown said:
    May I know how to find out the threshold voltage for each MOS after running Montecarlo simulation?

    Perform a dc operating point analysis and then you can access the operating point using a calculator function such as: OP("/M1" "vth"). The M1 is the instance name of the device. If you're using ADE - this will work well. Alternatively, if running spectre from the command line I used this:

    monte montecarlo numruns=10 variations=all {
      dcOp dc
      dcOpInfo info what=oppoint where=file
      models info what=models where=file
    }

    Then I got files, forummc.info.oppoint and forummc.info.models with the data in in human-readable form. My netlist was called forummc.scs, so the prefix of your files would depend on what your input file was called. In the oppoint file I can see vth for each transistor.

    Unknown said:
    This is the spectre code I modified.. When I run this code I am still not getting any variation.. Pls help me..

    There are a couple of things wrong with your file, but neither of these would cause it to not produce variation. The two things wrong are:

    1. NFET (D G S B) cmosn w=w l=l vth0 =0.5+ dvt0/sqrt(l*w)
      This red part is attempting to pass an instance parameter called vth0 to the transistor. This will give a warning in the simulator because vth0 is not an instance parameter of bsim3v3 (I'll explain why in response to your later question)
    2. You have the mismatch variation of dvt0 with the standard deviation set to 100% of the mean value. This means that you'll get quite a few negative values of dvt0 which will generate warnings in the simulator because I don't believe it's supposed to be negative. You probably were just setting it large to try to see a variation?

    Now, even with these mistakes, I still see variation. So my guess is that you've done something wrong in either the circuit netlist or the monte carlo setup. So:

    1. Are your transistors using the model NFET rather than cmosn? If you don't use NFET but use cmosn you'll get the globally defined model without any variation. Your instance lines in your circuit should look like this:
      M1 (D1 G 0 0) NFET w=1u l=0.18u
      M2 (D2 G 0 0) NFET w=1u l=0.18u
    2. Are you running the monte carlo with the variations set to "all" or "mismatch"? If you just set it to "process" you won't see the mismatch variation.

    I also removed the erroneous instance parameter vth0 and reduced the excessive dvt0 variation, and it still worked fine of course (but without the warnings). I also looked at using this:

    statistics {
      process {
        vary vth0 dist=gauss std=9 percent=yes
      }

      mismatch {
        vary vth0 dist=gauss std=4 percent=yes
      }
    }

    That worked well too.

    Unknown said:
    In the file which you have referred they modelled montecarlo using resistors. In the prosess paprameters they have declared mismatch parameter. I am trying to find out the mismatch parameter for the transistor. Can you pls provide a sample code to vary threshold voltage of invereters so that We can follow the same..

    Well, the above shows the principle, but precisely how you should vary the models depends on detailed understanding of the processes themselves. Inventing a threshold variation without any data on measurement is a bit silly - the foundry should have monte carlo models available (I'm assuming the models you've posted may be fictional models because you probably shouldn't have posted them if they belong to a foundry as it would be breaking NDA rules) - so you may be better off obtaining either a real technology from a foundry, or something like gpdk180 from which has monte carlo models for the transistors.

    In addition, understanding more about how mismatch works can be found in papers by Marcel Pelgrom, for example:

    These were from a quick google search for "Pelgrom matching".

    Unknown said:
    Hi, Can you please tell me what is meant by instance parameter?

    If you type "spectre -h bsim3v3" on the command line (or indeed any other component in spectre), you'll see sections listed on instance and model parameters. Instance parameters are those which can be specified on an instance of the device - i.e. where you have:

    M1 (D G S B) nch w=1u l=0.18u ad=...

    These are instance parameters. Whereas model parameters are specified when you define a model - so:

    model nch bsim3v3 type=n vth0=0.4 rsh=0.8 ...

    The parameters here are model parameters.

    Hope this is all clear!

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • Andrew Beckett
    Andrew Beckett over 10 years ago

    OK, a lot of separate questions here, so let me attempt to answer them in the order you posted them last night:

    Unknown said:
    May I know how to find out the threshold voltage for each MOS after running Montecarlo simulation?

    Perform a dc operating point analysis and then you can access the operating point using a calculator function such as: OP("/M1" "vth"). The M1 is the instance name of the device. If you're using ADE - this will work well. Alternatively, if running spectre from the command line I used this:

    monte montecarlo numruns=10 variations=all {
      dcOp dc
      dcOpInfo info what=oppoint where=file
      models info what=models where=file
    }

    Then I got files, forummc.info.oppoint and forummc.info.models with the data in in human-readable form. My netlist was called forummc.scs, so the prefix of your files would depend on what your input file was called. In the oppoint file I can see vth for each transistor.

    Unknown said:
    This is the spectre code I modified.. When I run this code I am still not getting any variation.. Pls help me..

    There are a couple of things wrong with your file, but neither of these would cause it to not produce variation. The two things wrong are:

    1. NFET (D G S B) cmosn w=w l=l vth0 =0.5+ dvt0/sqrt(l*w)
      This red part is attempting to pass an instance parameter called vth0 to the transistor. This will give a warning in the simulator because vth0 is not an instance parameter of bsim3v3 (I'll explain why in response to your later question)
    2. You have the mismatch variation of dvt0 with the standard deviation set to 100% of the mean value. This means that you'll get quite a few negative values of dvt0 which will generate warnings in the simulator because I don't believe it's supposed to be negative. You probably were just setting it large to try to see a variation?

    Now, even with these mistakes, I still see variation. So my guess is that you've done something wrong in either the circuit netlist or the monte carlo setup. So:

    1. Are your transistors using the model NFET rather than cmosn? If you don't use NFET but use cmosn you'll get the globally defined model without any variation. Your instance lines in your circuit should look like this:
      M1 (D1 G 0 0) NFET w=1u l=0.18u
      M2 (D2 G 0 0) NFET w=1u l=0.18u
    2. Are you running the monte carlo with the variations set to "all" or "mismatch"? If you just set it to "process" you won't see the mismatch variation.

    I also removed the erroneous instance parameter vth0 and reduced the excessive dvt0 variation, and it still worked fine of course (but without the warnings). I also looked at using this:

    statistics {
      process {
        vary vth0 dist=gauss std=9 percent=yes
      }

      mismatch {
        vary vth0 dist=gauss std=4 percent=yes
      }
    }

    That worked well too.

    Unknown said:
    In the file which you have referred they modelled montecarlo using resistors. In the prosess paprameters they have declared mismatch parameter. I am trying to find out the mismatch parameter for the transistor. Can you pls provide a sample code to vary threshold voltage of invereters so that We can follow the same..

    Well, the above shows the principle, but precisely how you should vary the models depends on detailed understanding of the processes themselves. Inventing a threshold variation without any data on measurement is a bit silly - the foundry should have monte carlo models available (I'm assuming the models you've posted may be fictional models because you probably shouldn't have posted them if they belong to a foundry as it would be breaking NDA rules) - so you may be better off obtaining either a real technology from a foundry, or something like gpdk180 from which has monte carlo models for the transistors.

    In addition, understanding more about how mismatch works can be found in papers by Marcel Pelgrom, for example:

    These were from a quick google search for "Pelgrom matching".

    Unknown said:
    Hi, Can you please tell me what is meant by instance parameter?

    If you type "spectre -h bsim3v3" on the command line (or indeed any other component in spectre), you'll see sections listed on instance and model parameters. Instance parameters are those which can be specified on an instance of the device - i.e. where you have:

    M1 (D G S B) nch w=1u l=0.18u ad=...

    These are instance parameters. Whereas model parameters are specified when you define a model - so:

    model nch bsim3v3 type=n vth0=0.4 rsh=0.8 ...

    The parameters here are model parameters.

    Hope this is all clear!

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

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