Storage

NVMe Controller Architecture: Building High-Performance Storage

18 min read Storage

NVMe Controller Architecture: High-Performance Storage Interface

NVMe (Non-Volatile Memory Express) is a high-performance storage protocol designed specifically for flash storage over PCIe. Unlike legacy protocols (SATA, SAS), NVMe eliminates software overhead and enables massive parallelism, achieving millions of IOPS with microsecond latency.

NVMe Advantages

  • Low Latency: ~10 μs vs ~100 μs for SATA
  • High IOPS: 1M+ vs 100K for SATA
  • Parallelism: 64K queues × 64K entries each
  • Efficient: Only 13 commands vs 400+ for SCSI
  • Direct PCIe: No controller bottleneck

NVMe Architecture Overview

Queue-Based Model

NVMe Queue Architecture:

Host Memory:                     NVMe Controller:
┌───────────────────┐           ┌───────────────────┐
│ Submission Queue 1│──────────►│                   │
│ (64K entries max) │           │                   │
├───────────────────┤           │   NVMe Engine     │
│ Submission Queue 2│──────────►│                   │
│                   │           │  ┌─────────────┐  │
├───────────────────┤           │  │ Command     │  │
│       ...         │──────────►│  │ Processing  │  │
│                   │           │  └─────────────┘  │
├───────────────────┤           │         │        │
│ Submission Queue N│──────────►│         ▼        │
│ (up to 64K queues)│           │  ┌─────────────┐  │
└───────────────────┘           │  │ Flash/Media │  │
                                │  │ Backend     │  │
┌───────────────────┐           │  └─────────────┘  │
│ Completion Queue 1│◄──────────│         │        │
├───────────────────┤           │         ▼        │
│ Completion Queue 2│◄──────────│                   │
├───────────────────┤           │   Completions     │
│       ...         │◄──────────│                   │
├───────────────────┤           │                   │
│ Completion Queue N│◄──────────│                   │
└───────────────────┘           └───────────────────┘

Doorbell registers notify controller of new commands

Key Concepts

  • Submission Queue (SQ): Host posts commands here
  • Completion Queue (CQ): Controller posts completions here
  • Doorbell: Memory-mapped register to signal new commands
  • Namespace: Logical container for storage (like LUN)
  • Admin Queue: Queue pair 0 for management commands

NVMe Commands

Admin Commands

  • Identify: Get controller/namespace information
  • Create I/O Queue: Allocate SQ/CQ pairs
  • Delete I/O Queue: Remove queues
  • Get/Set Features: Configuration parameters
  • Firmware Activate/Download: Firmware update

I/O Commands

  • Read: Transfer data from namespace to host
  • Write: Transfer data from host to namespace
  • Flush: Commit volatile writes to non-volatile
  • Write Zeroes: Deallocate/zero logical blocks
  • Compare: Compare data with stored value

Command Structure

// NVMe Submission Queue Entry (64 bytes)
typedef struct {
    uint8_t  opcode;        // Command opcode
    uint8_t  flags;         // Fused operation, PRP/SGL
    uint16_t command_id;    // Unique ID for tracking
    uint32_t nsid;          // Namespace ID
    uint64_t reserved;
    uint64_t mptr;          // Metadata pointer
    uint64_t prp1;          // Data pointer 1 (PRP/SGL)
    uint64_t prp2;          // Data pointer 2
    uint32_t cdw10-15[6];   // Command-specific DWORDs
} nvme_cmd_t;

// NVMe Completion Queue Entry (16 bytes)
typedef struct {
    uint32_t dw0;           // Command-specific
    uint32_t reserved;
    uint16_t sq_head;       // SQ head pointer
    uint16_t sq_id;         // Submission queue ID
    uint16_t command_id;    // Matching command ID
    uint16_t status;        // Status and phase bit
} nvme_cpl_t;
      

NVMe Controller Implementation

Controller Block Diagram

NVMe Controller Block Diagram:

┌──────────────────────────────────────────────────────────┐
│                    PCIe Interface                         │
│              (Root Complex Connection)                    │
└────────────────────────┬─────────────────────────────────┘
                         │
┌────────────────────────▼─────────────────────────────────┐
│                   PCIe Core                               │
│    ┌─────────────┐  ┌─────────────┐  ┌─────────────┐    │
│    │ Config Space│  │   DMA       │  │   MSI-X     │    │
│    │   Regs      │  │  Engine     │  │  Interrupt  │    │
│    └─────────────┘  └─────────────┘  └─────────────┘    │
└────────────────────────┬─────────────────────────────────┘
                         │
┌────────────────────────▼─────────────────────────────────┐
│                    NVMe Core                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐   │
│  │   Doorbell   │  │   Command    │  │  Completion  │   │
│  │   Handler    │  │   Fetch      │  │   Post       │   │
│  └──────────────┘  └──────────────┘  └──────────────┘   │
│                                                          │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐   │
│  │   Admin      │  │   I/O        │  │  Namespace   │   │
│  │   Command    │  │   Command    │  │  Management  │   │
│  │   Handler    │  │   Handler    │  │              │   │
│  └──────────────┘  └──────────────┘  └──────────────┘   │
└────────────────────────┬─────────────────────────────────┘
                         │
                         ▼
              ┌─────────────────────┐
              │   Backend Interface │
              │  (Flash Controller) │
              └─────────────────────┘

Queue Management

  • Queue Arbitration: Round-robin, weighted round-robin, or urgent priority
  • Command Fetch: DMA read from host memory SQ
  • Completion Write: DMA write to host memory CQ
  • Interrupt Coalescing: Aggregate completions to reduce overhead

Data Path

  • PRP (Physical Region Page): Scattered host buffers
  • SGL (Scatter-Gather List): More flexible descriptor format
  • CMB (Controller Memory Buffer): Optional on-controller RAM

Performance Optimization

Multi-Queue Design

  • One SQ/CQ pair per CPU core
  • Eliminates lock contention
  • MSI-X interrupt per queue

Command Pipelining

Process multiple commands concurrently:

  1. Fetch next command while processing current
  2. Multiple flash operations in parallel
  3. Post completions while fetching new commands

Performance Metrics

Workload SATA SSD NVMe SSD
Random 4K Read IOPS ~90K ~1M+
Sequential Read ~550 MB/s ~7 GB/s
Latency (4K Read) ~100 μs ~10 μs

Advanced NVMe Features

NVMe over Fabrics (NVMe-oF)

Extend NVMe beyond local PCIe:

  • NVMe over RDMA (RoCE, iWARP)
  • NVMe over TCP
  • NVMe over Fibre Channel

Zoned Namespaces (ZNS)

Expose flash write constraints to host:

  • Sequential write requirement
  • Reduces write amplification
  • Better SSD endurance

Key-Value (KV) Commands

Native key-value storage interface:

  • Store/Retrieve by key
  • Eliminates file system overhead

Conclusion

NVMe has become the standard for high-performance storage, enabling SSDs to fully utilize flash capabilities without legacy protocol overhead. Controller design requires careful attention to queue management, DMA efficiency, and command pipelining to achieve maximum performance.

Vcores offers NVMe controller IP compliant with NVMe 2.0 specification, supporting PCIe Gen 5, multiple namespaces, and advanced features including CMB and interrupt coalescing. Our controllers are optimized for both client and enterprise SSD applications.

Tags: NVMe controller storage IP SSD architecture IOPS optimization enterprise storage

Need IP Cores for Your Design?

Vcores offers silicon-proven IP cores for ASIC and FPGA designs. Get high-quality, verified IP with comprehensive documentation and support.

Explore Products Contact Us