Why is this an issue?

Using both active-low and active-high resets within the same reset domain can lead to several issues:

  1. Confusion and Misinterpretation
  2. Increased Design Complexity
  3. Timing and Glitch Issues
  4. Synthesis and Implementation
  5. Debugging Complexity
  6. Consistency in Design Practices

In summary, while there might be specific cases where using both active-low and active-high resets might seem beneficial, the drawbacks generally outweigh the advantages. It's advisable to choose one reset polarity standard for all elements within a reset domain to ensure clarity, reduce design complexity, and facilitate easier verification, synthesis, and debugging processes.

How to fix it

Code examples

Noncompliant code example

architecture rtl of top is
begin
  A: process (clk) is
  begin
   if rising_edge(clk) then
     s1 <= '1';
     if rst = '1' then  -- Active-high reset
       s1 <= '0';
     end if;
   end if;
  end process;

  B: process (clk) is
  begin
   if rising_edge(clk) then
     s2 <= '1';
     if rst = '0' then  -- Active-low reset
       s2 <= '0';
     end if;
   end if;
  end process;
end architecture;

Compliant solution

architecture rtl of top is
begin
  A: process (clk) is
  begin
   if rising_edge(clk) then
     s1 <= '1';
     if rst = '1' then  -- Active-high reset
       s1 <= '0';
     end if;
   end if;
  end process;

  B: process (clk) is
  begin
   if rising_edge(clk) then
     s2 <= '1';
     if rst = '1' then  -- Active-high reset
       s2 <= '0';
     end if;
   end if;
  end process;
end architecture;