Должна ли переменная регистра увеличиваться атомарно? - PullRequest
0 голосов
/ 19 марта 2019

Я пишу код Verilog, который перебирает состояния FSM, чтобы выполнять вычисления поэтапно. Приложение готово и работает по желанию, но из-за требований эффективности мне интересно следующее.

Я обновляю переменную case, "i", как показано в приведенной ниже выдержке 1, это необходимо для того, чтобы не пропустить ни одного шага в моем FSM?

Или метод в выдержке 2 одинаково безопасен для выполнения без пропуска ни одного шага?

Как второй отрывок в два раза быстрее, чем первый.

Прежде чем это спросить. Все работает, все инициализируется перед использованием, счетчики сбрасываются в 0, когда завершены и заключены в модуль.


Код для атомарного обновления "i"

always @(posedge clk) begin
  if( ITERATE ) i = i + 1; //Atomic increment of variable
  else begin
    case( i )
      0: ....
      .: .... 
      n: The case internals are not pertinent
    endcase
  end
  ITERATE = !ITERATE; //Trigger for atomic update of i
end

Код для неатомарного обновления "i"

always @(posedge clk) begin
  case( i )
    0: ....
    .: .... 
    n: The case internals are not pertinent
  endcase
  i = i + 1; //Non-atomic increment of variable
end

1 Ответ

0 голосов
/ 20 марта 2019

В обоих случаях ваши блоки всегда выполняются только один раз за передний фронт клика. Они будут не переоценены в том же дельта-цикле (если у вас нет глюков в самом clk).

Код внутри любого всегда блока выполняется последовательно, как и в других языках программирования.

Итак, согласно вашим примерам, первый будет увеличивать 'i' каждые секунд фронта тактового сигнала, в то время как второй будет увеличивать его каждый фронт тактового сигнала.

Я обновляю переменную case, "i", как показано в приведенной ниже выдержке 1, это вообще необходимо, чтобы не пропустить ни одного шага в моем FSM?

Я не уверен, что вы здесь имеете в виду, но i будет увеличиваться один за другим без пропуска, и оператор case в вашем fsm будет иметь возможность реагировать на каждое значение 'i' в обоих случаях. Будет разница во времени из-за того, что вы использовали ITERATE в первом примере. Кроме того, в первом примере i будет увеличен до оператора case, а во втором примере после . Это другое отличие.

Кстати, слово atomic не относится ни к одному из случаев. Что ты имел в виду там?

Также обратите внимание, что вы не написали свой конечный автомат в соответствии с общими рекомендациями, разделением состояния и логикой перехода, а также, скорее всего, неправильно использовали назначения блокировки в своих примерах. Вероятно, это приемлемые примеры кода для тестового стенда, но они могут не подходить для RTL.

...