Quantcast
Channel: Cadence Custom IC Design Forum
Viewing all 4888 articles
Browse latest View live

Device (BSIM4) operating-point parameters

$
0
0

Hi,

I do have one general and three specific questions concerning operating-point parameters (especially for BSIM4).

General question:

1. The operating-point parameters are not defined by the BSIM4 model, but are specific to the simulator used (Spectre, HSpice, Eldo), correct ?

This is why I find the operating point parameters documented in the Spectre documentation only and not in the BSIM4 manual, right ?

Specific questions to operating point parameters:

2. What is the difference between OP "vdsat" and "vdss" (I don't find any explanation in the latest spectre documentation v18.10 and the values after simulation seem to be the same) ?

3. What is the difference between OP "betaeff" and "beff" (I don't find any explanation in the latest spectre documentation v18.10 and the values after simulation differ) ?

4. What is OP "self_gain" ( I assume it is the intrinsic gain of gm*rout, but did not find documentation for it) ?


Encountering errors while running Monte Carlo Simulation using UMC foundary files

$
0
0

I am trying to run Monte-Carlo analysis in cadence virtuoso ( IC617.500.17, Spectre 161). I am using UMC foundry process development kit for the 180nm node. After doing all the steps in running Monte-Carlo analysis, finally, some errors are occurring. I think the errors are related to the Monte Carlo files provided by UMC Library. I don’t have much knowledge about the codes given inside the file provided by UMC. I request your help to give some insights for solving the same.

The details regarding the issue are attached below:

 1. In the ADEL setup, I have added all the required Monte Carlo library files.

2. In ADEXL, after running the Monte Carlo simulation, initially, I got an error which says “certain parameters( like dtox_n_18_mm_t ) were previously defined, add ‘+spice’ in the command line or option ‘redefinedparams’ in netlist to avoid these type of errors.” A screenshot of that error is attached below:

3. With the help on this error obtained from an online forum, in the ADEL window under

“Simulations   ->   Options  ->   Analog     ->   Check   ->  redefinedparams , I selected ignore option as shown below.

I ran the simulation again. Then a new set of error came. One of the error is regarding an unknown parameter ‘sigma’ another is regarding defining of the same parameter twice. The screenshot of this error is given below.

What shall I do to resolve them? I 

convergence issue

$
0
0

Hi all,

during simulation with ADE L I get the following error: 

(SPECTRE-16927): Transient simulation reaches maximum allowed number of convergence failures below minstep within 5% of stop time.
Change option `max_minstep_nonconv' to adjust the allowed maximum number of convergence failures below minstep.
Last acceptable solution computed at 10.0042 ns.

where is such 'max_minstep_nonconv' parameter set?

Thank you

best regards

Combining/extending monte carlo simulation results

$
0
0

I'm using ADE Assembler (IC6.1.7-64b.500.17).

I ran a monte carlo simulation and now I would like to extend the number of runs.

The way to go is probably to use the same seed, increase the 'first point' number with (at least) the number of simulations that already have been performed and run the simulation again.

But I'm not sure how to combine both results as to obtain a single distribution.

transient simulation result not available by RMB->Plot, but available in result browser

$
0
0

Hi, I face a problem that I sweep more than 1K corners transient simulations. When it finish without any error, I can't use RMB-plot to show the curve, e.g., "plot across corners". It gives the warning in CIW as transient sim result not available. But when I open result browser, I could display the transient curve there. 

Is there any solution for this, I don't want to re-sim so huge test bench again. 

BR

Libscore with Joules

$
0
0

Hi, I am trying to plot multiple liberty files performance at the single plot (w.r.t different FOM, e.g., delay, leakage etc.) any tool that able to perform this? have tried to use Joules but so far only able to compare two PVT. Many thanks.

How to recognise .GLOBAL statements from CDL models within AMS

$
0
0

Hello,

I am running a mixed signal simulation where my standard cell instances are defined using a .cdl model file which contains information like this.

.subckt adc12_stdcell_ADDFHX4 CO S A B CI
M0 net76 net82 VSS VSS n18 l=0.18 w=0.96
M1 VDD net82 net76 VDD p18 l=0.18 w=1.44
M2 CO net119 VSS VSS n18 l=0.18 w=2.4
.............
M27 net131 net84 net138 VSS n18 l=0.18 w=1.52
M28 net137 B net138 VSS n18 l=0.18 w=1.36
M29 net137 net84 net88 VSS n18 l=0.18 w=1.52
M30 net138 A VSS VSS n18 l=0.19 w=1.41
M31 VDD A net138 VDD p18 l=0.18 w=2.1
.ends ADDFHX4
*.SCALE meter
.GLOBAL VDD VSS

The gates are just symbol views in Virtuoso. The model file is selected under the Hierarchy Editor using the Set Cell View --> Specify SPICE Source file to pick up the .cdl file.

So far I haven't been able to get AMS to recognise the .GLOBAL statements and so my VDD and VSS nets within the CDL standard cells are unconnected.

I've searched around on the Community but haven't hit the information I need.

Can anyone give me a few pointers?

Many thanks,

Matthew Cordrey-Gale

multiple instances for monte carlo

$
0
0

Hi,

I design a small block with a few transistors.

I want to see and measure, in my simulations, 1000 instances of this block, as they will be fabricated in Si (i.e. no intentional extreme cases, but true distribution).

For various reasons, I prefer not to run 1000 different splits, but instead to instantiate the small block 10 times in my testbench and run only 100 splits.

This way, instead of one measurement, I have 10 measurements in my Maestro, and I extract the required statistics manually based on the 100X10=1000 measurement results I have.

The question is, is my thinking correct. 

I'm afraid that for some reason, due to the way the Monte Carlo in implemented, I don't really have results of 1000 blocks, as the 10 different instances may be correlated somehow. 

If it matters, the sampling method I'm using is "random", because I want to see a true distribution of 1000 blocks and not to see extreme end cases.

Thanks!


Cadence Spectre cannot read library model files

$
0
0

Hello everyone,

Recently I am using Cadence Spectre(Version 16.1.0.387.isr6 32bit) to simulate a netlist in command line. However, I met the error when reading the library model file:
Reading file: /home/grads/z/zhanxin/PowerDeliveryNetwork/IBM_90nm_models/IBM_PDK/cmos9sf/V2.2.0.1IBM/Spectre/models/design.scs

Fatal error found by spectre during circuit read-in.
FATAL (SFE-867): Unable to open the file `/home/grads/z/zhanxin/PowerDeliveryNetwork/IBM_90nm_models/IBM_PDK/cmos9sf/V2.2.0.1IBM/Spectre/models/design.scs'.

That circuit library file (design.scs) could be accessed via vim, so this excludes the possibility of path error. Also, I have tested it on an old server with Spectre version 15.1.0.602.isr11-32bit  installed and the simulation performs normally. Is there anyone having experiences about how to solve it with the new version Spectre?

Thanks a lot!
Xin

Creating Circles in layout

$
0
0

Hi,

I am trying to create a circle in my layout with smallest possible resolution (PDK suggests 5 nm). For this, I used the SKILL code posted before on this forum. The code works for the radius 1 um and grid size 5 nm and the shape passes the DRC. But I need the circle to be designed for atleast a 20 um radius(circle shown in circle 1um.png). When I try to do this for the 20 um radius (circle 20 um.png), I get a circle chopped off into sectors and the DRC fails. I am new to SKILL and I do not undertsand the reason behind this. Can someone please help me understand this issue and provide a solution that works for 20 um radius without theDRC errors.

The skill code for generating the circle is...

Direction

      5 6 7
      \    |    /
    4 - O - 0
      /  |   \
      3 2 1

--- Using it ---

You'll need to modify the call to pcDefinePCell() below to specify your
preferred library/cell names and possibly the default radius, grid and layer.
Once you've done that just use 'load("/path/to/circlePcell.il")' in the CIW or
the libInit.il file for your library.

*/
(defun RALgetNextPoint (direction X Y grid radius)
  (let (X0 Y0 R0 D0 X1 Y1 R1 D1 X2 Y2 R2 D2 X3 Y3 R3 D3 X4 Y4 R4 D4
    X5 Y5 R5 D5 X6 Y6 R6 D6 X7 Y7 R7 D7 ret)
    
    (if direction == 0 || direction == 1 || direction == 7 then
      (X0 = X + grid)
      (Y0 = Y)
      (R0 = (X0**2 + Y0**2)**0.5)
      (D0 = (abs R0 - radius)))

    (if direction == 1 || direction == 2 || direction == 0 then
      (X1 = X + grid)
      (Y1 = Y - grid)
      (R1 = (X1**2 + Y1**2)**0.5)
      (D1 = (abs R1 - radius)))

    (if direction == 2 || direction == 3 || direction == 1 then
      (X2 = X)
      (Y2 = Y - grid)
      (R2 = (X2**2 + Y2**2)**0.5)
      (D2 = (abs R2 - radius)))

    (if direction == 3 || direction == 4 || direction == 2 then
      (X3 = X - grid)
      (Y3 = Y - grid)
      (R3 = (X3**2 + Y3**2)**0.5)
      (D3 = (abs R3 - radius)))

    (if direction == 4 || direction == 5 || direction == 3 then
      (X4 = X - grid)
      (Y4 = Y)
      (R4 = (X4**2 + Y4**2)**0.5)
      (D4 = (abs R4 - radius)))

    (if direction == 5 || direction == 6 || direction == 4 then
      (X5 = X - grid)
      (Y5 = Y + grid)
      (R5 = (X5**2 + Y5**2)**0.5)
      (D5 = (abs R5 - radius)))

    (if direction == 6 || direction == 7 || direction == 5 then
      (X6 = X)
      (Y6 = Y + grid)
      (R6 = (X6**2 + Y6**2)**0.5)
      (D6 = (abs R6 - radius)))

    (if direction == 7 || direction == 0 || direction == 6 then
      (X7 = X + grid)
      (Y7 = Y + grid)
      (R7 = (X7**2 + Y7**2)**0.5)
      (D7 = (abs R7 - radius)))

    (caseq direction
           (0
            /* Possible 7 0 1 */
            (if D0 < D1 && D0 < D7 then
              /* Go D0 */
              (ret = (list X0 Y0 0))
              else
              (if D1 < D0 && D1 < D7 then
                /* Go D1 */
                (ret = (list X1 Y1 1))
                else
                /* Go D7 */
                (ret = (list X7 Y7 7))
                )
              )
            )

           (1
            /* Possible 0 1 2 */
            (if D1 < D2 && D1 < D0 then
              /* Go D1 */
              (ret = (list X1 Y1 1))
              else
              (if D2 < D1 && D2 < D0 then
                /* Go D2 */
                (ret = (list X2 Y2 2))
                else
                /* Go D0 */
                (ret = (list X0 Y0 0))
                )
              )
            )

           (2
            /* Possible 1 2 3 */
            (if D2 < D3 && D2 < D1 then
              /* Go D2 */
              (ret = (list X2 Y2 2))
              else
              (if D3 < D2 && D3 < D1 then
                /* Go D3 */
                (ret = (list X3 Y3 3))
                else
                /* Go D1 */
                (ret = (list X1 Y1 1))
                )
              )
            )

           (3
            /* Possible 2 3 4 */
            (if D3 < D4 && D3 < D2 then
              /* Go D3 */
              (ret = (list X3 Y3 3))
              else
              (if D4 < D3 && D4 < D2 then
                /* Go D4 */
                (ret = (list X4 Y4 4))
                else
                /* Go D2 */
                (ret = (list X2 Y2 2))
                )
              )
            )

           (4
            /* Possible 3 4 5 */
            (if D4 < D5 && D4 < D3 then
              /* Go D4 */
              (ret = (list X4 Y4 4))
              else
              (if D5 < D4 && D5 < D3 then
                /* Go D5 */
                (ret = (list X5 Y5 5))
                else
                /* Go D3 */
                (ret = (list X3 Y3 3))
                )
              )
            )

           (5
            /* Possible 4 5 6 */
            (if D5 < D6 && D5 < D4 then
              /* Go D5 */
              (ret = (list X5 Y5 5))
              else
              (if D6 < D5 && D6 < D4 then
                /* Go D6 */
                (ret = (list X6 Y6 6))
                else
                /* Go D4 */
                (ret = (list X4 Y4 4))
                )
              )
            )

           (6
            /* Possible 5 6 7 */
            (if D6 < D7 && D6 < D5 then
              /* Go D6 */
              (ret = (list X6 Y6 6))
              else
              (if D7 < D6 && D7 < D5 then
                /* Go D7 */
                (ret = (list X7 Y7 7))
                else
                /* Go D5 */
                (ret = (list X5 Y5 5))
                )
              )
            )

           (7
            /* Possible 6 7 0 */
            (if D7 < D0 && D7 < D6 then
              /* Go D7 */
              (ret = (list X7 Y7 7))
              else
              (if D0 < D7 && D0 < D6 then
                /* Go D0 */
                (ret = (list X0 Y0 0))
                else
                /* Go D6 */
                (ret = (list X6 Y6 6))
                )
              )
            )

         )
  ret
  ))

pcDefinePCell(list(ddGetObj("ph90wg") "disk1" "layout")
    ((Radius float 1.0) (Grid float 0.005) (Layer string "RX"))
    let(( pcParameters pcParamProp pcLayer pcPurpose polyList
        X Y direction ret cheese points)

    (pcParameters = ((pcCellView~>parameters)~>value))

    (pcParamProp = car(exists(prop pcParameters ((prop~>name) == "Radius"))))
    (Radius = (pcParamProp~>value))

    (pcParamProp = car(exists(prop pcParameters ((prop~>name) == "Grid"))))
    (Grid = (pcParamProp~>value))

    (pcParamProp = car(exists(prop pcParameters ((prop~>name) == "Layer"))))
    (Layer = (pcParamProp~>value))

    (dbReplaceProp pcCellView "viewSubType" "string" "maskLayoutParamCell")

    (polyList = nil)

    (X = 0.0)
    (Y = Radius)
    (direction = 0)

    (pcLayer = Layer)
    (pcPurpose = "drawing")

    (polyList = (tconc polyList (list X Y)))
    (ret = (RALgetNextPoint direction X Y Grid Radius))
    (X = (car ret))
    (Y = (cadr ret))
    (direction = (caddr ret))
    (polyList = (tconc polyList (list X Y)))
    (points = 1)
    (cheese = 0)
    (while !( (abs X) < Grid && (abs Radius-Y) < Grid)
           (points = points + 1)
           (ret = (RALgetNextPoint direction X Y Grid Radius))
           (X = (car ret))
           (Y = (cadr ret))
           (direction = (caddr ret))
           (polyList = (tconc polyList (list X Y)))

           /* Split into multiple polygons if the number of points will exceed
            * the maximum. If this happens, the final polygon must contain an
            * additional point at 0,0 so that it closes properly. This is
            * controlled with the "cheese" variable because the output shape
            * resembles a round cheese chopped into pieces. */
           (if points == 2047 then
             (polyList = (tconc polyList (list 0.0 0.0)))
             (dbCreatePolygon pcCellView
                              (list pcLayer pcPurpose)
                              (car polyList))
             (points = 0)
             (cheese = 1)
             (polyList = (tconc nil (list X Y)))
             )
           )

    (if (onep cheese) then
      (polyList = (tconc polyList (list 0.0 0.0)))
      )

    (dbCreatePolygon pcCellView
                     (list pcLayer pcPurpose)
                     (car polyList))
    t
    )
    )

Virtuoso Space Based Router (VSR) Routing Methodology

$
0
0

My question is maybe not too relevant for this section (kind of off-topic) but I am very much interested in understanding how does VSR is very fast to route big layouts?. Typically a router is combination of shortest path algorithms and some design constraints. For shortest path between pins typically the algorithm has to traverse through the nodes of graph (coordinates of maze/grid) and based in the step size these nodes could be 100 Million to 1 Billion for bigger circuits. How does VSR can traverse through these nodes and solve the big circuits and reasonable time?. Is is because the grid/maze is hard coded in the virtuoso layout suits and all shortest paths are also saved ?.

I was trying to write my own router but for bigger layouts I realized my router has become much slower because of Millions of graph nodes. I am very much interested in understanding the engineering behind this router.

P.S: I hope I am not asking something which shouldn't be shared on public forum 

How to append (or write) data into a file in column wise using SKILL/OCEAN

$
0
0

Dear All,

I want to add/append  data  into a file in column wise using Ocean script.

In other words, I run my  1st for loop which will add data in row wise in column 1.

In the next for loop run the data should be added in row wise but in in column 2.

One example:-

In loop 1 data are added into the file as below:-

1,

15,

2,

4,

11

In loop 2 data are added in the 2nd column as below:-

1,       61,

15,      4,

2,       13,

4,        12,

11         7

Similarly, for nth loop run, the data re to be added in nth column.

I know to append data in row wise into a .csv file using script. But I do not know how to add data in column wise.

Can anybody please tell how to achieve this using OCEAN script..

Kind Regards,

DFT parameters in spectrum emasurements

$
0
0

Hi all,

I am trying to get the DFT of the output waveform to get SINAD and ENOB. There are some things I am not sure about when reading at the help section about spectrum:

At a certain point it says: "The Sample Count value must be greater than zero. By default, this field displays the number of data points in the selected signal." but if I am looking at a waveform that lasts 20.48 us and time step during simulation was 1 ns means that the trace has 20480 points, but by default I get 1024 in the Sample Count field, why is that?

At another point it says: "The number of input periods in the period of the Fourier transform needs to be an integer and a prime number, where the period of the Fourier transform is 1/ the fundamental frequency of the Fourier transform." So it is saying that the interval stop time-start time should be an integer number of periods of my waveform, and that is ok, but why should it also be a prime number?

Also I am not sure  about how the signal first harmonic is chosen, is it just the one with bigger amplitude?

Thanks a lot for your help

spectremdl pss - access phase noise results

$
0
0

Is there a way to access the phase noise in spectremdl, e.g. phase noise in dBc/Hz at 1MHz offset?  The pss sim runs in spectremdl and produces some pss_fd result, but I don't see a way to print that using mdl. 

Simulating kT/C noise in discrete-time delta-sigma

$
0
0

Hi, 

I am trying to get the transient noise of my switched-capacitor delta-sigma in VerilogA. The building blocks are all ideal except the switches, which are modelled as follows:

`timescale 1ns / 1ps
`include "disciplines.vams"

module sw(in, n, s);
parameter real ron = 10.0 from (0:inf); // on resistance (ohms)
parameter real roff = 100.0M from (ron:inf);// off resistance (ohms)
parameter real td = 0.0; // delay time (s)
parameter real tr = 20n; // rise time (on -> off) (s)
parameter real tf = 20n; // fall time (off -> on) (s)
input s;
logic s;
electrical in, n;
real reff;

analog begin
@(posedge s) reff = ron;
@(negedge s) reff = roff;
@(initial_step) reff = (s ? ron : roff);

V(in,p) <+ white_noise(4*`P_K*$temperature*reff,"thermal");
I(p, n) <+ V(p, n) / transition(reff, td, tr, tf);
end
endmodule

However, I am getting zero transient noise while simulating in transient mode. I have the feeling that the white_noise can only be seen in small-signal analysis and not in transient simulations? If so, how can I get the transient noise from these switches?

Thanks

Kind regards, 

Nicolas

PS: I actually need transient noise for my own purposes and not pnoise results...


Library Path display issue

$
0
0

I met a problem when I define the library in cds.lib file.

If I define like below:

DEFINE    LIBA    PATHA

SOFTDEFINE    LIBA   PATHB

WHen the  PATHA and  PATHB all exist, in Library Path, it will show the PATHB without any problem.

If the  PATHA is exist and the PATHB is not exist, the Library Path will show the PATHB in red, but it will point the LIBA to the  PATHA. Then if I show the property of LIBA, it will show the PATHA.

My question is how can I make the library path to show the correct path if the SOFTDEFINE path is not exist.

Thanks

Kevin

ADE/Virtuoso Question: .scs File Related

$
0
0

Hello,

I'm new to this forum, so I'm putting this post in the area I think it should be in. The questions area. If there is a better place for this post, please direct me there.

I'm trying to design a Rail-to-rail OTA, shown here.

And I've created a test-bench to test the functionality of the OTA, shown here.

My question is this. How do I get ADE to plot the gm of a given transistor in the OTA when the simulation is running on a test bench schematic and not the schematic of the OTA directly? I know that if you open a simulation on a schematic, you can plot the gm of any transistors in THAT schematic by simply creating a *.scs file and putting in "save [component name]:all" and then you plot any model parameter you want. But how do you do this for a transistor that lies within a symbol that is within a schematic? I thought that "save [symbol name].[component name within symbol]:all" would work, but all I can get is the DC operating point of the target component's model parameters. What I want is to see how the model parameters, say gm, change with some input, say the input common mode.

For reference, and in case it is difficult to see, the name of the OTA within the testbench is just "OTA". The name of the transistor I'm interested in that is within the OTA is "N_DPair_Pos".

The commands I've tried using in the .scs for ADE for the testbench are as follows:

save N_DPair_Pos:all

save OTA/N_DPair_Pos:all

save OTA.N_DPair_Pos:all

save OTA:all

I've tried looking through Help->Contents but I'm fairly new to cadence and there is a lot to read. If someone can answer my question then point me to what part of the documentation would help with understanding more about .scs files, I'd be most grateful.

Thank you.

Re-characterizing a tap-less cell library (Cadence Liberate)

$
0
0

Hi All,

I want to re-characterize the existing library to a lower supply voltage. I have been provided the extracted (with parasitics) netlist (.cir) of this tap-less cell library by the vendor. 

> I generated the cell template file from existing .lib in .tcl format which contains cell definitions, delay/power templates with slew/load indices.

> The provided netlist however contains the VBN/VBP contact ports (along with its parasitics) which are not available in generated template (I assume the earlier characterization was done by connecting well contacts to the supply rails accordingly / or atleast that's what I'd do if I create a lib for my custom made cells).

> In this condition, re-characterization is not possible as Liberate does not see VBN/VBP in cell definitions of the template. Is it possible to indicate "Liberate" that those well contacts should be connected globally to respective supply rails during the characterization ?

> When doing the characterization, are those slew values for the given loads automatically re-calculated for the new supply voltage ?

Thanks

Anuradha

Probing internal node to dspf file

$
0
0

Hi ,

Suppose we have some block "A" inside that there are three comparetor  (CompA, CompB,CompC),

Now i am running the AMS simulation with including the block "A" dspf netlist.

How i can save only the net to these three Comp*.

Could you please help.

Thanks,

Nasser

Voltus-Fi XL in ADE with dspf: how to reliably start 'shapeSever'

$
0
0

Hi All,  I'm using Voltus-Fi XL with transistor_dspf generated by Quantus QRC.  When I run an EM/IR sim within ADE and then open up Voltus-Fi XL for EMIR 'Layout Analysis', I often get the following error

@(#)$CDS: virtuoso version 6.1.7-64b 08/21/2018 19:47 (sjfhw316) $
sub-version IC6.1.7-64b.500.22
Voltus-Fi v06.17-e655_1

INFO : Auto loading the emir conf file /.../input.conf
INFO : Loading results for IR plots display
INFO: Shapes information read from Quantus shapeserver (runDir=/... runName=...)
Failed to start QRC module 'shapeServer'. Please check QRC installation or contact Cadence Customer Support.

Sometimes the shapeServer starts and Solid Shape Highlighting works in the layout, but mostly the shapeServer doesn't start.  I suspect the problem is with the contents of the QRC Run Dir, but not sure.  Seems like once a cell works, it continues to work, but if a new dspf extraction is performed for this cell then the shapeServer has a good chance of not starting.  I've spent quite a lot of time chasing this, so any help will be appreciated.

Viewing all 4888 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>