\section{Overview of the SRAM Structure} \label{sec:overview} % address decode and mem array The baseline SRAMs generated by OpenRAM have 1 read/write port as shown in Figure~\ref{fig:sram_architecture}. The address is decoded (Section~\ref{sec:addressdecoder}) into a one-hot set of word lines (WL) which are driven by word line drivers (Section~\ref{sec:wldriver}) over the bit-cell array (Section~\ref{sec:bitcellarray}). To facilitate reads, the precharge circuitry (Section~\ref{sec:precharge}) precharges the bitlines so that the column mux (Section~\ref{sec:column_mux}) can select the appropriate word which is then sensed by the sense amplifiers (Section~\ref{sec:senseamp}). Write drivers (Section~\ref{sec:writedriver}) use the bidirectional nature of the column mux to write the appropriate columns in a given memory row. A representative layout of such a memory closely resembles the logical representation and is shown in Figure~\ref{fig:layout_view}. The address and data flip-flops and control circuitry are not shown but are detailed in Section~\ref{sec:control}. \begin{figure}[htb] \centering \includegraphics[width=10cm]{./figs/sram_overview.pdf} \caption{Single Port SRAM Architecture} \label{fig:sram_architecture} \end{figure} \begin{figure}[htb] \centering \includegraphics[width=6cm]{./figs/layout_view_1024_16_annotated.pdf} \caption{1k SRAM with Two Columns and 16-bit Data} \label{fig:layout_view} \end{figure} \subsection{Inputs/Outputs} \label{sec:io} The inputs to the SRAM are: \begin{itemize} \setlength{\itemsep}{0pt} \item clk - External Clock \item CSb - Active-low Chip Select \item WEb - Active-low Write Enable \item OEb - Active-low Output Enable \item ADDR[\#] - Address Bus input (LSB is 0) \item DATA[\#] - Bi-directional Data bus (LBS is 0) \end{itemize} If multiple ports are used, the ADDR and DATA buses are appended with integers to extend them. The outputs to the SRAM are: \begin{itemize} \setlength{\itemsep}{0pt} \item DATA\# - correspond to the bi-directional Data bus. \end{itemize} The supply voltages to the SRAM are: \begin{itemize} \item vdd - Supply voltage \item gnd - Ground supply voltage \end{itemize} \subsection{Top-Level SRAM Module} \label{sec:sram} The sram class in \verb|sram.py| is the top-level SRAM module. This class handles the overall organization of the memory, instantiates the contorl logic, instantiates a number of banks, and creates decoded enable signals for multiple banks. All of the top level routing is performed in the sram class. The sram class instantiates identical copies of the bank module from \verb|bank.py|. All other sub-modules access the value of sizes from bank. The bank module includes an address decoder, (optional) column address decoder, (optional) column mux, sense amplifiers, precharge circuitry, write drivers, etc. A single bank organization is depicted in Figure~\ref{fig:sram_architecture}. Discussion of the design data structure is discussed in Section~\ref{sec:design} and the modules contained in the top-level SRAM are detailed in Section~\ref{sec:modules}.