Update process script to generate TeX.
This commit is contained in:
parent
1ca79fc52b
commit
a55e55f04f
66
Lab2/lab2.tex
Normal file
66
Lab2/lab2.tex
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
\documentclass{article}
|
||||||
|
\usepackage[margin=1in]{geometry}
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\begin{document}
|
||||||
|
\section*{Lab 2}
|
||||||
|
|
||||||
|
The data gathered in this lab is listed in tables
|
||||||
|
1 and 2.
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\centering
|
||||||
|
\begin{tabular}{lcccccc}
|
||||||
|
Node & $g_m$ (S) & $r_o$ ($\Omega$) & Gain & $I_\text{off} (A)$ & $I_\text{on} (A)$ & $I_\text{on}/I_\text{off}$ \\
|
||||||
|
\hline
|
||||||
|
longchannel pmos & 4.01E-04 & 1.36E+04 & 5.457 & 1.02E-11 & 1.36E-03 & 1.34E+08 \\
|
||||||
|
longchannel nmos & 9.13E-04 & 1.31E+04 & 11.95 & 1.12E-11 & 3.22E-03 & 2.87E+08 \\
|
||||||
|
50nm pmos & 2.11E-04 & 1.55E+04 & 3.259 & 8.84E-09 & 1.48E-04 & 1.68E+04 \\
|
||||||
|
50nm nmos & 4.44E-04 & 1.31E+04 & 5.793 & 3.64E-09 & 3.12E-04 & 8.55E+04 \\
|
||||||
|
16nmlp pmos & 1.62E-04 & 1.68E+04 & 2.72 & 2.30E-11 & 5.54E-05 & 2.40E+06 \\
|
||||||
|
16nmlp nmos & 2.88E-04 & 1.33E+04 & 3.83 & 8.87E-12 & 9.13E-05 & 1.03E+07 \\
|
||||||
|
16nmhp pmos & 3.33E-04 & 5.37E+03 & 1.787 & 9.22E-08 & 1.51E-04 & 1.64E+03 \\
|
||||||
|
16nmhp nmos & 4.95E-04 & 5.56E+03 & 2.755 & 7.41E-08 & 2.17E-04 & 2.93E+03 \\
|
||||||
|
\end{tabular}
|
||||||
|
\label{fig:dc}
|
||||||
|
\caption{Properties of various transistor sizes and types}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\centering
|
||||||
|
\begin{tabular}{lcccccc}
|
||||||
|
Node & Oscillation Period (ps) & Oscillation Frequency (GHz) \\
|
||||||
|
\hline
|
||||||
|
longchannel & 1020 & 0.980 \\
|
||||||
|
50nm & 222 & 4.49 \\
|
||||||
|
16nmlp & 140 & 7.11 \\
|
||||||
|
16nmhp & 32.2 & 31.0 \\
|
||||||
|
\end{tabular}
|
||||||
|
\label{fig:t}
|
||||||
|
\caption{Switching frequency of 5-long inverter loop.}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
From these tables, we can see that smaller transistors have progressively smaller
|
||||||
|
gain, and progressively smaller ratios of on current $I_\text{on}$ and off current
|
||||||
|
$I_\text{off}$. We can explain the drop in gain with velocity saturation. At smaller
|
||||||
|
scales, short-channel effects make the relationship between current and gate voltage no longer
|
||||||
|
quadratic, but linear (and thus smaller in magnitude). This means that the transconductance
|
||||||
|
of a transistor decreases as it gets smaller, leading to lower gain. Furthermore,
|
||||||
|
due to short-channel effects such as impact ionization, current doesn't stop increasing
|
||||||
|
past the theoretical saturation point. This makes the transistor behave less like
|
||||||
|
a current source past saturation, and decreases gain.
|
||||||
|
|
||||||
|
Decreasing the size of the transistor does, however, significantly improve its timing characteristics.
|
||||||
|
While at 1$\mu m$ the 5-transistor loop we simulated has an oscillation frequency of 0.98GHz, the 16nm
|
||||||
|
high power loop can go as fast as 31GHz. This is likely due to the decreased capacitances at
|
||||||
|
this scale: it takes less time to charge up any part of the CMOS logic, including the outputs,
|
||||||
|
which makes it possible for subsequent transistors to respond faster, and so on.
|
||||||
|
|
||||||
|
For analog circuits, we care about gain, since we want to ensure that our signal is transmitted
|
||||||
|
properly through our circuit. Thus, bigger transistors are probably better suited for this application,
|
||||||
|
since they have higher (sometimes much higher) gains than smaller transistors. On the other hand,
|
||||||
|
from the digital side, the gain doesn't matter as much as the performance characteristics of the transistor,
|
||||||
|
which makes the smaller nodes (ones that we measured to have higher oscillation frequency) preferable.
|
||||||
|
|
||||||
|
\end{document}
|
||||||
|
|
@ -27,8 +27,8 @@ simulations = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
moss = {
|
moss = {
|
||||||
"nmos": "M1 2 1 0 0 nmos W={10*ll} L= ll",
|
"pmos": "M1 2 1 vdd vdd pmos W={10*ll} L={ll}",
|
||||||
"pmos": "M1 2 1 vdd vdd pmos W={10*ll} L={ll}"
|
"nmos": "M1 2 1 0 0 nmos W={10*ll} L= ll"
|
||||||
}
|
}
|
||||||
|
|
||||||
script_dc = """
|
script_dc = """
|
||||||
@ -96,16 +96,40 @@ def find_period(ident, script, model, mos, l):
|
|||||||
group2.append((dp, time[i]))
|
group2.append((dp, time[i]))
|
||||||
peak1 = max(group1)[1] * 1000000000000
|
peak1 = max(group1)[1] * 1000000000000
|
||||||
peak2 = max(group2)[1] * 1000000000000
|
peak2 = max(group2)[1] * 1000000000000
|
||||||
print(ident, peak2-peak1)
|
print(ident, peak2-peak1, 1/(peak2-peak1) * 1000)
|
||||||
|
|
||||||
|
|
||||||
|
def find_table(ident, script, model, mos, l):
|
||||||
|
vds = l.get_data('vds')
|
||||||
|
current_lo = l.get_data('I(vds)', 0)
|
||||||
|
current_hi = l.get_data('I(vds)', l.case_count - 1)
|
||||||
|
if mos == "nmos":
|
||||||
|
vgs1 = l.get_data('I(vds)', l.case_count - 2)
|
||||||
|
vgs2 = l.get_data('I(vds)', l.case_count - 1)
|
||||||
|
gm = (vgs2[-1]-vgs1[-1])/(simulations[model][0]/12)
|
||||||
|
vds = l.get_data('vds', l.case_count - 1)
|
||||||
|
ids = l.get_data('I(vds)', l.case_count - 1)
|
||||||
|
ro = (vds[-5] - vds[-1])/(ids[-5] - ids[-1])
|
||||||
|
print("{} & {:.2E} & {:.2E} & {:.4} & {:.2E} & {:.2E} & {:.2E} \\\\".format(
|
||||||
|
ident[3:].replace("_", " "), -gm, -ro, gm * ro, -current_lo[-1], -current_hi[-1], current_hi[-1]/current_lo[-1]))
|
||||||
|
if mos == "pmos":
|
||||||
|
vgs1 = l.get_data('I(vds)', 0)
|
||||||
|
vgs2 = l.get_data('I(vds)', 1)
|
||||||
|
gm = (vgs2[0]-vgs1[0])/(simulations[model][0]/12)
|
||||||
|
vds = l.get_data('vds', 0)
|
||||||
|
ids = l.get_data('I(vds)', 0)
|
||||||
|
ro = (vds[50] - vds[0])/(ids[50] - ids[0])
|
||||||
|
print("{} & {:.2E} & {:.2E} & {:.4} & {:.2E} & {:.2E} & {:.2E} \\\\".format(
|
||||||
|
ident[3:].replace("_", " "), -gm, -ro, gm * ro, current_hi[0], current_lo[0], current_lo[0]/current_hi[0]))
|
||||||
|
|
||||||
def find_onoff(ident, script, model, mos, l):
|
def find_onoff(ident, script, model, mos, l):
|
||||||
vds = l.get_data('vds')
|
vds = l.get_data('vds')
|
||||||
current_lo = l.get_data('I(vds)', 0)
|
current_lo = l.get_data('I(vds)', 0)
|
||||||
current_hi = l.get_data('I(vds)', l.case_count - 1)
|
current_hi = l.get_data('I(vds)', l.case_count - 1)
|
||||||
if mos == "nmos":
|
if mos == "nmos":
|
||||||
print(ident, -current_lo[-1] * 1000, -current_hi[-1] * 1000, current_hi[-1]/current_lo[-1])
|
print("node: {}\toff: {:.2E}\ton: {:.2E}\tratio: {:.2E}".format(ident, -current_lo[-1], -current_hi[-1], current_hi[-1]/current_lo[-1]))
|
||||||
if mos == "pmos":
|
if mos == "pmos":
|
||||||
print(ident, current_lo[0] * 1000, current_hi[0] * 1000, current_lo[0]/current_hi[0])
|
print("node: {}\toff: {:.2E}\ton: {:.2E}\tratio: {:.2E}".format(ident, current_hi[0], current_lo[0], current_lo[0]/current_hi[0]))
|
||||||
|
|
||||||
def find_gm(ident, script, model, mos, l):
|
def find_gm(ident, script, model, mos, l):
|
||||||
vds = l.get_data('vds')
|
vds = l.get_data('vds')
|
||||||
@ -154,6 +178,10 @@ def run_sim(script, model, mos, callback, file_type = "dc"):
|
|||||||
|
|
||||||
callback(scriptname, script, model, mos, l)
|
callback(scriptname, script, model, mos, l)
|
||||||
|
|
||||||
|
print(" --- LaTeX --- ")
|
||||||
|
for node in simulations.keys():
|
||||||
|
for mos in moss.keys():
|
||||||
|
run_sim(script_dc, node, mos, find_table)
|
||||||
|
|
||||||
print(" --- gm, ro --- ")
|
print(" --- gm, ro --- ")
|
||||||
for mos in moss.keys():
|
for mos in moss.keys():
|
||||||
@ -161,8 +189,8 @@ for mos in moss.keys():
|
|||||||
run_sim(script_dc, node, mos, find_gm)
|
run_sim(script_dc, node, mos, find_gm)
|
||||||
|
|
||||||
print(" --- onoff --- ")
|
print(" --- onoff --- ")
|
||||||
for mos in moss.keys():
|
|
||||||
for node in simulations.keys():
|
for node in simulations.keys():
|
||||||
|
for mos in moss.keys():
|
||||||
run_sim(script_dc, node, mos, find_onoff)
|
run_sim(script_dc, node, mos, find_onoff)
|
||||||
|
|
||||||
print(" --- period --- ")
|
print(" --- period --- ")
|
||||||
|
Loading…
Reference in New Issue
Block a user