Давайте вдаваться в детали, чтобы все не выглядело так ужасно, как это понял
iosifk =)
Есть вычислительный модуль, в нем достаточно легковесная математика. Он единоразово принимает 34 байта стартовых данных и далее на протяжении примерно 5 500 000 000 шагов (1 шаг - 1 такт) эти данные обрабатывает. При частоте 200МГц - это около 30 секунд. В процессе этих 30 секунд никакие данные модулю больше не нужны. По итогам работы модуля мы на выходе получаем один бит: вычислилось ли интересующее нас значение или нет (флаг data_ready в первом интерфейсе, что я написал). Это происходит в среднем только один раз на 300 000 вариантов входных данных, поэтому мне достаточно просто знать для каких данных это произошло, а все остальное я проверяю на хосте. Ну и соответственно есть флаг done, когда все модули закончили - я им бросаю следующую пачку данных, предварительно принятых по UART, а обратно отправляю номер модуля который что-то вычислил, если он есть.
UART - другой частотный домен, заведен на два FIFO - один для отправки данных, один для приемки.
Главный модуль: объединяет и контролирует всё это.
Общая структура и порядок работы главного модуля:
1) Проверяем FIFO, в котором скапливаются данные прилетевшие с хоста, для каждых 34 байт оказавшихся там - отправляем их в вычислительный модуль.
2) Когда загрузили все модули - ждем, пока все модули посчитают (у всех done = '1')
3) Если у какого-то модуля data_ready = '1' - кидаем номер этого модуля в FIFO для отправки данных на хост
4) Ресетим модули и идем на пункт один
Вычислительный модуль:
1) Если data_flag = '1', то в data_input лежат валидные данные.
2) Как накопили 34 байта - начали работу.
3) Если вычислилось то, что нужно data_ready <= '1';
4) Как закончили done <= '1';
Изначально вычислительные коннектились к основному прозаично:
Код
MTMainCores:
for i in 0 to NCORES - 1 generate
begin
CoreEntry: CRMain
GENERIC MAP
(
CORE_N => i
)
PORT MAP
(
clock => clk,
reset => reset,
data_input => core_data,
data_flag => data_core_flag(i),
done => core_done(i),
data_ready => data_mt_ready(i)
);
end generate MainCores;
Потом добавил регистры, про которые написал в первом сообщении. По совету
Timmy добавил им аттрибут "keep":
Код
attribute keep : string;
attribute keep of reset_corebuf: signal is "true";
attribute keep of data_input_corebuf: signal is "true";
attribute keep of data_flag_corebuf: signal is "true";
attribute keep of done_corebuf: signal is "true";
attribute keep of data_ready_corebuf: signal is "true";
И на текущий момент имею 48084 timing score для 128 модулей и вот такой критический путь:
Код
Paths for end point Mmux__n4665412_FRB (SLICE_X98Y138.D3), 312 paths
--------------------------------------------------------------------------------
Slack (setup path): -2.621ns (requirement - (data path - clock path skew + uncertainty))
Source: MTMainCores[3].CoreEntry/data_ready_BRB2 (FF)
Destination: Mmux__n4665412_FRB (FF)
Requirement: 5.000ns
Data Path Delay: 7.486ns (Levels of Logic = 5)
Clock Path Skew: -0.100ns (1.521 - 1.621)
Source Clock: clk_BUFGP rising at 0.000ns
Destination Clock: clk_BUFGP rising at 5.000ns
Clock Uncertainty: 0.035ns
Clock Uncertainty: 0.035ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
Total System Jitter (TSJ): 0.070ns
Total Input Jitter (TIJ): 0.000ns
Discrete Jitter (DJ): 0.000ns
Phase Error (PE): 0.000ns
Maximum Data Path at Slow Process Corner: MTMainCores[3].CoreEntry/data_ready_BRB2 to Mmux__n4665412_FRB
Location Delay type Delay(ns) Physical Resource
Logical Resource(s)
------------------------------------------------- -------------------
SLICE_X70Y134.DQ Tcko 0.337 MTMainCores[3].CoreEntry/data_ready_BRB2
MTMainCores[3].CoreEntry/data_ready_BRB2
SLICE_X70Y132.C1 net (fanout=1) 0.710 MTMainCores[3].CoreEntry/data_ready_BRB2
SLICE_X70Y132.C Tilo 0.068 data_mt_ready<3>
MTMainCores[3].CoreEntry/data_ready_rstpot
SLICE_X97Y70.B3 net (fanout=5) 2.967 data_ready_corebuf<3>
SLICE_X97Y70.B Tilo 0.068 data_mt_ready<7>
Mmux__n466542
SLICE_X98Y112.D6 net (fanout=1) 1.627 N19372
SLICE_X98Y112.D Tilo 0.068 MTMainCores[21].CoreEntry/SM_STATE_FSM_FFd4_BRB1
Mmux__n466544
SLICE_X98Y138.C5 net (fanout=1) 1.158 N19376
SLICE_X98Y138.C Tilo 0.068 Mmux__n4665412_FRB
N19384
SLICE_X98Y138.D3 net (fanout=1) 0.345 N19384
SLICE_X98Y138.CLK Tas 0.070 Mmux__n4665412_FRB
Mmux__n4665412
Mmux__n4665412_FRB
------------------------------------------------- ---------------------------
Total 7.486ns (0.679ns logic, 6.807ns route)
(9.1% logic, 90.9% route)