CSE463M: Digital Integrated Circuit Design and Architecture Homework #2 Solved

44.99 $

Description

Rate this product

CSE 463M and CSE 563M students:
1) Solve problem 5.1 (inverter design with nMOS and resistor) from Chapter 5 from the textbook. Please show all your work and be neat and circle your answers. (10 points)
2) Solve problem 5.6 (inverter design with nMOS and pMOS) from Chapter 5 from the textbook. Please show all your work and be neat and circle your answers. (10 points)
3) Design suitable circuits in Cadence that will allow you to compute the voltage threshold (Vt), k’ and substrate bias coefficient (γ) for an NMOS transistor. The transistor aspect ratios are W=9um and L=9um. Print the circuits that you design to extract these 3 parameters. Simulate the circuit and print the simulated results. Indicate on your plots how you computed the 3 parameters. (30 points)

4) Repeat the same exercise for a PMOS device. Print all simulations and circuits that you use in order to determine voltage threshold (Vt), k’ and substrate bias coefficient (γ) for the PMOS transistor. (30 points)

5) Inverter design problem (schematic only)
Draw a schematic of a CMOS inverter. The power supply of the circuit is 5V, i.e. the source of the PMOS transistor is connected to 5V. Choose minimum size for both length and width of PMOS and NMOS transistors. Save the circuit and print it out. Perform a DC analysis on the circuit by sweeping the input to the inverter from 0V to 5V. Plot the output of the inverter. Label the threshold of the inverter on the plot. (20 points)

6) Inverter design problem (including layout) (50 points)
Follow the wiki tutorial in order to solve the problems bellow and get familiar with Cadence:

https://eda.engineering.wustl.edu/wiki/index.php/Cadence

Here is transistor data for AMI Semiconductor 0.5 micron process:

Problem set:
6.1) Design a CMOS inverter that will operate from a 5V power supply (i.e. Vdd=5V) and it has a threshold (Vth) of 3V. Show all hand calculations that allowed you to design this circuit. Use the data in the table above for your calculations.

6.2) Design the CMOS inverter from problem 6.1) in Cadence. Print the schematic of the inverter. Simulate the static behavior of the inverter. Make sure that your SPICE simulation indicates that the threshold of the inverter is 3V. If this is not the case, readjust the aspect ratios of your NMOS and/or PMOS in order to have the desired threshold of 3V. Print your SPICE simulation and indicate your Vth on the plot.

6.3) Using SPICE and the calculator within the SPICE simulator to compute VIL and VIH. Plot the results and indicate your results on the plot.

6.4) Draw the layout of the inverter in Cadence. Print the layout of the device.

6.5) Run a Design Rule Check (DRC), extract the layout and LVS the design. Cut and Paste the messages generated in the CIW (the main Cadence window) when the DRC is executed. Print the Layout vs Schematic (LVS) result – make sure it has successfully passed LVS.
CSE 563M students only:
7) Solve problem 5.4 from the textbook. (10 points) 8) Solve problem 5.7 from the textbook. (10 points) 1) – 5.1

(a)
𝑉𝐷𝐷 = 1.1 𝑉
𝑉𝑇0 = 0.52 𝑉
𝑉𝑂𝐿 = 0.05 𝑉
𝑅 = 2 𝑘Ω
𝜇𝑛𝐶𝑜𝑥 = 𝑘′𝑛 = 216 𝜇𝐴/ 𝑉2

𝑉𝐷𝐷 − 𝑉𝑂𝐿 = 𝑘′𝑛 (𝑊)[2(𝑉 )𝑉𝑂𝐿 − 𝑉𝑂𝐿2]
𝑅𝐿 2 𝐿 𝐷𝐷 − 𝑉𝑇0
1.1 − 0.05 = 216 ∙ 10−6 (𝑊 )[2(1.1 − 0.52)0.05 − (0.05)2]
𝐿

𝑊
= 87.58759

𝐿

(b)
′ 𝑊
𝑘𝑛 = 𝑘 𝑛
𝐿

1 1
𝑉𝐼𝐿 = 𝑉𝑇0 + 𝑘 𝑅 = 𝑉𝑇0 + 𝑊
𝑛 𝐿 𝑘′𝑛 𝐿 𝑅𝐿

𝑉𝐼𝐻 √
3 𝑘𝑛𝑅𝐿 𝑘𝑛𝑅𝐿
𝑉𝐼𝐻

(c)

𝑁𝑀𝐿 = 𝑉𝐼𝐿 − 𝑉𝑂𝐿 = 0.546 − 0.05 = 0.496 𝑉
𝑁𝑀 = 𝑉 − 𝑉 = 1.1 − 0.772 = 0.328 𝑉
𝐻 𝑂𝐻 𝐼𝐻

2) – 5.6
+ We know the following:
𝑊
nMOS: 𝑉𝑇0,𝑛 = 0.48𝑉, 𝜇𝑛𝐶𝑜𝑥 = 102 𝜇𝐴/ 𝑉2, ( 𝐿 )𝑛 = 10
𝑊
𝑝𝑀𝑂𝑆: 𝑉𝑇0,𝑝 = −0.46𝑉, 𝜇𝑝𝐶𝑜𝑥 = 51.6 𝜇𝐴/ 𝑉2, ( 𝐿 )𝑝 = 19
𝑉𝐷𝐷 = 𝑉𝑂𝐻 = 1.2 𝑉
𝑘𝑛 = 𝑘′𝑛(𝑊𝐿) = 𝜇𝑛𝐶𝑜𝑥(𝑊𝐿 )𝑛 = 102 ∙ 10 = 1020 𝜇𝐴/ 𝑉2
𝑛
𝑘𝑝 = 𝑘′𝑝(𝑊𝐿)𝑝 = 𝜇𝑝𝐶𝑜𝑥(𝑊𝐿 )𝑝 = 51.6 ∙ 19 = 980.4 𝜇𝐴/ 𝑉2
𝑘𝑛 1020
𝑘𝑅 = = = 1.04
𝑘𝑝 980.4

+ To get 𝑉𝐼𝐿:
2𝑉𝑜𝑢𝑡 + 𝑉𝑇0,𝑝 − 𝑉𝐷𝐷 + 𝑘𝑅𝑉𝑇0,𝑛
𝑉𝐼𝐿 =
1 + 𝑘
𝑉𝐼𝐿 = = 0.98𝑉𝑜𝑢𝑡 − 0.569
1 + 1.04

+ Substitute above equation to KCL equation:
𝑘𝑛 2 = 𝑘𝑝 [2(𝑉𝐷𝐷 − 𝑉𝑖𝑛 − |𝑉𝑇0,𝑝|)(𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡) − (𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡)2]
(𝑉𝑖𝑛 − 𝑉𝑇0,𝑛)
2 2

+ Since, 𝑉𝑖𝑛 = 𝑉𝐼𝐿
𝑉𝑜𝑢𝑡 − 0.569 − 0.48)2
𝑉𝑜𝑢𝑡 − 0.569) − 0.46)(1.2 − 𝑉𝑜𝑢𝑡) − (1.2 − 𝑉𝑜𝑢𝑡)2]

+ The expression yields a second order polynomial as follows:
0.000019212𝑉𝑜𝑢𝑡2 + 0.000211234𝑉𝑜𝑢𝑡 − 0.00027292 = 0

𝑉𝑜𝑢𝑡 = −12.1628 𝑜𝑟 1.16796
𝑉𝑜𝑢𝑡 = 1.16796(𝑉𝑜𝑢𝑡 > 0)

𝑉𝐼𝐿 = 0.98𝑉𝑜𝑢𝑡 − 0.569 = 0.98 ∙ 1.16796 − 0.569 = 0.575 𝑉

+ To get 𝑉𝐼𝐻 in terms of the output voltage:

𝑉𝐷𝐷 + 𝑉𝑇0,𝑝 + 𝑘𝑅(2𝑉𝑜𝑢𝑡 + 𝑉𝑇0,𝑛)
𝑉𝐼𝐻 =
1 + 𝑘𝑅
1.2 − 0.46 + 1.04(2𝑉𝑜𝑢𝑡 + 0.48)
= = 1.0196𝑉𝑜𝑢𝑡 + 0.6074
1 + 1.04

+ Substitute above equation to KCL equation:
𝑘𝑛 2 𝑘𝑝 2
[2(𝑉𝑖𝑛 − 𝑉𝑇0,𝑛)𝑉𝑜𝑢𝑡 − 𝑉𝑜𝑢𝑡 ] = (𝑉𝐷𝐷 − 𝑉𝑖𝑛 − |𝑉𝑇0,𝑝|)
2 2

+ Since, 𝑉𝑖𝑛 = 𝑉𝐼𝐻
𝑉𝑜𝑢𝑡 + 0.6074 − 0.48)𝑉𝑜𝑢𝑡 − 𝑉𝑜𝑢𝑡2]
𝑉𝑜𝑢𝑡 − 0.6074 − 0.46)2

0.0000203878𝑉𝑜𝑢𝑡2 + 0.000262497𝑉𝑜𝑢𝑡 − 8.61907 ∙ 10−6 = 0
𝑉𝑜𝑢𝑡 = −12.9079 𝑜𝑟 0.0327516
𝑉𝑜𝑢𝑡 = 0.0327516(𝑉𝑜𝑢𝑡 > 0)

𝑉𝐼𝐻 = 1.0196𝑉𝑜𝑢𝑡 + 0.6074 = 1.0196 ∙ 0.0327516 + 0.6074 = 0.64 𝑉

+ Finally, we can find the noise margin:

𝑁𝑀𝐿 = 𝑉𝐼𝐿 − 𝑉𝑂𝐿 = 0.575 − 0 = 0.575 𝑉
𝑁𝑀 = 𝑉 − 𝑉 = 1.2 − 0.64 = 0.58 𝑉
𝐻 𝑂𝐻 𝐼𝐻

+ For 𝑉𝑡ℎ:
𝑉𝑇 ,𝑝|)
𝑉𝑡
1 + √
𝑘𝑅

3)

+ for 𝑉𝑇0:
We can get Vt0 from the graph above.
𝑉𝑇0 = 0.6 𝑉
+ for 𝑘𝑛:

We can pick 2 points of green line from above graph.
(2.0V, 200 uA)
(4.0V, 480 uA)

+ for 𝛾:
𝑉𝑇 − 𝑉𝑇0
𝛾 =
√|−2Φ𝐹 + 𝑉𝑆𝐵| 𝐹

𝑉𝑇 = 1.5 𝑉
𝑉𝑇0 = 0.6 𝑉
Φ𝐹 = −0.375
𝑉𝑆𝐵 = 5 𝑉

𝛾

4)

+ for 𝑉𝑇0:
We can get Vt0 from the graph above.
𝑉𝑇0 = −0.8 𝑉, (𝑏𝑒𝑐𝑎𝑠𝑢𝑒 𝑤𝑒 𝑖𝑛𝑡𝑒𝑟𝑝𝑟𝑒𝑡 𝑎𝑏𝑜𝑣𝑒 𝑔𝑟𝑎𝑝ℎ 𝑏𝑦 𝑚𝑖𝑛𝑢𝑠 5𝑉, 4.2 − 5)

+ for 𝑘𝑝:

We can pick 2 points from above graph.
(-3V, -72 uA)
(-2.5V, -92 uA)

𝑘𝑝 = 0.0809307 𝐴𝑉2

+ for 𝛾:
𝑉𝑇 − 𝑉𝑇0
𝛾 =
√|−2Φ𝐹 + 𝑉𝑆𝐵| 𝐹

𝑉𝑇 = −1.8 𝑉
𝑉𝑇0 = −0.8 𝑉
Φ𝐹 = 0.375
𝑉𝑆𝐵 = −5 𝑉

𝛾

5)

6-1)
Using PMOS and NMOS to implement CMOS inverter.
Upper part is PMOS and lower part is NMOS.
Gate is connected to Vin and Vout is connected to GND.

When 𝑉𝑖𝑛 = 0 , PMOS is ON and NMOS if OFF like below.

When 𝑉𝑖𝑛 = 𝑉𝐷𝐷 , PMOS is OFF and NMOS if ON like below.

+ For 𝑉𝑂𝐻:
𝑉𝑂𝐻 = 𝑉𝐷𝐷

+ For 𝑉𝑂𝐿:
𝑉𝑂𝐿 = 0

+ Using 𝑉𝑡ℎ = 3𝑉, we can calculate 𝑘𝑅
𝑉𝑇 ,𝑝|)
𝑉𝑡
1 + √
𝑘𝑅

1 + √
𝑘𝑅
𝑘𝑅 = 0.298

+ For low voltage, 𝑉𝐼𝐿:
2𝑉𝑜𝑢𝑡 + 𝑉𝑇0,𝑝 − 𝑉𝐷𝐷 + 𝑘𝑅𝑉𝑇0,𝑛
𝑉𝐼𝐿 =
1 + 𝑘𝑅
2𝑉𝑜𝑢𝑡 − 0.8 − 5 + 0.298 ∙ 0.8 2𝑉𝑜𝑢𝑡 − 5.5616
𝑉𝐼𝐿 𝑉𝑜𝑢𝑡 − 4.28

+ Substitute above equation to KCL equation:
𝑘𝑛 2 = 𝑘𝑝 [2(𝑉𝐷𝐷 − 𝑉𝑖𝑛 − |𝑉𝑇0,𝑝|)(𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡) − (𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡)2]
(𝑉𝑖𝑛 − 𝑉𝑇0,𝑛)
2 2
𝑘𝑅(𝑉𝑖𝑛 − 𝑉𝑇0,𝑛)2 = [2(𝑉𝐷𝐷 − 𝑉𝑖𝑛 − |𝑉𝑇0,𝑝|)(𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡) − (𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡)2]

+ Since, 𝑉𝑖𝑛 = 𝑉𝐼𝐿
0.298(1.54𝑉𝑜𝑢𝑡 − 4.28 − 0.8)2
= [2(5 − (1.54𝑉𝑜𝑢𝑡 − 4.28) − 0.8)(5 − 𝑉𝑜𝑢𝑡) − (5 − 𝑉𝑜𝑢𝑡)2]

+ The expression yields a second order polynomial as follows:
−1.37326𝑉𝑜𝑢𝑡2 + 17.6974𝑉𝑜𝑢𝑡 − 52.1097 = 0
𝑉𝑜𝑢𝑡 = 4.5532 𝑜𝑟 8.33389
𝑉𝑜𝑢𝑡 = 4.5532

𝑉𝐼𝐿 = 1.54𝑉𝑜𝑢𝑡 − 4.28 = 1.54 ∙ 4.5532 − 4.28 = 2.73 𝑉

+ For high voltage, 𝑉𝐼𝐻:
𝑉𝐷𝐷 + 𝑉𝑇0,𝑝 + 𝑘𝑅(2𝑉𝑜𝑢𝑡 + 𝑉𝑇0,𝑛)
𝑉𝐼𝐻 =
1 + 𝑘𝑅
5 − 0.8 + 0.298(2𝑉𝑜𝑢𝑡 + 0.8) 0.596𝑉𝑜𝑢𝑡 + 4.4384
𝑉𝐼𝐻 = = = 0.46𝑉𝑜𝑢𝑡 + 3.41
1 + 0.298 1.298

+ Substitute above equation to KCL equation:
𝑘𝑛 2 𝑘𝑝 2
[2(𝑉𝑖𝑛 − 𝑉𝑇0,𝑛)𝑉𝑜𝑢𝑡 − 𝑉𝑜𝑢𝑡 ] = (𝑉𝐷𝐷 − 𝑉𝑖𝑛 − |𝑉𝑇0,𝑝|)
2 2
𝑘𝑅[2(𝑉𝑖𝑛 − 𝑉𝑇0,𝑛)𝑉𝑜𝑢𝑡 − 𝑉𝑜𝑢𝑡2] = (𝑉𝐷𝐷 − 𝑉𝑖𝑛 − |𝑉𝑇0,𝑝|)2

+ Since, 𝑉𝑖𝑛 = 𝑉𝐼𝐻
0.298[2(0.46𝑉𝑜𝑢𝑡 + 3.41 − 0.8)𝑉𝑜𝑢𝑡 − 𝑉𝑜𝑢𝑡2] = (5 − (0.46𝑉𝑜𝑢𝑡 + 3.41) − 0.8)2
−0.23544𝑉𝑜𝑢𝑡2 + 2.28236𝑉𝑜𝑢𝑡 − 0.6241 = 0

𝑉𝑜𝑢𝑡 = 0.281627 𝑜𝑟 9.41239
𝑉𝑜𝑢𝑡 = 0.281627

𝑉𝐼𝐻 = 0.46𝑉𝑜𝑢𝑡 + 3.41 = 0.46 ∙ 0.281627 + 3.41 = 3.54 𝑉

+ Finally, we can find the noise margin:
𝑁𝑀𝐿 = 𝑉𝐼𝐿 − 𝑉𝑂𝐿 = 2.73 − 0 = 2.73 𝑉
𝑁𝑀𝐻 = 𝑉𝑂𝐻 − 𝑉𝐼𝐻 = 5 − 3.54 = 1.46 𝑉

6-2)

𝑉𝑇 ,𝑝|)
𝑉𝑡
1 + √
𝑘𝑅

1 + √
𝑘𝑅
𝑘𝑅 = 0.297521

+ I’m going to adjust NMOS and to make the calculation easy, so I set PMOS W/L = 1.
𝑘𝑛 𝑘′𝑛(𝑊𝐿 )𝑛 120(𝑊𝐿 )𝑛 3(𝑊𝐿 )𝑛
𝑘𝑅 = 𝑘𝑝 = 𝑘′𝑝(𝑊𝐿 ) = 40(𝑊𝐿 )𝑝 = (𝑊𝐿 )𝑝
𝑝
𝑊
0.297521 = 3( )
𝐿 𝑛
𝑊
( )𝑛 = 0.099
𝐿
𝑊𝑛
𝐿𝑛 =
0.099
𝐿𝑛 = 9150

+ Now, I found out all the values.
PMOS width = 900n
PMOS length= 900n
NMOS width = 900n
NMOS length= 9150n

6-3)

+ To find the VIL and VIH, get the derivative of a plot of ‘out’. And then find the slope -1.

+ The result shows that VIL and VIH have the same values that I calculated on 6.1 question!

6-4)

6-5)
+ FOR DRC check:

Validating hierarchy instantiation for: library: cse463 cell: inv view: layout
Rules come from library NCSU_TechLib_ami06.
Rules path is divaDRC.rul.
Inclusion limit is set to 1000.
Running layout DRC analysis
Flat mode Full checking. executing: nodrc = geomOr(“nodrc”)
executing: gwell = geomOr(geomAndNot((“gwell” “drawing”) nodrc)) executing: nwell = geomOr(geomAndNot((“nwell” “drawing”) nodrc)) executing: pwell = geomOr(geomAndNot((“pwell” “drawing”) nodrc)) executing: nactive = geomOr(geomAndNot((“nactive” “drawing”) nodrc)) executing: pactive = geomOr(geomAndNot((“pactive” “drawing”) nodrc)) executing: active = geomOr(geomAndNot((“active” “drawing”) nodrc) nactive pactive) executing: gselect = geomOr(geomAndNot((“gselect” “drawing”) nodrc)) executing: nselect = geomOr(geomAndNot((“nselect” “drawing”) nodrc))

executing: pselect = geomOr(geomAndNot((“pselect” “drawing”) nodrc)) executing: poly = geomOr(geomAndNot((“poly” “drawing”) nodrc)) executing: metal1 = geomOr(geomAndNot((“metal1” “drawing”) nodrc))
executing: cc = geomOr(geomAndNot((“cc” “drawing”) nodrc)) executing: metal2 = geomOr(geomAndNot((“metal2” “drawing”) nodrc)) executing: via = geomOr(geomAndNot((“via” “drawing”) nodrc)) executing: glass = geomOr(geomAndNot((“glass” “drawing”) nodrc)) executing: pad = geomOr(geomAndNot((“pad” “drawing”) nodrc)) executing: res_id = geomOr(“res_id”)
executing: metal3 = geomOr(geomAndNot((“metal3” “drawing”) nodrc)) executing: via2 = geomOr(geomAndNot((“via2” “drawing”) nodrc)) executing: highres = geomOr(geomAndNot((“highres” “drawing”) nodrc)) executing: elec = geomOr(geomAndNot((“elec” “drawing”) nodrc)) executing: ce = geomOr(geomOr(geomAndNot((“ce” “drawing”) nodrc)) geomAnd(cc elec))
executing: cp = geomOr(geomOr(geomAndNot((“cp” “drawing”) nodrc)) geomAnd(cc geomAndNot(poly ce))) executing: ca = geomOr(geomOr(geomAndNot((“ca” “drawing”) nodrc)) geomAnd(cc geomAndNot(active … executing: nActive = geomAnd(active nselect) executing: pActive = geomAnd(active pselect) executing: nBulk = geomOr(nwell)
executing: pBulk = geomOr(geomNot(nwell) geomAndNot(pwell nwell)) executing: nOhmic = geomAnd(nActive nwell) nNotOhmic = geomAndNot(nActive nwell) executing: pOhmic = geomAndNot(pActive nwell) pNotOhmic = geomAnd(pActive nwell)
executing: nDiff = geomAndNot(nNotOhmic geomOr(poly elec)) executing: pDiff = geomAndNot(pNotOhmic geomOr(poly elec)) executing: nDiffContact = geomAnd(ca nDiff) executing: pDiffContact = geomAnd(ca pDiff) executing: nOhmicContact = geomAnd(ca nOhmic) executing: pOhmicContact = geomAnd(ca pOhmic)
executing: Gate = geomAnd(geomOr(nNotOhmic pNotOhmic) poly) executing: fieldPoly = geomAvoiding(poly Gate)
executing: elecGate = geomAnd(geomOr(nNotOhmic pNotOhmic) elec) executing: fieldElec = geomAvoiding(elec elecGate) executing: CapacitorElec = geomInside(elec poly)
executing: TransistorElec = geomOverlap(elec geomNot(poly)) executing: fieldPoly = geomAndNot(fieldPoly res_id) executing: poly = geomAndNot(poly res_id)
executing: fieldElec = geomAndNot(fieldElec geomOr(res_id highres)) executing: elecRes = geomButting(geomAnd(res_id elec) fieldElec (keep
== 2))
executing: elecHighres = geomButting(geomAnd(highres elec) fieldElec
(keep == 2))
executing: elec = geomAndNot(elec geomOr(res_id highres))
executing: nBulk = geomAndNot(nBulk res_id) executing: nwell = geomAndNot(nwell res_id) executing: geomConnect((via nOhmicContact nOhmic nwell nBulk metal1) (via pOhmicContact pOhmic … executing: dubiousData((“gwell” “drawing”) “Improperly formed shape
– gwell”)
executing: dubiousData((“nwell” “drawing”) “Improperly formed shape
– nwell”)
executing: dubiousData((“pwell” “drawing”) “Improperly formed shape
– pwell”) executing: dubiousData((“active” “drawing”) “Improperly formed shape – active, nactive or pacti… executing: dubiousData((“gselect” “drawing”) “Improperly formed shape – gselect”)
executing: dubiousData((“nselect” “drawing”) “Improperly formed shape – nselect”)
executing: dubiousData((“pselect” “drawing”) “Improperly formed shape – pselect”)
executing: dubiousData((“poly” “drawing”) “Improperly formed shape – poly”)
executing: dubiousData((“metal1” “drawing”) “Improperly formed shape
– metal1”)
executing: dubiousData((“ca” “drawing”) “Improperly formed shape – ca”)
executing: dubiousData((“cp” “drawing”) “Improperly formed shape – cp”)
executing: dubiousData((“metal2” “drawing”) “Improperly formed shape
– metal2”)
executing: dubiousData((“via” “drawing”) “Improperly formed shape – via”)
executing: dubiousData((“glass” “drawing”) “Improperly formed shape
– glass”)
executing: saveDerived(geomGetNon45(gwell) “Non-Manhattan shape – gwell”)
executing: saveDerived(geomGetNon45(nwell) “Non-Manhattan shape – nwell”)
executing: saveDerived(geomGetNon45(pwell) “Non-Manhattan shape – pwell”)
executing: saveDerived(geomGetNon45(active) “Non-Manhattan shape – active, nactive or pactive”)
executing: saveDerived(geomGetNon45(gselect) “Non-Manhattan shape – gselect”)
executing: saveDerived(geomGetNon45(nselect) “Non-Manhattan shape – nselect”)
executing: saveDerived(geomGetNon45(pselect) “Non-Manhattan shape – pselect”)
executing: saveDerived(geomGetNon45(poly) “Non-Manhattan shape – poly”)
executing: saveDerived(geomGetNon45(metal1) “Non-Manhattan shape – metal1”)
executing: saveDerived(geomGetNon45(ca) “Non-Manhattan shape – ca”) executing: saveDerived(geomGetNon45(cp) “Non-Manhattan shape – cp”) executing: saveDerived(geomGetNon45(metal2) “Non-Manhattan shape – metal2”)
executing: saveDerived(geomGetNon45(via) “Non-Manhattan shape – via”)
executing: saveDerived(geomGetNon45(glass) “Non-Manhattan shape – glass”)
executing: offGrid(gwell gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(nwell gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(pwell gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(active gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(gselect gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(nselect gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(pselect gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(poly gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(metal1 gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(ca gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(cp gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(metal2 gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(via gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(glass gridRes “(SCMOS Inst) Edge not on grid”) executing: dubiousData((“metal3” “drawing”) “Improperly formed shape – metal3”)

executing: dubiousData((“via2” “drawing”) “Improperly formed shape – via2”)
executing: saveDerived(geomGetNon45(metal3) “Non-Manhattan shape – metal3”)
executing: saveDerived(geomGetNon45(via2) “Non-Manhattan shape – via2”)
executing: offGrid(metal3 gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(via2 gridRes “(SCMOS Inst) Edge not on grid”) executing: dubiousData((“elec” “drawing”) “Improperly formed shape – elec”)
executing: dubiousData((“ce” “drawing”) “Improperly formed shape – ce”)
executing: saveDerived(geomGetNon45(elec) “Non-Manhattan shape – elec”)
executing: saveDerived(geomGetNon45(ce) “Non-Manhattan shape – ce”) executing: offGrid(elec gridRes “(SCMOS Inst) Edge not on grid”) executing: offGrid(ce gridRes “(SCMOS Inst) Edge not on grid”) executing: nwellEdge = geomGetEdge(nwell) executing: pwellEdge = geomGetEdge(pwell) executing: activeEdge = geomGetEdge(active) executing: nselectEdge = geomGetEdge(nselect) executing: pselectEdge = geomGetEdge(pselect) executing: polyEdge = geomGetEdge(poly) executing: metal1Edge = geomGetEdge(metal1) executing: caEdge = geomGetEdge(ca) executing: cpEdge = geomGetEdge(cp) executing: metal2Edge = geomGetEdge(metal2) executing: viaEdge = geomGetEdge(via) executing: glassEdge = geomGetEdge(glass) executing: highresEdge = geomGetEdge(highres) executing: ceEdge = geomGetEdge(ce) executing: metal3Edge = geomGetEdge(metal3) executing: via2Edge = geomGetEdge(via2) executing: nBulkEdge = geomGetEdge(nBulk) executing: pBulkEdge = geomGetEdge(pBulk) executing: nOhmicEdge = geomGetEdge(nOhmic) executing: pOhmicEdge = geomGetEdge(pOhmic) executing: nNotOhmicEdge = geomGetEdge(nNotOhmic) executing: pNotOhmicEdge = geomGetEdge(pNotOhmic) executing: GateEdge = geomGetEdge(Gate) executing: fieldPolyEdge = geomGetEdge(fieldPoly)
executing: CapacitorElecEdge = geomGetEdge(CapacitorElec) executing: TransistorElecEdge = geomGetEdge(TransistorElec) executing: elecHighresEdge = geomGetEdge(elecRes coincident elec) executing: saveDerived(geomAndNot(active geomOr(nselect pselect)) “(DBM Rule 1.1) Active must b… executing: saveDerived(geomAnd(poly nOhmic) “(DBM Rule 2.0) Poly cannot overlap ohmic diffusion”)
executing: saveDerived(geomAnd(poly pOhmic) “(DBM Rule 2.0) Poly cannot overlap ohmic diffusion”)
executing: saveDerived(geomAnd(elec nOhmic) “(DBM Rule 2.1) Elec cannot overlap ohmic diffusion”)
executing: drc(activeEdge (width < (lambda * 3.0)) errMesg) drc(activeEdge (sep < (lambda * 3.0)) errMesg) drc(activeEdge (notch < (lambda * 3.0)) errMesg) executing: drc(nNotOhmicEdge nBulkEdge (sep < (lambda * 6.0)) errMesg)
executing: drc(pNotOhmicEdge pBulkEdge (sep < (lambda * 6.0)) errMesg)
executing: drc(pBulkEdge nNotOhmicEdge (enc < (lambda * 6.0)) errMesg)
executing: drc(nBulkEdge pNotOhmicEdge (enc < (lambda * 6.0)) errMesg)
executing: drc(nBulkEdge nOhmicEdge (enc < (lambda * 3.0)) errMesg) executing: drc(nOhmicEdge pBulkEdge (sep < (lambda * 3.0)) errMesg) executing: drc(pOhmicEdge nBulkEdge (sep < (lambda * 3.0)) errMesg) executing: drc(pBulkEdge pOhmicEdge (enc < (lambda * 3.0)) errMesg) executing: drc(nNotOhmicEdge pOhmicEdge ((0 < sep) < (lambda * 4.0)) errMesg)
executing: drc(pNotOhmicEdge nOhmicEdge ((0 < sep) < (lambda * 4.0)) errMesg)
executing: drc(polyEdge (width < (lambda * 2.0)) errMesg) drc(polyEdge (sep < (lambda * 3.0)) errMesg) drc(polyEdge (notch < (lambda * 3.0)) errMesg) executing: drc(polyEdge activeEdge (enc < (lambda * 2.0)) errMesg) drc(activeEdge polyEdge (enc < (lambda * 3.0)) errMesg) drc(polyEdge activeEdge (sep < (lambda * 1.0)) errMesg) executing: drc(nselectEdge geomGetEdge(polyEdge inside pNotOhmic) (sep < (lambda * 3.0)) (app >…
executing: drc(nselectEdge geomGetEdge(polyEdge inside nNotOhmic) (enc < (lambda * 3.0)) (app >…
executing: drc(pselectEdge geomGetEdge(polyEdge inside nNotOhmic) (sep < (lambda * 3.0)) (app >…
executing: drc(pselectEdge geomGetEdge(polyEdge inside pNotOhmic) (enc < (lambda * 3.0)) (app >… executing: drc(geomOr(nselectEdge pselectEdge) activeEdge (sep <
(lambda * 2.0)) errMesg)
drc(geomOr(nselectEdge pselectEdge) activeEdge (enc <
(lambda * 2.0)) errMesg)
executing: drc(nselectEdge caEdge (sep < (lambda * 1.0)) errMesg) drc(nselectEdge caEdge (enc < (lambda * 1.0)) errMesg) executing: drc(pselectEdge caEdge (sep < (lambda * 1.0)) errMesg) drc(pselectEdge caEdge (enc < (lambda * 1.0)) errMesg) executing: saveDerived(geomButting(geomAnd(ca nselect) geomAnd(ca pselect)) errMesg)
executing: drc(nselectEdge (width < (lambda * 2.0)) errMesg) drc(nselectEdge (sep < (lambda * 2.0)) errMesg) drc(nselectEdge (notch < (lambda * 2.0)) errMesg) executing: drc(pselectEdge (width < (lambda * 2.0)) errMesg) drc(pselectEdge (sep < (lambda * 2.0)) errMesg) drc(pselectEdge (notch < (lambda * 2.0)) errMesg) executing: saveDerived(geomAnd(nselect pselect) errMesg) executing: drc(cpEdge (width < (lambda * 2.0)) errMesg) drc(cpEdge (sep < (lambda * 3.0)) errMesg) drc(cpEdge (notch < (lambda * 3.0)) errMesg) executing: drc(cp (area > ((lambda * 2.0 * (lambda * 2.0)) + (lambda * 0.1 * (lambda * 0.1)))) … executing: drc(polyEdge cpEdge (enc < (lambda * 1.0)) errMesg) drc(cpEdge polyEdge (sep < (lambda * 5.0)) errMesg) executing: saveDerived(geomAndNot(cp poly) errMesg)
executing: saveDerived(geomAndNot(cc geomOr(poly elec active)) errMesg)
executing: drc(cpEdge GateEdge (sep < (lambda * 2.0)) errMesg) executing: drc(cpEdge activeEdge (sep < (lambda * 2.0)) errMesg) executing: saveDerived(geomAnd(cp active) errMesg) executing: saveDerived(geomGetLength(drc(cpEdge activeEdge (sep < (lambda * 3.0))) (length > (l… executing: drc(caEdge (width < (lambda * 2.0)) errMesg) drc(caEdge (sep < (lambda * 3.0)) errMesg) drc(caEdge (notch < (lambda * 3.0)) errMesg) executing: drc(ca (area > ((lambda * 2.0 * (lambda * 2.0)) + (lambda * 0.1 * (lambda * 0.1)))) … executing: drc(activeEdge caEdge (enc < (lambda * 1.0)) errMesg) drc(caEdge activeEdge (sep < (lambda * 5.0)) errMesg) executing: saveDerived(geomAndNot(ca active) errMesg) executing: drc(caEdge GateEdge (sep < (lambda * 2.0)) errMesg) executing: saveDerived(geomAnd(ca Gate) errMesg)
executing: drc(caEdge fieldPolyEdge (sep < (lambda * 2.0)) errMesg) executing: saveDerived(geomAnd(ca fieldPoly) errMesg) executing: saveDerived(geomGetLength(drc(caEdge fieldPolyEdge (sep < (lambda * 3.0))) (length >… executing: drc(caEdge cpEdge (sep < (lambda * 4.0)) errMesg) executing: saveDerived(geomAnd(ca cp) errMesg)
executing: drc(metal1Edge (width < (lambda * 3.0)) errMesg) drc(metal1Edge (sep < (lambda * 3.0)) errMesg) drc(metal1Edge (notch < (lambda * 3.0)) errMesg) executing: drc(metal1Edge cpEdge (enc < (lambda * 1.0)) errMesg) executing: drc(metal1Edge caEdge (enc < (lambda * 1.0)) errMesg) executing: saveDerived(geomAndNot(cp metal1) errMesg) executing: saveDerived(geomAndNot(ca metal1) errMesg) executing: drc(viaEdge (width < (lambda * 2.0)) errMesg) drc(viaEdge (sep < (lambda * 3.0)) errMesg) executing: drc(via (area > ((lambda * 2.0 * (lambda * 2.0)) + (lambda * 0.1 * (lambda * 0.1))))… executing: drc(metal1Edge viaEdge (enc < (lambda * 1.0)) errMesg) executing: saveDerived(geomAndNot(via metal1) errMesg)

executing: drc(metal2Edge (width < (lambda * 3.0)) errMesg) drc(metal2Edge (sep < (lambda * 3.0)) errMesg) drc(metal2Edge (notch < (lambda * 3.0)) errMesg) executing: drc(metal2Edge viaEdge (enc < (lambda * 1.0)) errMesg) executing: saveDerived(geomAndNot(via metal2) errMesg) executing: BondingGlass = geomInside(glass pad) ProbeGlass = geomOutside(glass pad) executing: saveDerived(geomStraddle(glass pad))
executing: BondingPad = geomAndNot(geomSize(BondingGlass 6.0) geomHoles(BondingGlass))
executing: ProbePad = geomAndNot(geomSize(ProbeGlass 6.0) geomHoles(ProbeGlass))
executing: Pad = geomOr(BondingPad ProbePad) executing: BondingPadEdge = geomGetEdge(BondingPad not_over “nodrc”) executing: ProbePadEdge = geomGetEdge(ProbePad not_over “nodrc”) executing: PadEdge = geomGetEdge(Pad not_over “nodrc”)
executing: Metal3EdgeNearPad = geomGetEdge(geomOr(geomGetByLayer(“metal3” “glass” 36.0)) not_ov…
executing: Metal2EdgeNearPad = geomGetEdge(geomOr(geomGetByLayer(“metal2” “glass” 36.0)) not_ov…
executing: Metal1EdgeNearPad = geomGetEdge(geomOr(geomGetByLayer(“metal1” “glass” 21.0)) not_ov…
executing: PolyEdgeNearPad =
geomGetEdge(geomOr(geomGetByLayer(“poly” “glass” 21.0)) not_over “…
executing: ActiveEdgeNearPad = geomGetEdge(geomOr(geomGetByLayer(“active” “glass” 21.0)) not_ov…
executing: ElecEdgeNearPad =
geomGetEdge(geomOr(geomGetByLayer(“elec” “glass” 21.0)) not_over “… executing: drc(BondingPadEdge (width < 60.0) “(SCMOS Rule 10.1) bonding pad width: 60 um”)
executing: drc(ProbePadEdge (width < 20.0) “(SCMOS Rule 10.2) probe pad width: 20 um”) executing: drc(Metal3EdgeNearPad glassEdge (enc < 6.0) “(SCMOS Rule 10.3) pad enclosure of glas… executing: saveDerived(geomAndNot(glass metal3) “(SCMOS Rule 10.3) pad enclosure of glass: 6 um”) executing: drc(PadEdge Metal3EdgeNearPad (sep < 30.0) “(SCMOS Rule 10.4) pad to unrelated metal…
executing: drc(PadEdge Metal2EdgeNearPad (sep < 30.0) “(SCMOS Rule 10.4) pad to unrelated metal…
executing: drc(PadEdge Metal1EdgeNearPad (sep < 15.0) “(SCMOS Rule 10.5) pad to unrelated metal…
executing: drc(PadEdge PolyEdgeNearPad (sep < 15.0) “(SCMOS Rule 10.5) pad to unrelated poly sp…
executing: drc(PadEdge ActiveEdgeNearPad (sep < 15.0) “(SCMOS Rule 10.5) pad to unrelated activ…
executing: drc(PadEdge ElecEdgeNearPad (sep < 15.0) “(SCMOS Rule 10.5) pad to unrelated elec sp… executing: drc(CapacitorElecEdge (width < (lambda * 7.0)) errMesg) drc(CapacitorElecEdge (sep < (lambda * 3.0)) errMesg) drc(CapacitorElecEdge (notch < (lambda * 3.0)) errMesg) executing: drc(polyEdge CapacitorElecEdge (enc < (lambda * 5.0)) errMesg)
executing: drc(CapacitorElecEdge nBulkEdge (sep < (lambda * 2.0)) errMesg)
drc(nBulkEdge CapacitorElecEdge (enc < (lambda * 2.0)) errMesg)
executing: drc(CapacitorElecEdge pBulkEdge (sep < (lambda * 2.0)) errMesg)
drc(pBulkEdge CapacitorElecEdge (enc < (lambda * 2.0)) errMesg)
executing: saveDerived(geomStraddle(CapacitorElec nBulk) errMesg) executing: saveDerived(geomStraddle(CapacitorElec pBulk) errMesg) executing: drc(CapacitorElecEdge activeEdge (sep < (lambda * 2.0)) errMesg)
executing: saveDerived(geomAnd(CapacitorElec active) errMesg) executing: drc(CapacitorElecEdge cpEdge (sep < (lambda * 6.0)) errMesg)
executing: drc(geomGetEdge(“elec”) geomGetEdge(“metal3”) (sep <
(lambda * 2.0)) errMesg)
executing: saveDerived(geomOverlap(metal3 elec diffNet) errMesg) executing: drc(geomGetEdge(“elec”) geomGetEdge(“metal2”) (sep <
(lambda * 2.0)) errMesg)
executing: saveDerived(geomOverlap(metal2 elec diffNet) errMesg) executing: drc(geomGetEdge(“elec”) geomGetEdge(“metal1”) (sep <
(lambda * 2.0)) errMesg)
executing: saveDerived(geomOverlap(metal1 elec diffNet) errMesg) executing: drc(TransistorElecEdge (width < (lambda * 2.0)) errMesg) drc(TransistorElecEdge (sep < (lambda * 3.0)) errMesg)

drc(TransistorElecEdge (notch < (lambda * 3.0)) errMesg) executing: drc(TransistorElecEdge activeEdge (enc < (lambda * 2.0)) errMesg)
drc(TransistorElecEdge activeEdge (sep < (lambda * 1.0)) errMesg)
executing: drc(TransistorElecEdge polyEdge (sep < (lambda * 2.0)) errMesg)
drc(TransistorElecEdge polyEdge (ovlp < (lambda * 2.0)) errMesg)
executing: drc(TransistorElecEdge cpEdge (sep < (lambda * 3.0)) errMesg)
executing: saveDerived(geomAnd(TransistorElec cp) errMesg) executing: drc(TransistorElecEdge caEdge (sep < (lambda * 3.0)) errMesg)
executing: saveDerived(geomAnd(TransistorElec ca) errMesg) executing: drc(ceEdge (width < (lambda * 2.0)) errMesg) drc(ceEdge (sep < (lambda * 3.0)) errMesg) drc(ceEdge (notch < (lambda * 3.0)) errMesg) executing: drc(ce (area > ((lambda * 2.0 * (lambda * 2.0)) + (lambda * 0.1 * (lambda * 0.1)))) … executing: drc(CapacitorElecEdge ceEdge (enc < (lambda * 3.0)) errMesg)
executing: drc(TransistorElecEdge ceEdge (enc < (lambda * 2.0)) errMesg) executing: saveDerived(geomAndNot(ce elec) “(SCMOS Rules 13.3,13.4) electrode enclosure of cont… executing: drc(ceEdge polyEdge (sep < (lambda * 3.0)) errMesg) executing: saveDerived(geomOutside(geomAnd(ce poly) CapacitorElec) errMesg)
executing: drc(ceEdge activeEdge (sep < (lambda * 3.0)) errMesg) executing: saveDerived(geomAnd(ce active) errMesg) executing: drc(via2Edge (width < (lambda * 2.0)) errMesg) drc(via2Edge (sep < (lambda * 3.0)) errMesg) executing: drc(via2 (area > ((lambda * 2.0 * (lambda * 2.0)) + (lambda * 0.1 * (lambda * 0.1)))… executing: drc(metal2Edge via2Edge (enc < (lambda * 1.0)) errMesg) executing: saveDerived(geomAndNot(via2 metal2) errMesg) executing: drc(metal3Edge (width < (lambda * 5.0)) errMesg) drc(metal3Edge (sep < (lambda * 3.0)) errMesg) drc(metal3Edge (notch < (lambda * 3.0)) errMesg) executing: drc(metal3Edge via2Edge (enc < (lambda * 2.0)) errMesg)
executing: saveDerived(geomAndNot(via2 metal3) errMesg) executing: drc(highresEdge (width < (lambda * 4.0)) errMesg) drc(highresEdge (sep < (lambda * 4.0)) errMesg) drc(highresEdge (notch < (lambda * 4.0)) errMesg) executing: drc(highresEdge caEdge (sep < (lambda * 2.0)) errMesg) executing: drc(highresEdge cpEdge (sep < (lambda * 2.0)) errMesg)
executing: saveDerived(geomAnd(highres ca) errMesg) executing: saveDerived(geomAnd(highres cp) errMesg) executing: drc(highresEdge activeEdge (sep < (lambda * 2.0)) errMesg)
executing: drc(highresEdge geomGetEdge(geomAndNot(elec geomButting(elec elecHighres))) (sep < (… executing: saveDerived(geomButting(elecHighres geomAndNot(elec elecHighres) (ignore == 2)) errM… executing: saveDerived(geomAnd(elecHighres nwell) “(SCMOS Rule 27.6) resistor must be outside w…
executing: saveDerived(geomAnd(elecHighres active) “(SCMOS Rule 27.6) resistor must be outside … executing: drc(elecHighresEdge (width < (lambda * 5.0)) errMesg) drc(elecHighresEdge (sep < (lambda * 7.0)) errMesg) drc(elecHighresEdge (notch < (lambda * 7.0)) errMesg) executing: drc(highresEdge elecHighresEdge (enc < (lambda * 2.0)) errMesg)
********* Summary of rule violations for cell “inv layout” *********
Total errors found: 0

+ For LVS check:

Command line:
/project/engineering/cadence21/IC618/tools.lnx86/dfII/bin/64bit/LVS
-dir /home/warehouse/b.gwak/cadence/LVS -l -s -t
/home/warehouse/b.gwak/cadence/LVS/layout
/home/warehouse/b.gwak/cadence/LVS/schematic
Like matching is enabled.
Net swapping is enabled.
Using terminal names as correspondence points. Compiling Diva LVS rules…

Net-list summary for
/home/warehouse/b.gwak/cadence/LVS/layout/netlist count
4 nets
4 terminals
1 pmos
1 nmos

Net-list summary
/home/warehouse/b.gwak/cadence/LVS/schematic/netlist count
4 nets
4 terminals
1 pmos
1 nmos

Terminal correspondence points
N0 N0 gnd!
N3 N4 in N2 N2 out N1 N1 vdd!

Devices in the netlist but not in the rules:
pcapacitor
Devices in the rules but not in the netlist: cap nfet pfet nmos4 pmos4

The net-lists match.
layout schematic instances un-matched 0 0 rewired 0 0 size errors 0 0 pruned 0 0 active 2 2 total 2 2

nets un-matched 0 0 merged 0 0 pruned 0 0 active 4 4 total 4 4
terminals un-matched 0 0 for
matched but
different type 0 0 total 4 4

Probe files from /home/warehouse/b.gwak/cadence/LVS/schematic
devbad.out:
netbad.out:
mergenet.out:
termbad.out:
prunenet.out:
prunedev.out:
audit.out:

Probe files from /home/warehouse/b.gwak/cadence/LVS/layout
devbad.out:
netbad.out:
mergenet.out:
termbad.out:
prunenet.out:
prunedev.out:
audit.out:

7)- 5.4 (For 563M) + We know the following:
𝑉𝑇0 = 0.48 𝑉
𝜇𝐴
𝜇𝑛𝐶𝑜𝑥 = 102 2
𝑉
𝑊
()𝑙𝑜𝑎𝑑 = 3
𝐿
𝑊
()𝑑𝑟𝑖𝑣𝑒𝑟 = 9
𝐿
𝛾 = 0 𝑉
|2Φ𝐹| = 1.011 𝑉
𝜆 = 0
𝑉𝐷𝐷 = 1.2 𝑉
𝐸𝑐𝐿𝑛 = 0.45 𝑉

+ (a), For 𝑉𝑂𝐻, 𝑉𝑂𝐿:
Consider that load transistor is in saturation.
𝑘𝑙𝑜𝑎𝑑 2
(𝑉𝐷𝐷 − 𝑉𝑂𝐻 − 𝑉𝑇) = 0
2
So, 𝑉𝑂𝐻 = 𝑉𝐷𝐷 − 𝑉𝑇
𝑉𝑂𝐻 = 1.2 − 0.48 = 0.72𝑉

Consider the load is in saturation and driver is in linear when input is 𝑉𝑂𝐻.
𝑘𝑙𝑜𝑎𝑑 2 𝑘𝑑𝑟𝑖𝑣𝑒𝑟 2
2 (𝑉𝐷𝐷 − 𝑉𝑂𝐿 − 𝑉𝑇) = 2 [2(𝑉𝑂𝐻 − 𝑉𝑇0)𝑉𝑂𝐿 − 𝑉𝑂𝐿 ]
𝑘𝑑𝑟𝑖𝑣𝑒𝑟 2
(𝑉𝐷𝐷 − 𝑉𝑂𝐿 − 𝑉𝑇)2 = [2(𝑉𝑂𝐻 − 𝑉𝑇0)𝑉𝑂𝐿 − 𝑉𝑂𝐿 ]
𝑘𝑙𝑜𝑎𝑑

𝑘𝑑𝑟𝑖𝑣𝑒𝑟 𝜇𝑛𝐶𝑜𝑥 𝑊 𝑊
Since,
𝑘𝑙𝑜𝑎𝑑 𝜇𝑛𝐶𝑜𝑥( 𝐿 )𝑙𝑜𝑎𝑑 ( 𝐿 )𝑙𝑜𝑎𝑑 3
(1.2 − 𝑉𝑂𝐿 − 0.48)2 = 3 ∙ [2(0.72 − 0.48)𝑉𝑂𝐿 − 𝑉𝑂𝐿2]

𝑉𝑂𝐿2 − 1.44 𝑉𝑂𝐿 + 0.5184 = 1.44 𝑉𝑂𝐿 − 3𝑉𝑂𝐿2

𝑉𝑂𝐿 = 0.36 𝑉

+ (b), For noise margin :
Consider load is in saturation and driver is in saturation.
𝑘𝑙𝑜𝑎𝑑 2 𝑘𝑑𝑟𝑖𝑣𝑒𝑟 2
2 (𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡 − 𝑉𝑇0) = 2 (𝑉𝑖𝑛 − 𝑉𝑇0)

(𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡 − 𝑉𝑇0)2 = 3(𝑉𝑖𝑛 − 𝑉𝑇0)2
(1.2 − 𝑉𝑜𝑢𝑡 − 0.48)2 = 3(𝑉𝑖𝑛 − 0.48)2
(0.72 − 𝑉𝑜𝑢𝑡)2 = 3(𝑉𝑖𝑛 − 0.48)2 ——- (X)

Take derivation with respect to Vin on both side.
𝑑𝑉𝑜𝑢𝑡
= −1
𝑑𝑉𝑖𝑛

𝑑𝑉𝑜𝑢𝑡
2(0.72 − 𝑉𝑜𝑢𝑡) = 6(𝑉𝑖𝑛 − 0.48)
𝑑𝑉𝑖𝑛

−2(0.72 − 𝑉𝑜𝑢𝑡) = 6(𝑉𝑖𝑛 − 0.48)
−(0.72 − 𝑉𝑜𝑢𝑡) = 3(𝑉𝑖𝑛 − 0.48)
𝑉𝑜𝑢𝑡 = 3𝑉𝑖𝑛 − 1.44 + 0.72
𝑉𝑜𝑢𝑡 = 3𝑉𝑖𝑛 − 0.72

Put 𝑉𝑜𝑢𝑡 = 3𝑉𝑖𝑛 − 0.72 back into (X) equation.
(0.72 − 𝑉𝑜𝑢𝑡)2 = 3(𝑉𝑖𝑛 − 0.48)2 ——- (X)
(0.72 − 3𝑉𝑖𝑛 + 0.72)2 = 3(𝑉𝑖𝑛 − 0.48)2
𝑉𝑖𝑛 = 𝑉𝐼𝐿 = 0.48 𝑉

Therefore, noise margin :

𝑁𝑀𝐿 = 𝑉𝐼𝐿 − 𝑉𝑂𝐿 = 0.48 − 0.36 = 0.12 𝑉

+ (c), For current:

𝐼𝑙𝑜𝑎𝑑 = 𝑘𝑙𝑜𝑎𝑑 (𝑉 − 𝑉 )2 = 𝑘𝑙𝑜𝑎𝑑 (𝑉𝐷𝐷 − 𝑉𝑜𝑢𝑡 − 𝑉𝑇,𝐿)2
𝐺𝑆,𝐿 𝑇,𝐿
2 2
𝑊
= 𝜇 𝑛𝐶𝑜𝑥 ( 𝐿 )𝑙𝑜𝑎𝑑 (𝑉𝐷𝐷 − 𝑉𝑂𝐿 − 𝑉𝑇,𝐿)2
2
102 ∙ 10−6 ∙ 3
= (1.2 − 0.36 − 0.48)2
2
= 0.0000198288
= 19.8288 𝜇𝐴

8) – 5.7(For 563M)
+ we know following:
𝑊
nMOS: 𝑉𝑇0,𝑛 = 0.48𝑉, 𝜇𝑛𝐶𝑜𝑥 = 102 𝜇𝐴/ 𝑉2, ( 𝐿 )𝑛 = 10
𝑊
𝑝𝑀𝑂𝑆: 𝑉𝑇0,𝑝 = −0.46𝑉, 𝜇𝑝𝐶𝑜𝑥 = 51.6 𝜇𝐴/ 𝑉2, ( 𝐿 )𝑝 = 19
𝐸𝐶,𝑛𝐿𝑛 = 0.4𝑉
𝐸𝐶,𝑝𝐿𝑝 = 1.8𝑉
𝐿𝑛 = 𝐿𝑝 = 60 𝑛𝑚

+ (a) For 𝑊𝑛:
𝑊𝑝

We use the below equation.
𝑉𝑇 (𝑉𝐷𝐷 − |𝑉𝑇0,𝑝|)
𝑉𝑡
1 + √
𝑘𝑅

0.
1 + √
𝑘𝑅
𝑘𝑅 = 144

𝑊 𝑊
𝑘𝑛 𝜇𝑛𝐶𝑜𝑥( 𝐿 )𝑛 102( 𝐿 )𝑛 102𝑊𝑛
𝑘𝑅 = 𝑘 = 𝜇 𝑊 = 𝑊 = 51.6𝑊𝑝 = 144
𝑝 𝐶𝑜𝑥( 𝐿 )𝑝 51.6( 𝐿 )𝑝 𝑝

𝑊𝑛 51.6
= 144 ∙ = 72.84
𝑊𝑝 102

+ (b) For 𝑉𝑡ℎ:

𝑊
𝑘𝑛 𝜇𝑛𝐶𝑜𝑥( 𝐿 )𝑛
𝑘𝑅 = 𝑘𝑝 = 𝜇𝑝𝐶𝑜𝑥(𝑊𝐿 )𝑝
𝑘𝑅
𝑘𝑝 51.6 ∙ 19
√ = 0.98
𝑘𝑅

𝑉𝑇 ,𝑝|)
𝑉𝑡
1 + √
𝑘𝑅

𝑉𝑇0,𝑛 = 0.48 ± 15%
𝑉𝑇0,𝑝 = −0.46 ± 20%

𝑉𝑇0,𝑛𝑚𝑎𝑥 = 0.48 + 0.48 ∙ 15% = 0.552
𝑉𝑇0,𝑛𝑚𝑖𝑛 = 0.48 − 0.48 ∙ 15% = 0.408
𝑉𝑇0,𝑝𝑚𝑎𝑥 = −0.46 + 0.46 ∙ 20% = −0.368
𝑉𝑇0,𝑝𝑚𝑖𝑛 = −0.46 − 0.46 ∙ 20% = −0.552

For upper limit, 𝑉𝑇0,𝑛 is max and 𝑉𝑇0,𝑝 is min.

0. ,𝑝|)
𝑉 𝑡ℎ,𝑢𝑝𝑝𝑒𝑟

0.
𝑉𝑡ℎ,𝑢𝑝𝑝𝑒𝑟 = = 0.69 𝑉
1 + 0.98

For lower limit, 𝑉𝑇0,𝑛 is min and 𝑉𝑇0,𝑝 is max.
𝑉𝑇 ,𝑝|)
𝑉𝑡ℎ,𝑙𝑜𝑤𝑒𝑟

0.408 + 0.98(1.2 − 0.552) 𝑉𝑡ℎ,𝑙𝑜𝑤𝑒𝑟 = = 0.52 𝑉
1 + 0.98

  • homework2-z6kanw.zip