#case #verilog #hdl #synthesis
Вопрос:
При проектировании конечных автоматов в verilog я часто пишу подобный код, чтобы сохранить значение в определенном состоянии.
always@(state, a, b) begin case(state) begin S1: a = b; S2: a = a; // preserve a; endcase end
Это необходимо, потому что, если я не укажу значение для каждого регистра в списке чувствительности, компилятор выведет блокировку. Для меня это похоже на запах кода, но я недостаточно опытен, чтобы знать наверняка. Является ли это лучшим способом сохранить ценность в verilog?
Ответ №1:
Сохранить состояние означает создать защелку, то есть устройство, которое делает именно это.
a=a
это оператор null, и вы вообще не должны его использовать.
Не используйте списки чувствительности в блоке всегда, они подвержены ошибкам, вместо этого используйте@*.
И для защелок вы должны использовать неблокирующие назначения.
Ваше заявление о случае защелки должно выглядеть следующим образом:
always@(*) begin case(state) begin S1: a lt;= b; S2: // do nothing about 'a', a will not change. endcase end
в целом схема FSM, используемая в промышленности, использует часы и выглядит следующим образом:
always@(posedge clk) begin case(state) begin S1: begin next_state lt;= S2; a lt;= b; end S2: // do nothing about 'a', a will not change. .... endcase end assign state = next_state;