Сначала убедитесь, что простая защелка будет синтезироваться как защелка. Если это не так, то это отдельная проблема, и вам нужно будет разобраться; проверьте версию синтезатора и целевое устройство.
always_latch
if (enable)
a <= a_input;
Я не уверен, почему ваша защелка не работает. Защелки должны быть простыми, чтобы предотвратить непреднамеренную сложную обратную связь. Ваш код выглядит достаточно простым, поскольку единственное, что он делает за пределами базового c D-защелки, это маскирует некоторые биты.
Если предположить, что защелка basi c синтезируется правильно, вы можете сделать комбинационную логику c до или после защелки. Пример:
always_comb begin
a_comb = a_input;
a_comb.test = a_comb.test[1:0];
end
always_latch
if (enable)
a <= a_comb;
или:
always_latch
if (enable)
a_lat <= a_input;
always_comb begin
a = a_lat;
a.test = a.test[1:0];
end
Если вы только маскируете биты, вы можете использовать:
always_latch
if (enable)
a <= a_input & 32'h100000003;
Если три выше не не работает, но простая защелка работает правильно, тогда это может быть связано с оптимизацией. В этом случае убедитесь, что a_input
и enable
являются FF и являются функционально переключаемыми (ie не оптимизирован, потому что делают что-то еще выше). Также проверьте, как a
начинает использоваться вниз по течению.