\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\# - corresponds to the Address Bus input, labeled 0 to N-address bits. \item DATA\# - corresponds to the bi-directional Data bus. \end{itemize} The outputs to the SRAM are: \begin{itemize} \setlength{\itemsep}{0pt} \item DATA\# - correspond to the bi-directional Data bus. \end{itemize} \subsection{Top-Level SRAM Module} \label{sec:sram} The \verb|sram| class in \verb|sram.py| is the top-level SRAM module. This class handles the overall organization of the memory and the input/output signals. Based on the user inputs, the various bus and array sizes are calculated and passed to the \verb|bank| module. All other sub-modules access the value of sizes from \verb|bank|. The overall 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}. When the user has specified the desired size (word size, total number of words and number of banks) of the memory that is to be generated, the following parameters must be calculated. There are several constraints to be considered in this calculations: (i) \verb|sram| can generate 1 bank, 2 banks or 4 banks. (ii) The area of each bank should be as square as possible which is dependent on the area of a 6T cell. (iii) There are several options for multiplexing (column-mux): 2-way, 4-way, 8-way and none. All of the top level routing is performed in the \verb|sram| class. \fixme{More soon...}