Как сохранить значение в операторе case в verilog

#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;