100 Neuromorphic PUF (distinct-tap LFSR arbiter + memristor XOR, GF180)

100 : Neuromorphic PUF (distinct-tap LFSR arbiter + memristor XOR, GF180)

Design render
  • Author: Prof. Santhosh Sivasubramani, IIT Delhi
  • Description: GF180mcuD digital Physical Unclonable Function: 8 distinct-tap maximal-length 10-bit LFSRs act as synthesizable virtual ring-oscillators, a 6-bit challenge selects a pair, and an arbiter FSM compares their popcounts over a programmable 2^N-cycle window (N in 4..12) to produce a response bit. 64 challenges accumulate into a 64-bit response that can be XORed with a host-loaded memristor vector for dual-entropy mode. SPI-programmable, IRQ output, 25 MHz signoff clock, 1x2 tile (upsized from 1x1: global-placement utilization 103.6% on 1x1).
  • GitHub repository
  • Open in 3D viewer
  • Clock: 25000000 Hz

How it works

A compact digital Physical Unclonable Function (PUF) for TinyTapeout GF 26a that derives a 64-bit device-unique signature by running an arbiter between eight distinct-tap maximal-length LFSRs and optionally XORing the result with a host-loaded 64-bit "memristor vector" for dual-entropy mode.

Because free-running combinational ring oscillators are rejected by the standard-cell ASIC flow (Yosys logic-loop check), this design replaces them with eight clocked 10-bit LFSRs, each with a distinct maximal-length tap polynomial. Their output bits have data-dependent popcounts over a given window, giving the challenge-response asymmetry of an RO-PUF without the non-synthesizable feedback loop.

Architecture

  +----------+   +------+
  | LFSR_0   |-->|      |
  |  taps    |   |  8:1 |  bit_a --+     +---------+
  |  {9,6}   |   | mux  |          |     |         |
  +----------+   |      |          +---->| counter |---> cnt_a
       :        |      |                |   A     |
  +----------+  |      |                +---------+
  | LFSR_7   |->|      |                                   +-----+
  | {9,8,5,2}|   +------+                                   |cmp  |-> resp_bit
  +----------+       ^                                      | >   |
                     |                                      +-----+
                +----+----+  idx_a = challenge[5:3]             ^
                | challenge|  idx_b = challenge[2:0]             |
                +---+------+                                    |
                    |  bit_b --+     +---------+                |
                    +--------->| counter |----> cnt_b -----------+
                               |   B     |
                               +---------+

  Every 2^N cycles (N in 4..12) one response bit is latched into resp[63:0]
  at position `challenge`. Optional XOR with mem_vec[63:0] for dual-entropy.

LFSR taps (all maximal-length, Xilinx XAPP052)

LFSR Taps Seed
0 {9, 6} 0x001
1 {9, 5} 0x002
2 {9, 4} 0x004
3 {9, 2} 0x008
4 {9, 7, 6, 5} 0x010
5 {9, 8, 7, 4} 0x020
6 {9, 8, 6, 3} 0x040
7 {9, 8, 5, 2} 0x080

SPI register map (16-bit frame, mode-0, MSB first)

Addr Name Description
0x00 R_CTRL {irq_en, —, —, clear_resp, mem_xor_en, —, start, global_en}
0x01 R_CHAL 6-bit current challenge (idx_a = [5:3], idx_b = [2:0])
0x02 R_CYCLES {—, —, —, run_sweep, cyc_exp[3:0]} — effective exp clamped 4..12
0x03 R_CHAL_MAX 6-bit max challenges in sweep (1..64)
0x04..0x0B R_RESP0..7 64-bit response (LSB byte at 0x04)
0x0C..0x13 R_MVEC0..7 64-bit memristor vector (host write)
0x1E R_STATUS {busy, done_sticky, irq_sticky, …}
0x1F R_CHAL_IDX current challenge index within the sweep
0x20 R_W1C write 1<<6 to clear done, 1<<5 to clear irq

Degenerate challenges

Challenges where idx_a == idx_b (8 of the 64: 0x00, 0x09, 0x12, 0x1B, 0x24, 0x2D, 0x36, 0x3F) would always produce cnt_a == cnt_b and thus a deterministic response bit of 0 — useless for PUF entropy. The arbiter substitutes the corresponding mem_vec bit instead, so the host can either skip these positions (treat them as the loaded fingerprint) or dual-entropy them by setting mem_xor_en=1.

Pinout

  • ui_in[7:0] — reserved (tied off)
  • uo_out[7:0] — live mirror of resp[0] (low byte of response)
  • uio[0..3] — SPI (cs_n, mosi, miso, sck)
  • uio[4] — busy
  • uio[5] — done (sticky)
  • uio[6] — irq (sticky)
  • uio[7] — reserved

How to test

# generate response
spi_write(R_CYCLES, 0x14)         # run_sweep=1, cyc_exp=4 (16 cycles/chal)
spi_write(R_CHAL_MAX, 64)
spi_write(R_CTRL, 0x03)           # global_en=1, start=1
wait (status.done == 1)
read R_RESP0..R_RESP7             # 64-bit PUF response
spi_write(R_W1C, 0x40)            # clear done

Apply a mem_vec and retry with R_CTRL = 0x0B (global_en + start + mem_xor_en) to fold in the host-supplied entropy.

External hardware

None required. The PUF derives its entropy from the LFSR arithmetic; the mem_vec input lets an external memristor / OTP array or MCU contribute additional entropy through normal SPI writes.

IO

#InputOutputBidirectional
0reserved (tied-off, available for future memristor-byte live override)resp[0][0] (live mirror of R_RESP0 bit 0)spi_cs_n
1reservedresp[0][1]spi_mosi
2reservedresp[0][2]spi_miso
3reservedresp[0][3]spi_sck
4reservedresp[0][4]busy (out)
5reservedresp[0][5]done (out, sticky)
6reservedresp[0][6]irq (out, sticky)
7reservedresp[0][7]reserved (driven low)

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (Tiny Tapeout Factory Test) tt_um_Vincent2405_adder_tree (BSD Convolution Adder Tree) tt_um_BastiBudde_i2c_slave_sensor (I2C Slave Template with Emulated Sensor) tt_um_60hz_load (60 Hz Grid-Forming ASIC with Dump-Load Control) tt_um_spi_config_reg (Simple SPI configuration for analog designs) tt_um_ex_drosen766 (Project) tt_um_spi_cpu_top (SPI-CPU) tt_um_d5smith_mfa (Music for ASICs) tt_um_i2c_master (I2C Master Controller) tt_um_aswarby_mac (Aswarby INT8 MAC) tt_um_arrakeen_spsram_direct (TT-Arrakeen-SPSRAM-direct) tt_um_alu (8-bit Interactive ALU) tt_um_JCT_PoC (ttgf jct PoC) tt_um_jct_lea (LEA-128) tt_um_cwru_cpu (CWRU CPU) tt_um_teapot (100Mbps Ethernet Accelerator Wrapper) tt_um_jte_cordic (CORDIC sin/cos generator) tt_um_aidenkoch4 (Three Channel RGB PWM Controller) tt_um_pschuetz_tremolo (Tremolo guitar pedal ASIC) tt_um_jsabree11_fibonacci_checker (fibbonaci_tt) tt_um_connerdaehler_boop (Procedural ASIC) tt_um_Kieckenwama_Traffic_LIGHT_FSM (Traffic Light FSM) tt_um_KimLuu02_WashingMachine_FSM (WashingMachine_FSM) tt_um_PaulineKreis_PWM_Analyser (PWM-Analyser) tt_um_PWM (PWM Generator) tt_um_wokwi_466666882406199297 (Simple Sprinkler) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_spi_master (SPI Master Slave Communication) tt_um_likitha_trng (Secure TRNG Entropy Generator) tt_um_wnn (8-bit WNN Pattern Recognizer) tt_um_raksha (Raksha) tt_um_uart_soc (UART_SOC) tt_um_ecdsa_verify (ECDSA Verification) tt_um_ecc_processor (ECC Processor) tt_um_fast_auth (Fast Authentication Accelerator) tt_um_karthik_trng (TRNG using Ring Oscillator) tt_um_push (Secure V2X Mini Demonstrator) tt_um_santosh_aes_sbox (AES S-Box Accelerator) tt_um_hardware_anomaly_detection (Hardware Anomaly Detection) tt_um_multi_protocol (Multi-Protocol Communication Controller) tt_um_pqc_ntt_butterfly (PQC NTT Butterfly Core) tt_um_cambridge_nlfsr (Programmable Chaotic NLFSR) tt_um_4b_accumulator_cpu (4 bit Accumulator CPU) tt_um_spi_slave (SPI Slave with 8-Register File) tt_um_geeta_doddamani_lfsr (4-bit Maximum-Length LFSR) tt_um_ecc_accelerator (ECC Scalar Accelerator) tt_um_egurapha_chacha20 (ChaCha20) tt_um_configurable_pwm (Configurable PWM Generator) tt_um_Arctic0 (Arctic0 16-bit CPU) tt_um_comp8 (8-bit Comparator) tt_um_pwm_cit (Configurable 8-bit PWM Generator) tt_um_rameshwar_door_lock (Digital Door Lock) tt_um_sandy_venky (8-bit LFSR Circuit) tt_um_ljhahne_pong (Pong) tt_um_v2x_warning (V2X Collision Warning) tt_um_ecc_scalar_mult (ECC Scalar Multiplication) tt_um_fhw_appel_spiPWMio (spiPWMio) tt_um_arrakeen_spsram_direct_sramrules (TT-Arrakeen-SPSRAM-direct-sramrules) tt_um_arrakeen_spsram_direct_5v (TT-Arrakeen-SPSRAM-direct-5V) tt_um_LukeSilva_cartrip (Car Trip) tt_um_coffeepot (100Mpbs 3 port Ethernet switch) tt_um_emiliopeju_lightscan (Lightscan) tt_um_Alanduan21_triad01_top (triad01) tt_um_lif_snn (4-Neuron LIF Spiking Neural Network) tt_um_smerity_mandelbrot (Smerity-Mandelbrot) tt_um_elvtide01_7SegmentDice (7SegmentDice) tt_um_elemental_harmony (Elemental Harmony Game) tt_um_pattern_gen (Programmable Waveform and PWM Generator) tt_um_antimatter15_pdm_vad (PDM Voice Activity Detector) tt_um_layla_spike_detector (Neural Spike Detector) tt_um_detronyx_arith_lab (Detronyx Arithmetic Lab Tile) tt_um_hasheddan_nni (Nearest Neighbor Interpolation) tt_um_brisq (BRISQ) tt_um_santhosh_spike_codec_gf (Neuromorphic Spike Codec (GF180)) tt_um_santhosh_aer_router_gf (Asynchronous-AER Spike Router (4-phase REQ/ACK, 16-entry routing table, GF180)) tt_um_santhosh_snn_wta_gf (Spiking Neural Network WTA Inference Engine (GF180)) tt_um_santhosh_cim_bist_gf (CIM Controller with BIST and Fault Map (GF180)) tt_um_santhosh_neuro_puf_gf (Neuromorphic PUF (distinct-tap LFSR arbiter + memristor XOR, GF180)) tt_um_detronyx_uart_trace_exerciser (Detronyx UART Trace Exerciser) tt_um_ro_puf (Tiny RIng Oscillator PUF) tt_um_franretfie_top (Quadrature sine generator) tt_um_cherny_xor_8bi (XORing given bits) tt_um_mealycpp_ascon_sdmc_uart (ASCON Integrated Crypto Processor) tt_um_reflex_s4 (AER Reflex Chip - MCP2515 CAN gateway) tt_um_polytrig_core (PolyTrig Digital Waveform Synthesis Core) tt_um_waferspace_vga_screensaver (Wafer.space Logo VGA Screensaver) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_urish_simon (Simon Says memory game) Available