6.5.10 · D5Advanced & Emerging Architectures
Question bank — FPGA-based acceleration
True or false — justify
An FPGA runs your algorithm as a program the way a CPU does.
False. An FPGA becomes a circuit shaped like your algorithm; there is no instruction fetch/decode loop — data flows through fixed hardware, not through a reused ALU. See Dataflow architectures.
A higher clock frequency always means more real work done per second.
False. Throughput = (ops per cycle) × clock. A 250 MHz FPGA doing 1000 ops/cycle crushes a 4 GHz CPU doing ~10; frequency is only one factor.
Pipeline latency and pipeline throughput are the same measurement.
False. Latency is how long the first result takes ( cycles); throughput is the steady rate after fill (1 result/cycle). For large (many items) throughput dominates and latency is a one-time cost. See Pipelining and Throughput.
A -input LUT can implement any boolean function of its inputs.
True. A -input LUT stores output bits — a full truth table. Every boolean function of inputs is a truth table, so writing it in makes the LUT that gate. See Configurable Logic Blocks (LUTs & Flip-Flops).
An -stage pipeline gives exactly an speedup.
False. Speedup is , which only approaches as . For small (few items) the fill cost eats much of the gain.
Adding more compute units to an FPGA design always makes it faster.
False. If you are memory-bound (, performance capped by bandwidth × intensity), extra units sit idle waiting for data. You must raise arithmetic intensity (buffer in BRAM), not add compute. See Roofline Model & Arithmetic Intensity.
You can just recompile ordinary sequential C and get a fast FPGA design via HLS.
False. Naive C synthesizes to a slow state machine, often slower than the CPU. You must expose parallelism — unroll, pipeline, partition arrays — and think in dataflow. See High-Level Synthesis (HLS).
An FPGA is generally more power-efficient than a GPU for irregular streaming workloads.
True. For custom/irregular/low-latency streaming, FPGAs deliver the best performance/Watt; GPUs shine on regular dense SIMD math but burn more power. See GPU vs FPGA vs ASIC trade-offs.
An ASIC and an FPGA can both be reprogrammed after manufacturing.
False. Only the FPGA is field-programmable; an ASIC's logic is etched permanently. The FPGA trades some efficiency for that post-fab flexibility.
DSP slices are just a marketing name for a cluster of LUTs.
False. DSP slices are hardwired multiply-accumulate units. Building multipliers from LUTs is large and slow, so hardening them saves area, power, and boosts clock. See Domain-Specific Accelerators.
Spot the error
"My FIR filter uses multipliers so it must be faster than any CPU, period."
The is an upper bound on compute parallelism; real speedup is capped by input bandwidth — if you can't feed a new sample each cycle, the multipliers starve.
"Timing closure just means the design compiled without syntax errors."
No — timing closure checks that the longest combinational path clock period. A syntactically valid design that fails timing produces wrong data because values aren't stable at the clock edge.
"Place & Route is optional; synthesis already gave me a working netlist."
Synthesis only maps logic to primitives (LUTs, DSPs). Place & Route assigns physical locations and wires — and wire delay depends on distance, which sets the achievable clock. Skipping it means no real hardware.
"Roofline says , so I'm compute-bound whenever I have lots of FLOPs."
FLOP count doesn't decide it — the ratio does. With = performance, = compute roof, = bandwidth and = intensity, you're compute-bound only when ; a high-FLOP kernel with low intensity is still memory-bound. See Roofline Model & Arithmetic Intensity.
"I pipelined the design, so latency dropped."
Pipelining usually raises latency (more register stages) while raising throughput. You trade a longer first-result delay for one result every cycle. See Pipelining and Throughput.
"BRAM is just slower DRAM that happens to be on-chip."
BRAM is fast on-chip SRAM whose whole purpose is to avoid slow DRAM trips — it raises data reuse and keeps you compute-bound, the opposite of a slow memory.
"Speedup can exceed if I make huge."
It monotonically approaches from below and never exceeds it — the ratio caps at the stage count (the gap ).
Why questions
Why does a CPU waste effort that a spatial FPGA datapath avoids?
The CPU re-fetches and re-decodes instructions and reuses one ALU each cycle; the FPGA lays out one physical unit per operation, so there's no instruction overhead and many ops run every cycle.
Why do FPGAs run at ~100–500 MHz yet still beat GHz CPUs?
Their edge is width and depth (spatial parallelism + deep pipelines), not clock. Thousands of ops/cycle at a modest clock outproduce a few ops/cycle at a high clock.
Why does the pipeline speedup formula have in the denominator, not ?
The extra is the fill cost — the first result needs all stages before the steady one-per-cycle stream begins. It's a fixed overhead amortized over the items.
Why keep data in BRAM instead of streaming from DRAM every access?
To raise arithmetic intensity (ops per byte fetched) so you stay compute-bound; each cached value feeds many operations, avoiding repeated slow DRAM fetches.
Why does a shift register in the FIR example matter beyond just holding samples?
It gives data reuse — each input sample naturally feeds all taps over successive cycles, so you never re-fetch it from memory.
Why is the FPGA positioned "between GPU and ASIC"?
It offers near-ASIC efficiency but stays reprogrammable after fabrication, avoiding the ASIC's huge fixed NRE cost while beating the GPU's efficiency on custom streaming work.
Why can naive sequential C be slower on an FPGA than on a CPU?
HLS synthesizes it into a serial state machine with a low clock and no parallelism, so it loses the CPU's high clock without gaining the FPGA's parallelism.
Edge cases
What happens to pipeline speedup when (a single item)?
Speedup — no benefit at all. With one item you pay full fill cost and get nothing to amortize it over.
What is the throughput when the pipeline never fills because you feed one item every cycles?
You get no steady-state benefit — it degenerates to unpipelined behavior. Pipelines only win when the input stream is dense (a new item each cycle).
What if two combinational paths tie for slowest?
The clock period is still set by that shared maximum ; ties don't change closure — the longest path (however many share it) governs .
What does a -tap FIR () or empty dataflow graph mean here?
There's nothing to compute — no multipliers, no output. It's a degenerate design; the parallelism gain () collapses to zero because there's no work to spread.
What limits speedup when input bandwidth, not compute, is the wall?
Speedup saturates at (bandwidth / bytes-per-result), regardless of how many compute units you add — you're on the memory roof of the Roofline Model & Arithmetic Intensity, not the compute roof.
If a design uses 100% of LUTs but is memory-bound, is it "full"?
In resource terms yes, but it's underperforming — idle logic waiting on data. "Full of logic" and "fast" are unrelated when the bottleneck is bandwidth.