Каков смысл не сбрасывать регистр в сбросе в сознании блока Always_ff?

Каковы последствия не сброса флопа внутри блока alaways_ff, поддерживающего сброс?

Пример 1:

always_ff @(posedge clk, negedge rst) begin
   if (~rst) begin
      reg_a <='0;
      reg_b <='0;
   end else begin
      if (condition_1) begin
         reg_a <= some_signal;
      end else if (condition_2) begin
         reg_b <= some signal;
      end
   end
end

Пример 2:

always_ff @(posedge clk, negedge rst) begin
   if (~rst) begin
      reg_a <='0;
   end else begin
      if (condition_1) begin
         reg_a <= some_signal;
      end else if (condition_2) begin
         reg_b <= some signal;
      end
   end
end

Единственная разница между примерами 1 и 2 состоит в том, что в примере 2 reg_b не имеет условия сброса. Что будет следствием этой ошибки в бэкэнде / синтезе? У меня есть опыт работы с интерфейсом RTL с небольшим опытом в sylthesis. Итак, я пытаюсь понять, почему пример 2 выше - плохая практика.

Одна очевидная проблема - сразу после сброса reg_b будет X в примере 2. Так что, если reg_b используется в любой логике управления, это может привести к ошибке в дизайне. Кроме этого, какие еще проблемы это может создать?

1 ответ

Я не думаю, что это приведет к какой-либо ошибке во время синтеза или PnR.
На огромных проектах я столкнулся с некоторыми ff, которые не были сброшены. Это может избежать некоторых ненужных ограничений на инструменты PnR.
Однако, как вы сказали, вы должны быть осторожны, чтобы не вводить ошибки, используя их до того, как они будут написаны, поскольку до этого момента это будет "X".

Другие вопросы по тегам