Всегда указывайте значение по умолчанию для переменных в verilog - PullRequest
0 голосов
/ 03 мая 2018

У меня довольно большой блок if else.

always @(posedge clk)
begin
  r <= 3;
  if( cond1 )
    a <= 1;
  else if( cond2 )
  begin
    a <= 2;
    r <= 3;
  end
  else
    a <= 3;
end

В этом случае я пытаюсь указать значение по умолчанию для r в блоках. Будет ли верхний оператор r<= выполняться для первого и последнего блоков if?

1 Ответ

0 голосов
/ 03 мая 2018

Вполне допустимо указывать значения по умолчанию.
В Verilog последнее задание «выигрывает».
- Для неблокирующих назначений это означает, что выполняется только последнее.
- Для блокирующих назначений они выполняются в порядке, в котором они встречаются.

На самом деле в сложных конечных автоматах это метод, который я предпочитаю. Вы можете использовать его как в комбинаторном (блокирующем), так и в тактовом / зарегистрированном (неблокирующем) коде.

Однако это хорошая практика кодирования, чтобы пометить это, чтобы читатель знает, что вы устанавливаете значения по умолчанию и что эти значения могут быть переопределены далее в коде. Вот фрагмент кода передатчика UART:

  // Defaults for TX FSM
  nxt_tx_state    = tx_state;
  nxt_tx_bit_cnt  = tx_bit_cnt;
  nxt_tx_samp_cnt = tx_samp_cnt;
  nxt_shift_out   = shift_out;

То же самое верно, когда у вас есть нижележащее переопределение:

....
....
// This overrides all the above
if (emergency_halt)
   state <= IDLE_STATE;

Как инструмент синхтезиса обрабатывает это значение по умолчанию? Или это не то, на что мне не нужно смотреть

Вам не нужно беспокоиться об этом. Наиболее важным является то, что симуляция и аппаратные средства ведут себя одинаково.

Но я все равно отвечу. Проще всего привести пример:

always @(*)
begin
   // default
   A = 1;

   if (B==2)
      A = 3;

   if (B==4)
      A = 5;

end

Инструмент синтеза переводит это на:

   if (B==4)
      A = 5;
   else if (B==2)
      A = 3;
   else
      A = 1;

В этом случае два оператора 'if' являются взаимоисключающими, но даже если это не так, в результате аппаратные средства будут действовать как блокирующие назначения: побеждает последний.

...