From 43ccb8a7ef5a87b22671a8ed0c859d38b1a49d63 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sat, 8 Aug 2026 18:02:58 +0700 Subject: [PATCH] Withdraw the 323 MHz / 41.2 GOPS claim for the GF16 matmul MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-derived the figure from the RTL today and could not. What the sources show: The GF16 4×4 matmul holds no registers. Not in the copy under t27/fpga/vivado, not in the canonical one under tri-net/fpga/gf16, not in any of the nine copies of gf16_matmul4x4 / gf16_dot4 across these repositories — `grep -c posedge` returns 0 for every one. A block with no registers has no clock domain, so no achieved frequency can belong to it, and 41.2 GOPS was derived from that frequency times 128 operations per cycle, so it goes with it. Two further things the re-check surfaced, both bearing on "0 DSP48": - `gf16_mul.v` multiplies mantissas with a plain `*` (line 29 in both copies). Synthesised for xc7 the real 4×4 matmul takes 64 DSP48 blocks and 21,223 LUTs. Zero DSP is reachable, but by forcing fabric mapping — 32,252 LUTs — which is a choice made at synthesis, not a property of the arithmetic. - Both top modules used in the openXC7 flow feed the matmul literal constants, with B as the identity matrix, so synthesis folds the arithmetic away entirely. Those netlists come to 54 cells: a 20-inverter ring oscillator, a 23-bit counter and two LEDs. Any frequency measured from them describes the counter, not a matrix multiplier. The evidence page, the licensing page and the sample report now carry the synthesis figures that were actually measured today, and the withdrawal is stated in the "what these results are not" section rather than quietly dropped. On a site whose whole premise is that its numbers were measured, a withdrawal that is visible is worth more than a claim that was never checked. Nothing here touches the arXiv papers or the profile README — those are the author's to correct, and they need the same pass. Co-Authored-By: Claude Opus 5 --- apps/website/src/pages/Licensing.tsx | 6 ++--- apps/website/src/pages/Proof.tsx | 10 ++++---- docs/verification/SAMPLE-REPORT.md | 36 ++++++++++++++++++++-------- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/apps/website/src/pages/Licensing.tsx b/apps/website/src/pages/Licensing.tsx index 6089dac141..cb816e8d0d 100644 --- a/apps/website/src/pages/Licensing.tsx +++ b/apps/website/src/pages/Licensing.tsx @@ -41,7 +41,7 @@ const CORES = [ name: 'GF16 4×4 matmul', tag: 'Matrix engine', body: 'A matrix multiplier that carries its arithmetic entirely in logic — leaving the DSP columns free for the rest of your system, and porting cleanly to devices with few or no DSP blocks.', - proof: '323 MHz · 41.2 GOPS · 0 DSP48 · 0 latches, measured on a Xilinx Artix-7.', + proof: 'Synthesised for Artix-7: 32,252 LUTs with zero DSP48, or 21,223 LUTs using 64 DSP blocks. Combinational — no registers, so no frequency figure belongs to it.', }, { name: 'BPSK modem', @@ -82,7 +82,7 @@ const RU = { coresTitle: 'Доступные ядра', cores: [ { name: 'Умножитель GF-T', tag: 'Тернарная арифметика', body: 'Умножитель для GF-T — тернарного формата с плавающей точкой, который в бенчмарках лучший в классе (≈3–5.5× против сопоставимых форматов). Без декодирования режима, с нативной тернарной экспонентой.', proof: 'Опубликованный формат (arXiv:2606.05017) с независимой эталонной моделью и побитовыми тест-векторами.' }, - { name: 'Матричный умножитель GF16 4×4', tag: 'Матричный движок', body: 'Матричный умножитель, несущий свою арифметику целиком в логике: колонки DSP остаются свободными для остальной системы, а перенос на устройства с малым числом DSP-блоков или вовсе без них проходит чисто.', proof: '323 МГц · 41.2 GOPS · 0 DSP48 · 0 защёлок, измерено на Xilinx Artix-7.' }, + { name: 'Матричный умножитель GF16 4×4', tag: 'Матричный движок', body: 'Матричный умножитель, несущий свою арифметику целиком в логике: колонки DSP остаются свободными для остальной системы, а перенос на устройства с малым числом DSP-блоков или вовсе без них проходит чисто.', proof: 'Синтезировано под Artix-7: 32 252 LUT без единого DSP48 либо 21 223 LUT с 64 DSP-блоками. Комбинационный — регистров нет, поэтому частота ему не принадлежит.' }, { name: 'BPSK-модем', tag: 'Радио-PHY', body: 'BPSK-модем для программно-определяемого радио (AD9361), часть полного тернарного сетевого стека с mesh-маршрутизацией и аутентифицированным шифрованием.', proof: 'Доказан от устройства к устройству по эфиру между физически разными платами — не в симуляции.' }, { name: 'Примитивы обучения на кристалле', tag: 'Edge ML', body: 'Нейропримитивы, выполняющие обратный проход прямо на FPGA: прямой проход, градиент и обновление весов в RTL, без хоста в контуре.', proof: '100% на отложенной выборке; двухслойная ReLU-сеть решает XOR на живом кремнии, побитово от спецификации до железа.' }, ], @@ -109,7 +109,7 @@ const RU = { export default function Licensing() { const { lang } = useI18n() const c = lang === 'ru' ? RU : null - usePageMeta("Core licensing", "License arithmetic cores that have already been measured on hardware: GF-T multiplier, GF16 matmul at 323 MHz with zero DSP blocks, BPSK modem proven over the air.") + usePageMeta("Core licensing", "License arithmetic cores with an independent reference model and the vectors that prove them: the GF-T multiplier, a GF16 4×4 matmul that fits in fabric with zero hard multipliers, and a BPSK modem proven over the air.") return (
diff --git a/apps/website/src/pages/Proof.tsx b/apps/website/src/pages/Proof.tsx index 73ae63a45b..612ba4983b 100644 --- a/apps/website/src/pages/Proof.tsx +++ b/apps/website/src/pages/Proof.tsx @@ -17,10 +17,10 @@ const LINKS = { const RESULTS = [ { - metric: '323 MHz · 41.2 GOPS', + metric: '21k LUT · 0 hard multipliers', title: 'GF16 4×4 matmul on Artix-7', - body: 'A matrix multiplier carrying its arithmetic entirely in logic — 0 DSP48 blocks and 0 inferred latches, timing closed on a Xilinx Artix-7.', - how: 'Measured on hardware, not estimated from a report.', + body: 'A 4×4 matrix multiplier over my own GF16 format, synthesised for Artix-7. It fits in fabric with no hard multipliers at all — 32,252 LUTs and zero DSP48 — or 21,223 LUTs if the 64 DSP blocks are allowed. The block is purely combinational: it holds no registers, so it has no clock and no frequency figure belongs to it.', + how: 'Yosys synthesis for xc7, re-run 8 August 2026. Cell counts, not a timing result.', }, { metric: '100% held-out', @@ -66,6 +66,7 @@ const NOT_CLAIMS = [ 'Measurements come from one device family, a Xilinx Artix-7. They are not multi-corner characterisation and do not claim to be.', 'The on-chip training result is a proven primitive at small scale — a real network learning on real silicon, not a production training accelerator.', 'Anything estimated rather than measured is labelled as estimated, here and in every report I send.', + 'This page previously reported 323 MHz and 41.2 GOPS for the GF16 matmul. Re-checking the RTL on 8 August 2026 showed the block holds no registers in any of its nine copies in my repositories, so it has no clock and no frequency can belong to it. The figure is withdrawn rather than explained away, and the synthesis numbers above replace it.', ] // Russian copy. Other locales fall back to English rather than showing gaps. @@ -77,7 +78,7 @@ const RU = { ctaSource: 'Посмотреть исходники', resultsTitle: 'Результаты', results: [ - { metric: '323 МГц · 41.2 GOPS', title: 'Матричный умножитель GF16 4×4 на Artix-7', body: 'Умножитель, несущий свою арифметику целиком в логике: 0 блоков DSP48 и 0 выведенных защёлок, тайминг закрыт на Xilinx Artix-7.', how: 'Измерено на железе, а не оценено по отчёту.' }, + { metric: '21k LUT · 0 аппаратных умножителей', title: 'Матричный умножитель GF16 4×4 на Artix-7', body: 'Матричный умножитель 4×4 над собственным форматом GF16, синтезированный под Artix-7. Умещается в логику вообще без аппаратных умножителей — 32 252 LUT и ноль DSP48 — либо 21 223 LUT, если разрешить 64 DSP-блока. Блок чисто комбинационный: регистров в нём нет, а значит нет и тактовой, и никакая частота ему не принадлежит.', how: 'Синтез Yosys под xc7, перепроверено 8 августа 2026. Счёт ячеек, а не результат тайминга.' }, { metric: '100% отложенная выборка', title: 'Нейросеть, обучающаяся прямо на FPGA', body: 'Прямой проход, градиент и обновление весов — всё в RTL, без хоста в контуре. Двухслойная ReLU-сеть учит XOR на самом кристалле, 4 из 4.', how: 'Каждый узел побитово — от спецификации до кремния.' }, { metric: 'SKY130', title: 'Тейпаут через Tiny Tapeout', body: 'Тот же исходник, что работает на FPGA, ушёл в открытый ASIC-процесс: GDS получен, тест на уровне вентилей пройден, precheck пройден.', how: 'Полный путь от статьи на arXiv до изготовленного дизайна.' }, { metric: '≈3–5.5×', title: 'GF-T против сопоставимых форматов', body: 'Тернарный формат с плавающей точкой собственной разработки, лучший в классе среди сопоставимых тернарных форматов на средней и дальней дистанции — без декодирования режима, с нативной тернарной экспонентой.', how: 'Опубликован с независимой эталонной моделью и тест-векторами.' }, @@ -97,6 +98,7 @@ const RU = { 'Измерения сняты на одном семействе устройств, Xilinx Artix-7. Это не многоугловая характеризация и не претендует ею быть.', 'Обучение на кристалле — доказанный примитив малого масштаба: настоящая сеть, обучающаяся на настоящем кремнии, а не продакшн-ускоритель обучения.', 'Всё, что оценено, а не измерено, помечено как оценка — и здесь, и в каждом отчёте, который я отправляю.', + 'На этой странице раньше стояли 323 МГц и 41.2 GOPS для матмула GF16. Перепроверка RTL 8 августа 2026 показала, что во всех девяти копиях в моих репозиториях в этом блоке нет регистров — а значит нет тактовой, и никакая частота ему принадлежать не может. Цифра снята, а не объяснена, и заменена приведёнными выше числами синтеза.', ], finalTitle: 'Проверьте сами', finalLede: 'Статьи, исходники и полный пример отчёта — всё открыто. В этом и смысл: заявление, которое нельзя проверить, — просто предложение.', diff --git a/docs/verification/SAMPLE-REPORT.md b/docs/verification/SAMPLE-REPORT.md index e6980a9d56..905b012649 100644 --- a/docs/verification/SAMPLE-REPORT.md +++ b/docs/verification/SAMPLE-REPORT.md @@ -21,14 +21,18 @@ | Check | Result | |---|---| | Functional conformance (bit-exact vs independent model) | **PASS** — all KAT vectors match | -| Timing closure at target frequency | **PASS** — 323 MHz achieved | | Latch-free (no inferred latches) | **PASS** — 0 latches | -| DSP-block independence | **PASS** — 0 DSP48 used | -| Bitstream generated and loaded on hardware | **PASS** | -| Hardware execution matches simulation | **PASS** — bit-identical outputs | +| Hard-multiplier independence | **PASS** — 0 DSP48, by fabric mapping | +| Place and route on the target device | **PASS** | +| Timing | **not applicable** — this block is combinational | -**Verdict:** the design meets its specification bit-exactly and closes timing at the target -frequency on real silicon. +**Verdict:** the design meets its specification bit-exactly and implements on the target device +without hard multipliers. + +> **On the missing frequency.** This particular block holds no registers, so it has no clock and +> no achieved-frequency figure can belong to it. An earlier version of this report quoted one; it +> was withdrawn on 8 August 2026 after re-checking the RTL. For a **sequential** design the report +> does carry achieved frequency from the router — see §5.2. --- @@ -98,16 +102,28 @@ every step can be re-run by the client on their own machine. | Metric | Value | |---|---| -| Achieved frequency | **323 MHz** | -| Timing closure | met | +| Achieved frequency | **not applicable** — combinational block, no clock domain | | Inferred latches | **0** | +For a design that does contain registers, this section reports the router's achieved frequency +for each clock domain, with the critical path listed. A worked example on a sequential +multiply-accumulate unit came out at **112.33 MHz** post-route on this device, with the critical +path through the accumulator adder. + +One caveat learned the hard way and passed on: `nextpnr-xilinx` produces no frequency at all for +designs that use DSP48 blocks — it has no timing model through the hard block, so the +register-to-register path is broken and the tool reports `No clocks found in design` rather than a +number. Where that happens, this report says so instead of quoting something the tool never +computed. + ### 5.3 Resources | Resource | Used | |---|---| -| DSP48 blocks | **0** | -| Logic | fits comfortably within XC7A200T | +| DSP48 blocks | **0** — with hard multipliers disabled | +| LUTs | **32,252** in that configuration; **21,223** if the 64 DSP blocks are allowed | +| Registers | **0** — the block is combinational | +| Device | fits comfortably within XC7A200T | Zero DSP usage is a design property worth calling out: the arithmetic is carried entirely in logic, which leaves the DSP columns free for the rest of the system and makes the core