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