Every FPGA-timing question is one of these cells. The worked examples below each carry a tag [C#] telling you which cell they cover.
#
Case class
What is extreme about it
Example
C1
Large M (streaming limit)
M→∞, speedup →S
Ex 1
C2
Tiny M (M=1, single item)
Fill cost dominates, no speedup
Ex 2
C3
Degenerate pipeline (S=1)
Nothing to pipeline — sanity floor
Ex 3
C4
Balanced vs unbalanced stages
One slow stage sets T
Ex 4
C5
Compute-bound side of roofline
Ppeak<B⋅I
Ex 5
C6
Memory-bound side of roofline
B⋅I<Ppeak; more logic useless
Ex 6
C7
Real-world word problem
Choose device from latency budget
Ex 7
C8
Exam twist
Clock unit trap + efficiency →S
Ex 8
Related vault topics you should keep open while reading: Pipelining and Throughput, Roofline Model & Arithmetic Intensity, Configurable Logic Blocks (LUTs & Flip-Flops), GPU vs FPGA vs ASIC trade-offs, High-Level Synthesis (HLS), Dataflow architectures.
Look at the conveyor above: the first item (amber) must crawl across all S benches — that crawl is the fill. After it exits, cyan items follow one per tick. That single picture is why every case below behaves the way it does.
Compute pipelined cycles.cycles=S+(M−1)=8+99,999=100,007.
Why this step? The conveyor picture: the very first item needs all S=8 ticks to crawl the whole pipe (the fill), and the remaining M−1=99,999 items each add exactly one more tick as they pop out behind it. 8+99,999=100,007.
Compute speedup.S+M−1MS=100,007100,000×8=100,007800,000≈7.9994.
Why this step? Comparing to the serial CPU that spends M⋅S ticks.
Interpret. We are within 0.008% of the ceiling S=8.
Why this step? Confirms the limit S+M−1MS→S as M→∞.
Recall Verify
As M→∞, divide top and bottom by M: 1+(S−1)/MS→S. With M=100,000 and S=8, we sit at 7.9994 — essentially 8. Units: dimensionless (a ratio of times). ✓
Plug in.S+M−1MS=1+5000−15000×1=50005000=1.
Why this step? One stage means each item occupies the whole datapath alone — no room to overlap a second item.
Interpret the ceiling. The limit as M→∞ is S=1.
Why this step? You can never beat 1× if there is only one stage. The ceiling is the stage count.
Recall Verify
S=1⇒MM=1 for all M. The degenerate case correctly reports "no speedup". ✓
Find the bottleneck (a). The clock can tick no faster than the slowest bench: T=tmax=9 ns.
Why this step? Every stage shares one clock; if it ticked faster than 9 ns, the slow stage would not be finished when the tick arrives → wrong data (a timing-closure violation, see parent note).
Total time before the split (b).(S+M−1)T=(4+999)×9=1003×9=9027 ns.
Why this step? Direct use of the pipeline-time formula.
After splitting (c). Now S=6, T=3 ns: (6+999)×3=1005×3=3015 ns.
Why this step? Two more stages cost two extra fill ticks, but each tick is three times shorter — a huge net win.
Speedup from re-balancing.9027/3015≈2.994× faster.
Why this step? Confirms the intuition: the slowest stage was throttling everyone; slicing it lets the clock breathe.
Recall Verify
Before: 9027 ns. After: 3015 ns. Ratio ≈2.994. Units all in ns → ratio dimensionless. ✓
Compute the memory ceiling.B⋅I=20 GB/s×40 ops/byte=800 GOP/s.
Why this step? This is the fastest memory can feed you.
Take the min.min(500,800)=500 GOP/s.
Why this step? Memory could feed 800, but the silicon can only chew 500 — compute is the wall.
Verdict: compute-bound. Adding more BRAM caching won't help; you'd need more DSP slices / a deeper pipeline.
Why this step? You fix the binding constraint, never the slack one.
Recall Verify
B⋅I=800, Ppeak=500, min=500. Compute-bound because Ppeak<B⋅I. ✓
Ceiling (a).B⋅I=20×5=100 GOP/s; min(500,100)=100. Memory-bound.Why this step? Memory only feeds 100; the 500 of compute mostly sits idle.
Double the compute (b).min(1000,100)=100 GOP/s — unchanged.
Why this step? You widened the slack side; the bottleneck (memory) never moved. This is the "more logic used ≠ faster" mistake from the parent note.
Raise intensity via BRAM (c). New B⋅I=20×30=600; min(500,600)=500 GOP/s.
Why this step? Reusing cached data means fewer DRAM trips per op → higher I → you slide up the diagonal onto the compute roof. 5× faster.
Recall Verify
(a) min(500,100)=100. (b) min(1000,100)=100 (no change). (c) min(500,600)=500; 500/100=5×. ✓
FPGA latency (a). First result after S ticks: 20×5 ns=100 ns=0.1μs.
Why this step? Latency = pipeline fill = ST. Compare to the 10μs budget → passes with vast margin.
FPGA throughput (b). After the pipe is full it emits one sample per tick, so a frame of N=1000 samples takes NT=1000×5 ns=5μs≤8μs. ✓
Why this step? Throughput is the sustained rate; multiplying the frame size N (given in the problem) by the tick T gives the per-frame time, and 5μs<8μs meets the deadline.
GPU check (c). Throughput 6μs≤8μs ✓ but latency 50μs>10μs ✗.
Why this step? The GPU batches to get throughput, blowing the latency budget. Reject it.
Decision. The FPGA meets both; the GPU fails latency. Choose the FPGA — the classic low-latency streaming win.
Recall Verify
FPGA latency =100 ns≤10,000 ns ✓; frame time 5μs≤8μs ✓; GPU latency 50μs>10μs ✗. FPGA is the only device passing both. ✓
Convert the clock (the trap).T=200×106Hz1=5×10−9 s=5 ns.
Why this step? MHz is millions of ticks per second; forgetting to invert gives nonsense. Always turn frequency into a period before plugging into a time formula.
Pipeline time (a).(S+M−1)T=(12+9999)×5 ns=10,011×5 ns=50,055 ns≈50.06μs.
Why this step? Straight into the pipeline-time formula with the correct T: 11 fill ticks plus M−1=9999 pops, all ×5 ns.
CPU time (b).M×S×1 ns=10,000×12×1 ns=120,000 ns=120μs.
Why this step? The serial machine has no overlap: every one of the M=10,000 items costs its full S=12 operations, each 1 ns, so total =M⋅S⋅1 ns.
Efficiency (c).pipeline timeCPU time=50,055120,000≈2.40? No — efficiency here means the speedupS+M−1MS=10,011120,000≈11.99.
Why this step? Efficiency is the honest speedup ratio S+M−1MS (same total work MS over the pipe's actual S+M−1 ticks). At 11.99 we sit at 99.9% of the ceiling S=12, because the 11-tick fill cost is negligible against 10,000 streamed items — this is exactly the M→∞ limit approaching S.
Recall Verify
T=5 ns; pipe =50,055 ns; CPU =120,000 ns; efficiency =120,000/10,011≈11.99≈S=12. Matches the parent note's numbers. ✓