Skip to content

Repository files navigation

64 b SRAM Memory Design

LaTeX to PDF LaTeX ESE 3700 22 nm HP SRAM SPICE

The required course work is Project 2 itself: a 16x4 SRAM design, analysis, and written report for ESE 3700 - Spring 2026 (Circuit Design and Optimization) at the University of Pennsylvania, School of Engineering and Applied Science.

This GitHub repository is not the official assignment submission. It exists for documentation, and personal record-keeping: LaTeX source, figures, SPICE decks, Electric exports, validation evidence, and a CI-built PDF.

Course assignment (instructor handout): The Spring 2026 Project 2 specification—requirements, figure of merit, and what counts as the assigned work—is published by Penn Engineering for ESE 3700 here: Project 2 handout (PDF). That PDF is course material, not something I wrote and not what this repository is hosting; it is linked only so readers can see the official brief. This repo is my own implementation, simulations, and write-up for that assignment.

Author: Tyrone Marhguy (contact links at the end of this page).


Figure 1: Required vs delivered headline metrics
Figure 1 — Required vs. delivered headline metrics (from the LaTeX report).

ESE 3700, Spring 2026 - Project 2: 64 b SRAM in PTM 22 nm HP CMOS.

Overview

This repository documents a 64 b SRAM macro organized as 16 words x 4 bits in the PTM 22 nm High-Performance CMOS process at VDD = 1.0 V. The design is optimized around the project figure of merit:

FOM = 60 * BitcellArea * Power * Delay^2

Because delay is squared, the final architecture spends complexity in the periphery while keeping the repeated bitcell compact. The memory uses a standard 6T cell with asymmetric sizing (CR = 2, PR = 1), no column multiplexer, four parallel column slices, a clocked StrongARM sense amplifier, self-timed sense-amp enable from a replica bitline column, and a two-phase non-overlapping clocking scheme generated from the single external CLK.

Full detail: ESE3700_Proj2_Marhguy.pdf is generated by CI after a successful LaTeX build on main. The source of truth is ESE3700_Proj2_Marhguy.tex.

Design Summary

Item Implemented design
Memory organization 16 rows x 4 columns; 64 b total
Process PTM 22 nm High-Performance CMOS
Supply VDD = 1.0 V
Interface A[3:0], Din[3:0], Dout[3:0], WE, single CLK
Bitcell 6T SRAM cell, CR = 2, PR = 1
Bitcell area metric 8 Wmin summed transistor width
Read architecture Precharge/equalize + bitline discharge + StrongARM sense amplifier
Write architecture Tri-state inverter write driver per column
Timing Replica bitline generates self-timed SAE
Clocking Two-phase non-overlapping internal clocks from one external CLK
Array choice No column mux; all four addressed bits are read/written in parallel

6T SRAM bitcell
6T bitcell (CR = 2, PR = 1) — full sizing context is in the PDF.

Key Results

All headline numbers below come from the LaTeX report and its cited SPICE evidence.

Metric Result
Sustainable max CLK frequency fmax (W/W/R/R sweep) 4.571 GHz (T_min = 218.75 ps = 0.21875 ns; find_fmax.py --json prints 4.571429 GHz before display rounding)
Equivalent frequency feq = 1 / (CLK -> Dout) (single-edge latency; not sustained CLK) 9.037 GHz (from f_eq_ghz in ngspice spice/top.spi Performance Metrics)
Top-level CLK to Dout (single read access) 110.65 ps (t_clk_to_dout ≈ 1.1065×10⁻¹⁰ s in the same block)
Frequency requirement 500 MHz
Sustainable frequency margin ~9.14×
Average top-level power (12 ns validation window, 500 MHz validation CLK) 21.367 µW (`P = VDD ×
Functional readback at 5 ns 0x5 PASS
Functional readback at 7 ns 0xA PASS
Bitcell write 1 -> 0 9.87 ps
Bitcell write 0 -> 1 21.8 ps
Read disturb maximum storage-node rise 95.4 mV
Final FOM (access-time delay term) ≈ 1.256×10⁻²² (60 × 8 × P × D² with P and D from the validation deck; see PDF §11)

find_fmax.py: sustained f_max ~4.57 GHz, T_min 0.21875 ns, steady verify PASS
find_fmax.py on shipped top.spi: sustainable f_max 4.571 GHz, 0.21875 ns minimum period, ~9.14× vs 500 MHz, steady verify (e.g. 8 W/W/R/R macros / 32 CLK cycles) PASS. Re-run the script and refresh the PNG for a matching terminal capture — media/terminal/fmax.png.

Two distinct frequency claims—keep them in separate mental buckets:

  • fmax (sustained)4.571 GHz at T_min = 218.75 ps comes from the cycle-stepped sweep in spice/find_fmax.py: binary search on CLK period with a W/W/R/R pattern each cycle, functional readback at 0.5 V, then optional steady verify (e.g. 8 macros / 32 CLK cycles in the saved transcript). Use python3 spice/find_fmax.py --json for sustained_fmax_ghz (e.g. 4.571429 on the shipped deck).
  • feq (latency-only)9.037 GHz is 1 / t_clk_to_dout from the .control block in spice/top.spi after tran at the 500 MHz validation CLK. It is not a claim that the macro runs continuously at 9 GHz; it is the inverse of the measured single-edge CLK→Dout delay (~110.65 ps) and feeds the FOM delay term.
  • Regression screening: spice/parallel_cell_mix.py can run many integer width-composed decks in parallel; on the current export, screened recipes reproduced the same ~4.57 GHz sustained closure, supporting that the limiter is a shared cycle envelope rather than a single cell tweak. Evidence: media/terminal/fmax.png (sustained f_max sweep + steady verify) and a fresh ngspice spice/top.spi run (Performance Metrics: t_clk_to_dout, iavg_vdd, pavg_mw, f_eq_ghz) or media/terminal/final-terminal-out.png (archived capture of the same deck).

To reproduce the sustained sweep with a nicer terminal harness (banner/spinner + JSON saved):

./scripts/run-find-fmax.sh

Architecture

The top level registers all inputs, decodes the 4-bit address into sixteen wordlines, activates four identical column slices, and uses a replica column to time the read decision.

Key architectural choices:

  • 16x4 organization, no column mux: avoids a pass-gate mux in the read path and keeps bitline capacitance low for this small array.
  • 6T bitcell: keeps the repeated area term low while meeting read stability and writeability targets with CR = 2, PR = 1.
  • StrongARM sensing: provides fast regenerative readout without static sense-amp current.
  • Replica timing: tracks real bitline discharge better than a fixed inverter-chain delay.
  • Two-phase clocking: separates precharge from active wordline/write/sense windows to reduce contention.


Top-level macro

Top-level 16x4 SRAM schematic
Electric export; PNG flattened on white.

Diagrams from the LaTeX report

Screenshots of PDF figures live under media/readme/ as figN.png (printed Figure N in ESE3700_Proj2_Marhguy.pdf). Figure 1 is already at the top of this page; the full TikZ / methodology figures are in the report—below are only a couple of extras worth scrolling on GitHub.

Decoder / SA / write paths do not add to the bitcell-area FOM term—only the repeated 6T width does (§2 in the PDF).

Highlights

Figure 38 — find_fmax.py sweep (fig:fmax_search)

Figure 38: find_fmax.py binary search flowchart

Figure 43 — FOM sensitivity (fig:fom_sensitivity_bars)

Figure 43: FOM sensitivity bar chart

Other README snapshots (same folder)

Fig File
2 — Report flow fig2.png
3 — FOM pipeline fig3.png
4 — Array organization fig4.png
39 — Read delay stack fig39.png
40 — Write delay stack fig40.png
42 — Energy split fig42.png

Figures

The PDF report contains the complete schematic set (column slice, precharge, sense amp, decoder, etc.). Top-level behavioral simulation:

Full SRAM validation waveform
Top-level validation: writes then reads 0x5 and 0xA.

Repository Layout

Path Description
ESE3700_Proj2_Marhguy.tex LaTeX source for the full report
ESE3700_Proj2_Marhguy.pdf Compiled report PDF, produced by CI after a successful run
media/ Figures, schematics, waveform PNGs, and terminal captures cited by the report
media/readme/ README diagrams: figN.png = PDF Figure N (screenshots of report figures)
spice/ SPICE netlists, Electric libraries, simulation helpers, and SVG waveform masters
spice/find_fmax.py Cycle-scaled maximum-frequency sweep driver
.github/workflows/ GitHub Actions workflow for building and committing the report PDF
scripts/ Optional local helpers for CI-like LaTeX builds

Build The Report Locally

Requirements: a modern TeX distribution with latexmk, or Docker/Podman for the containerized helper script.

Native build:

latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode ESE3700_Proj2_Marhguy.tex

Containerized build matching the GitHub Action:

./scripts/run-latex-ci-local.sh

The local helper uses the same TeX Live container family as the CI workflow.

Continuous Integration

The LaTeX to PDF workflow is configured to run on pushes to main or master when the LaTeX source, figures, or workflow change. It compiles ESE3700_Proj2_Marhguy.tex and commits only ESE3700_Proj2_Marhguy.pdf back to the repository with [skip ci] in the commit message.

The workflow also supports manual workflow_dispatch, which is useful for the first PDF build after the repository is pushed. Until the workflow has run at least once on GitHub, the badge at the top may show no status.

SPICE Notes

The SPICE decks are exported from Electric VLSI and use a PTM-style 22 nm HP model card. Some decks may contain local .include paths from the author's machine; update those paths to your local 22nm_HP.pm before running simulations elsewhere.

Important entry points:

  • spice/top.spi: top-level netlist and validation driver. The embedded .control block prints the headline t_clk_to_dout (single-edge access), iavg_vdd, pavg_mw, and f_eq_ghz = 1 / t_clk_to_dout used in the report.
  • spice/find_fmax.py: cycle-stepped fmax sweep driver. Binary-searches the CLK period under a 4-cycle write/write/read/read schedule against the live top.spi; on the current deck closure is T_min = 218.75 ps (fmax ≈ 4.571 GHz). Run with --json for metrics only on stdout.
  • spice/parallel_cell_mix.py: optional parallel driver for per-cell integer width scaling + find_fmax.py (CSV logs) for regression screening.
  • spice/sram_6t_cell.spi: repeated 6T memory bitcell.
  • spice/column_slice.spi: precharge, write driver, sense amp, and output latch integration.
  • spice/replica_column.spi: dummy-column timing path for self-timed SAE.

Academic Integrity

This work was completed in compliance with the University of Pennsylvania Code of Academic Integrity, as stated on the report title page. This repository is an archive of the author's own project materials and should not be treated as a substitute for any course submission process.

Citation And Reuse

If you reuse figures, netlists, or excerpts for coursework or research, cite or link this repository and the course context appropriately. The authoritative technical narrative, assumptions, measurement conditions, and conclusions are in the PDF report.

Suggested GitHub topics: sram, vlsi, spice, latex, cmos, memory, 22nm, ese3700, upenn.

Contact

Gmail Penn SEAS LinkedIn X Instagram Substack

About

Custom 16×4 (64-bit) 6T SRAM in PTM 22nm HP with SPICE-verified read/write timing, sense amp, precharge, write driver, and validation waveforms.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages