A synthesizable fixed-point Verilog accelerator for one-dimensional FIR filtering. The design uses 64-point FFT-based block convolution with the overlap-save method and was developed as a VLSI DSP course project.
The current architecture reuses one iterative radix-2 FFT/IFFT core and one pipelined complex multiplier across the transform and frequency-domain filtering phases. This favors area and implementation clarity over peak streaming throughput.
| Item | Value |
|---|---|
| FFT length | 64 points |
| FIR length | 16 taps |
| Valid outputs per block | 49 samples |
| Input / coefficient format | Signed Q1.15 |
| Internal datapath | Signed 32-bit fixed point |
| FFT architecture | Iterative radix-2, shared FFT/IFFT core |
| Complex multiplication | One shared two-cycle pipelined unit |
| Reference technology | TSMC 90 nm typical standard-cell library |
The checked-in test fixture contains two blocks (98 input and output samples). Cadence Xcelium simulation produced:
PASS: 98 output samples matched within tolerance 16.
The final Design Compiler reports for the shared-multiplier RTL show:
| Metric | Result |
|---|---|
| Clock constraint | 10.00 ns (100 MHz) |
| Critical-path slack | +2.42 ns |
| Total cell area | 368,306.270659 library area units |
| Standard-cell count | 54,030 |
| Estimated total power | 12.7989 mW |
| Steady-state block interval | 2,536 cycles |
| Throughput at 100 MHz | 1.93 MSamples/s |
These are synthesis-level results, not post-layout measurements. Power was estimated without annotated switching activity or extracted parasitics.
Each processing block contains 15 history samples and 49 new samples:
input stream
-> overlap-save block buffer
-> 64-point FFT
-> point-wise multiplication by precomputed FFT(h)
-> 64-point IFFT and 1/64 normalization
-> discard 15 overlap samples
-> 49-sample output block
The coefficient spectrum and test vectors are generated from a 16-tap moving-average FIR filter. rtl/coeff_rom64_values.vh is generated as a synthesizable constant ROM so the ASIC and FPGA synthesis flows do not depend on $readmemh support.
| Path | Contents |
|---|---|
rtl/ |
Synthesizable Verilog RTL and generated coefficient ROM values |
tb/ |
Self-checking Verilog testbench and simulation file list |
scripts/ |
Deterministic vector generator and Xcelium/Vivado launch helpers |
data/ |
Checked-in input, coefficient, and golden-output fixtures |
syn/ |
Synopsys Design Compiler and Vivado synthesis scripts |
reports/ |
Final Design Compiler area, timing, power, and QoR reports |
waveform/ |
GTKWave views and report-ready waveform screenshots |
docs/ |
Implementation notes and generated-artifact policy |
report.tex |
Public, student-ID-redacted final report source |
fft_based_convolution_proposal.tex |
Original project proposal source |
Requirements:
- Python 3.8 or later
- Icarus Verilog 11 or later (
iverilogandvvp)
Run the commands from the repository root:
mkdir -p build
python3 scripts/generate_vectors.py
iverilog -g2012 -o build/fft_block_conv_tb.vvp -f tb/filelist_tb.f
vvp build/fft_block_conv_tb.vvpOn Windows PowerShell, use python instead of python3 if necessary:
New-Item -ItemType Directory -Force build | Out-Null
python scripts/generate_vectors.py
iverilog -g2012 -o build/fft_block_conv_tb.vvp -f tb/filelist_tb.f
vvp build/fft_block_conv_tb.vvpThe testbench writes fft_block_conv_top.vcd. Open it with GTKWave and load either view in waveform/ if desired.
The laboratory EDA setup uses tcsh. From the repository root:
tcsh
source scripts/setup_eda.csh
tcsh scripts/run_xrun.cshFor a waveform-oriented run that opens SimVision when a graphical display is available:
tcsh scripts/run_xrun_gui.cshThe setup script expects the site-specific EDA environment at $HOME/eda; adjust it for another installation.
syn/dc_synthesis.tcl currently references the course laboratory's TSMC 90 nm library path. Change target_library if your installation differs, then run:
dc_shell -f syn/dc_synthesis.tclThe script recreates the generated netlist, SDC, and reports. The technology library is proprietary and is not included.
Vivado is used only as an RTL synthesizability and FPGA timing sanity check:
vivado -mode batch -source syn/vivado_synth.tclor:
powershell -ExecutionPolicy Bypass -File scripts/run_vivado_synth.ps1Vivado LUT/FF/DSP results are not comparable to the TSMC 90 nm standard-cell results. Existing local Vivado outputs predate the final shared-multiplier RTL, so they are intentionally excluded from version control and must be regenerated before use.
scripts/generate_vectors.pyis deterministic and should reproduce every checked-in file indata/plusrtl/coeff_rom64_values.vh.- Generated simulator databases, logs, wave dumps, synthesis work files, netlists, and checkpoints are excluded by
.gitignore. - The final Design Compiler text reports are retained as compact evidence for the results quoted above.
report.pdfis intentionally ignored because the existing local copy contains a student ID. Build a public PDF from the redactedreport.texbefore publishing it separately.- See
docs/artifacts.mdfor the complete tracked/generated-file policy.
- The FFT length and FIR length are fixed at 64 and 16 in the top-level implementation.
- The testbench covers one deterministic two-block fixture rather than randomized or assertion-based verification.
- The design uses no SRAM, ROM, or multiplier macros; arrays and arithmetic are mapped by the synthesis tool.
- ASIC power is a low-effort vectorless synthesis estimate.
- The included Design Compiler script depends on a site-specific commercial library and tool installation.
This project is released under the MIT License.
