Cadence Tutorial 4
Click here to load reader
-
Upload
john-leons -
Category
Documents
-
view
219 -
download
4
description
Transcript of Cadence Tutorial 4
-
Cadence Tutorial 4
The following Cadence CAD tools will be used in this lab:
Virtuoso Schematic (a.k.a. Composer) for schematic capture.
Analog Environment (Spectre) for simulation.
Please go to your cadence directory and start icfb. In this tutorial we are going to learn some
more skills in using the Cadence tools. Let's start our fourth schematic now!
USING PARAMETERS FOR OPTMIZING PERFORMANCE
In this Tutorial 4 we are going to create a hierarchical schematic at the logic (gate) level by using
symbols for lower level schematics. When creating such a schematic it is sometimes necessary to
use different gates with the same logic but with different transistor sizes (e.g. a "weak" inverter
and a "strong" inverter). Also sometimes it is good to be able to easily move from one
technology to another (e.g. from 0.6u to 0.25u) without a lot of effort. For these purposes it is
good if the sizes of the transistors are parameterized. We will use the schematic and symbol for
the inverter that we created in Tutorials 2 and 3 as a starting point (you may want to go back and
refresh your memory). First let's copy the existing inverter cell to 4 other cells, let's call them:
Invx1, Invx4, Invx16 and Loadx64, respectively. These will be a parameterized inverter with
minimum size (x1), 4 times the minimum (x4), 16 times the minimum (x16) a fix load 64 times
the minimum. In order to copy the cells first click on the Tutorial library, then on the inverter cell
(such that they become highlighted), then go to Edit -> Copy, and fill the new name of the cell in
the To unfilled part, and make sure that Copy All Views is checked. In this way you should get 4
more cells in the Tutorial library (in general you could have also copied the cell into a different
library).
-
Click Apply, then change the names to get all 4 cells, then click Cancel to close the pop-up
window.
Open the schematic view of Invx1 by double clicking on the schematic view in the Library
Manager window. We now need to change the properties Width and Length for the transistors
such that they are parameterized. Edit properties for the nmos and change Length to: Len and
Width to: Wid, then pmos and change Length to: Len and Width to: a*Wid.
-
Check and save your design and make sure you get no errors. By doing this we have created
parameterized transistor sizes where both the nmos and pmos have the same length with
parameter Len (default value 0.6u), while the widths are parameters Wid and a*Wid where a can
be used to change the PMOS/NMOS ratio and Wid is the base size (e.g. 1.5u). When we use this
inverter in a hierarchical schematic we can now keep the default values or change the default
values to go to a different technology (e.g. change Len to 0.25u for a 0.25u CMOS technology)
or have different transistor strengths for different inverters.
Now change the sizes for Invx4, Invx16 and Loadx64. For all of them make the length Len, both
for PMOS and NMOS. This is the standard practice for digital design where transistors are
minimum length for high performance. Then make the widths:
a*b*Wid for PMOS, b*Wid for NMOS for Invx4
a*b*b*Wid for PMOS, b*b*Wid for NMOS for Invx16
a*c*Wid for PMOS, c*Wid for NMOS for Loadx64
-
In this way we have Invx4 and Invx16 parameterized twice (a for PMOS/NMOS ratio, rule of
thumb 2, and b for consecutive upsizing in a chain, rule of thumb 4), while the load Loadx64 is
kept independent to be able to compare different sizing options for a and b when the chain drives
a fixed load (where default is c=64). Make sure you check and save your cells after you edit
them.
We should also edit the symbols of the 4 new cells to reflect their different characteristics,
although this is not absolutely necessary. Let's do it though, go to the Library Manager and
double click on the symbol view of the Invx1 cell. Go to Edit -> Properties -> Objects... and then
clik on the text inv on the symbol itself. In the pop-up window fill Invx1 as the Label, then clik
OK. The symbol should change to reflect the change. Make sure you also save the symbol.
Also change the names of the three other new cells to: Invx4, Invx16, Loadx64.
Now we can create a hierarchical schematic that uses the newly created inverter symbols. Let's
do that by creating a new schematic, call it InvDelay. Go to the Library Manager and with the
Tutorial library highlighted do File -> New -> Cell View and create a schematic view for a cell
named InvDelay. The Composer schematic editor window should open up. Let's create a
schematic of 4 cascaded inverters with an input port IN1 and an output port OUT after the third
inverter, first inverter Invx1, second Invx4, third Invx16, fourth Loadx64. You may need to go to
the previous tutorials if you don't remember all the steps. Do Check and Save. You should get
one warning about the output of the last inverter which is floating. Let's get rid of that warning
by placing an instance of the noConn instance from the basic library on that output.
-
Also add labels to the internal nets by doing Add -> Wire Name, filling the names: IN2 IN3 in
the dialogue box and then click on the two internal nets, then on CANCEL.
Now when you do a Check and Save you should get no errors or warnings and the two internal
nets should have names.
-
Now let's assign sizes to the 4 inverters. Let's assume that we are interested in the inverter delay
for a fanout of 4; this means that in theory we could use identical inverters and place 3 more of
them at each output (we did that in Tutorial 3), or use the newly created parameterized inverters.
and assume that an inverter 4 times larger than the base size is equivalent to 4 base inverters (if
you are unclear about this please check the text, notes, talk to the TA or come and see me). This
means that we can keep the first inverter at the base size, make the second one 4 times larger, the
3rd one 16 times larger and the 4th one 32 times larger, simply by making the parameter b = 4. In
case we want to test a different sizing scenario we just need to modify one parameter, b, to a
different value. We can do this easily now since we have already defined the parameterized
transistor sizes for the inverter. The last skill in the schematic entry for now will be to traverse
hierarchy. For this go to Design -> Hierarchy -> Descend Edit and then click on the first inverter
and then clik OK. You should get to the inverter schematic where you can verify that the sizes
are actually as you would expect. In principle now you could edit this schematic if necessary but
for now go back to Design -> Hierarchy -> Return.
SIMULATION
We can use the previous schematic for determining the optimum pmos to nmos ratio (a) for a
fanout of b (e.g. b=4) through simulation. The two inverters that make the actual circuit used for
delay calculation are the second and third. The first inverter is used only to make the rise and fall
times more realistic (better than a simple step or piecewise linear) and the last inverter is used
only as load.
-
CAUTION: In general you should always use this approach when estimating delays through
simulation, never drive inputs directly because you may get unrealistic results!
We use two inverters for delay such that we can take both tpLH and tpHL into account without
having to do manual addition. First let's make sure the inverters work, let's simulate. In the
Composer window go to Tools -> Analog Environment. The design should be set to the right
Library, Cell and View. Setup simulation for Spectre, and set the right model libraries. If you
have an old state that you saved you can also load that state to save on typing. We also need to
set up inputs and power supply since we don't have explicit voltage sources. Go to Setup ->
Stimuli. We need to setup both inputs (IN1) and the global sources (power supply). For IN1 use
a pulse with amplitude 5 (Voltage 1=0, Voltage 2=5) with 0.4n rise and fall times and 1.6n pulse
width and 4n period, make sure you enable it. Click on the Global Sources, you should have only
one (vdd!). Click on Enabled, Function dc, Type Voltage, DC voltage 5, Source type dc, and
click on Apply. The vdd! should turn from OFF to ON. You may want to revisit Tutorial 2 if you
have trouble with this. CAUTION Cadence is very fragile concerning this dialog box, make sure
you enter the numbers exactly as above (i.e. no space between the digit and n, etc.). If you get
syntax errors later in simulation they are most likely because of this. Now you need to choose the
type of simulation, go to Analyses -> Choose... In this case we will choose tran which is the
default, 8n as the Stop time and moderate as the accuracy default. Now go to Outputs -> Save All
and make sure allpub is checked for signals to save (default). Click OK. CAUTION In general,
once you have a big schematic, you will want to only save a few signals for simulation, this will
make your simulation faster. For small circuits as we have now it doesn't make a big difference
though.
The only other settings that we need are the variables a, b, c, Len and Wid, for now let's set a=2
(the rule of thumb), b=4, c=64, Len=0.6u, Wid=1.5u. Go to Variables -> Edit and then in the
dialogue box enter a as Name and 2 as value. Click Add.
The variable a should now appear in the Design Variables list. Do the same for b, c, Wid, Len.
All variables should now appear in the Design Variables list.
-
Now we can finally simulate! Click on the Netlist and Run button (looks like a green light) on
the right or go to Simulation -> Netlist and Run. Click OK on the Welcome to Spectre window
which should start the simulation. In case you have errors you will need to go back and correct
them. This can be tricky! You may need to do Simulation -> Netlist -> Recreate if you change
the schematic. CAUTION Each time you change the schematic you have to do Check and Save!.
Assuming there are no errors you can now admire the simulation results. Go to Results -> Direct
Plot -> Transient Signal which will pop-up your schematic window. Now you have to click on
the signals you want to see. Since this is a transient analysis we want to see a few voltages. In
order to do this you have to click on the desired nets, then the ESC key. Click on OUT, IN1, IN2
and IN3.
-
Now we can measure tpLH, tpHL for the second and third inverters (signals IN2 and IN3). To do
this accurately we are going to use the waveform calculator. Go to Tools -> Calculator in the
Analog Environment window which should pop up the calculator. Get familiarized with the
calculator, you may also want to consult cdsdoc. The calculator works with a "stack" in which
you first input a waveform or more and then you perform an operation. After each operation it's
recommended that you clear the stack (clst). To view the stack you have to enable it (click on the
button Display Stack). Now click on wave in the calculator window and then click on the IN3
wave in the waveform window. A wave should be displayed in the calculator. Now press on the
IN2 wave which should push the first wave in the stack and bring this new wave in the
calculator. IMPORTANT: Note that we entered the waves in reverse order (the late first, then
the early one), this is a "feature" of the stack operation of the calculator.
-
Now go to Special Functions in the calculator window and click on delay. Fill 2.5 as the
threshold values (50% of Vdd = 5V) and keep the edges as 1 and edge types as either (in other
situations you may want to make different choices here) then click OK. Notice the change in the
calculator window. Now click on Evaluate buffer and you should get the value approx. 224 ps
which represents tpLH for the second inverter with a fanout of 4 (we measured delay from IN2
to IN3 going high). Clear Evaluate buffer and the stack and now measure tpHL for the second
inverter. You need to got through the same steps except choose Edge Number 2 in the Threshold
Delay dialogue box. tpHL is about 221 ps, slightly less than tpLH as expected due to the
difference in mobility between pmos and nmos. Although this may suggest that we need to
increase the size of the pmos even higher we only need to do that if we are mainly interested in
symmetric VTC and equal tpHL and tpLH. If we are interested in propagation delay (average of
tpHL and tpLH) we may actually want to make them even less symmetric to gain speed. In order
to see why we added yet another inverter we can also measure the total delay from IN2 to OUT.
For this we again clear the calculator and measure the delay from IN2 and OUT for both the first
and the second edge, you should get about 434ps and 433ps, res[ectively. As you can see the two
values are very close and also relatively close to the previously measured tpHL + tpLH = 445ps.
Basically this means that we can use just one measurement, not two, to get information about tp.
Let's determine now the optimal pmos/nmos ratio a through simulation. For this we will do
multiple simulations with different values for a and determine the fastest solution. Theoretically
-
we could do those simulations manually, luckily Cadence offers the possibility of doing this
automatically. Go to Tools -> Parametric Analysis in the Analog Environment window. Fill the
Variable Name a with values from 1 to 3 in Linear Steps of 0.2
Now do Analysis -> Start in the Parametric Analysis window. The simulations will take a little
longer (10 simulations are performed), be patient. Once the simulations are over we can again
plot the waveforms. Go to Results -> Direct Plot -> Transient Signal and then choose IN2 and
OUT.
-
The first observation that we can make is that the delays are quite close even if we changed the
pmos/nmos ratio quite drastically (from 1 to 3), which should reinforce the idea that
complementary static CMOS is non-ratioed. If we zoom on the HL transition you will discover
that the fastest solution in this case is actually the a = 1 waveform where the pmos and nmos are
equal (412ps vs. 468ps when a=2.8).
-
On the other hand if you look at the LH transition you can see that the solution with a = 1 has a
poor rise time while a = 1.4 or a = 1.6 have much better rise times and still have small delays
(compared to larger or smaller values of a). You should verify that this is indeed true by using
the calculator. From this superficial analysis we can conclude that indeed a value around a = 1.5
(close to sqrt(2-3) = 1.41-1.73 as suggested in class) is close to optimal for delay and decent rise
time.
-
It is a good idea to save your state before exiting the simulator in case you want to redo some of
the simulations you can start by loading a saved state. Congratulations, this is the end of Tutorial
4.