Verilog / VHDL - ¿Cómo evitar restablecer los registros de datos dentro de un solo bloque siempre?

Me gusta evitar restablecer los registros de datos que no necesitan restablecerse. Por ejemplo, cuando se transmiten datos a través de etapas de canalización, si cada etapa tiene un bit válido, no es necesario restablecer los registros de datos. (Creo que esto facilita el enrutamiento y la sincronización en los registros de datos).

Esto se puede lograr fácilmente usando bloques siempre separados (o procesos en vhdl), pero me parece detallado, y hacer lo siguiente es problemático porque el restablecimiento de los datos esencialmente lo habilita.

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

En cambio, he estado poniendo la cláusula de reinicio al final del bloque siempre y aprovechando la regla de "últimas asignaciones ganadas".

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

  if (rst)
    out_valid <= 0
end

No he visto a mucha gente usando este estilo. ¿Hay algún inconveniente o problema que me falta? ¿Hay una mejor manera de hacer esto?

Pregunta extra: ¿Qué pasa si el reinicio es asíncrono? Como en:

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

  if (rst)
    out_valid <= 0
end

En este caso, creo que el sintetizador conectará la señal de reinicio al registro de datos, lo que anula el propósito. ¿Existe una forma elegante de desacoplar el registro de datos de la señal de reinicio sin tener que recurrir a un bloque siempre separado?

Respuestas a la pregunta(4)

Su respuesta a la pregunta