Вполне допустимо указывать значения по умолчанию.
В 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' являются взаимоисключающими, но даже если это не так, в результате аппаратные средства будут действовать как блокирующие назначения: побеждает последний.