Verilog / VHDL - Como evitar a redefinição de registros de dados em um único bloco sempre?

Eu gosto de evitar a redefinição de registros de dados que não precisam ser redefinidos. Por exemplo, ao transmitir dados pelos estágios do pipeline, se cada estágio tiver um bit válido, não será necessário redefinir os registros de dados. (Acredito que isso facilita o roteamento e o tempo nos registros de dados.)

Isso pode ser feito facilmente usando blocos sempre separados (ou processos em vhdl), mas acho isso detalhado, e fazer o seguinte é problemático porque o registro de dados está essencialmente sendo ativado pela redefinição.

always @(posedge clk)
if (rst)
  out_valid <= 0;
  // NOTE: out_data is not reset
else begin
  out_valid <= in_valid;
  if (in_valid)
    out_data <= in_data + 1;
end

Em vez disso, coloquei a cláusula de redefinição no final do bloco always e aproveitei a regra "vitórias na última atribuição".

always @(posedge clk)
begin
  out_valid <= in_valid;
  if (in_valid)
    out_data <= in_data + 1;

  if (rst)
    out_valid <= 0
end

Não vi muitas pessoas usando esse estilo. Há alguns inconvenientes ou problemas que estou perdendo? Existe um jeito melhor de fazer isso?

Pergunta bônus: E se a redefinição for assíncrona? Como em:

always @(posedge clk, posedge rst)
begin
  out_valid <= in_valid;
  if (in_valid)
    out_data <= in_data + 1;

  if (rst)
    out_valid <= 0
end

Nesse caso, acho que o sintetizador conectará o sinal de redefinição ao registro de dados, o que anula o objetivo. Existe uma maneira elegante de dissociar o registro de dados do sinal de redefinição sem recorrer a separar sempre o bloco?

questionAnswers(4)

yourAnswerToTheQuestion