敏感性列表和等待語句

具有敏感性列表的程序也不能包含等待語句。它相當於同一個程序,沒有敏感列表,還有一個最後一個語句:

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;