Всем привет!
Всегда писал автоматы преимущественно одним блоком процесса, сейчас решил попробовать разделение на синхронный и асинхронный блоки так как в текущей задаче это было бы удобно(небольшая экономия строк кода и повышение читаемости). Да и язык для меня новый.
Вот написал конечный автомат:
Код
(*keep = "true"*)enum logic[5:0] {IDLE, READ_HEADER, READ_CALIB_DATA, STOP} sm_state, sm_state_next;
always_ff @(posedge clk) begin
sm_state <= sm_state_next;
end
always @(*)begin// специально поставил именно * так как входных сигналов управления fsm предполагается много
if(rst==1'b1)begin
sm_state_next <= IDLE;
end
else begin
case (sm_state)
IDLE : begin
sm_state_next <= READ_HEADER;
end
READ_HEADER : begin
sm_state_next <= READ_CALIB_DATA;
end
READ_CALIB_DATA : begin
sm_state_next <= STOP;
end
STOP : begin
end
default: begin
sm_state_next <= IDLE;
end
endcase
end
end
Как я понял - так же предлагают многие учебники(может я не внимателен?).
Проблема в том, что вивадо(17.1) ругается, что там появляется timing loop. Это нормальное поведение? не усложняет ли этот факт ошибки оценку тайминга(при желании можно проигнорировать эту ошибку и насильно развести)
В симуляции работает все корректно.
Заранее спасибо!