予期しない結果になる VHDL コード例 - 2023.2 日本語

Vivado Design Suite ユーザー ガイド: ロジック シミュレーション (UG900)

Document ID
UG900
Release Date
2023-10-18
Version
2023.2 日本語
clk_b <= clk;
clk_prcs : process (clk)
begin
  if (clk'event and clk='1') then
    result <= data;
  end if;
end process;
clk_b_prcs : process (clk_b)
begin
  if (clk_b'event and clk_b='1') then
    result1 <= result;
  end if;
end process;

この例には、2 つの同期プロセスがあります。

  • clk_prcs
  • clk_b_prcs

シミュレータは、シミュレーション時間を進める前に clk_b <= clk 代入を実行します。この結果、2 クロック エッジ内で発生するはずのイベントが 1 クロック エッジ内で発生し、レース コンディションになります。

このような状況を回避するため、次を推奨します。

  • クロックとデータは同時に変更しないでください。出力ごとに遅延を挿入します。
  • 同じクロックを使用します。
  • 次の例に示すように、一時的な信号を使用してデルタ遅延を強制します。
    clk_b <= clk;
    clk_prcs : process (clk)
    begin 
      if (clk'event and clk='1') then
        result <= data;
      end if;
    end process;
    result_temp <= result;
    clk_b_prcs : process (clk_b)
    begin
    if (clk_b'event and clk_b='1') then
        result1 <= result_temp;
      end if;
    end process;

ほとんどのイベント ベース シミュレータでデルタ サイクルを表示できます。シミュレーション問題をデバッグする際は、この表示を利用してください。