Skip to content

About

A daily portfolio of complete hardware/software co-design projects: parameterized SystemVerilog accelerators with real HW/SW interfaces, C/host software, and self-checking differential verification (Icarus Verilog).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

58 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hardware/Software Co-Design Projects — Everyday

A daily portfolio of complete, non-trivial hardware/software co-design projects. Each day is a self-contained accelerator: parameterized SystemVerilog RTL with a real hardware/software interface, working C or host software that configures and drives it, and a self-checking differential testbench that verifies the hardware bit-exactly against a software golden model.

Every project ships with:

  • Synthesizable, parameterized RTL — at least three submodules plus a top level, elaborating cleanly at multiple parameter sets.
  • A real HW/SW interface — AXI4-Lite/AXI4-Stream, memory-mapped registers, DMA, or similar — with a documented register map or protocol.
  • Software that does real work — configures the device, moves data, handles completion, and computes the reference result.
  • Measured results — cycle counts, throughput, latency, and a hardware-versus-software speedup, extracted from simulation rather than asserted.
  • Hand-drawn diagrams — a hardware block diagram and a title banner, plus a Mermaid transaction sequence.

Verification runs under Icarus Verilog (this environment has no Verilator/Yosys); where a synthesized area report is unavailable, an analytical estimate is given instead. See each day's README for the exact toolchain and any substitutions.

Index

Day Project Domain Microarchitecture Interface Summary
39 PCIe Completion Reorder Engine high-speed I/O / PCIe split-transaction ordering eight-tag allocator + request-order FIFO + tag-indexed completion store PCIe-like request/completion/result ready-valid channels + TileLink-UL-style telemetry CSRs + sticky W1C IRQ Hardware accepts arbitrary completion order while preserving software-visible request order and containing invalid tags. 320 results in 760 randomized-stall clocks, 0.421053 requests/clock, 143 out-of-order completions, two contained protocol errors, full eight-request occupancy, 1,289 checks, sanitizer-clean C reference, 0 mismatches; Yosys unavailable, synthesis-oriented Icarus elaboration passed.
38 GPU Tile Mask Compactor GPU rendering / tile-work scheduling and verification eight parallel byte popcount lanes + hierarchical count and first/last priority reduction + elastic result stage AXI4-Stream 64-bit mask/result transport + AHB-Lite threshold/counter CSRs + sticky W1C IRQ Firmware chooses the sparse-tile policy while hardware compacts coverage masks into scheduling metadata. 320 masks in 783 randomized-stall clocks, 0.408685 masks/clock, one-clock unstalled latency, 645 checks, sanitizer-clean C reference, 0 mismatches; Yosys unavailable, synthesis-oriented Icarus elaboration passed.
37 Coherent Snoop Filter multicore SoC cache coherency / design verification two-way set-associative directory with parallel tag match, sharer vectors and round-robin replacement CHI-like ready/valid coherence request/response channels + APB4 telemetry + sticky W1C IRQ Firmware configures and observes a hardware snoop directory aligned with current Apple and NVIDIA SoC DV roles. 320 transactions in 1,399 randomized-stall clocks, 0.228735 transactions/clock, 19 hits, 301 misses, 90 routed probes, 126 detected protocol errors, 1,607 checks, sanitizer-clean C reference, 0 mismatches; Yosys unavailable, synthesis-oriented Icarus elaboration passed.
36 Vibration Goertzel Monitor predictive maintenance / vibration condition monitoring four parallel programmable second-order Goertzel resonators + parallel peak selector AXI4-Stream signed-sample ingress + Wishbone B4 coefficient/result CSRs + sticky W1C IRQ Firmware selects mechanical fault bands while hardware evaluates them without an FFT. 260 frames / 16,640 samples in 48,376 randomized-gap clocks, 0.343972 samples/clock, 1,570 checks, sanitizer-clean C reference, 0 mismatches; Yosys unavailable, synthesis-oriented Icarus elaboration passed.
35 Genomics Minimizer Stream Engine genomics / sequence indexing canonical reverse-complement/hash pipeline + rolling parallel minimum window Avalon-ST k-mer/result streams + Avalon-MM seed/counter CSRs + sticky W1C IRQ Hardware emits strand-independent eight-k-mer minimizers while software configures the hash seed and validates the stream. 320 k-mers / 313 results in 795 randomized-stall clocks, 0.402516 k-mers/clock, sanitizer-clean C reference, 0 mismatches; Yosys unavailable, synthesis-oriented Icarus elaboration passed.
34 ML Top-K Command Engine ML inference / deterministic class and expert selection balanced tree reduction: 4 leaf pairs, 2 intermediate merges, 1 root merge + registered result selected/ready MMIO command registers + 32-bit DMA reads/writes + sticky W1C completion/error IRQ Driver-managed INT16 top-two selection for classification, Mixture-of-Experts routing and beam pruning. 3,464 START-to-IRQ cycles, 0.092379 vectors/clock, 4-clock final-read-to-result latency, and 14.894630× over a 51,595-cycle scalar baseline; 8 directed + 312 seeded-random vectors, randomized DMA stalls, sanitizer gate clean, 0 mismatches.
33 Power Telemetry Fusion Engine sensor fusion / platform power and thermal telemetry descriptor front end + three-stage elastic feature/product/reduction pipeline selected/ready MMIO configuration + descriptor-driven 32-bit DMA read/write channels + sticky W1C completion/error IRQ Firmware chooses operating limits and weights while hardware fuses voltage droop, current and temperature for every sample. 554 START-to-IRQ cycles, 0.578662 samples/clock under randomized DMA stalls, 3-cycle pipeline latency, and 27.180505× over a 15,058-cycle scalar baseline; 8 directed + 312 seeded-random vectors, sanitizer gate clean, 0 mismatches.
32 Firmware Trace Compressor compression / resource-constrained boot, power and fault telemetry double-buffered 8-record ping-pong staging + stateful run encoder + shared producer/consumer rings selected/ready MMIO control and 512-entry shared input/output ring windows + sticky W1C completion IRQ Firmware writes timestamped events while hardware overlaps ring prefetch with run encoding and emits fixed 64-bit packets. 320 records to 88 packets (45% fewer bytes), 329 busy cycles, 0.972644 records/clock, 331-cycle START-to-IRQ latency, and 22.580060× over scalar; sanitizer gate clean, 256/4 and 512/16 alternate geometries elaborate, 0 mismatches.
31 Robot Arm Kinematics Engine robotics kinematics / wearable exoskeleton and end-effector pose joint FIFO + wrapped absolute-heading controller + 16-iteration fixed-point CORDIC rotator + widened X/Y accumulation 40-bit SPI command/result protocol + sticky acknowledged completion IRQ Firmware queues calibrated link lengths and relative joint angles, then hardware returns the deterministic Q24.8 end-effector pose. 1,065,360 SPI end-to-end cycles for 320 chains / 1,744 joints, 0.052632 joints/clock in the CORDIC path, 103.550-cycle mean START-to-IRQ latency and 9.942× over scalar; sanitizer gate clean, 4/8/16-joint elaborations pass, 0 mismatches.
30 SerDes Eye Margin Engine networking / high-speed PHY link-margin validation streaming dataflow with an 8-entry sample FIFO, threshold classifier and contiguous-open-run tracker APB control/status + ready/valid phase/error sample stream + sticky W1C completion IRQ Firmware-configured PCIe/Ethernet/NVLink/CXL eye scan measures the earliest widest passing phase interval without service-jitter stalls. 426 cycles for 320 points, 0.751174 samples/clock, 106.250-cycle mean first-sample-to-IRQ latency and 8.432× over scalar; sanitizer gate clean, 0 mismatches.
29 RAS Fault Graph Engine graph analytics / datacenter RAS fault isolation four-lane Boolean propagation array + registered frontier/reached fixed-point feedback selected/ready MMIO graph mailbox + result/telemetry + sticky W1C completion IRQ Hardware blast-radius analysis for BMC firmware and fault-injection campaigns. 35,380 cycles for 320 graphs, 0.009045 graphs/clock, 7.887500-cycle average doorbell-to-IRQ latency and 14.638779× over scalar; sanitizer gate clean, 0 mismatches.
28 SPDM Nonce Replay Guard cryptography / authenticated-management anti-replay 32-entry associative nonce memory + parallel context/epoch/nonce compare + dual priority encoders + epoch-floor policy selected/ready MMIO mailbox for metadata and 128-bit nonce + telemetry + sticky W1C completion IRQ BMC/security-processor boundary for rejecting authenticated-but-replayed SPDM commands. 7,870 cycles for 320 stateful requests, 0.040661 requests/clock including randomized mailbox gaps, 4.709375-cycle average doorbell-to-IRQ latency and 8.418806× over scalar; replay/stale/flush/replacement cases, sanitizer gate clean, 0 mismatches.
27 SDR Preamble Correlator SDR / burst preamble synchronization eight signed complex SIMD lanes + balanced I/Q reduction trees + magnitude-square threshold in a three-stage elastic pipeline selected/ready MMIO tap/threshold control and telemetry + 128-bit AXI4-Stream ingress + 64-bit result stream + sticky completion IRQ Driver-programmable matched filter for Wi-Fi/cellular/LoRa/satellite burst acquisition. 320 candidates in 323 cycles, 0.991 candidates/clock, 3-cycle latency and 48.54× over scalar; randomized backpressure plus full-rate pass, sanitizer gate clean, 640 checks, 0 mismatches.
26 Sobel Line-Buffer Engine image/video / streaming edge extraction parameterized two-row line buffer + three-column shift window + parallel signed Sobel reduction and saturating magnitude selected/ready MMIO control/telemetry + ready/valid 8-bit input/output streams + frame-last + sticky W1C completion/error IRQ Driver-managed camera/GPU preprocessing primitive that retains overlapping 3×3 neighborhoods on chip and freezes losslessly under output backpressure. 461 cycles for 320 inputs / 252 checked outputs, 0.546638 pixels/clock, 3-cycle window-to-output latency and 17.960954x over scalar; 304 seeded random plus 16 directed corner pixels, counters/TLAST/IRQ checked, sanitizer gate clean, 0 mismatches.
25 Bit-Serial Motor Current Loop motor control / hard-real-time phase-current regulation four-entry command FIFO + exact signed error + eight-cycle shift/add Q8 gain + parallel overcurrent guard + saturating PWM clamp selected/ready MMIO mailbox with doorbell, configuration, telemetry and sticky W1C completion/fault IRQ The deterministic inner loop behind a motor-control firmware stack: signed phase-current error is scaled by a compact bit-serial gain engine while an independent safety path checks overcurrent, then a saturator emits a center-aligned 16-bit PWM command or fault-safe zero. 13-cycle deterministic launch-to-interrupt latency, 0.076923 commands/clock, 6.668510x over scalar; 320 corner/random vectors driven through the real MMIO pins with randomized gaps, duty/flags/telemetry/IRQ checked, sanitizer gate clean, 0 mismatches.
24 USB Audio Rate Matcher audio / USB isochronous endpoint clock-domain rate matching Three-stage elastic pipeline: FIFO fill error, bounded Q8 proportional rate correction, and saturating PCM16 linear interpolation Selected/ready MMIO control/telemetry + ready/valid PCM streams + frame-last + sticky completion IRQ Bridges independent USB-host and codec clocks without hard sample slips. 740 cycles for 320 randomized/backpressured vectors, 0.432432 samples/clock, 3-cycle latency, 7.8x over a 5772-cycle scalar baseline, 0 mismatches; ASan/UBSan clean
23 DDR RAS Scrub Engine error-correcting codes / DDR memory reliability Parallel Hamming SECDED syndrome-reduction tree + correction stage + parameterized scrub writeback FIFO Selected/ready MMIO descriptor and telemetry registers + 64-bit read/write DMA channels + sticky completion IRQ Patrol scrubber reads 39-bit SECDED words, repairs single-bit faults in place, reports double-bit faults without modifying them, and drains all writebacks before interrupting firmware. 734-cycle descriptor latency, 0.414169 words/clock, 38.128× over a 27,986-cycle scalar baseline; 304 randomized/backpressured differential words, 152 repairs, 76 uncorrectable detections, 0 mismatches; ASan/UBSan clean
22 HID Touch Fusion Engine sensor fusion / human-interface touch and force sensing Eight parallel baseline clamps + total/right/bottom reductions feed two concurrent 32-step restoring divider engines; below-threshold frames bypass division and return the neutral centroid SPI mode-0 command protocol (CONFIG, FRAME, STATUS, RESULT) over spi_sclk, spi_cs_n, spi_mosi, spi_miso + sticky completion IRQ Two four-quadrant touch/force tiles fuse into pressure and a 10-bit centroid. The C stack configures calibration, moves big-endian frames, handles polling/IRQ completion, reads results, and supplies the bit-exact reference. 33.12-cycle mean launch-to-IRQ latency, 0.03019 frames/clock, 4.47× over a 148-cycle scalar baseline; 304 pin-level SPI differential frames including zero, baseline, saturation, opposing corners and full-range random inputs, 0 mismatches; ASan/UBSan clean
21 MX-Cast Custom Functional Unit (bf16 <-> MXFP4 cast on an RV32I core) compression / block-scaled numeric format conversion (OCP Microscaling MXFP4 cast kernels for quantised LLM inference and inter-device tensor transfer) custom functional unit tightly coupled to a three-stage RV32I pipeline (F / X / W, one retire per cycle): five combinational stateless custom-0 instructions in the execute stage beside the ALU, two bf16 per instruction because a 32-bit register holds exactly two - so the unit's width is set by the register file, not chosen. MXQ4 is the longest path: exponent subtract, one variable shift with a sticky OR of everything shifted out, then seven midpoint comparisons in parallel into a 3-bit population count - precisely what a scalar machine must serialise. Round-to-nearest-even on the non-uniform E2M1 grid needs no tie logic and no table: the pair straddling midpoint k is (k, k+1), so the even member is k for even k and k+1 for odd, which is exactly strict versus non-strict compare, and adding the sticky bit expresses 'strictly above the midpoint' without a second comparison. A single W-to-X bypass also covers load-use, so there is no load-use stall and the only bubble is the instruction fetched behind a taken branch - making cycles = instret + taken branches + 2 an exact identity checked on every job. Traps precise, priority-encoded WDOG > FETCH > ILLEGAL > ALIGN > RANGE. Both single-ported SRAMs are owned by the core while it runs and the host while it is halted, by contract rather than arbitration MMIO register file over a selected/ready host bus with one wait state (22 registers: self-clearing START / SOFT_RST / CLR_STAT, sticky W1C DONE/TRAP interrupt, latched ERRCODE and TRAP_PC, WDOG as a retired-instruction budget, six counters - CYCLES, INSTRET, CUSTOM_OPS, BRANCH_TAKEN, LOADS, STORES - ARG0..ARG3 loaded into a0..a3 at launch, RETVAL from a0 at the halt, CAPS carrying both memory widths and the custom-instruction count, and a REGMAP_CSUM cross-checking rtl/mxq_defs.vh against sw/mxq.h) plus instruction- and data-memory windows accessible only while the core is halted, and a completion/trap interrupt The MXFP4 cast every quantised-inference deployment runs before a tensor crosses a device boundary: 32 bf16 values become one shared E8M0 scale plus 4 bits each - 4.25 bits/element against bf16's 16. The cast is not arithmetic but bit manipulation with a hard rounding rule, which is why a scalar machine needs 46 instructions per element, 1959 per block. Five instructions absorb it - MXAMAX (amax fold with Inf/NaN clamp and subnormal flush), MXSCALE, MXQ4 (the whole quantise, sticky bit and seven parallel comparisons), MXDQ, MXPK - and deliberately not as an accelerator behind a bus: an MX cast instruction costs exactly what an ADD costs, so the kernel stays an ordinary loop whose inner iteration is four instructions instead of ninety. Both versions of each kernel, custom-0 and strictly base RV32I, are emitted from the same C file, run on the same core over the same 94 blocks, and must leave byte-identical memory - so the speedup is a measured cycle ratio between two programs, not a cost model of a machine nobody built: 11.96x quantise, 7.50x dequantise, 10.53x round trip, 194.4 cycles/block against 2324.5, 0.899 IPC, 1.531 custom instructions/element. The five instructions are ~1010 gate equivalents - 7.8% of the core's logic, a quarter of the base ALU, beside 256 kbit of SRAM. 243,523 instruction commits compared against the simulator one at a time (PC, destination register, value, address, store data of every architectural write, in order), 110,303 memory words, a full 4096-word sweep per pass against a testbench-maintained shadow - 1,357,215 checks, 0 mismatches. Five independent implementations of the cast (fixed-point model, floating-point reference, base-RV32I kernel, RTL unit, simulator) required to agree, with all 65536 bf16 values checked at 11 scales before a vector is written; 24 directed blocks including exact ties at all seven midpoints and the same ties with sticky set, 33 hand-written ISA conformance results, 7 trap programs, 300 randomised jobs; eight injected defects all caught; five geometries - 6,797,115 checks, 0 mismatches
20 Speculative-Decoding Draft-Tree Verifier (tree-based spec decode acceptance) LLM serving / tree-based speculative decoding draft-tree verification (the acceptance step between a draft device and the target GPU) broadcast-compare node array with a log-depth argmax reduction: the whole draft tree in MAX_NODES x 112 flops rather than a RAM, because every node is interrogated on every step - all N nodes answer par[j] == cur && accept(j) at once into a candidate mask that a ceil(log2 N)-level argmax tree reduces to a winner in the same cycle, ties breaking to the lowest index structurally (right child taken only when valid AND strictly greater, leaf i seeded with index i); the typical-acceptance floor thr[j] = max(TH_ABS, (pmax[j] * TH_REL) >> 16) precomputed by one 16x16 multiplier at load time so the walk's critical path holds no multiplier; structural validation as three parallel reductions priority-encoded NNODES > ROOT > PARENT > SELF in one cycle; the winner pushed on cycle k+1 to keep the mux out of the selection path, and CHECK gated on an empty result FIFO so a started walk can never be stalled by backpressure APB3 control slave (21 registers: EN / IRQ_EN / 2-bit acceptance MODE / self-clearing CLR_STAT and SOFT_RST, TH_ABS and TH_REL in Q0.16, MAX_ACC clamped to MAX_DEPTH in hardware, sticky DONE/ERROR/CLAMP IRQ cleared W1C, latched ERRCODE, CAPS, ten counters with source-starve and backpressure stalls counted apart, a REGMAP_CSUM cross-checking rtl/sdv_defs.vh against sw/sdv.h, and MAX_DEPTH per-position acceptance counters; PSLVERR on unmapped addresses) + 128-bit AXI4-Stream ingress, one node record per beat {parent, draft token, target argmax, score, pmax}, TLAST ending the tree + 128-bit AXI4-Stream egress, accepted-token beats then a trailer {count, bonus token, error, (nodes << 16) flags}; the job config is latched on the first ingress beat, so there is no doorbell write in the steady-state path
19 GPU Peer Transport Engine (RDMA-style GPU-to-GPU link) networking / GPU-to-GPU peer interconnect transport (tensor-parallel inference collectives) credit-based streaming dataflow: a transmit segmentation engine (2 header beats + MTU payload beats) that prefetches payload into an 8-deep staging FIFO on the header beats; a store-and-forward receiver whose RX_BUFS x MTU packet buffer pool is the credit pool, allocated and freed in order; per-QP 8-bit sequence with whole-packet discard and resync on a gap; a receive-side accumulate fold pipelined behind an 8-deep result FIFO; one shared AXI4-Lite read channel arbitrated round-robin with a grant-order tag FIFO, write channel owned by the receive path alone work-queue / completion-queue rings in shared memory (8-word descriptors, 4-word completions) + AXI4-Lite control slave (24 registers: doorbell, ring bases, MEM_LIMIT guard, CREDIT_LIM, sequence-gap injection, 11 statistics counters with credit / link / memory stalls counted apart, CAPS, done+error IRQ cleared W1C) + pipelined AXI4-Lite memory master (separate 4-outstanding read and write channels) + 32-bit AXI4-Stream egress/ingress pair (TLAST per packet, TUSER on the header beat) + per-QP credit-return sideband The layer underneath a collective: the thing that actually moves a tensor shard between devices while the arithmetic waits for it. Drains a work-queue ring, segments each message into MTU packets, moves them over the link under credit-based flow control, and reassembles, commits and completes them at the far end - or folds the payload into the destination instead of overwriting it, a reduce-scatter done on the wire with no kernel launched on the receiving device. A credit is a receive buffer, so nothing is dropped and there is no retransmit path; slots are freed in order, so the memory image is a function of the descriptor ring and not of bus, wire or flow-control timing - which is exactly what three passes (randomised wait states + link gaps + credit delay / full rate / one credit per queue pair) are built to break. 0.788 payload words/clock peak (88.6 % link occupancy against a 0.889 roofline set by 2 header beats per 16-word packet), 0.451 words/clock with the accumulate fold (pipelining it took that from 0.235), 29-cycle single-word message latency, 10.30x / 15.01x over scalar; bit-exact over 331 launches / 2,283 packets / 28,328 payload words per pass (31 directed: zero length, exactly MTU, MTU+1, accumulate across INT32_MAX / INT32_MIN, two accumulates onto one destination, one credit, sequence gaps on a middle and on a last packet, a 2048-word peak message, 9 rejection cases incl. error-priority ordering; plus 300 randomised), 221,952 checks incl. a full 70,656-word memory sweep, register-map checksum against the firmware header, SLVERR / recovery / IRQ-masking / W1C tests, mutation-checked with four injected defects all caught, full differential sim at MTU/QP/BUFS = 16/4/4, 32/2/4, 8/8/8, 64/4/2 - 890,883 checks, 0 mismatches
18 Kernel-DAG Scheduler (multi-GPU command processor) heterogeneous runtime / multi-GPU kernel-DAG launch scheduling (CUDA-Graph command processor) associative dependency scoreboard: an on-chip graph CAM whose masks are read in parallel every tick, so all MAX_NODES readiness matches resolve in one cycle; combinational affinity placer + two-level priority encoder with fixed tie-breaks; DEVICES countdown slots retiring in parallel; RUN touches no bus, and a cycle is an exact condition, not a timeout AXI4-Lite control slave (doorbell, node/result base, seven scheduling statistics counters, per-device occupancy, done/error IRQ cleared W1C) + a pipelined AXI4-Lite memory master (4 outstanding, AR ahead of R, in-order returns) The launch front end of a CUDA graph in hardware: a runtime has to walk the node list to answer which kernels are runnable now, and while it walks, the GPUs idle. Here a dependency CAM answers it for all 64 nodes at once, a combinational placer picks the lowest ready node and the lowest idle device its affinity mask allows, and countdown slots retire in parallel so a dependent issues the cycle its last predecessor retires. Because the graph is fetched on chip before the first decision, the schedule is a pure function of the DAG - byte-identical under randomised wait states and at full rate - and makespan == dispatched + stall + depwait and sum(dev_busy) == serial_ticks are checked on every graph. 0.985 nodes/clock peak dispatch, 32-cycle single-graph latency, 2.583x parallel compression (146,263 serial ticks in 56,632), 98.4 % AXI4-Lite occupancy in the transfer phases, 17.62x / 18.37x over scalar; bit-exact over 326 launches / 9,991 nodes per pass (17 directed shapes incl. reverse-topological labelling, pinned affinity, a 1000-tick kernel, 32-way fan-in, MAX_NODES-deep chain and MAX_NODES-wide peak; 9 rejection cases incl. two- and three-node cycles, dangling and self edges, absent device; 300 randomised relabelled DAGs), 255,388 checks incl. a full 80,844-word memory sweep, SLVERR / recovery / IRQ-masking / W1C tests, mutation-checked with three injected defects, full differential sim at 64x4, 32x2, 32x8, 128x4 - 1,113,064 checks, 0 mismatches
17 Sharded Embedding Gather-Reduce Engine (multi-GPU EmbeddingBag) recommendation inference / sharded embedding-table gather-reduce (DLRM / TorchRec multi-GPU) double-buffered (ping-pong) row-staging pipeline: the CHUNKS-beat burst of row i+1 overlaps the CHUNKS-cycle fold of row i exactly, LANES one-adder-deep reduce lanes, first-row init instead of a sentinel, divide-in-place MEAN through LANES 34-stage pipelined dividers (no drain FIFO) AXI4 burst read + AXI4 burst write masters over shared device memory driven by an 8-word descriptor ring + 19-register MMIO control/statistics with a done / baglen / index / bus-error IRQ The nn.EmbeddingBag lookup path of a multi-GPU recommender, where the sparse tower is the latency floor: per bag the engine fetches the whole index list, classifies every index against this device's shard window, gathers each local row as one CHUNKS-beat INCR burst, and folds it through LANES reduce lanes at one beat per clock. An index owned by a peer shard is skipped and counted in ST_REMOTE - that is what sizes the all-to-all, not an error - so MEAN renormalises by the locally pooled count and an all-remote bag emits the zero vector the sharded reduce expects. Because a row takes CHUNKS cycles to fold and CHUNKS beats to fetch, the ping-pong buffers match the two stages exactly; CTRL.SINGLE_BUF collapses the overlap in the same RTL and measures the gain at 1.667x. 3.374 pooled words/clock peak (87.1 % AXI occupancy, 18.97 cycles per 16-beat row), 2.917 sustained, 13.17x / 14.08x over scalar; bit-exact over 319 bags / 9,523 indices / 6,000 gathered rows / 20,416 pooled output words per pass under randomised AXI wait states, at full rate, in single-buffer mode and after injected faults (19 directed: empty bag, single local, single remote, all-remote, MAX over INT32_MIN, MIN over INT32_MAX, wrapping SUM, MEAN truncating toward zero, duplicate index, both shard boundaries, MAX_BAG peak bag, over-long bag, out-of-range index, plus 300 randomised), 248,960 checks incl. proof that nothing outside the output region is written and CSR counters cross-checked against real bus beats, SLVERR / AR-watchdog / zero-ring / IRQ W1C tests, mutation-checked, full differential sim at 64/4/64, 32/8/32, 128/4/48, 32/2/64, 0 mismatches
16 KV-Cache Paging Engine (paged-attention block table) memory management / paged KV-cache address translation for LLM serving (heterogeneous inference) set-associative translation cache (parallel tag compare, true-LRU move-to-front) + block-table walker FSM + LIFO physical-block allocator, one bus-done gate for lossless stalls, next-key lookahead probe Wishbone B4 classic master over shared memory (request fetch, block-table read/write, result writeback) + MMIO control/statistics with done/out-of-memory/bus-error IRQ The vLLM PagedAttention block table in hardware: the attention kernels want physical KV-block numbers, the runtime thinks in (sequence, logical block) pairs. A 1-cycle set-associative translation cache resolves a translation, a block-table walker handles the miss, and an unmapped entry allocates a physical block from a LIFO pool, writes the entry back and reports ALLOC; FREE returns a sequence's blocks (LIFO reuse), an exhausted pool raises a sticky out-of-memory interrupt instead of evicting on its own. The walker absorbs the next key while the current result is on the bus — 0.970 translations/clock peak (93.5 % bus occupancy), 3-cycle latency, 13.02× / 20.42× over scalar; bit-exact over 16 batches / 1,909 translations / 1,955 result words per pass under randomised memory wait states and at full rate (cold prefill, cached re-read, flush-and-rewalk, NOALLOC, eviction + LIFO reuse, OOM mid-range, bad opcode, 9-way LRU thrash, 320 randomised requests), 8,464 checks incl. the whole 2,048-word block table, Wishbone ERR_I + bus-watchdog tests, full differential sim at 16×4 / 8×2 / 32×8 / 4×4, 0 mismatches
15 GPU Vector-Search (ANN) Top-K Engine vector search / approximate-nearest-neighbour retrieval (RAG / embedding inference) P-lane SIMD int8 distance datapath (adder tree + int32 accumulator folding D/P beats/vector) + streaming insertion-select top-K network (K sorted slots, parallel-compare insertion, one candidate/clock) AXI4-Stream database-vector ingress (P int8/beat) + MMIO control/status with query window, top-K readback, statistics + search-complete/error IRQ The retrieval primitive behind RAG / embedding search (FAISS-GPU style, sharded multi-GPU): a query is loaded once, a shard streams in at P int8 elements/clock, P SIMD distance lanes score each vector (squared-L2 nearest or inner-product argmax) via an adder tree + int32 accumulator, and a streaming insertion-select network keeps the running top-K (stable tie rule) at one candidate/clock — 7.993 sustained / 8.000 peak dims/clock (P=8 roofline), 1-cycle latency, 21.80× / 25.00× over scalar; bit-exact (score and id) over 49 searches / 7,364 vectors / 58,912 beats / 762 result entries per pass under randomised ingress bubbles and at full rate (9 directed: single vector, exactly-K, fewer-than-K, planted zero-distance hit, all-identical ties, IP argmax, IP ties, int8 saturation), CSR statistics + truncated-shard error/IRQ, full differential sim at D/P/K = 64/8/8, 32/4/4, 128/16/16, 256/16/8, 0 mismatches
14 GPU All-Reduce Collective Engine (multi-GPU) distributed training / multi-GPU collective communication (all-reduce) R-stage × P-lane systolic reduction array (input-skewed reduce-PE chain) + descriptor-ring DMA with R-way coalesced gather + depth-R masked-scatter pipeline descriptor-ring DMA (R-way gather + P-wide scatter) over a wide shared-memory master + MMIO control + done/error IRQ Hardware ncclAllReduce: reduces R rank buffers of int32 element-wise (SUM/PROD/MAX/MIN) and scatters the result from a host-built descriptor ring; an R-stage × P-lane systolic array (rank r skewed r cycles) retires P elements/clock after an R-cycle fill, all frozen losslessly by one adv=mem_ready gate — 2.87 sustained / 3.97 peak words/clock (P=4 roofline), 4-cycle latency, 51.65× / 71.44× over scalar; bit-exact over 49 collectives / 3627 elements / 924 groups per pass under randomised memory wait states and at full rate (32-bit-wrapping SUM, PROD, signed MAX/MIN, tail masks, a 2048-element peak collective), CSR + zero-length-descriptor error/IRQ checks, full differential sim at R=2/4/8, 0 mismatches
13 GPU MoE Router Engine (top-k gating / dispatch) machine-learning inference / Mixture-of-Experts routing log-depth top-2 argmax reduction + piecewise-linear exp-LUT softmax renormalizer (two 34-stage pipelined dividers) + per-expert capacity single-cycle RMW AXI4-Stream logit ingress + AXI4-Stream dispatch egress + AXI4-Lite control + over-capacity IRQ Sparse-transformer expert router / MoE gate: per token selects the top-2 experts, computes a fixed-point softmax gate (257-entry exp LUT) renormalised by two 34-stage pipelined dividers, and enforces per-expert capacity with a single-cycle load RMW — 1 token/clock, 38-cycle deterministic latency, 116.94× / 131.00× over scalar; bit-exact over 316 tokens (12 directed incl. capacity storm + 300 random) under randomised bubbles + backpressure and at full rate, CSR statistics + over-capacity IRQ checks, E=4/8/16 parameterization, gate weights within 1.35e-4 of a double-precision softmax, 0 mismatches
12 Pre-Trade Risk Engine (HFT market-access gateway) risk management / pre-trade market-access controls (HFT) parallel heterogeneous risk-gate array + priority-encoded verdict + single-cycle position read-modify-write RAM AXI4-Stream order ingress + AXI4-Stream decision egress + APB3 control/status + violation IRQ Line-rate SEC 15c3-5 risk firewall: every order runs six parallel risk gates (kill, range, halt, price-band, size, notional, position, message-cap) resolved by a priority encoder to an accept/reason verdict with a same-cycle position RMW commit — 1 order/clock, 2-cycle deterministic latency, 53.39× / 53.63× over scalar; identical decisions under randomised bubbles + backpressure and at full rate, every reason code exercised, 1024-order RMW burst + kill/IRQ, 312 orders/pass, 0 mismatches
11 Feed-Integrity Engine (HFT CRC + sequence check) error-correcting codes / market-data feed integrity (HFT) combinational GF(2) CRC-32 fold (unrolled LFSR) + AXI4-Stream framing FSM + per-channel sequence RAM AXI4-Stream packet ingress + AXI4-Lite control + integrity-failure IRQ Line-rate feed-handler integrity check: a combinational CRC-32/FCS fold verifies 4 payload bytes/clock while a framing FSM + per-channel sequence RAM catch bad CRCs and dropped-packet gaps, raising a sticky IRQ — 3.77 sustained / 3.99 peak bytes/clock, 2-cycle latency, 31.02× / 31.98× over scalar; KAT-anchored (0xCBF43926), 315 packets / 27,838 bytes per pass under randomised bubbles + full rate, 37 CRC errors + 30 gaps caught, 632 records checked, 0 mismatches
10 Bit-Pack Decode Engine (HFT columnar decompression) compression / columnar market-data decompression (HFT) streaming bit-unpack dataflow: variable-rate bit-FIFO aligner + 4-lane barrel-shift field extractor + combinational zig-zag / 4-wide delta-prefix tail AXI4-Stream compressed in + wide 128-bit AXI4-Stream decoded out + AXI4-Lite control + block-done/error IRQ Line-rate columnar (FOR + delta + zig-zag + bit-pack) feed decompression: a 192-bit variable-rate bit-FIFO feeds a 4-lane barrel-shift extractor and a combinational zig-zag + 4-wide delta-prefix tail retiring up to 4 int32 values/clock at 5-cycle latency, 1.86 sustained / 4.00 peak values/clock, 20.76× / 39.85× over scalar; 268 blocks / 67,171 values / 138,438 checked decodes, 0 mismatches
9 Alpha-Signal Engine (HFT streaming signals) quantitative finance / real-time trading signals (HFT) deeply-pipelined fixed-point datapath + single-cycle read-modify-write per-symbol state loop + unrolled integer sqrt/divider AXI4-Stream ticks in + AXI4-Stream signals out + AXI4-Lite control + alert IRQ Ultra-low-latency "alpha in the wire": per-symbol fast/slow EWMA + rolling variance in a single-cycle RMW symbol RAM feed a 32-stage integer sqrt then 48-stage divider to emit a z-score / momentum / alert record every tick at a sustained 1.000 ticks/clock, 84-cycle deterministic latency, 54.73× / 83.00× over scalar; 264 streams / 57,959 ticks / 115,918 checked records, 0 mismatches
8 CAM Limit Order-Book / BBO Engine networking / market-data (HFT) content-addressable price-level map (associative memory) + log-depth BBO comparator trees AXI4-Stream ingress + MMIO control/snapshot + BBO-update IRQ Ultra-low-latency HFT book build: single-cycle parallel (side,price) match/update over 32 CAM levels, two comparator trees pick best-bid/best-ask, top of book republished 2 cycles after every message at ~1 msg/clock, 39.61× / 200.00× over scalar; 266 streams / 8,214 messages / 16,428 checked BBO records, 0 mismatches
7 CORDIC Special Function Unit (SFU) physics kernels / transcendental math iterative CORDIC engine (unified circular/hyperbolic) + SIMD lanes shared submission/completion ring buffer + gather/scatter masters + IRQ GPU SFU pool: sin/cos/exp/cosh/sinh/atan2/hypot/ln/sqrt on one shift-and-add CORDIC datapath, 4-lane SIMD, ~9 cycles/function, 34.47× / 35.58× over scalar; 264 jobs / 39,759 checked words, 0 mismatches, 1.15e-7 max error vs libm (~23 bits)
6 Philox Counter-Based RNG Engine cryptography / Monte-Carlo RNG fully-pipelined counter-based (Philox-4x32-10) datapath + SIMD lanes MMIO mailbox + doorbell + IRQ, coalesced wide masked write master GPU/cuRAND RNG core, 4-lane SIMD retires one 128-bit block/lane/clock (512 random bits/clock), 3.40 sustained / 3.71 peak draws/cycle (4.0 ideal), 441.95× / 481.76× over scalar; 294 jobs / 276,808 checked words, 0 mismatches
5 Bilinear Texture-Filter Engine image / video processing line-buffer window + 2×2 texel gather + Q16.16 bilinear blend mailbox + doorbell + IRQ, coalesced wide memory master GPU texture unit, two-row line buffer retires one filtered pixel/clock, 0.67 sustained / 0.97 peak pixels/cycle (1.0 ideal), 22.49× / 32.35× over scalar; 290 jobs / 314,316 pixels, 0 mismatches
4 Tiled Bitonic Sort Accelerator search acceleration / sorting pipelined Batcher bitonic sorting network (compare-exchange lane array) MMIO + coalesced wide-DMA master + IRQ GPU block-sort primitive, 10-stage / 80-cell network retires one 16-key (512-bit) tile/clock, 13.18 sustained keys/cycle (16.0 ideal), 105.43× / 116.20× over scalar; 286 jobs / 275,984 checked keys, 0 mismatches
3 Parallel Prefix-Sum (Scan) Engine graph analytics / parallel primitives parallel-prefix (Kogge-Stone) tree w/ carry chaining APB + descriptor-driven wide DMA GPU scan primitive, 16-lane prefix tree, 15.06 sustained words/cycle (16.0 ideal), 45.18× over scalar; 292 jobs / 257,960 checked outputs, 0 mismatches
2 Systolic GEMM Accelerator ML inference output-stationary systolic array Wishbone B4 8×8 INT8 MAC array with K-accumulate tiling, up to 64 MAC/cycle, 49.35× over scalar; 273 jobs / 17,152 checked outputs, 0 mismatches
1 Streaming FIR Accelerator DSP streaming dataflow w/ FIFO backpressure AXI4-Lite + AXI4-Stream Transposed-form FIR, 8 MAC/cycle, ~1 sample/clock, 7.88× over scalar; 1354-sample differential test, 0 mismatches

Layout

dayN - <project_name>/
├── README.md          project write-up (problem, partition, architecture, results)
├── Makefile           make sw | sim | metrics | elab | synth | formal | all
├── docs/              banner.svg, block_diagram.svg, waveform.svg
├── rtl/               synthesizable sources
├── tb/                testbench + golden vectors
├── sw/                firmware / driver / host application + reference
├── scripts/           build, metric extraction, diagram generation
└── results/           metrics.md (committed) + sim.log/vcd (generated)

License

MIT — see LICENSE.

About

A daily portfolio of complete hardware/software co-design projects: parameterized SystemVerilog accelerators with real HW/SW interfaces, C/host software, and self-checking differential verification (Icarus Verilog).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages