Статистика реализации на 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:
- любая булева функция от ≤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)
| Ресурс |
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 аддеров без существенной переработки архитектуры:
- баррел-шейфер выравнивания мантисс (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 бит) DSP48E1, но накладные расходы на конкатенацию частей и обратную сборку результата перекрывают любую экономию LUT.
Ожидаемая экономия при использовании 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 для остальной логики системы.