
This document describes the live RTL implementation of tt_um_crockpotveggies_neuron.sv.
The active design is a programmable, event-driven neuron core with:
The old primitive-composition architecture is no longer the active design.
The wrapper owns the TinyTapeout boundary:
tt_cmd_tThese are shared infrastructure for the wrapper boundary, event queue, and packed structs/constants.
neuron.sv is the core top. It owns the event scheduler and sequences one micro-op per cycle for each in-flight event.
The design is event-driven, not free-running.
CMD_EVENT pushes events into the 2-entry FIFO.That gives the core:
Important constraints:
vector_base[tag] plus ucode_len_rneuron_exec is combinational, but the overall core is a clocked state machineThe core stores eight signed 4-bit registers:
R0 = VR1 = IR2 = THR3 = RR4 = T0R5 = T1R6 = WR7 = AUXAll arithmetic saturates to -8..+7.
The core also stores:
last_sid[3:0]last_tag[1:0]last_time[5:0]spike_flaghave_outout_data_r[7:0]neuron_weight_bank.sv stores 16 signed 4-bit entries, but the committed legal values are always ternary:
-10+1Both direct host writes and STDP_LITE writeback are clamped into that set.
neuron_ucode_store.sv stores 16 words of 16 bits each.
CMD_UCODEucode_ptr_r[0] selects low vs high byteucode_ptr_r[4:1] selects one of the 16 wordsThe core is programmed through:
CMD_CSRCMD_WEIGHTCMD_UCODEThe event path (CMD_EVENT) only feeds the FIFO.
neuron_csr.sv owns:
CSR_CTRL pulse decodeucode_ptr_rucode_len_rvector_base0_r..vector_base3_rinit_rf_flatDefault reset image:
V = 0I = 0TH = +7R = 0T0 = 0T1 = 0W = 0AUX = 0rst_n = 0This clears:
ena = 0This clears runtime state aggressively:
neuron_state reloads init_rf_flatTriggered by CSR_CTRL.bit0.
This reloads the live runtime state from init_rf_flat and clears:
last_sid, last_tag, last_timespike_flagIt does not erase microcode or the persistent weight bank.
CSR_CTRL also provides:
bit1: clear held output beatbit2: clear the event FIFOsid[3:0], tag[1:0], event_time[5:0]00 -> 001 -> +111 -> -110 -> treated as 0uo_out[7:0] is the held output beat:
uo_out[7] = 1uo_out[6:5] = emitted taguo_out[4:1] = last_siduo_out[0] = spike_flagThe beat is held until acknowledged on uio_in[1].
event_time is captured by RECV and stored in last_time, but the current core does not automatically compute decay from timestamp deltas.
All decay remains explicit and shift-based:
LEAKTDECREFRACT| # | Input | Output | Bidirectional |
|---|---|---|---|
| 0 | IN_DATA[0] (addr[0]) | OUT_DATA[0] | IN_REQ (in) / IN_ACK (out) |
| 1 | IN_DATA[1] (addr[1]) | OUT_DATA[1] | OUT_ACK (in) / OUT_REQ (out) |
| 2 | IN_DATA[2] (addr[2]) | OUT_DATA[2] | CFG_OP[0] (in) |
| 3 | IN_DATA[3] (addr[3]) | OUT_DATA[3] | CFG_OP[1] (in) |
| 4 | IN_DATA[4] (addr[4]) | OUT_DATA[4] (type[0]) | CFG_ARG[0] (in) |
| 5 | IN_DATA[5] (addr[5]) | OUT_DATA[5] (type[1]) | CFG_ARG[1] (in) |
| 6 | IN_DATA[6] (polarity) | OUT_DATA[6] (type[2]) | CFG_ARG[2] (in) |
| 7 | IN_DATA[7] (is_tick) | OUT_DATA[7] (valid) | CFG_ARG[3] (in) |