敏感性列表和等待语句

具有敏感性列表的进程也不能包含等待语句。它相当于同一个进程,没有敏感列表,还有一个最后一个语句:

wait on <sensitivity_list>;

例:

  process(clock, reset)
  begin
    if reset = '1' then
      q <= '0';
    elsif rising_edge(clock) then
      q <= d;
    end if;
  end process;

相当于:

  process
  begin
    if reset = '1' then
      q <= '0';
    elsif rising_edge(clock) then
      q <= d;
    end if;
    wait on clock, reset;
  end process;

VHDL2008 在灵敏度列表中引入了 all 关键字。它等同于在过程中某处读取的所有信号。在设计用于合成的组合过程时,避免不完整的灵敏度列表尤其方便。不完整敏感度列表的示例:

  process(a, b)
  begin
    if ci = '0' then
      s  <= a xor b;
      co <= a and b;
    else
      s  <= a xnor b;
      co <= a or b;
    end if;
  end process;

ci 信号不是灵敏度列表的一部分,这很可能是编码错误,导致合成前后的模拟不匹配。正确的代码是:

  process(a, b, ci)
  begin
    if ci = '0' then
      s  <= a xor b;
      co <= a and b;
    else
      s  <= a xnor b;
      co <= a or b;
    end if;
  end process;

在 VHDL2008 中,all 关键字简化了这一过程并降低了风险:

  process(all)
  begin
    if ci = '0' then
      s  <= a xor b;
      co <= a and b;
    else
      s  <= a xnor b;
      co <= a or b;
    end if;
  end process;