Статистика реализации на 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:
- любая булева функция от ≤6 входов = 1 LUT6;
- n-битный сумматор/вычитатель с carry chain (CARRY4) = n LUTs — перенос идёт через MUXCY, а не через LUT;
- 2:1 мультиплексор шириной n бит = n LUTs;
- сравнение ниббла с константой (NOR4/AND4) = 1 LUT.
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):
- FTZ-детектирование (exp==0 && frac!=0): 2× ~3 = 6 LUT
- mux
*_exp_eff (8 бит × 2): 16 LUT
- mux
*_frac_eff (7 бит × 2): 14 LUT
- mux мантисс
a_man/b_man (8 бит × 2): 16 LUT
exp_norm = exp_sum + man_msb (9-битный инкремент, carry chain): 9 LUT
- компараторы under/overflow (9-бит vs константы 381/254): ~9 LUT
- mux
man_norm (7 бит): 7 LUT
- приоритетный mux
c_next (5 ветвей × 16 бит): ~32 LUT
en_pipe и прочее: ~2 LUT
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 аддеров без существенной переработки архитектуры:
- баррел-шейфер выравнивания мантисс (27 бит, переменный сдвиг) — не отображается на DSP48;
- LZD (leading-zero detect) — не отображается на DSP48;
- логика округления RNE (sticky, G/R/S, инкремент significand) — не отображается на DSP48;
- F32 pack mux (5 ветвей × 32 бита) — не отображается на DSP48;
- 28-битный add/sub теоретически помещается частично в порт A (25 бит) DSP48A1, но накладные расходы на конкатенацию частей и обратную сборку результата перекрывают любую экономию LUT.
Ожидаемая экономия при использовании 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.