input wire sys_clk; // тактовая частота
input wire [31:0] data_in; // входные данные
output reg [31:0] reg_out; // выходные данные
reg [31:0] reg_in_1, reg_in_2, reg_in_3, reg_in_4; // регистры для хранения принятых данных
вначале автомат по некоторому закону принимает входные данные в регистры, где они довольно долго (микросекунды) хранятся.
always @ (posedge clock_sys)
begin
...STATE_IN1: reg_in_1 <= data_in;
STATE_IN2: reg_in_2 <= data_in;
STATE_IN3: reg_in_3 <= data_in;
STATE_IN4: reg_in_4 <= data_in;
...
end
через некоторое время содержимое этих регистров необходимо подать на выход (в другой регистр). Это делает другой автомат.
always @ (posedge clock_sys)
begin
...STATE_OUT1: reg_out <= reg_in_1;
STATE_OUT2: reg_out <= reg_in_2;
STATE_OUT3: reg_out <= reg_in_3;
STATE_OUT4: reg_out <= reg_in_4;
...
end
Время между записью входных данных и передачей их на выход настолько большое, что, казалось бы, можно на эти пути прописать set_false_path
Но - между выходами reg_in_х и входами reg_out Quartus поставит коммутатор. Т.е. на самом деле можно не анализировать пути от выходов reg_in_х до входов этого коммутатора, а
вот время пробега данных от момента выбора с какого входа этого коммутатора данные передаются на входы регистра reg_out не должно превышать такта тактовой частоты clock_sys.
Вопрос - как правильно прописать констрейнты для такого случая (как найти этот коммутатор).
Можно, конечно, изменить проект и явно задать этот коммутатор, или добавить промежуточный регистр в цепочку передачи данных, но не хотелось бы...
Нашел такую команду:
# Cut timing from a mode_select register, which is static in the design, to all of its destinations:
set_false_path -from [get_keepers *|mode_select]
Оно поможет?