¿Por qué dos bucles if independientes siempre se colocan en diferentes bloques always/process?

architecture rtl of goodFFstyle is
signal q1 : std_logic;
begin
    process (clk)
    begin
       if (clk'event and clk = '1') then
          if (rst_n = '0') then
             q1 <= '0';
          else
             q1 <= d;
          end if;
      end if;
end process;

process (clk)
begin
   if (clk'event and clk = '1') then
      q2 <= q1;
   end if;
end process;
end rtl;

En el ejemplo anterior, el segundo proceso podría haberse evitado si q2 asignado se incluyera en el primer proceso.

architecture rtl of goodFFstyle is
    signal q1 : std_logic;
    begin
        process (clk)
        begin
           if (clk'event and clk = '1') then
              if (rst_n = '0') then
                 q1 <= '0';
              else
                 q1 <= d;
              end if;
              q2 <= q1;
          end if;
    end process;

El segundo ejemplo usa menos líneas de código, pero la mayoría prefiere la primera forma de codificación. Entonces, mi duda, ¿hay alguna ventaja si codificamos en el primer método?

En una nota relacionada, if (clk'event and clk = '1') thengeneralmente no se recomienda el estilo, sino que se usa if (rising_edge(clk)) then.

Respuestas (1)

No hay nada malo con el segundo estilo a menos que se lleve en exceso.

Si la funcionalidad de Q1 y Q2 están estrechamente relacionadas, preferiría el proceso único. Perseguir señales intermedias entre cientos de pequeños procesos solo oscurece el diseño.

Y nunca he visto una herramienta de síntesis que tampoco pueda generar hardware óptimo a partir de ella.