4. Run a whole group; metrics go to build/results/.json

July 8, 2026 ยท View on GitHub

LogikBench

License Python Version PyPI Lint Downloads

Why LogikBench

LogikBench is a curated open source RTL benchmark suite that enables reproducible evaluation of EDA tools, process technologies, architectures, and LLMs.

"Sunlight is said to be the best of disinfectants." --Supreme Court Justice Louis Brandeis

ChallengeLogikBench Solution
No "Spec CPU for RTL"220 standardized RTL benchmark circuits
Circuit diversityBroad mix of circuit types, sizes, and source origins
Size diversityPer-circuit parameterization across multiple scales
TrustDocumented source code provenance and curation criteria
ReproducibilityFully automated, push-button benchmark flows
PortabilityTechnology-agnostic RTL and lambdalib-based benchmarks
LicensingClear, permissive licensing for all included sources
QualitySelf-checking testbenches and conservative curation

LogikBench includes the following benchmark types:

Benchmark typeGroups (-g)
Micro-benchmarksbasic, arithmetic
Legacy synthetic benchmarksepfl, isca85, isca89
Very large and real circuitsblocks

๐Ÿ† Results dashboard


Quick Start

# 1. Install LogikBench (pure Python, from PyPI)
pip install logikbench

# 2. Install the EDA tools it drives (Yosys + FPGA synthesis plugins)
sc-install -group fpga

# 3. Synthesize your first benchmark on an FPGA target
lb run -n mux -t xilinx_virtex7

# 4. Run a whole group; metrics go to build/results/<target>.json
lb run -g basic -t xilinx_virtex7
lb run -g basic -t sc_asap7

# 5. Compare a metric across the two runs (writes a CSV)
lb compare -m luts build/results/xilinx_virtex7.json build/results/lattice_ice40.json

lb -h, lb run -h, and lb compare -h list every option. Picking a benchmark is optional: with neither -g nor -n, lb run sweeps all groups. For ASIC area/FMAX metrics, install sc-install -group asic and use an ASIC target such as yosys_freepdk45. See Tool Installation for the full tool prerequisites.


Benchmark Architecture

Each LogikBench benchmark circuit consists of:

  • Tech-agnostic RTL Verilog files for broad tool compatibility
  • SiliconCompiler Design object with metadata and configuration

The SiliconCompiler Design object captures benchmark data as files, parameters, topmodule name, and other settings grouped as a fileset. Every circuit in the LogikBench suite has a Python class that inherits from SiliconCompiler's Design class, as shown in this mux example:

from os.path import dirname, abspath
from siliconcompiler import Design

class Mux(Design):
    def __init__(self):
        name = 'mux'
        fileset = 'rtl'
        rootname = f'{name}_root'
        super().__init__(name)
        self.set_dataroot(rootname, dirname(abspath(__file__)))
        self.add_file(f'rtl/{name}.v', fileset, dataroot=rootname)
        self.set_topmodule(name, fileset)

To use a benchmark circuit, simply instantiate its class. You then have access to all methods inherited from SiliconCompiler. The example below shows how to instantiate the Mux circuit and write out its RTL settings in a standard filelist format that can be read directly by tools like Icarus Verilog, Verilator, and slang.

import logikbench as lb
d = lb.basic.Mux()
d.write_fileset('mux.f', fileset='rtl')

AI Provenance (ai.json)

Some LogikBench blocks are AI-generated (RTL authored with the help of a large language model under human direction). Any such block carries an ai.json file in its directory (e.g. ai.json) that records its provenance so the origin of the design is transparent and auditable. Blocks that are hand-written or vendored/imported from an external source do not carry an ai.json.

The file captures who authored the block, which model generated it and when, that a human reviewed it, and whether the RTL is an original implementation or derived from an external source:

{
  "schema_version": "1.0",
  "name": "lz77",
  "spec_ref": "README.md",
  "authorship": "Zero ASIC Corporation; author Andreas Olofsson",
  "generated_by": {
    "model": "claude-opus-4-8",
    "provider": "Anthropic",
    "interface": "Claude Code",
    "date": "2026-06-25"
  },
  "human_review": {
    "reviewed": true,
    "reviewer": "Andreas Olofsson",
    "date": "2026-06-25",
    "notes": "Architecture, scope, and verification were directed and reviewed by the author."
  },
  "origin": {
    "type": "original",
    "notes": "Original implementation written for LogikBench; follows the cited algorithm/standard and hardware architectures, not copied from any specific HDL source."
  }
}
FieldMeaning
spec_refThe block's specification (its README.md)
authorshipThe party accountable for the block
generated_byThe model / provider / interface and date of generation
human_reviewWhether a human reviewed it, by whom, and their notes
originoriginal (written for LogikBench) or a derived/vendored source

Benchmark Metrics

FPGA runs report three metrics, all extracted from the Yosys synthesis run (no place-and-route): LUTs, logic depth, and runtime.

ASIC runs report three metrics, Cell Area, FMAX, and runtime. Cell Area comes from the Yosys synthesis run; FMAX is computed by an OpenSTA timing run on the synthesized netlist. Neither involves place-and-route.

FPGA LUTs

NOTE that it is impossible to do a truly fair synthesis comparison between different FPGA architectures because it's an apples to oranges comparison. The approach below is our attempt at normalization. File an issue if you disagree with it.

The LUT count is the synthesized logic-fabric usage, read from Yosys' stat per-cell-type report (num_cells_by_type). Note that ideally, each target should have a custom post processing function blessed by the vendor to fairly extract their metrics. LUTs include three kinds of cell:

  1. Lookup tables โ€” the basic LUT primitives, whose names vary by vendor: LUT1..LUT6, $lut, SB_LUT4 (ice40), EFX_LUT4 (efinix), CC_LUT* (gatemate), LUTFF (fabulous), and CFG1..CFG4 (microchip PolarFire).

  2. Dedicated mux-fabric cells โ€” the hardwired wide multiplexers that live in the same logic block as the LUTs and implement muxing a LUT-only fabric would otherwise spend LUTs on: MUXF7/MUXF8 (xilinx), mux4x0/mux8x0 (quicklogic), MUX2_LUT5..8 (gowin), LUTMUX7/8 (adi), L6MUX21/PFUMX (lattice ECP5), CC_MX4/CC_MX8 (gatemate), MX4 (microchip).

  3. Hard DSP / multiply / MAC blocks โ€” dedicated multiplier and multiply-accumulate cells: DSP48E1 (xilinx), MULT18X18D (lattice ECP5), CC_MULT (gatemate), MACC_PA (microchip), RBBDSP (adi), efpga_mult* (Zero ASIC). A fabric without them builds multipliers out of LUTs, so a target that uses a hard block would otherwise read as artificially LUT-light. (Carry/ALU cells such as CARRY4, ALU, CCU2C, ARI1 are not DSPs and are not counted.)

Including mux cells keeps the comparison fair: ice40 has no dedicated mux, so its read/select logic is built entirely from LUTs and is fully counted; fabrics like QuickLogic or GateMate offload that same logic to mux cells, which would otherwise make their LUT count read artificially low (e.g. regfile on QuickLogic is mostly mux8x0 cells, not LUTs).

Every fabric cell counts as one, regardless of its capacity: a 6-input LUT (Xilinx, ADI) packs more logic than a 4-input LUT, and a hard mux (e.g. QuickLogic mux8x0) does an 8:1 select that a LUT-only fabric would spend several LUTs on โ€” but each is one cell. This makes the metric a clean logic-cell utilization count, most directly comparable within an architecture family (e.g. the Zero ASIC z10xx parts, or two synthesis options on one target). Across vendors the cells differ in size, so cross-vendor LUT counts are informative rather than a strict apples-to-apples ranking โ€” each architecture wins where its cell type fits the design (mux fabrics on mux/select/decode logic, LUT/carry fabrics on arithmetic).

FPGA Logic depth

Logic depth is the longest combinational path through the mapped netlist, measured by Yosys' ltp -noff (longest topological path, flip-flops excluded). It is the count of cells on that path, reported uniformly across all targets; the per-vendor ABC mapping reports are inconsistent (some flows print nothing), so ltp gives one comparable number. ltp only spans a single module, but the vendor synth_* flows flatten by default, so it covers the whole design.

Because it counts cells, the path includes carry-chain and mux cells, not just LUT levels โ€” so depth, like LUTs, reflects each architecture's primitives.

ASIC Cell Area

Cell Area is the total standard-cell area of the synthesized (mapped) netlist, read from the same Yosys stat report as the FPGA cell counts. It is the sum of the areas of every instantiated standard cell, in the area units of the target's liberty (um^2 for the Nangate45 library used by freepdk45). Yosys also reports the raw cell count alongside the area.

This is a pre-layout synthesis-area figure: it reflects the logic mapped to the standard-cell library but not place-and-route effects (buffering, sizing, or filler), so it tracks logic complexity rather than final silicon area. As with the FPGA LUT count, it is most directly comparable within one PDK/library.

ASIC FMAX

FMAX is the maximum operating frequency, computed by an OpenSTA timing run on the synthesized netlist (logikbench/tools/opensta/scripts/timing.tcl). For each clock STA finds the minimum achievable period (find_clk_min_period), and FMAX is 1 / min_period, reported in MHz.

The benchmarks ship no constraints, so a generic SDC (generated by logikbench/sdc.py) attaches a clock to a port named clk when present, or a virtual clock for purely combinational designs (so input-to-output paths are still constrained). The period defaults to 1 ns and is set with lb run --clk <ns>; it is given in nanoseconds and scaled into each PDK's SDC time unit (create_clock -period is read in the unit OpenROAD derives from the liberty -- 1 ns for most PDKs, 1 ps for ASAP7 -- so the same --clk is the same real frequency on every target). For the yosys_<pdk>/tardigrade_<pdk> lbflow path the period is only a starting reference (FMAX is the minimum achievable period); for the sc_<pdk> asicflow path it is the real optimization target that place-and-route works to.

Runtime

Runtime is the wall-clock time of the synthesis step, reported to 0.01 s.


Running Benchmarks

LogikBench includes the lb command-line tool for batch processing benchmarks. It drives synthesis through SiliconCompiler: each benchmark is a SiliconCompiler Design, and lb has two subcommands:

  • lb run synthesizes the selected benchmarks for one or more targets and writes a per-target metrics file <-o>/<target>.json (default -o: build/results; printing its path). The write is incremental (read-modify-write), so running a subset updates only those benchmarks and preserves the rest. To publish into the committed results tree, run with -o results. lb run takes the required -t/--target plus an optional benchmark selector (-g/--group or -n/--name; default: all groups).
  • lb compare -m METRIC FILE... tabulates one metric across two or more metrics files and writes a CSV: rows are benchmarks, one column per file (labeled by its target), values are that metric (no deltas). The files are the <target>.json written by run, so you can tabulate any set: several build results, several published results, or build vs results.

Run lb run -h or lb compare -h for the full option list.

FPGA Targets

-t/--target selects what runs and is required; pass several to sweep them in turn. FPGA targets are named <vendor>_<partname> and map to a Yosys synth command:

TargetSynth command
xilinx_virtex7synth_xilinx -family xc7
quicklogic_polarprosynth_quicklogic -family pp3
microchip_polarfiresynth_microchip -family polarfire
lattice_ice40synth_ice40
lattice_ecp5synth_lattice -family ecp5
gowin_gw5asynth_gowin -family gw5a
achronix_speedstersynth_achronix
adi_flex16ffcsynth_analogdevices -tech t16ffc
efinix_trionsynth_efinix
fabulous_genericsynth_fabulous
gatemate_colognesynth_gatemate
zeroasic_z1015synth_fpga -config <arch> (wildebeest)
zeroasic_z1060synth_fpga -config <arch> (wildebeest)

The zeroasic_* targets load the Wildebeest plugin and run synth_fpga -config <arch>, where <arch> is the per-part architecture config vendored under logikbench/targets/zeroasic/.

ASIC Targets

ASIC targets follow the same <tool>_<part> scheme as FPGA targets (<vendor>_<partname>): the tool comes first, the PDK second. Three flavors -- yosys_<pdk> and tardigrade_<pdk> run the lightweight lbflow path (synthesis

  • OpenSTA timing, no place-and-route), and sc_<pdk> runs the full SiliconCompiler asicflow:
TargetPDK / libraryFlow
yosys_freepdk45FreePDK45 / Nangate45 (lambdapdk)lbflow: Yosys synthesis + OpenSTA timing (no place-and-route)
tardigrade_freepdk45FreePDK45lbflow with tardigrade as the synthesis mapper
sc_freepdk45FreePDK45SiliconCompiler asicflow (synth -> floorplan -> place -> cts -> route)
sc_asap7ASAP7 7nmSiliconCompiler asicflow
sc_skywater130SkyWater 130SiliconCompiler asicflow
sc_gf180GlobalFoundries 180SiliconCompiler asicflow
sc_ihp130IHP SG13G2 130SiliconCompiler asicflow

The yosys_<pdk> / tardigrade_<pdk> targets run the lightweight lbflow path used for the QoR metrics above: the mapper maps to the standard-cell library and OpenSTA reports FMAX, with no place-and-route. The sc_<pdk> targets run the full official SiliconCompiler asicflow (through routing) and are trimmed to a single library and a single setup corner so each benchmark stays fast; use --to synthesis to stop after synthesis. (yosys_<pdk>/tardigrade_<pdk> cover the lambdapdk std-cell PDKs; sc_<pdk> additionally offers sc_interposer.)

ASIC Timing Constraints (SDC)

Every ASIC run is timing-constrained automatically. You do not need to write an SDC per benchmark: the flow generates a small wrapper that injects --clk and the per-PDK knobs, then sources the shared default constraints in logikbench/targets/default.sdc. Applied to every benchmark, it:

  • creates one clock per port whose name matches *clk*/*clock* (so multi-clock designs such as ethmac, with rx_clk/tx_clk, are fully constrained), all at the --clk period;
  • creates a single virtual clock for purely combinational benchmarks (no clock port), so their input-to-output paths are still timed;
  • constrains all data inputs and outputs with input/output delays at 50% of the clock period, and applies per-PDK input transition (slew), load capacitance, and setup/hold clock uncertainty read from logikbench/targets/<pdk>/tech.tcl.

The only number you normally set is --clk (the clock period in nanoseconds, the same value for every PDK; it is scaled into each PDK's native time unit):

lb run -g basic -t yosys_freepdk45 --clk 2   # constrain every basic benchmark at 2 ns

Customizing a single benchmark. When a benchmark needs constraints the defaults cannot express (e.g. a specific clock name, a subset of ports, a false path), ship an SDC in the block directory and register it in the benchmark's .py. Because default.sdc guardbands its defaults, a custom SDC only sets what it wants to override, then sources the shared file:

# logikbench/<group>/<name>/sdc/<name>.sdc
set LB_CLK     [get_ports my_clock]     ;# override clock detection
set LB_INPUTS  [all_inputs]             ;# or a hand-picked subset
set LB_OUTPUTS [all_outputs]
source $LB_DEFAULT_SDC                  ;# tech.tcl + generic constraints

Register it in the benchmark class (alongside the rtl fileset):

self.add_file(f'sdc/{name}.sdc', 'sdc', dataroot=root)

The wrapper then sources your SDC instead of default.sdc directly. Any of LB_CLK, LB_INPUTS, LB_OUTPUTS you leave unset fall back to the guardbanded defaults; LB_CLK_NS (from --clk) and LB_TECH_FILE/LB_DEFAULT_SDC (paths) are always injected for you.

Options

lb run:

FlagDescription
-t, --targetSynthesis target(s) to sweep (required); see the Targets table above
-g, --groupBenchmark group(s): basic, memory, arithmetic, epfl, blocks, iscas85, iscas89 (default: all groups; mutually exclusive with -n)
-n, --nameAct only on benchmark(s) with these name(s), searched across all groups (names are globally unique; mutually exclusive with -g)
-bBuild directory root; per-benchmark work goes in <builddir>/<target>/<name> (default: build)
-o, --outputDirectory for the per-target metrics file <DIR>/<target>.json (default: build/results; use -o results to publish into the committed results tree)
-jNumber of benchmarks to synthesize in parallel across the target x benchmark matrix (default: 1)
--optionsExtra args passed verbatim to the FPGA synth command. Use the = form so leading dashes are not parsed as flags: --options=-abc9 (quote multiple: --options='-abc9 -nocarry')
--clkASIC clock period in nanoseconds for the generic SDC, scaled into each PDK's time unit; ignored for FPGA targets (default: 1.0)
--fromFirst flow step to run: synthesis, floorplan, place, cts, route (default: from the start)
--toLast flow step to run (same choices; default: to the end)
--resumeSkip benchmarks whose build already completed successfully; only synthesize the rest
--timeoutPer-step wall-clock cap in seconds; a step that exceeds it is killed and marked failed (default: 3600; 0 disables)
-v, --verboseShow full SiliconCompiler tool/scheduler logs (quieted by default)

lb compare -m METRIC FILE...:

FlagDescription
FILE...two or more <target>.json metrics files to tabulate (as written by lb run, e.g. from build/results/ or results/)
-m, --metricmetric to tabulate, one column per file (e.g. luts, logicdepth, cellarea, fmax, cells, tasktime)
-o, --outputOutput file; format chosen by extension (.json -> JSON {metric, targets, data}, else CSV). Default ./compare_<metric>.csv

lb run wipes each benchmark's build directory before synthesizing, so runs are always fresh (no SiliconCompiler build reuse); use --resume to skip completed benchmarks. After building, lb run writes <-o>/<target>.json (default build/results/<target>.json) incrementally (read-modify-write), so a subset run updates only those benchmarks and preserves the rest.


Examples

Synthesize a group (metrics -> build/results/<target>.json):

lb run -g arithmetic -t xilinx_virtex7

Synthesize a single benchmark for a Zero ASIC part (needs the wildebeest plugin):

lb run -n mux -t zeroasic_z1015

Sweep several FPGA targets at once, 8 benchmarks in parallel:

lb run -g basic -t xilinx_virtex7 lattice_ice40 gowin_gw5a -j 8

Tabulate a metric across the published results (no build needed):

lb compare -m cellarea results/yosys_asap7.json \
                       results/yosys_skywater130.json \
                       results/yosys_freepdk45.json

Build two FPGA targets, then compare their LUT counts:

lb run -g arithmetic -t xilinx_virtex7 lattice_ice40 -j 8
lb compare -m luts build/results/xilinx_virtex7.json \
                   build/results/lattice_ice40.json

Run ASIC synthesis + timing (lbflow) on the freepdk45 PDK:

lb run -g basic -t yosys_freepdk45

Run the asap7 SC asicflow target, synthesis only:

lb run -g basic -t sc_asap7 --to synthesis

Benchmark Inventory

Basic Logic (26 benchmarks)

BenchmarkDescriptionSourceAI
arbiterFixed-priority arbiterarbiter.v
bandAND reductionband.v
bin2grayBinary to Gray code converterbin2gray.v
bin2prioBinary to priority encoderbin2prio.v
binvBitwise inverterbinv.v
bnandNAND reductionbnand.v
bnorNOR reductionbnor.v
borOR reductionbor.v
bxnorXNOR reductionbxnor.v
bxorXOR reduction (parity)bxor.v
crossbarCrossbar switchcrossbar.v
dffasyncAsynchronous reset flip-flopdffasync.v
dffsyncSynchronous reset flip-flopdffsync.v
fsmParametrized FSM with pseudo-random transitionsreadmeY
gray2binGray to binary code convertergray2bin.v
icgGated-clock registericg.v
latchTransparent D latchlatch.v
muxMultiplexermux.v
muxcaseCase-based multiplexermuxcase.v
muxhotOne-hot multiplexerreadme
muxpriPriority multiplexermuxpri.v
onehotOne-hot encoderonehot.v
pipelinePipeline registerpipeline.v
shiftregShift registershiftreg.v
tffToggle flip-floptff.v
tmrTriple-modular-redundancy votertmr.v

Arithmetic (71 benchmarks)

BenchmarkDescriptionSourceAI
absAbsolute valueabs.v
absdiffAbsolute differenceabsdiff.v
absdiffsSigned absolute differenceabsdiffs.v
addAdderreadme
addmodWide modular adder (a+b) mod mreadme
addsubAdder-subtractoraddsub.v
addtreeBalanced adder-reduction treereadme
argmaxIndex of max over Nargmax.v
argminIndex of min over Nargmin.v
atanArctangent (CORDIC vectoring)readmeY
avgnAverage over N (avg pool)avgn.v
clampSaturate/clip to [lo,hi]clamp.v
clzCount leading zerosclz.v
cmpComparatorcmp.v
cosCosine (CORDIC rotation)readmeY
counterCountercounter.v
csa323:2 carry-save addercsa32.v
csa424:2 carry-save addercsa42.v
ctzCount trailing zerosctz.v
decDecrementerdec.v
divUnsigned integer divide (sequential)readmeY
divsSigned integer divide (sequential)readmeY
dotprodDot productreadme
expExponential (range-reduce + poly)readmeY
fmadd8Fused multiply-add, E4M3 fp8readme
fmadd16Fused multiply-add, bf16readme
fmadd32Fused multiply-add, fp32readme
geluGELU activation (sigmoid approx)readmeY
hswishHard-swish activationreadmeY
incIncrementerinc.v
lnNatural logarithm (normalize + poly)readmeY
log2Log base 2log2.v
lreluLeaky ReLU activationreadmeY
macMultiply-accumulatemac.v
maccComplex multiply-accumulatemacc.v
macsSigned multiply-accumulatemacs.v
maxMaximummax.v
maxnMax over N (max pool)maxn.v
minMinimummin.v
modUnsigned modulo (sequential)readmeY
msubMultiply-subtractmsub.v
mulMultiplierreadme
muladdMultiply-addreadme
muladdcComplex multiply-addmuladdc.v
muladdsSigned multiply-addmuladds.v
mulcComplex multiplymulc.v
mulregRegistered multiplierreadme
mulsSigned multiplierreadme
mulsuSigned x unsigned multipliermulsu.v
multconstConstant-coefficient multipliermultconst.v
popcountPopulation count (set bits)popcount.v
premulPre-adder multiply (a+d)*bpremul.v
recipFixed-point reciprocal 1/x (sequential)readmeY
reluReLU activation functionrelu.v
requantRequantize (mul-shift-round-saturate)readmeY
rotlRotate left (barrel)rotl.v
rotrRotate right (barrel)rotr.v
roundRounderround.v
rsqrtFixed-point inverse sqrt (sequential)readmeY
shiftarArithmetic right shiftshiftar.v
shiftbBarrel shiftershiftb.v
shiftlLeft shiftshiftl.v
shiftrRight shiftshiftr.v
sigmoidSigmoid activation (PLAN PWL)readmeY
simdmulPacked SIMD multiplysimdmul.v
sineSine functionsine.v
sqdiffSquared differencesqdiff.v
sqrtSquare rootreadmeY
subSubtractorsub.v
sumSummation treesum.v
tanhTanh activation (PLAN PWL)readmeY

Memory (17 benchmarks)

BenchmarkDescriptionSourceAI
cacheCache memorycache.v
camContent-addressable memoryreadmeY
fifoasyncAsynchronous FIFOfifoasync.v
fifosyncSynchronous FIFOfifosync.v
ramasyncAsynchronous RAMramasync.v
rambitBit-wide RAMrambit.v
rambyteByte-wide RAMrambyte.v
raminitInitialized RAMraminit.v
ramtdpTrue dual-port RAM (single clock)ramtdp.v
ramtdpdcTrue dual-port RAM (dual clock)ramtdpdc.v
ramsdpSimple dual-port RAMramsdp.v
ramspSingle-port RAMramsp.v
ramspncSingle-port RAM (no change)ramspnc.v
ramsprfSingle-port RAM (read-first)ramsprf.v
ramspwfSingle-port RAM (write-first)ramspwf.v
regfileRegister filereadme
romRead-only memoryrom.v

Complex Blocks (48 benchmarks)

BenchmarkDescriptionSourceAI
aesAES encryption corereadme
apbregsAPB register fileapbregs.v
axicrossbarAXI crossbarreadme
axiramAXI RAM interfacereadme
blackparrotBlackParrot RISC-V corereadme
conv2dStreaming 3x3 2D convolutionreadmeY
coralnpuCoralNPU neural acceleratorreadme
crc32CRC-32 generatorreadmeY
codec8b10b8b/10b line encoder/decoderreadmeY
cva6CVA6 (Ariane) RISC-V corereadme
ddcDigital down-converter (NCO/mixer/CIC/FIR)readmeY
ethmacEthernet MACreadme
fftFast Fourier TransformreadmeY
firfixFixed-coefficient FIR filterfirfix.v
firprogProgrammable FIR filterfirprog.v
fpu6464-bit floating-point unitfpu64/
gearbox6664b/66b scrambler + gearboxreadmeY
hammingHamming ECC encoder/decoderreadmeY
hftTick-to-trade HFT pipelinereadmeY
hmacHMAC-SHA hashingreadme
huffmanCanonical Huffman encoder/decoderreadmeY
i2cI2C controllerreadme
ialuInteger ALUreadme
jesd204bJESD204B full-duplex link interfacereadmeY
lfsrLinear feedback shift registerreadme
linkmapJESD204-style transport framer/deframerreadmeY
lpddr5LPDDR5 memory controller (UMI + DFI, ECC)readmeY
lz77LZ77 (LZSS) compressor/decompressorreadmeY
median3x3Streaming 3x3 median filterreadmeY
nvdlaNVDLA deep-learning acceleratorreadme
ofdmOFDM modem (QAM + IFFT/FFT)readmeY
openpitonOpenPiton manycore tilereadme
picorv32PicoRV32 RISC-V corereadme
reedsolomonReed-Solomon RS(544,514) codecreadmeY
rocketRocket RISC-V corereadme
sad8x88x8 sum of absolute differencesreadmeY
servSERV bit-serial RISC-V corereadme
sobel3x3Streaming 3x3 Sobel edge detectorreadmeY
spiSPI controllerreadme
tpuWeight-stationary systolic matrix multiply (TPU MXU)readmeY
uartUARTreadme
umicrossUMI crossbarreadme
umidevUMI device endpointreadme
umiregsUMI register fileumiregs.v
viterbiViterbi decoderreadmeY
vortexVortex GPU corereadme
wallyCVW-Wally RISC-V corewally/
wordalignComma detect + bitslip alignerreadmeY

EPFL Benchmarks (19 benchmarks)

BenchmarkDescriptionSource
epfl_adderEPFL adder benchmarkepfl_adder.v
epfl_arbiterEPFL arbiter benchmarkepfl_arbiter.v
epfl_barBarrel shifterepfl_bar.v
epfl_cavlcCAVLC encoderepfl_cavlc.v
epfl_decDecoderepfl_dec.v
epfl_divDividerepfl_div.v
epfl_hypHypotenuse calculatorepfl_hyp.v
epfl_i2cI2C controllerepfl_i2c.v
epfl_int2floatInteger to float converterepfl_int2float.v
epfl_log2Log base 2epfl_log2.v
epfl_maxMaximumepfl_max.v
epfl_memctrlMemory controllerepfl_memctrl.v
epfl_multiplierMultiplierepfl_multiplier.v
epfl_priorityPriority encoderepfl_priority.v
epfl_routerRouterepfl_router.v
epfl_sinSine functionepfl_sin.v
epfl_sqrtSquare rootepfl_sqrt.v
epfl_squareSquare functionepfl_square.v
epfl_voterVoter circuitepfl_voter.v

ISCAS85 Benchmarks (11 benchmarks)

Combinational gate-level circuits. See iscas85/README.md.

BenchmarkDescriptionSource
c17Trivial 6-gate circuitc17.v
c43227-channel interrupt controllerc432.v
c49932-bit single-error-correcting circuitc499.v
c8808-bit ALUc880.v
c135532-bit single-error-correcting circuitc1355.v
c190816-bit SEC/DED circuitc1908.v
c267012-bit ALU and controllerc2670.v
c35408-bit ALUc3540.v
c5315ALU with parityc5315.v
c628816x16 combinational multiplierc6288.v
c755232-bit adder/comparatorc7552.v

ISCAS89 Benchmarks (28 benchmarks)

Sequential gate-level circuits (clock port CK). See iscas89/README.md.

BenchmarkDescriptionSource
s27Sequential benchmark circuits27.v
s298Sequential benchmark circuits298.v
s344Sequential benchmark circuits344.v
s349Sequential benchmark circuits349.v
s382Sequential benchmark circuits382.v
s386Sequential benchmark circuits386.v
s400Sequential benchmark circuits400.v
s420Sequential benchmark circuits420.v
s444Sequential benchmark circuits444.v
s510Sequential benchmark circuits510.v
s526Sequential benchmark circuits526.v
s641Sequential benchmark circuits641.v
s713Sequential benchmark circuits713.v
s820Sequential benchmark circuits820.v
s832Sequential benchmark circuits832.v
s838Sequential benchmark circuits838.v
s953Sequential benchmark circuits953.v
s1196Sequential benchmark circuits1196.v
s1238Sequential benchmark circuits1238.v
s1423Sequential benchmark circuits1423.v
s1488Sequential benchmark circuits1488.v
s5378Sequential benchmark circuits5378.v
s9234Sequential benchmark circuits9234.v
s13207Sequential benchmark circuits13207.v
s15850Sequential benchmark circuits15850.v
s35932Sequential benchmark circuits35932.v
s38417Sequential benchmark circuits38417.v
s38584Sequential benchmark circuits38584.v

Leaderboard (WIP)

Targets ranked by total LUTs over all benchmarks (config: small), lowest first. A benchmark with no result for a target is charged the highest LUT count any target reached on it. Comparing different FPGA architectures is by definition an apples to oranges exercise. Ranking by no means implies quality or goodness, it's just a neat way to compress and order data.

ASIC Synthesis

ASIC leaderboard tables (cell area and FMAX, starting with freepdk45) are work in progress and will be published here once results are collected.

Tool Installation

LogikBench itself is pure Python and installs from PyPI:

pip install logikbench

Running benchmarks additionally needs the EDA tools that SiliconCompiler drives. The sc-install helper (shipped with SiliconCompiler) builds and installs them. Install by group, or name individual tools:

sc-install -group fpga          # FPGA synthesis (Yosys + vendor plugins)
sc-install -group asic          # ASIC synthesis + timing (Yosys, OpenROAD, OpenSTA)

Useful flags: -prefix <path> to install somewhere other than the default, -build_dir <path> to build elsewhere, and -jobs <N> to limit parallel build jobs on memory-constrained machines.

Use caseToolsGroup
FPGA LUT / depth metricsYosys (+ vendor synth plugins)fpga
ASIC area / FMAX metricsYosys, OpenROAD, OpenSTAasic
RTL simulation (testbenches)Icarus Verilog, Verilatordigital-simulation

License

The LogikBench project is licensed under the MIT license unless specified otherwise inside the individual benchmark folders.