vhlibvbf16

Статистика реализации на Xilinx Spartan-7 (XC7S15-1, XC7S15-2)

Спецификация целевых FPGA

Параметр XC7S15-1 XC7S15-2
Device XC7S15-1FTGB196C (Spartan-7) XC7S15-2CPGA196I (Spartan-7)
Package FTGB196 CPGA196
Speed grade -1 -2
Slices 2,000 2,000
LUTs (6-input / LUT6) 8,000 (2,000 × 4) 8,000 (2,000 × 4)
Flip-Flops 16,000 16,000
Block RAM (36Kb) 10 (360 Kb total) 10 (360 Kb total)
DSP48E1 20 20
Max Clock (typical) ~250–400 MHz для простых путей ~280–450 MHz для простых путей

Важно: Все цифры ниже — оценки на основе ручного подсчёта по RTL-коду с учётом типовых задержек Xilinx Spartan-7 (LUT6 I→O ≈ 0.36..0.42 ns, CARRY4 carry/bit ≈ 0.042..0.050 ns, FF setup ≈ 0.45..0.52 ns, clk→Q ≈ 0.59..0.68 ns, routing-коэффициент ≈ 1.35..1.40). Реальный синтез в Xilinx Vivado не выполнялся, отчётов report_timing нет. Ожидаемая погрешность без реального синтеза — ±20–25%. Для точного Fmax необходимо запустить synth_design + report_timing с .xdc ограничением на тактовую частоту.

Методика оценки Fmax

Fmax определяется самым длинным комбинационным путём между регистрами (reg-to-reg) плюс время установки (setup) выходного триггера:

T_clk ≥ T_clk→Q + T_logic(max path) + T_routing + T_setup
Fmax = 1 / T_clk

Speed grade -2 примерно на 12–15% быстрее speed grade -1. Routing задержка оценивается как +35..40% к чистой логике.

Правила подсчёта LUT6:


Top-level модули

1. vhfastmulb16_mul_bf16_bf16_bf16_rtz_lat3 (RTZ — Round Toward Zero)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~392 (350–440) ~392 (350–440) ~4.9%
FF (регистры) ~151 ~151 ~0.9%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~180–205–240 MHz ~200–225–260 MHz —
Рабочая частота (typ) ~205 MHz ~225 MHz —

Распределение по подмодулям:

Подмодуль LUTs FF Примечание
mul_u8_u8_u16_lat2 (4× mul4x4 + CSA-дерево + CPA) ~208 48 4× CSA-структура + 2 уровня CSA + 16-битный CPA (carry chain)
add8x8_lat2 ~18 19 9-bit add + 9-bit sub (константа 127), carry chain
sign ~1 3 1 XOR
except_lat2 (включая 2× flags_lat1) ~54 63 флаги, классификация NaN/Inf/Zero, NaN payload mux
FTZ + mux эффективных операндов ~52 2 FTZ-детект, mux exp/frac/man (2:1, 7–8 бит)
exp_norm + под-/переполнение ~25 0 9-битный инкремент, компараторы vs 381/254
man_norm mux (7 бит) ~7 0 2:1 мультиплексор
c_next приоритетный mux (5 ветвей × 16 бит) ~32 0 выбор результата
en_pipe + выходной регистр c (16 бит) ~2 18 2 FF для en_d1/d2, 16 FF для c
ИТОГО ~392 ~151  

2. vhfastmulb16_mul_bf16_bf16_bf16_rne_lat3 (RNE — Round to Nearest Even)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~427 (380–480) ~427 (380–480) ~5.3%
FF (регистры) ~151 ~151 ~0.9%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~160–180–210 MHz ~180–200–230 MHz —
Рабочая частота (typ) ~180 MHz ~200 MHz —

Разница с RTZ (+35 LUTs):

Компонент Доп. LUTs Причина
man_shifted mux + G/R/S/LSB extract +13 выбор нормализованной мантиссы и битов округления
Инкремент man_shifted при round_up (8 бит + carry) +9 carry-chain сумматор 9 бит
exp_inc (инкремент экспоненты на 0/1/2) +2 комбинированный инкремент
exp_norm = exp_sum + exp_inc (9-битное сложение вместо инкремента) +9 полное 9-битное сложение вместо 9-битного инкремента
Дополнительные FF 0 rounding — чисто комбинационный
ИТОГО +35  

Распределение:

Подмодуль LUTs FF
mul_u8_u8_u16_lat2 ~208 48
add8x8_lat2 ~18 19
sign ~1 3
except_lat2 ~54 63
FTZ + mux эффективных операндов ~52 2
exp_norm + под-/переполнение (RTZ часть) ~25 0
man_norm mux (7 бит) ~7 0
c_next приоритетный mux ~32 0
en_pipe + выходной регистр c ~2 18
RNE rounding (always_comb, net к RTZ) ~+35 0
ИТОГО ~427 ~151

3. vhfastmulb16_mul_bf16_bf16_fp32_lat4 (BF16 x BF16 -> F32, exact, no rounding)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~308 (260–360) ~308 (260–360) ~3.9%
FF (регистры) ~179 ~179 ~1.1%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~150–165–190 MHz ~165–180–205 MHz —
Рабочая частота (typ) ~165 MHz ~180 MHz —

Распределение по подмодулям:

Подмодуль LUTs FF Примечание
4× mul4x4_comb (STAGE 1) ~88 0 4 комбинационных 4×4 множителя
Регистры STAGE 1→2 0 45 pp×4 + exp_sum + flags + sign
CSA-дерево + 16-битный CPA (STAGE 2) ~28 0 2 уровня CSA + один 16-битный CPA
Регистры STAGE 2→3 0 29 man_prod + exp_s2 + flags + sign
Leading-one + нормализация (STAGE 3) ~56 0 приоритетный энкодер + 24-bit шейфер
Регистры STAGE 3→4 0 66 k + mant_norm + mant_sub + exp_unb + flags
F32 pack mux (STAGE 4) ~80 0 приоритетный mux ~5 ветвей × 32 бит
Выходной регистр outc (32 бита) 0 32 регистр результата
Exception + sign + exp_sum + muxes + en_pipeline ~56 11 общая управляющая логика
ИТОГО ~308 ~179  

4. vhfastmulb16_add_fp32_fp32_fp32_rtz_lat4 (FP32 + FP32 -> FP32, RTZ, latency 4)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~290 (260–330) ~290 (260–330) ~3.6%
FF (регистры) ~263 ~263 ~1.6%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~110–140–170 MHz ~120–150–185 MHz —
Рабочая частота (typ) ~140 MHz ~150 MHz —

Распределение по подмодулям:

Подмодуль LUTs FF Примечание
Operand unpack + классификация исключений (S1) ~45 0 сравнения exp/frac с 0/0xFF, флаги NaN/Inf/Zero
Эффективная экспонента/мантисса (S1) ~18 0 mux exp_eff (8 бит ×2), hidden bit для man
exp_diff, shift_amt, a_larger, exp_max (S1) ~55 0 8-битный компаратор/вычитание, mux, сравнение мантисс
sign_res (S1) ~5 0 приоритетный mux результата знака
hi/lo mux операндов 2×27 бит (S1) ~54 0 выбор большего/меньшего модуля без разворота в S2
Баррел-шейфер выравнивания мантисс 27 бит + sticky (S1) ~78 0 переменный сдвиг на shift_amt (5 бит управления), sticky в LSB
en_pipeline (4 задержки + OR) ~3 4 4 FF + OR логика
Регистры S1→S2 0 93 man_hi_al(27) + man_lo_al(27) + exp_max(8) + flags/sign/op_add/nan/etc
28-битный mantissa add/sub (S2, unconditional hi - lo) ~28 0 CARRY4 цепочка, 28 бит, без mux порядка операндов
Регистры S2→S3 0 67 man_raw(28) + exp_max(8) + flags/sign/nan_frac/etc
Carry fix-up + LZD 27-bit + 9-bit signed exponent (S3) ~85 0 исправление переноса, приоритетный энкодер 27 бит, коррекция экспоненты
Регистры S3→S4 0 67 man_norm(27) + exp_pre(9) + flags/sign/nan_frac/etc
Subnormal shift + RTZ truncation + F32 pack mux (S4) ~45 0 сдвиг для субнормала, отсечение 3 младших бит, приоритетный mux ~5 ветвей × 32 бит
Выходной регистр outf32c (32 бита) 0 32 регистр результата
ИТОГО ~290 ~263  

Критический путь (оценка):

баррел-шейфер выравнивания (S1) → 28-bit add/sub (S2) → LZD 27-bit (S3)
→ carry fix-up → F32 pack mux → output reg

Оценка ~5.0–6.5–8.0 ns (XC7S15-1: 110–140–170 MHz; XC7S15-2: 120–150–185 MHz).


5. vhfastmulb16_add_fp32_fp32_fp32_rne_lat4 (FP32 + FP32 -> FP32, RNE, latency 4)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~340 (305–390) ~340 (305–390) ~4.3%
FF (регистры) ~263 ~263 ~1.6%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~100–130–160 MHz ~110–140–175 MHz —
Рабочая частота (typ) ~130 MHz ~140 MHz —

Разница с RTZ (~+50 LUTs):

Компонент Доп. LUTs Доп. FF Причина
RNE rounding: G/R/S биты, round_up, inc_carry (S4) +25 0 инкремент significand, проверка tie-to-even на kept[0]
Subnormal rounding (G/R/S + инкремент для субнормала, S4) +20 0 отдельная логика округления для субнормального результата
exp_ovf корректировка при overflow significand +5 0 инкремент экспоненты при переносе mantissa
sticky_d1 убран (sticky складывается в LSB на S1) 0 -1 регистр sticky_d1 больше не нужен
ИТОГО +50 0  

Распределение:

Подмодуль LUTs FF
(всё из RTZ, кроме изменений ниже) ~290 ~263
RNE rounding логика (net к RTZ) ~+50 0
ИТОГО ~340 ~263

6. vhfastmulb16_add_fp16_fp16_fp16_rtz_lat4 (FP16 + FP16 -> FP16, RTZ, latency 4)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~160 (140–190) ~160 (140–190) ~2.0%
FF (регистры) ~151 ~151 ~0.9%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~135–170–220 MHz ~150–190–240 MHz —
Рабочая частота (typ) ~170 MHz ~190 MHz —

Распределение по подмодулям:

Подмодуль LUTs FF Примечание
Operand unpack + классификация исключений (S1) ~20 0 5-битные сравнения exp, 10-битные сравнения frac
Эффективная экспонента/мантисса (S1) ~12 0 mux exp_eff (5 бит ×2), hidden bit для man (1 бит ×2)
exp_diff, shift_amt, a_larger, exp_max (S1) ~35 0 5-битный компаратор/вычитание, mux, сравнение мантисс
sign_res (S1) ~3 0 приоритетный mux результата знака
hi/lo mux операндов 2×14 бит (S1) ~28 0 выбор большего/меньшего модуля без разворота в S2
Баррел-шейфер выравнивания мантисс 14 бит + sticky (S1) ~45 0 переменный сдвиг на shift_amt (5 бит управления), sticky в LSB
en_pipeline (4 задержки + OR) ~3 4 4 FF + OR логика
Регистры S1→S2 0 51 man_hi_al(14) + man_lo_al(14) + exp_max(5) + flags/sign/op_add/nan/etc
15-битный mantissa add/sub (S2, unconditional hi - lo) ~15 0 CARRY4 цепочка, 15 бит
Регистры S2→S3 0 37 man_raw(15) + exp_max(5) + flags/sign/nan/etc
Carry fix-up + LZD 15-bit + 6-bit signed exponent (S3) ~50 0 исправление переноса, приоритетный энкодер 15 бит, коррекция экспоненты
Регистры S3→S4 0 43 man_norm(14) + exp_pre(6) + sub_shift(5) + flags/sign/nan/etc
Subnormal shift + RTZ truncation + F16 pack mux (S4) ~30 0 сдвиг для субнормала, отсечение, приоритетный mux ~5 ветвей × 16 бит
Выходной регистр outf16c (16 бит) 0 16 регистр результата
ИТОГО ~160 ~151  

Критический путь (оценка):

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ carry fix-up → F16 pack mux → output reg

Оценка ~4.5–6.0–7.5 ns (XC7S15-1: 135–170–220 MHz; XC7S15-2: 150–190–240 MHz).


7. vhfastmulb16_add_fp16_fp16_fp16_rne_lat4 (FP16 + FP16 -> FP16, RNE, latency 4)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~190 (170–220) ~190 (170–220) ~2.4%
FF (регистры) ~151 ~151 ~0.9%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~125–155–205 MHz ~140–175–220 MHz —
Рабочая частота (typ) ~155 MHz ~175 MHz —

Разница с RTZ (+30 LUTs):

Компонент Доп. LUTs Доп. FF Причина
RNE rounding: G/R/S биты, round_up, inc_carry (S4) +18 0 инкремент significand, проверка tie-to-even на kept[0]
Subnormal rounding (G/R/S + инкремент для субнормала, S4) +10 0 отдельная логика округления для субнормального результата
exp_ovf корректировка при overflow significand +2 0 инкремент экспоненты при переносе mantissa
ИТОГО +30 0  

Распределение:

Подмодуль LUTs FF
(всё из RTZ, кроме изменений ниже) ~160 ~151
RNE rounding логика (net к RTZ) ~+30 0
ИТОГО ~190 ~151

Критический путь (оценка):

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ нормализация → RNE rounding (G/R/S + инкремент) → F16 pack mux → output reg

Оценка ~5.0–6.5–8.0 ns (XC7S15-1: 125–155–205 MHz; XC7S15-2: 140–175–220 MHz).


8. vhfastmulb16_add_bf16_bf16_bf16_rtz_lat4 (BF16 + BF16 -> BF16, RTZ, latency 4)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~165 (140–195) ~165 (140–195) ~2.1%
FF (регистры) ~140 ~140 ~0.9%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~130–165–215 MHz ~145–185–235 MHz —
Рабочая частота (typ) ~165 MHz ~185 MHz —

Распределение по подмодулям:

Подмодуль LUTs FF Примечание
Operand unpack + классификация исключений (S1) ~14 0 8-битные сравнения exp, 7-битные сравнения frac, флаги NaN/Inf/Zero
Эффективная экспонента/мантисса (S1) ~10 0 mux exp_eff (8 бит ×2), hidden bit для man (1 бит ×2)
exp_diff, shift_amt, a_larger, exp_max (S1) ~22 0 два 8-битных вычитателя, 16-битный magnitude compare, mux
sign_res (S1) ~2 0 приоритетный mux результата знака
hi/lo mux операндов 2×14 бит (S1) ~14 0 выбор большего/меньшего модуля без разворота в S2
Баррел-шейфер выравнивания мантисс 14 бит + sticky (S1) ~30 0 переменный сдвиг на 4 бита, prefix-OR sticky
en_pipeline (4 задержки + OR) ~2 4 4 FF + OR логика
Регистры S1→S2 0 50 man_hi_al(14) + man_lo_al(14) + exp_max(8) + flags/sign/op_add/nan/etc
15-битный mantissa add/sub (S2, unconditional hi - lo) ~15 0 CARRY4 цепочка, 15 бит
Регистры S2→S3 0 36 man_raw(15) + exp_max(8) + flags/sign/nan/etc
Carry fix-up + LZD 15-bit + 9-bit signed exponent (S3) ~34 0 исправление переноса, приоритетный энкодер 15 бит, Kogge-Stone вычитание экспоненты
Регистры S3→S4 0 34 man_norm(14) + exp_pre(9) + grs_shift(5) + flags/sign/etc
Subnormal shift + RTZ truncation + BF16 pack mux (S4) ~22 0 сдвиг для субнормала, отсечение, приоритетный mux ~5 ветвей × 16 бит
Выходной регистр obf16c (16 бит) 0 16 регистр результата
ИТОГО ~165 ~140  

Критический путь (оценка):

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ carry fix-up → BF16 pack mux → output reg

Оценка ~4.8–6.3–8.0 ns (XC7S15-1: 130–165–215 MHz; XC7S15-2: 145–185–235 MHz).


9. vhfastmulb16_add_bf16_bf16_bf16_rne_lat4 (BF16 + BF16 -> BF16, RNE, latency 4)

Ресурс XC7S15-1 XC7S15-2 % от XC7S15
LUTs ~195 (170–225) ~195 (170–225) ~2.4%
FF (регистры) ~140 ~140 ~0.9%
DSP48E1 0 0 0%
Block RAM 0 0 0%
Макс. частота ~120–150–200 MHz ~135–170–215 MHz —
Рабочая частота (typ) ~150 MHz ~170 MHz —

Разница с RTZ (+30 LUTs):

Компонент Доп. LUTs Доп. FF Причина
RNE rounding: G/R/S биты, round_up, inc_carry (S4) +18 0 инкремент significand, проверка tie-to-even на kept[0]
Subnormal rounding (G/R/S + инкремент для субнормала, S4) +10 0 отдельная логика округления для субнормального результата
exp_ovf корректировка при overflow significand +2 0 инкремент экспоненты при переносе mantissa
ИТОГО +30 0  

Распределение:

Подмодуль LUTs FF
(всё из RTZ, кроме изменений ниже) ~165 ~140
RNE rounding логика (net к RTZ) ~+30 0
ИТОГО ~195 ~140

Критический путь (оценка):

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ нормализация → RNE rounding (G/R/S + инкремент) → BF16 pack mux → output reg

Оценка ~5.3–6.9–8.7 ns (XC7S15-1: 120–150–200 MHz; XC7S15-2: 135–170–215 MHz).


Сравнение top-level модулей (XC7S15)

Модуль LUTs FF Latency Точность % LUTs (от 8,000) Fmax typ -1, MHz Fmax typ -2, MHz
vhfastmulb16_mul_bf16_bf16_bf16_rtz_lat3 ~392 ~151 3 truncation (RTZ) ~4.9% ~205 ~225
vhfastmulb16_mul_bf16_bf16_bf16_rne_lat3 ~427 ~151 3 IEEE 754 RNE ~5.3% ~180 ~200
vhfastmulb16_mul_bf16_bf16_fp32_lat4 ~308 ~179 4 exact BF16 product; RTZ for F32 subnormal ~3.9% ~165 ~180
vhfastmulb16_add_fp32_fp32_fp32_rtz_lat4 ~290 ~263 4 FP32+FP32→FP32, RTZ truncation ~3.6% ~140 ~150
vhfastmulb16_add_fp32_fp32_fp32_rne_lat4 ~340 ~263 4 FP32+FP32→FP32, IEEE 754 RNE ~4.3% ~130 ~140
vhfastmulb16_add_fp16_fp16_fp16_rtz_lat4 ~160 ~151 4 FP16+FP16→FP16, RTZ truncation ~2.0% ~170 ~190
vhfastmulb16_add_fp16_fp16_fp16_rne_lat4 ~190 ~151 4 FP16+FP16→FP16, IEEE 754 RNE ~2.4% ~155 ~175
vhfastmulb16_add_bf16_bf16_bf16_rtz_lat4 ~165 ~140 4 BF16+BF16→BF16, RTZ max finite, canonical NaN ~2.1% ~165 ~185
vhfastmulb16_add_bf16_bf16_bf16_rne_lat4 ~195 ~140 4 BF16+BF16→BF16, IEEE 754 RNE, canonical NaN ~2.4% ~150 ~170

Критический путь (Timing)

RTZ:

mul4x4 (CSA) → mul_u8_u8_u16_lat2 CPA → exp_sum + man_msb → c_next mux → output reg

~4.2–4.7–5.6 ns (XC7S15-1: 180–205–240 MHz; XC7S15-2: 200–225–260 MHz).

RNE:

mul4x4 (CSA) → mul_u8_u8_u16_lat2 CPA → man_shifted/G/R/S → RNE increment → exp_inc → exp_norm → c_next mux → output reg

~4.8–5.5–6.2 ns (XC7S15-1: 160–180–210 MHz; XC7S15-2: 180–200–230 MHz).

F32:

mul4x4_comb (CSA) → CPA → leading-one → mant_norm шейфер → exp_unb → F32 pack mux → output reg

~5.3–6.0–6.7 ns (XC7S15-1: 150–165–190 MHz; XC7S15-2: 165–180–205 MHz).

AddF32 RTZ:

баррел-шейфер выравнивания (S1) → 28-bit add/sub (S2) → LZD 27-bit (S3)
→ carry fix-up → F32 pack mux → output reg

~5.0–6.5–8.0 ns (XC7S15-1: 110–140–170 MHz; XC7S15-2: 120–150–185 MHz).

AddF32 RNE:

баррел-шейфер выравнивания (S1) → 28-bit add/sub (S2) → LZD 27-bit (S3)
→ нормализация → RNE rounding (G/R/S + инкремент) → F32 pack mux → output reg

~5.5–7.0–8.5 ns (XC7S15-1: 100–130–160 MHz; XC7S15-2: 110–140–175 MHz). В отличие от RTZ, в критический путь вступает дополнительная логика округления (sticky в LSB, G/R/S, инкремент significand).

AddF16 RTZ:

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ carry fix-up → F16 pack mux → output reg

~4.5–6.0–7.5 ns (XC7S15-1: 135–170–210 MHz; XC7S15-2: 150–190–230 MHz). FP16 вариант быстрее FP32 на ~20–25% за счёт уменьшенной разрядности всех путей.

AddF16 RNE:

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ нормализация → RNE rounding (G/R/S + инкремент) → F16 pack mux → output reg

~5.0–6.5–8.0 ns (XC7S15-1: 125–155–195 MHz; XC7S15-2: 140–175–215 MHz). В отличие от RTZ, в критический путь вступает дополнительная логика округления (sticky в LSB, G/R/S, инкремент significand).

AddBF16 RTZ:

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ carry fix-up → BF16 pack mux → output reg

~4.8–6.3–8.0 ns (XC7S15-1: 130–165–215 MHz; XC7S15-2: 145–185–235 MHz). BF16-вариант близок к FP16; более широкие сравнения экспоненты (8 бит против 5) компенсируются упрощённой упаковкой (canonical NaN, RTZ overflow → max finite).

AddBF16 RNE:

баррел-шейфер выравнивания (S1) → 15-bit add/sub (S2) → LZD 15-bit (S3)
→ нормализация → RNE rounding (G/R/S + инкремент) → BF16 pack mux → output reg

~5.3–6.9–8.7 ns (XC7S15-1: 120–150–200 MHz; XC7S15-2: 135–170–215 MHz). В отличие от RTZ, в критический путь вступает дополнительная логика округления (sticky в LSB, G/R/S, инкремент significand).


Рекомендации по оптимизации

Оптимизация Экономия LUTs Сложность
Перенести mul_u8_u8_u16_lat2 на DSP48E1 ~-200 LUTs 1× DSP48E1 (25×18 multiplier)
Убрать избыточные mux *_exp_eff ~-16 LUTs Простейшая правка
Объединить except_lat2 + flags_lat1 ~-10 LUTs Рефакторинг флагов
Потенциальный итог RTZ ~170-220 LUTs (~2-3%)  

Spartan-7 XC7S15 имеет 20 DSP48E1. Использование 1 для mul_u8_u8_u16_lat2 сокращает RTZ top до ~190-240 LUTs (~2.4-3.0%).

DSP48 для FP32 аддеров (add_fp32_fp32_fp32_*)

DSP48E1 не применим для FP32 аддеров без существенной переработки архитектуры:

Ожидаемая экономия при использовании DSP48E1 для аддеров: 0 LUT.

DSP48 для FP16 аддеров (add_fp16_fp16_fp16_*)

Те же ограничения, что и для FP32 аддеров: баррел-шейфер, LZD, логика округления и F16 pack не отображаются на DSP48E1. 15-битный add/sub частично помещается в порт A (25 бит) DSP48E1, но накладные расходы перекрывают любую экономию LUT.

Ожидаемая экономия при использовании DSP48E1 для аддеров: 0 LUT.


Вывод (XC7S15)

Модуль LUTs % от XC7S15 (8,000 LUT6) FF % FF (16,000) Fmax typ -1, MHz Fmax typ -2, MHz Рекомендация
RTZ ~392 ~4.9% ~151 ~0.9% ~205 ~225 ✅ Помещается с большим запасом
RNE ~427 ~5.3% ~151 ~0.9% ~180 ~200 ✅ Помещается. Если нужна IEEE 754 точность
F32 ~308 ~3.9% ~179 ~1.1% ~165 ~180 ✅ Помещается. Для точного BF16 x BF16 -> F32
AddF32 RTZ ~290 ~3.6% ~263 ~1.6% ~140 ~150 ✅ Помещается с большим запасом
AddF32 RNE ~340 ~4.3% ~263 ~1.6% ~130 ~140 ✅ Помещается. Если нужна IEEE 754 точность для FP32 сложения
AddF16 RTZ ~160 ~2.0% ~151 ~0.9% ~170 ~190 ✅ Помещается с очень большим запасом
AddF16 RNE ~190 ~2.4% ~151 ~0.9% ~155 ~175 ✅ Помещается. Если нужна IEEE 754 точность для FP16 сложения
AddBF16 RTZ ~165 ~2.1% ~140 ~0.9% ~165 ~185 ✅ Помещается с очень большим запасом
AddBF16 RNE ~195 ~2.4% ~140 ~0.9% ~150 ~170 ✅ Помещается. Если нужна IEEE 754 точность для BF16 сложения

Все девять top-level модуля занимают лишь ~2.0–5.3% LUT6 и ~0.9–1.6% FF XC7S15 — остаётся запас ~95% LUTs для остальной логики системы.