Updated column mux section. Removed some old, unused, or bad images.

This commit is contained in:
Matt Guthaus 2018-02-12 16:37:49 -08:00
parent 93c66ec45d
commit 72b3072e3f
10 changed files with 110 additions and 1979 deletions

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 51 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -1,409 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="decoder_to _array.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4">
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lend"
style="overflow:visible;">
<path
id="path3229"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lstart"
style="overflow:visible">
<path
id="path3226"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<linearGradient
inkscape:collect="always"
id="linearGradient2461">
<stop
style="stop-color:#b3b3b3;stop-opacity:1;"
offset="0"
id="stop2463" />
<stop
style="stop-color:#b3b3b3;stop-opacity:0;"
offset="1"
id="stop2465" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2451">
<stop
style="stop-color:#b3b3b3;stop-opacity:1;"
offset="0"
id="stop2453" />
<stop
style="stop-color:#b3b3b3;stop-opacity:0;"
offset="1"
id="stop2455" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2445">
<stop
style="stop-color:#b3b3b3;stop-opacity:1;"
offset="0"
id="stop2447" />
<stop
style="stop-color:#b3b3b3;stop-opacity:0;"
offset="1"
id="stop2449" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective10" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2445"
id="linearGradient2443"
x1="370.17203"
y1="408.19574"
x2="372.40872"
y2="517.79352"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7710419,0,0,0.8337292,8.1937292,7.8098171)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2451"
id="linearGradient2457"
x1="371.29037"
y1="409.31409"
x2="367.72989"
y2="523.38525"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7712785,0,0,0.8337292,8.0871771,7.8098171)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2461"
id="linearGradient2467"
x1="551.34387"
y1="456.28641"
x2="551.34387"
y2="619.56287"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.5308865,0,114.74779)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.1448286"
inkscape:cx="309.70169"
inkscape:cy="808.88914"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1600"
inkscape:window-height="1132"
inkscape:window-x="0"
inkscape:window-y="0" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:url(#linearGradient2467);fill-opacity:1"
id="rect2459"
width="354.07697"
height="193.31812"
x="391.42059"
y="246.19127" />
<rect
style="fill:url(#linearGradient2457);fill-opacity:1"
id="rect2433"
width="127.34832"
height="191.49203"
x="228.03519"
y="248.01219" />
<rect
style="fill:#ff6600"
id="rect2549"
width="518.00879"
height="37.828362"
x="227.68326"
y="302.75879" />
<rect
style="fill:#00ff00"
id="rect2547"
width="544.10468"
height="38.307152"
x="201.76241"
y="243.43471" />
<rect
style="fill:url(#linearGradient2443);fill-opacity:1"
id="rect2383"
width="192.29077"
height="392.53891"
x="35.787025"
y="46.97047" />
<text
xml:space="preserve"
style="font-size:19.24255753px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="94.222366"
y="-121.21298"
id="text2387"
transform="matrix(-6.8463303e-3,1.0398304,-0.9616465,-7.4029511e-3,0,0)"><tspan
sodipodi:role="line"
id="tspan2389"
x="94.222366"
y="-121.21298">Address Decoder</tspan><tspan
sodipodi:role="line"
x="94.222366"
y="-97.15979"
id="tspan2391" /></text>
<rect
style="fill:#ff0000"
id="rect2393"
width="159.23743"
height="17.715534"
x="202.95409"
y="254.21713" />
<rect
style="fill:#0000ff"
id="rect2399"
width="159.23741"
height="17.715534"
x="202.9501"
y="280.85464" />
<rect
style="fill:#008000"
id="rect2401"
width="159.40862"
height="17.715534"
x="202.94533"
y="310.23676" />
<text
xml:space="preserve"
style="font-size:14.67683983000000048px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="254.6263"
y="281.54678"
id="text2403"
transform="scale(1.0494184,0.9529088)"><tspan
sodipodi:role="line"
id="tspan2405"
x="254.6263"
y="281.54678">Vdd </tspan></text>
<text
xml:space="preserve"
style="font-size:14.9124279px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="278.65591"
y="268.46613"
id="text2407"
transform="scale(0.9095598,1.0994329)"><tspan
sodipodi:role="line"
id="tspan2409"
x="278.65591"
y="268.46613">Word Line</tspan></text>
<text
xml:space="preserve"
style="font-size:15.81832218px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="277.87473"
y="316.27682"
id="text2411"
transform="scale(0.9736983,1.0270121)"><tspan
sodipodi:role="line"
id="tspan2413"
x="277.87473"
y="316.27682">Vss</tspan></text>
<rect
style="fill:#ff0000"
id="rect2469"
width="362.56842"
height="17.715534"
x="382.1893"
y="254.20079" />
<rect
style="fill:#0000ff"
id="rect2471"
width="363.03949"
height="17.715534"
x="382.1853"
y="280.83832" />
<rect
style="fill:#008000"
id="rect2473"
width="361.6424"
height="17.715534"
x="383.1106"
y="310.22043" />
<text
xml:space="preserve"
style="font-size:14.67683983px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="445.56149"
y="281.52963"
id="text2475"
transform="scale(1.0494184,0.9529088)"><tspan
sodipodi:role="line"
id="tspan2477"
x="445.56149"
y="281.52963">Vdd </tspan></text>
<text
xml:space="preserve"
style="font-size:14.9124279px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="498.65213"
y="268.45126"
id="text2479"
transform="scale(0.9095598,1.0994329)"><tspan
sodipodi:role="line"
id="tspan2481"
x="498.65213"
y="268.45126">Word Line</tspan></text>
<text
xml:space="preserve"
style="font-size:15.81830978px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="485.32767"
y="315.46939"
id="text2483"
transform="scale(0.9736983,1.0270121)"><tspan
sodipodi:role="line"
id="tspan2485"
x="485.32767"
y="315.46939">Vss</tspan></text>
<rect
style="fill:#ffffff"
id="rect2551"
width="16.346491"
height="152.72293"
x="364.29324"
y="215.42181" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:18.10000038;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="M 382.1893,263.0691 L 362.19151,263.07027"
id="path2487"
inkscape:connector-type="polyline"
inkscape:connection-start="#rect2469"
inkscape:connection-end="#rect2393" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:18.10000038;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="M 362.35394,319.0899 L 383.1106,319.08869"
id="path2491"
inkscape:connector-type="polyline"
inkscape:connection-start="#rect2401"
inkscape:connection-end="#rect2473" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:18.10000038;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="M 382.1853,289.70663 L 362.18752,289.70779"
id="path2493"
inkscape:connector-type="polyline"
inkscape:connection-start="#rect2471"
inkscape:connection-end="#rect2399" />
<text
xml:space="preserve"
style="font-size:24px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="533.82971"
y="239.70804"
id="text2543"><tspan
sodipodi:role="line"
id="tspan2545"
x="533.82971"
y="239.70804">Array</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:18.10000038;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="M 380.28173,247.63341 L 363.69741,247.63484"
id="path2553"
inkscape:connector-type="polyline" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:18.10000038;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="M 380.8161,335.38958 L 364.23178,335.39101"
id="path2563"
inkscape:connector-type="polyline" />
<text
xml:space="preserve"
style="font-size:24px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="-238.96878"
y="379.59302"
id="text2583"
transform="matrix(0,-1,1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan2585"
x="-238.96878"
y="379.59302">}</tspan></text>
<text
xml:space="preserve"
style="font-size:24px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="345.11981"
y="380.30951"
id="text2587"
transform="matrix(0,1,1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan2589"
x="345.11981"
y="380.30951">}</tspan></text>
<text
xml:space="preserve"
style="font-size:16.78106117px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="331.69421"
y="231.48781"
id="text2591"
transform="scale(1.0378936,0.9634899)"><tspan
sodipodi:role="line"
id="tspan2593"
x="331.69421"
y="231.48781">N-Well</tspan></text>
<text
xml:space="preserve"
style="font-size:16.01638031px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="354.27347"
y="370.5802"
id="text2595"
transform="scale(0.9905987,1.0094905)"><tspan
sodipodi:role="line"
id="tspan2597"
x="354.27347"
y="370.5802">P-Well</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Binary file not shown.

View File

@ -127,79 +127,58 @@ the top of a bitcell array.
\subsection{Address Decoders}
\label{sec:addressdecoder}
\label{sec:address_decoder}
The address decoder takes the row address bits from the address bus as
inputs, and asserts the appropriate wordline in the row that data is
to be read or written. A n-bit address input controls $2^n$ word
lines.
The address decoder deodes the binary-encoded row address bits from the
address bus as inputs, and asserts a one-hot wordline in the row that
data is to be read or written. OpenRAM provides a hierarchical address
decoder as the default, but will soon have other options.
OpenRAM provides a hierarchical address decoder as the default, but
will soon have other options.
The address decoders are created using parameterized gates (pnand2,
pnand3, pinv) and transistors (ptx). This means that the decoders do
not rely on any hard library cells.
\subsubsection{Hierarchical Decoder}
\label{sec:hierdecoder}
Hierarchical decoder is a type of decoder which the constrcution takes place hierarchically.
The simple 2:4 decoder is shown in the Figure~\ref{fig:2 to 4 decoder}. The operation of
this decoder can be explained as follows: soon after the address signals A0 and A1 are put on the address lines,
depending on the signal combination, one of the wordlines will rise after a brief amount of time. For example if the
address input is A0A1=00 then the output is W0W1W2W3=1000. The 2:4 address decoder uses inverters and two
input nand gates for its constrcution while the gates are sized to have equal rise and fall time.
As the decoder size increases the size of the nand gates required for decoding also increases.
Table~\ref{table:2-4 hierarchical_decoder} gives the detailed input and output siganls
for the 2:4 hierarchical decoder.
A simple 2:4 decoder is shown in Figure~\ref{fig:2:4decoder}. This
decoder computes all of the possible decode values using a single
level of nand gates along with the inverted and non-inverted inputs.
As the decoder size increases the size of the nand gates required for
decoding would increase proportional to the bits to be decoded. This
would not be practical for large decoders.
\begin{figure}[h!]
\centering
\includegraphics[scale=.6]{./figs/2t4decoder.pdf}
\caption{Schematic of 2-4 simple decoder.}
\label{fig:2 to 4 decoder}
\label{fig:2:4decoder}
\end{figure}
\begin{table}[h!]
\begin{center}
\begin{tabular}{| c | c |}
\hline
A[1:0] & Selected WL\\ \hline
00 & 0\\ \hline
01 & 1\\ \hline
10 & 2\\ \hline
11 & 3\\ \hline
\end{tabular}
\end{center}
\caption{Truth table for 2:4 hierarchical decoder.}
\label{table:2-4 hierarchical_decoder}
\end{table}
An $n$-bit decoder requires {$2^n$} logic gates, each with $n$ inputs. For example, with $n$ = 6,
64 $NAND6$ gates are needed to drive 64 inverters to implement the decoder.
It is clear that gates with more than 3 inputs create large series resistances and long delays.
Rather than using $n$-input gates, it is preferable to use a cascade of gates.
Typically two stages are used: a predecode stage and a final decode stage.
The predecode stage generates intermediate signals that are used
by multiple gates in the final decode stage.
A hierarchical decoder uses two-levels of decoding hierarchy to
perform an address decode. The first stage computes predecoded values
while the second stage computes the final decoded values.
Figure~\ref{fig:4 to 16 decoder} shows a 4:16 heirarchical
decoder. The decoder uses two 2:4 decoders for
predecoding and 2-input nand gates and inverters for final decoding to
form the 4:16 decoder.
\begin{figure}[h!]
\centering
\includegraphics[scale=.6]{./figs/4t16decoder.pdf}
\caption{Schematic of 4 to 16 hierarchical decoder.}
\caption{Schematic of 4:16 hierarchical decoder.}
\label{fig:4 to 16 decoder}
\end{figure}
Figure~\ref{fig:4 to 16 decoder} shows the 4 to 16 heirarchical decoder. The structure of the decoder consists of two 2:4 decoders for predecoding and 2-input nand gates and inverters for final decoding to form the 4:16 decoder.
In the predecoder, a total of 8 intermediate signals are generated from the address bits and their complements.
The concept of using predecoing and final decoding stage for construction of address decoder is very procutive since small
decoders like 2:4 decoder is used for predecoding. The operation of 4:16 heirarchical decoder can explained with an example. If the address is A0A1A2A3=0000 the output of the predecoder1 and predeocder2 will be
WL0WL1WL2WL3=1000 and WL0WL1WL2WL3=1000, respectively. According to the connections in figure~\ref{fig:4 to 16 decoder} the wordline 0 of predecoder1 and predecoder2 are conneted
to the first 2-input nand gate in the decode stage representing the wordline 0 of the final decoding stage. Hence depengin on the combination
of the input signal one of the wordline will rise. In this case since the address input is A0A1A2A3=0000 the wordline 0 should go high. Table~\ref{table:4-16 hierarchical_decoder} gives the detailed input and output siganls
for the 4:16 hierarchical decoder.
The predecoder generates a total of 8 intermediate signals from the
address bits and their complements. These intermediate signals are in
two groups of 4 from each decoder. The enumeration of all 4 x 4
predecoded values are used by the final decode to produce the 16
decoded results. As an example, Table~\ref{table:4-16 hierarchical_decoder}
gives the detailed input and output siganls for the 4:16 hierarchical
decoder.
\begin{table}[h!]
@ -230,43 +209,72 @@ for the 4:16 hierarchical decoder.
\end{table}
As the size of the address line increases higher level decoder can be created using the lower level decoders. For example for a 8:256 decoder, two instances of 4:16 followed by 256 2-input nand gates and inverters
can form the decoder. In order to construct the 8:256 decoder, first 4:16 decoder should be constructed through using 2:4 deccoders. Hence the name is hierarchical decoder.
As the address size increases, additional sizes of pre- and final
decoders can be used. In OpenRAM, there are implementations for
\verb|modules/hierarchical\_predecode2x4.py| and
\verb|modules/hierarchical\_predecode3x8.py| to produce 2:4 and 3:8
predecodes, respectively. These same decoders are used to generate the
column mux select bits as well.
For the final decode, we can use either pnand2 or pnand3 gates. This
allows a maximum size of three 3:8 predocers along with a final pnand3 decode
stage, or, 512 word lines. To extend beyond this, a pnand4 or
a 4:16 predecoder would be needed.
\subsection{Wordline Driver}
\label{sec:wldriver}
Word line drivers are inserted, in between the word line
output of the address decoder and the word line input of the bitcell-array. The word
line drivers ensure that as the size of the memory array increases,
and the word line length and capacitance increases, the word line
signal is able to turn on the access transistors in the 6T cell. Also, as the bank select signal
in multi-bank structures is $ANDED$ with the word line output of decoder,
bitcells turn on only when bank is selected.
Figure~\ref{fig:wordline_driver} shows the diagram of word line driver and its input/output pins.
In OpenRAM, word line drivers are created by using the \verb|pinv| and \verb|nand2| classes which
takes the transistor size and cell height as inputs (so that it can abutt the
6T cell). Word line driver is added as seperate module in \verb|compiler|.
The word line driver buffers the address decoder to drive the wordline and
gates the signal until the decode has stabilized. Without waiting, an
incorrectly asserted wordline could erase memory contents.
The word line driver is sized according to the bitcell array width so
that wordlines in larger memory arrays can be appropriately driven.
% gating for first half decode, second half read/write
The first half of the clock cycle is used for address decoding in
OpenRAM. Therefore, the wordline driver is enabled in the second half
of the clock cycle in OpenRAM. The buffered clock signal drives each
wordline driver row and is logically ANDed with the decoder output.
% bank clock gating for wordline driver
In multi-bank structures the clock buffer is also anded with the bank
select signal to prevent the read/writing of an entire bank.
\begin{figure}[h!]
\centering
\includegraphics[scale=.8]{./figs/wordline_driver.pdf}
\includegraphics[scale=.6]{./figs/wordline_driver.pdf}
\caption{Diagram of word line driver.}
\label{fig:wordline_driver}
\end{figure}
Figure~\ref{fig:wordline_driver} illustrates the wordline driver and
its inputs/outputs. This is implemented in the
\verb|modules/wordline_driver.py| module and matches the number of
rows in the bitcell array of a bank.
OpenRAM creates the wordline drivers using the parameterized pinv and
pnand2 classes. This enables the wordline driver to be matched to the
bitcell height and to sized to drive the wordline load.
\subsection{Column Mux}
\label{sec:column_mux}
The column mux takes the column address bits from the address bus
selects the appropriate bitlines for the word that is to be read from
or written to. It takes n-bits from the address bus and can select
$2^n$ bitlines. The column mux is used for both the read and write
operations; it connects the bitline of the memory array to both the
sense ampflifier and the write driver.
The column mux is an optional module in an SRAM bank. Without a column
mux, the bank is assumed to have a single word in each row. A column
mux enables more more than one word to be stored in each row and
read/written individually. The column mux is used for both the read
and write operations by connecting the bitlines of a bank to
both the sense amplifier and the write driver.
OpenRAM provides several options for column mux, but the default
is a single-level column mux which is sized for optimal speed.
In OpenRAM, the column mux uses the {\bf high address bits} to select
the appropriate word in each row. If n-bits are used, there are $2^n$
words in each row. OpenRAM currently allows 2, 4, or 8 words per row,
but the 8 words are not fully debugged (as of 2/12/18).
%% OpenRAM provides several options for column mux, but the default
%% is a single-level column mux which is sized for optimal speed.
%% \subsubsection{Tree\_Decoding Column Mux}
%% \label{sec:tree_decoding_column_mux}
@ -352,30 +360,37 @@ is a single-level column mux which is sized for optimal speed.
%% it is connected to.
\subsubsection{Single\_Level Column Mux}
\subsubsection{Single-Level Column Mux}
\label{sec:single_level_column_mux}
The optimal design for column mux uses a single NMOS device, driven by the input address or decoded input addresses.
Figure~\ref{fig:2t1_single_level_column_mux} shows the schematic of a 2:1 single-level column mux. In this column mux one bit
of address and its complementry drive the pass transistors. Selected transistors will
connect their corresponding bitlines ( 1 set of column out of 2 set of columns) to sense-amp and write-driver circuitry for read or write operation.
Figure~\ref{fig:4t1_single_level_column_mux} shows the schematic of a 4:1 single-level column mux. In this column mux, 2 input
address are decoded using a 2:4 decoder ( 2:4 decoder is explain in section~\ref{sec:hierdecoder}). 2:4 decoder provides a one-hot set of outputs, so only one set of columns
will be selected and connected to sense-amp and write-driver
( in figure~\ref{fig:4t1_single_level_column_mux} one set of column out of four sets of column is selected).
OpenRAM includes a single-level pass-gate mux implemtation for the
column mux. A single level of NMOS devices is driven by either the
input address (and it's complement) or decoded input addresses using a
2:4 predecoder (Section~\ref{sec:hierdecoder}).
In OpenRAM, the \verb|single-level_mux_array| is a dynamically generated design and
it is made up of dynamically generated cell (\verb|single-level_mux|).
\verb|single-level_mux| uses the parameterized transistor class \verb|ptx| to generate two NMOS transistors
which will connect the BL and BLB of selected columns to sense-amp and write-driver. Horizontal rails are added for $sel$ signals. Vertical
straps connect the BL and BLB of bitcell\_array to BL and BLB of single-level column mux and also BL-out and BLB-out of single-level
column mux to BL and BLB of sense-amp and write-driver.
Figure~\ref{fig:2t1_single_level_column_mux} shows the schematic of a
2:1 single-level column mux. In this column mux, the {\bf MSB of the
address bus} and it's complement drive the pass transistors.
Figure~\ref{fig:4t1_single_level_column_mux} shows the schematic of a
4:1 single-level column mux. The select bits are decoded from the {\bf
2 MSB of the address bus} using a 2:4 decoder. The 2:4 decoder
provides one-hot select signals to select one column.
In OpenRAM, one mux, single\_level\_mux, is dynamically generated in
\verb|modules/single_level_column_mux.py| and multiple of these muxes
are tiled together in \verb|modules/single_level_column_mux_array.py|.
single\_level\_mux uses the parameterized ptx (Section~\ref{sec:ptx}
to generate 2 or 4 NMOS transistors for each the bl and br
bitlines. Horizontal rails are added for the $sel$ signals. The
bitlines are automatically pitch-matched to the bitcell array.
\begin{figure}[h!]
\centering
\includegraphics[scale=.7]{./figs/2t1_single_level_column_mux.pdf}
\caption{Schematic of a 2:1 single level column mux.}
\includegraphics[scale=.5]{./figs/2t1_single_level_column_mux.pdf}
\caption{Schematic of a 2:1 single level column mux. \fixme{Signals names are wrong.}}
\label{fig:2t1_single_level_column_mux}
\end{figure}
@ -383,8 +398,8 @@ column mux to BL and BLB of sense-amp and write-driver.
\begin{figure}[h!]
\centering
\includegraphics[scale=.6]{./figs/4t1_single_level_column_mux.pdf}
\caption{Schematic of a 4:1 single level column mux.}
\includegraphics[scale=.5]{./figs/4t1_single_level_column_mux.pdf}
\caption{Schematic of a 4:1 single level column mux. \fixme{Signals names are wrong.}}
\label{fig:4t1_single_level_column_mux}
\end{figure}

View File

@ -126,7 +126,7 @@ height=tech.cell_6t["height"])
\begin{figure}[h!]
\centering
\includegraphics[width=10cm]{./figs/nand2.pdf}
%\includegraphics[width=10cm]{./figs/nand2.pdf}
\caption{An example of Parameterized NAND2(nand\_2)}
\label{fig:nand2}
\end{figure}
@ -169,7 +169,7 @@ height=tech.cell_6t["height"])
\begin{figure}[h!]
\centering
\includegraphics[width=10cm]{./figs/nand3.pdf}
%\includegraphics[width=10cm]{./figs/nand3.pdf}
\caption{An example of Parameterized NAND3(nand\_3)}
\label{fig:nand3}
\end{figure}