FPGA

FPGA SRL (shift-register LUT)

By CourseTron Team ·  4 min read ·  Updated Oct 2026 💬 𝕏 in f
Table of Contents
    ? Print / Save as PDF

    In short: An FPGA SRL (shift-register LUT) reuses a single LUT's internal 16- or 32-bit configuration memory as a dynamically-addressable shift register, giving you a dense delay line or FIFO in one logic cell instead of 16–32 flip-flops plus routing.

    If you have ever built a pipeline delay, a small FIFO, or a programmable tap in an FPGA and watched your flip-flop count explode, the SRL primitive is the trick you were missing. It is one of the highest-leverage area optimizations in mainstream FPGA fabric, and interviewers love it because it tests whether you actually understand what a LUT is.

    What a LUT really stores

    A 6-input look-up table in a modern AMD/Xilinx or Intel/Altera device is physically a small SRAM: 64 configuration bits feeding a 64:1 multiplexer. Normally those bits are frozen at configuration time to implement a boolean function. The key insight behind the SRL is that the same storage can instead be clocked: each cycle the contents shift by one position and a new bit enters, turning combinational memory into sequential storage. In the classic 6-LUT, the cell splits into two 5-LUTs, so one LUT delivers a 32-deep shift register (SRL32), while older/narrower configurations give SRL16.

    Crucially, the output tap is addressable. A set of address inputs (A[3:0] for SRL16, A[4:0] for SRL32) selects which internal bit appears at the output Q, so you get a variable-length delay without rebuilding logic.

    One 6-LUT configured as SRL32 (32 x 1-bit)clk: every edge shifts all cells one place rightd0d1d2d30d31· · ·D in32:1 muxA[4:0] picks the tapQ (delay 1-32)CourseTron · coursetron.com
    A single 6-LUT becomes a 32-deep, 1-bit-wide shift register; address lines pick the output tap.

    Why it saves so much

    Consider a 32-stage delay line, 1 bit wide. Built from fabric flip-flops it needs 32 FFs, 32 routing hops, and the carry of 32 clock loads. As an SRL32 it is one LUT: the shift happens inside the cell, so the fabric interconnect sees only one input and one output. The density gain is roughly 16–32x in both logic cells and the routing resource that usually bottlenecks timing closure.

    A 256-deep x 8-bit delay = 2,048 flip-flops in fabric, but only 8 SRL32 primitives chained 8 deep (8 LUTs x 8 bits = 64 LUTs) — a dramatic area and power win, and it frees the real flip-flops for pipelining logic that needs them.

    256-deep x 8-bit delay: 8 bit-lanes of 8 chained SRL328 LUTs x 32 = 256 stages per lanebit 0SRL32SRL32SRL32SRL32SRL32SRL32SRL32SRL32bit 1SRL32SRL32SRL32SRL32SRL32SRL32SRL32SRL32· · ·bit 7SRL32SRL32SRL32SRL32SRL32SRL32SRL32SRL32Fabric FFs: 256 x 8 = 2,048SRL32: 8 x 8 = 64 LUTsCourseTron · coursetron.com
    Worked example from the key fact: each of 8 bit-lanes chains 8 SRL32 LUTs for 256 stages, totalling 64 LUTs versus 2,048 flip-flops.

    SRL16 vs SRL32 vs block RAM

    ResourceDepthBest forCost
    SRL1616short delays, small FIFOs0.5 LUT
    SRL3232medium delays, taps1 LUT
    Fabric FF chainanyneeds reset/enable per stage1 FF/bit
    Block RAM / FIFO512+deep buffers, two ports1 BRAM

    The decision tree is practical: under ~32 deep, use an SRL; hundreds deep, move to block RAM. This is the same memory-sizing judgement covered in our deep dive on block RAM vs distributed RAM, and it pairs naturally with how you plan FIFO depth for clock-domain crossings.

    The catch: an SRL has no per-stage reset. Its internal cells cannot be cleared by a fabric reset, only flushed by shifting known data through. If your design demands a synchronous clear on every tap, SRLs are the wrong primitive — use flip-flops.

    How you actually infer one

    You rarely instantiate SRLs by hand. Both AMD Vivado and Intel Quartus inference engines detect the pattern automatically, and so do third-party synthesis flows such as Synopsys Synplify. The rule is simple: write a shift register with no reset on the shift chain and no intermediate taps that need clearing.

    • A clean always @(posedge clk) shreg <= {shreg[N-2:0], din}; infers an SRL.
    • Adding if (rst) shreg <= 0; forces flip-flops instead — the single most common reason an expected SRL "disappears."
    • Reading an intermediate bit (shreg[5]) forces a tap; the tool keeps the chain as SRL only up to that tap, then splits.

    Animated: a bit marching through the delay

    A bit marching through the delay: one cell per clock edged0d1d2d3d4d5D inQclkCourseTron · coursetron.com
    No reset line exists on the chain — the only way to "clear" the register is to shift fresh data all the way through.

    Where engineers use SRLs in real designs

    • Pipeline balancing: aligning a data path with a control path that took N extra cycles of arithmetic.
    • Fractional / programmable delay: the addressable tap lets you tune latency at runtime — essential in SERDES alignment and DSP skew matching.
    • Compact FIFOs: an SRL plus a small counter makes an efficient shallow FIFO without touching a block RAM.
    • LFSR and pattern generators: dense storage for test and scrambler logic.

    For teams building production RTL and closing timing on these structures, hands-on mentorship matters — our partner Avecas VLSI design services uses exactly these area-recovery techniques on customer tapeouts.

    Want to master FPGA memory primitives, inference rules, and timing closure the way interviewers test them? Explore the hands-on FPGA track on our CourseTron courses page.

    FAQ

    Can an SRL be reset?

    No — the shift chain has no clear input. You flush it by shifting known values through, which takes as many clocks as the register is deep. Needing a synchronous reset per stage is the main reason to choose flip-flops instead.

    How do I force the tool to use an SRL?

    Write a plain shift register with no reset and no mid-chain tap that needs clearing. In Vivado you can also use the SRL_STYLE attribute (e.g. "srl", "reg_srl_reg") to override the inference heuristic.

    Is SRL32 always better than SRL16?

    Not necessarily. SRL32 uses a whole 6-LUT; two independent SRL16s can pack into the same cell. If your delays are short, SRL16 can be the denser choice.

    When should I switch to block RAM?

    Roughly past 32–64 deep per LUT, chaining SRLs costs more LUTs than one block RAM, and BRAM gives you true dual-port access. See our block RAM vs distributed RAM comparison.

    Advertisement