VHDL で ALU をビルドして合成しようとしていますが、合成するとすぐに問題が発生します。ALU に、2 つの N ビット入力を追加するためのオペコードと、入力または以前に計算された合計によって設定できるキャリーを持たせたいと考えています。私が興味を持っているコードの部分は次のとおりです。
process (a, b, op) -- a and b are n bits input en op is the op-code
case op is
when "011" => -- add a + b + c (with c as carry)
y <= ('0' & a) + ('0' & b) + c; -- y is the N-bit output
...
end process;
process (clk)
if (clk'event and clk = '1') then
if (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) > (2**N)) then --basically I'm testing if there is an overflow during the calculation
c <= '1';
elsif (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) < ((2**N)+1))
c <= '0';
...
end process;
シグナルの種類を定義していないので、ここでコードが機能するかどうかはわかりませんが、基本的には上に書いたとおりです。これに関する問題は、適切なテストベンチで VHDL をシミュレートすると、正常に動作するのに、このコードを合成して同じテストベンチで合成コードをシミュレートすると、最初のプロセスが何らかの理由で正しく動作しないことです。 a、b、または op が変更されていなくても、もう一度繰り返されます。したがって、合計の結果にキャリーがある場合、この新しいキャリーを使用して計算が再度実行され、a、b、または op が変更されていなくても、結果が 1 増加します。
後で、この記事で、機密リストがコンパイラによって「無視」されていることを発見しました。コンパイラは、コンパイラがプログラムをあなたよりもよく知っていると考え、独自の機密リストを作成します。これが真の場合、コンパイラが最初のプロセスのセンシティビティ リストに clk を追加して、op = "011" のときに clk 周期ごとに計算が実行されるようにします。
私の質問は次のとおりです。計算が一度実行され、その後キャリーが変更されるようにするには、この問題について何ができますか?
敬具