vhlibvbf16

Статистика реализации на Xilinx Spartan-6 (XC6SLX9, XC6SLX16)

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

Параметр XC6SLX9 XC6SLX16
Device XC6SLX9 (Spartan-6 LX9) XC6SLX16 (Spartan-6 LX16)
Package CPG196 / TQG144 / CSG225 / CSG324 CPG196 / CSG225 / CSG324 / FTG256
Logic Cells 9,152 14,579
Slices 1,430 2,278
LUTs (6-input / LUT6) 5,720 (1,430 × 4) 9,112 (2,278 × 4)
Flip-Flops 11,440 18,224
Block RAM (18Kb) 32 (576 Kb total) 32 (576 Kb total)
DSP48A1 16 32
Speed grade -2 -2
Целевая температура Коммерческий диапазон (0..85 °C) Коммерческий диапазон (0..85 °C)

Важно: Все цифры ниже — оценки на основе ручного подсчёта по RTL-коду с учётом типовых задержек Xilinx Spartan-6 (LUT6 I→O ≈ 0.35 ns, CARRY4 carry/bit ≈ 0.075 ns, FF setup ≈ 0.46 ns, clk→Q ≈ 0.57 ns, routing-коэффициент ≈ 1.35). Реальный синтез в Xilinx ISE не выполнялся, отчётов trce/timing нет. Ожидаемая погрешность без реального синтеза — ±20–25%. Для точного Fmax необходимо запустить xst + trce с .ucf ограничением на тактовую частоту.

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

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

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

Учитываются только критические пути, описанные в секции «Критический путь (Timing)» для каждого модуля. Routing задержка оценивается как +35% к чистой логике.

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


Top-level модули

1. vhfastmulb16_mul_bf16_bf16_bf16_rtz_lat3 (RTZ — Round Toward Zero)

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~392 (350–440) ~392 (350–440) ~6.9% ~4.3%
FF (регистры) ~151 ~151 ~1.3% ~0.8%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~160–175–200 MHz ~160–175–200 MHz — —
Рабочая частота (typ) ~175 MHz ~175 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 (частично поглощается LUT соседней логики)
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 выбор результата: NaN/Inf/Zero/Under/Overflow/Normal
en_pipe + выходной регистр c (16 бит) ~2 18 2 FF для en_d1/d2, 16 FF для c
ИТОГО ~392 ~151  

Детали glue-логики RTZ (~116 LUTs без mul_u8_u8_u16_lat2/add8x8/sign/except):


2. vhfastmulb16_mul_bf16_bf16_bf16_rne_lat3 (RNE — Round to Nearest Even)

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~427 (380–480) ~427 (380–480) ~7.5% ~4.7%
FF (регистры) ~151 ~151 ~1.3% ~0.8%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~140–155–180 MHz ~140–155–180 MHz — —
Рабочая частота (typ) ~155 MHz ~155 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 — чисто комбинационный (always @(*)), новые регистры не нужны
ИТОГО +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)

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~308 (260–360) ~308 (260–360) ~5.4% ~3.4%
FF (регистры) ~179 ~179 ~1.6% ~1.0%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~130–145–165 MHz ~130–145–165 MHz — —
Рабочая частота (typ) ~145 MHz ~145 MHz — —

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

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

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

mul4x4_comb (CSA) → CPA → leading-one → mant_norm shifter
→ exp_unb → F32 pack mux → output reg

Оценка ~6.0–6.5 ns (150–170 MHz). Точные значения требуют синтеза.


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

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~290 (260–330) ~290 (260–330) ~5.1% ~3.2%
FF (регистры) ~263 ~263 ~2.3% ~1.4%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~90–120–150 MHz ~90–120–150 MHz — —
Рабочая частота (typ) ~120 MHz ~120 MHz — —

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

Подмодуль LUTs FF Примечание
Operand unpack + классификация исключений (S1) ~45 0 сравнения exp/frac с 0/0xFF, флаги NaN/Inf/Zero, операнд sign
Эффективная экспонента/мантисса (S1) ~18 0 mux exp_eff (8 бит ×2), hidden bit для man (1 бит ×2)
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

Оценка ~6.5–8.0–10.0 ns (90–120–150 MHz). Критический путь проходит через баррел-шейфер выравнивания мантисс на S1 и 28-битный CPA на S2. Упрощение границы S3/S4 (перенос subnormal-сдвига в S4, устранение sticky_shifted) снизило задержку по сравнению с предыдущей версией.


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

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~340 (305–390) ~340 (305–390) ~5.9% ~3.7%
FF (регистры) ~263 ~263 ~2.3% ~1.4%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~80–110–140 MHz ~80–110–140 MHz — —
Рабочая частота (typ) ~110 MHz ~110 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

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

Модуль LUTs FF Latency Точность % LUTs (от 5,720) Fmax typ, MHz
vhfastmulb16_mul_bf16_bf16_bf16_rtz_lat3 ~392 ~151 3 truncation (RTZ) ~6.9% ~175
vhfastmulb16_mul_bf16_bf16_bf16_rne_lat3 ~427 ~151 3 IEEE 754 RNE ~7.5% ~155
vhfastmulb16_mul_bf16_bf16_fp32_lat4 ~308 ~179 4 exact BF16 product; RTZ for F32 subnormal ~5.4% ~145
vhfastmulb16_add_fp32_fp32_fp32_rtz_lat4 ~290 ~263 4 FP32+FP32→FP32, RTZ truncation ~5.1% ~120
vhfastmulb16_add_fp32_fp32_fp32_rne_lat4 ~340 ~263 4 FP32+FP32→FP32, IEEE 754 RNE ~5.9% ~110
vhfastmulb16_add_fp16_fp16_fp16_rtz_lat4 ~160 ~151 4 FP16+FP16→FP16, RTZ truncation ~2.8% ~140
vhfastmulb16_add_fp16_fp16_fp16_rne_lat4 ~190 ~151 4 FP16+FP16→FP16, IEEE 754 RNE ~3.3% ~130
vhfastmulb16_add_bf16_bf16_bf16_rtz_lat4 ~165 ~140 4 BF16+BF16→BF16, RTZ max finite, canonical NaN ~2.9% ~135
vhfastmulb16_add_bf16_bf16_bf16_rne_lat4 ~195 ~140 4 BF16+BF16→BF16, IEEE 754 RNE, canonical NaN ~3.4% ~125

RNE добавляет ~+35 LUTs относительно RTZ для умножителей (_lat3), ~+50 LUTs для FP32 аддеров (_lat4) и ~+30 LUTs для FP16 аддеров (_lat4). F32-модуль использует сбалансированный конвейер 2+2 с комбинационным mul4x4_comb и отдельной F32-упаковкой, поэтому его latency равна 4 тактам, но LUT-затраты ниже за счёт отказа от регистровых mul4x4_lat2 на первой стадии.


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

RTZ:

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

~5.2–6.2 ns (160–175–200 MHz). Критический путь проходит через 9-битный инкремент экспоненты (CARRY4), компараторы vs 381/254 и 5-ветвевой приоритетный mux c_next.

RNE:

mul4x4 (CSA) → mul_u8_u8_u16_lat2 CPA → man_shifted/G/R/S → RNE increment → exp_inc → exp_norm (полное 9-битное сложение) → c_next mux → output reg

~5.6–6.4–7.1 ns (140–155–180 MHz). В отличие от RTZ, в критический путь вступают две последовательные carry-цепочки (инкремент мантиссы + сложение экспоненты), что снижает Fmax на ~10–15%.

F32:

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

~6.1–6.9–7.7 ns (130–145–165 MHz). Самый длинный такт — переход STAGE 2→STAGE 3: leading-one encoder (casez на 16 бит) + переменный сдвиг мантиссы (баррел-шейфер 24 бита).

AddF32 RTZ:

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

~6.5–8.0–10.0 ns (90–120–150 MHz). Критический путь проходит через баррел-шейфер выравнивания мантисс на S1 и 28-битный CPA на S2.

AddF32 RNE:

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

~7.0–8.5–10.5 ns (80–110–140 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

~5.5–7.0–9.0 ns (110–140–180 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

~6.0–7.5–9.5 ns (100–130–165 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

~5.7–7.4–9.5 ns (105–135–175 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

~6.3–8.0–10.5 ns (95–125–160 MHz). В отличие от RTZ, в критический путь вступает дополнительная логика округления (sticky в LSB, G/R/S, инкремент significand).


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

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~160 (140–190) ~160 (140–190) ~2.8% ~1.8%
FF (регистры) ~151 ~151 ~1.3% ~0.8%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~110–140–180 MHz ~110–140–180 MHz — —
Рабочая частота (typ) ~140 MHz ~140 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_frac/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_frac/etc
Subnormal shift + RTZ truncation + F16 pack mux (S4) ~30 0 сдвиг для субнормала, отсечение 3低бита, приоритетный 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

Оценка ~5.5–7.0–9.0 ns (110–140–180 MHz). Критический путь проходит через баррел-шейфер выравнивания мантисс на S1 и 15-битный CPA на S2. FP16 вариант быстрее FP32 на ~20–25% за счёт уменьшенной разрядности всех путей.


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

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~190 (170–220) ~190 (170–220) ~3.3% ~2.1%
FF (регистры) ~151 ~151 ~1.3% ~0.8%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~100–130–165 MHz ~100–130–165 MHz — —
Рабочая частота (typ) ~130 MHz ~130 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

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

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~165 (140–195) ~165 (140–195) ~2.9% ~1.8%
FF (регистры) ~140 ~140 ~1.2% ~0.8%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~105–135–175 MHz ~105–135–175 MHz — —
Рабочая частота (typ) ~135 MHz ~135 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

Оценка ~5.7–7.4–9.5 ns (105–135–175 MHz). BF16-вариант близок к FP16 по задержкам: более широкие сравнения экспоненты (8 бит против 5) компенсируются упрощённой упаковкой результата (canonical NaN 0x7FC0, RTZ overflow → max finite 0x7F7F).


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

Ресурс XC6SLX9 XC6SLX16 % от XC6SLX9 % от XC6SLX16
LUTs ~195 (170–225) ~195 (170–225) ~3.4% ~2.1%
FF (регистры) ~140 ~140 ~1.2% ~0.8%
DSP48A1 0 0 0% 0%
Block RAM 0 0 0% 0%
Макс. частота ~95–125–160 MHz ~95–125–160 MHz — —
Рабочая частота (typ) ~125 MHz ~125 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

Оценка ~6.3–8.0–10.5 ns (95–125–160 MHz). В отличие от RTZ, в критический путь вступает дополнительная логика округления (sticky в LSB, G/R/S, инкремент significand).


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

Оптимизация Экономия LUTs Сложность
Перенести mul_u8_u8_u16_lat2 на DSP48A1 ~-200 LUTs (mul_u8_u8_u16_lat2 → ~0-10) Замена структурного умножителя на DSP-инстанс
Убрать избыточные mux *_exp_eff ~-16 LUTs a_exp_eff ≡ a_exp при субнормале (exp=0)
Объединить except_lat2 + flags_lat1 ~-10 LUTs Флаги комбинационно, поглощение выходных регистров
Потенциальный итог RTZ (все оптимизации) ~170-220 LUTs (~3-4%)  

Spartan-6 XC6SLX9 имеет 16 DSP48A1. Использование 1 для mul_u8_u8_u16_lat2 (без остальных оптимизаций) сокращает RTZ top до ~190-240 LUTs (~3.3-4.2%).

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

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

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

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

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

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


Вывод (XC6SLX9)

Модуль LUTs % от XC6SLX9 (5,720 LUT6) FF % FF (11,440) Fmax typ, MHz Рекомендация
RTZ ~392 ~6.9% ~151 ~1.3% ~175 ✅ Помещается с большим запасом
RNE ~427 ~7.5% ~151 ~1.3% ~155 ✅ Помещается. Если нужна IEEE 754 точность
F32 ~308 ~5.4% ~179 ~1.6% ~145 ✅ Помещается. Для точного BF16 x BF16 -> F32
AddF32 RTZ ~290 ~5.1% ~263 ~2.3% ~120 ✅ Помещается с большим запасом
AddF32 RNE ~340 ~5.9% ~263 ~2.3% ~110 ✅ Помещается. Если нужна IEEE 754 точность для FP32 сложения
AddF16 RTZ ~160 ~2.8% ~151 ~1.3% ~140 ✅ Помещается с очень большим запасом
AddF16 RNE ~190 ~3.3% ~151 ~1.3% ~130 ✅ Помещается. Если нужна IEEE 754 точность для FP16 сложения
AddBF16 RTZ ~165 ~2.9% ~140 ~1.2% ~135 ✅ Помещается с очень большим запасом
AddBF16 RNE ~195 ~3.4% ~140 ~1.2% ~125 ✅ Помещается. Если нужна IEEE 754 точность для BF16 сложения

Все девять top-level модулей занимают лишь ~2.8–7.5% LUT6 и ~0.8–2.3% FF XC6SLX9 — остаётся запас ~92% LUTs для остальной логики системы.

Для XC6SLX16 загрузка ещё ниже: ~1.8–4.7% LUT6, ~0.8–1.4% FF.