---
name: reference-ssm-zoh-lut-fpga-config-2026-08-13
description: Rei SSM (Mamba selective scan) の FPGA target 実装 config lookup。 168 scenarios spike で 決定した 「512 entries × Q1.15 × linear 補間 × 1 BRAM block」 の 具体値。 Tang Console 138K / Nano 9K 双方 適用可能、 Phase 2 で Verilog 実装 する 時の 前提知識
metadata: 
  node_type: memory
  type: reference
  originSessionId: c3511ef5-c9e4-4d3d-ad7e-1dd6a9c51580
  modified: 2026-08-13T22:01:03.883Z
---

# SSM Q-format + ZOH LUT FPGA implementation config (reference)

> ★ **Update 2026-08-14 (Phase 2 (a) 実測反映)**: config 自体 (512 entries × Q1.15 × linear × 1 BRAM) は **有効維持**。精度保証文言のみ以下に更新:
> - 従前: 「Q1.15 で max rel error < 1%」(N=1 前提)
> - 更新: **「Q1.15 で N ≤ 16 の worst-case rel error ≤ 2% (per-dim + output aggregation 込み)、T-bounded」**
>
> 詳細: [[project-ssm-phase2a-multidim-drift-2026-08-14]] (N=16, T=100k まで bounded 確認)

Rei の Mamba-family SSM を FPGA (Tang Console 138K / Nano 9K) に 実装する 時の 決定 config。 2026-08-13 evening の 3-spike arc ([[project-ssm-qformat-3spike-arc-2026-08-13]]、 168 scenarios × up to 100k steps) の 実測 evidence 由来。

**When to use**: Phase 2 で Verilog / rei-fpga JSON IR を 書く 時、 本 config を default 前提として 参照。 特別な 制約 (BRAM tight / longer time constant / larger input dynamic range) が ある 場合のみ 逸脱を 検討。

## 決定 config

| 項目 | 値 | 根拠 |
|---|---|---|
| **State precision** | **Q1.15** (16-bit signed、 1 sign + 15 fractional) | Spike 2: max relative error < 1% を 全 test scenario で 達成、 Q1.7 は unusable (68× drift)、 Q1.23/31 は area 過剰 |
| **exp() implementation** | **Look-Up Table (LUT)** | FPGA で exp() 直接 は 実用外、 LUT が 標準 |
| **LUT input range** | **z ∈ [-5, 0]** | A_cont ∈ [-1, 0] × Δ_t ∈ [0, 5] の Mamba 典型範囲 cover |
| **LUT size** | **512 entries** | Spike 3: 512 で Q1.15 量子化 floor に 到達、 それ以上は 頭打ち |
| **LUT entry precision** | **Q1.15** (16-bit) | state と 同 precision で 整合 |
| **LUT interpolation** | **linear (必須)** | Spike 3: nearest は 全 size で unusable (cumulative bias で 66× drift)、 linear で 0.27% relative error |
| **LUT storage** | **1 BRAM block** (16 kbit) | 512 × 16-bit = 8 kbit、 Tang 標準 16 kbit BRAM block に 余裕 fit |
| **State dimension (1-D スケール)** | 1 per LUT | 本 arc は 1-D verify、 multi-dim は 未 test |

## FPGA area 見積 (Tang Console 138K / Nano 9K)

**1-D SSM (本 arc verify 済)**:
- LUT: 1 BRAM block
- State register: 16-bit (LUT block とは 別)
- Multiplier: 1 個 (18-bit DSP block)
- 累計: **BRAM 1 個 + DSP 1 個 + register ~16 bit** = 極少 area

**Multi-dim SSM N=16 (Mamba 標準、 未 test)**:
- LUT 共通 or 個別 (実装選択):
  - 共通 (1 LUT for all channels): BRAM 1 個、 但し throughput 制約 (逐次 access)
  - 個別 (16 LUT parallel): BRAM 16 個 = 32 kbit
- Tang Nano 9K BRAM 総容量 ~46 kbit → 個別 16 LUT で **70% 使用**、 tight だが fit 可能
- Tang Console 138K BRAM 総容量 数百 kbit → **余裕**

**Multi-dim N=64 (実 Mamba 大 model 相当)**:
- 個別 LUT で 128 kbit BRAM = Tang Nano 9K では **overflow**
- Tang Console 138K target 前提

## 性能 見積 (Q1.15 での 誤差 profile)

Spike 3 実測 (T=100000、 A_cont ∈ [-0.1, -0.001]):

| metric | 値 | 意味 |
|---|---|---|
| max relative error (worst scenario) | 0.27% | Q1.15 floor 到達、 これ以上 は 精度改善しない |
| max absolute deviation | 0.19 | state magnitude ~74 に対して |
| A_t_q が |1| に 触る 頻度 | 稀 (Q1.15、 selective) | 0-2 回 / 100k steps |
| Trajectory 発散 | 0 件 / 全 scenarios | Q1.15 では stable |

## LUT precomputation

Python side で 事前計算 (spike 3 script 参照):
```python
z_grid = np.linspace(-5.0, 0.0, 512)  # 512 entries
lut_values = np.exp(z_grid)            # ≈ [0.00674, ..., 1.0]
lut_values_q15 = round(lut_values * 32768) / 32768  # Q1.15 quantize
# → BRAM initialization file
```

Verilog / rei-fpga JSON IR 側で 参照 する 時は BRAM init file 形式 (Gowin `.mi` format 等) に 変換。

## 誤差 mode 分類 (spike 3 で 確認)

| 誤差 source | 相対 magnitude | 対策 |
|---|---|---|
| LUT grid step (linear 補間後) | ~0.003% | 512 entries + linear で 抑制済 |
| Q1.15 量子化 (state) | ~0.003% | precision 上げれば 改善、 area cost あり |
| Cumulative drift (long T) | 上記 の O(√T) 集積 | Q1.15 で T=100k まで < 1% error 実測 |
| Overflow (state >1) | scenario 依存 | saturation logic 必要、 未 test |

## 未 verify 項目 (Phase 2 で 追加 spike 必要)

1. **Multi-dim state (N=16)**: LUT × N の cross-channel interference、 累積誤差 の scaling
2. **ZOH 中間計算 精度**: `A_cont * Δ_t` の 計算 も Q1.15 で 十分か、 中間精度 Q1.31 必要か
3. **Softplus 計算**: `Δ_t = softplus(k*x+b)` も LUT 化 必要 → 別 LUT、 area 増
4. **Input scale 大**: 音響 signal (10x normal scale) の overflow 挙動、 clip vs saturate policy
5. **Overflow / saturation 挙動**: state magnitude が Q1.15 range [-1, 1) を 超えた 場合 の policy (clip / wrap / signal)

## Chat-Claude 元 提案 との 対応

Chat-Claude 2026-08-13 evening:
- 「CPU 上 固定小数点 selective scan 1 本」 → **本 config は spike 1-3 の 3 段 完了、 chat-Claude scope 以上 到達**
- 「FPGA (Tang Console 138K) に port」 → 本 config で **直接 port 可能** (別 STEP、 Phase 2 candidate (b))
- 「MLIR D-FUMT₈ dialect」 → 別 branch、 本 config は そこに 統合可能 (Q-format arithmetic + LUT を dialect で 表現)

## 関連

- [[project-ssm-qformat-3spike-arc-2026-08-13]] — 本 config 決定の 3-spike arc 完全記録
- [[project-benchtop-harness-phase3-full-arc-2026-08-13]] — 本日 evening の 別 arc、 同 「実測 で config 決定」 精神系
- [[feedback-external-verify-beats-internal-review-4patterns-2026-08-13]] — chat-Claude thesis を 実測で refine する pattern 継承
- [[feedback-no-rush-publication]] — Phase 2 は 藤本さん digest 挟んで judgment
- Rei 過去 asset: STEP 1029 D-FUMT₈ ALU on Tang Console NEO (Verilog pattern reference)、 STEP 1038 Tang Nano 9K silicon programming、 STEP 1039 D-FUMT₈ ALU port on Tang Nano 9K

## Version

- v1 initial: 2026-08-13 evening、 3-spike arc close 時、 藤本さん 「(d) memory 化」 signal per。 168 scenarios evidence base 由来 の decision reference。
