回答:
3つの可能性を区別します。
VHDL変数にはハードウェア表現がまったくありません。次の例を想定します
signal a,b,c : integer;
...
process ( clk ) is
variable var : integer := 0;
begin
if ( rising_edge(clk) ) then
var := a + b;
c <= var;
end if;
end process;
変数var
は実際には組み合わせロジックとしてまったく合成されていません(これが問題の意味であると仮定した場合)。a + b
ハードウェアに統合されるのは、割り当ての右側です。厳密に言えば、変数が組み合わせロジックに合成されることはありません。
変数は中間結果を保持するだけであり、同じクロックサイクルで評価されます->ハードウェアは合成されません(これは1です))、または次のクロックサイクルで評価されます->フリップフロップが合成されます。
これらの恐ろしいラッチの1つは、変数に新しい値(一部の信号に依存)もデフォルト値も割り当てられていない条件付きブランチが存在する場合に推測されます。通常、このケースは意図せず発生します:-)
保存する前に変数の値を使用すると、プロセスが最後に保存したときに保存された値が取得されます(クロックプロセスでは、前のクロックサイクルの値)。これはレジスターまたはFFとして合成されます。
もちろん、reset句で変数を初期化しない限り、最初のクロックサイクルでガベージが発生します。