アーキテクチャで宣言された信号をプロセスの機密リストに挿入する必要がある時期について混乱しています。
どんな状況でも従うことができる一般的な法律はありますか?
プロセス感度リストに信号を含める必要がある場合、理解が非常に困難です。
「一般法」とは
プロセスがchanges ofについて知る必要があるものはすべて、機密リストに含まれている必要があります。
同期リセットを備えた一般的な合成可能なレジスタの場合:
_process (clk) is
begin
if rising_Edge(clk) then
if reset = '1' then
-- do reset things
else
-- read some signals, assign some outputs
end if;
end if;
end process;
_
リストに含める必要があるのはクロックのみです。他のすべてはクロックが変更されたとき(if rising_Edge(clk)
ステートメントによる)のみに注目されるためです。
非同期リセットが必要な場合:
_process (clk, reset) is
begin
if reset = '1' then
-- do reset things
elsif rising_Edge(clk) then
-- read some signals, assign some outputs
end if;
end process;
_
reset
信号も感度リストに含まれている必要があります。これは、クロックの動作に関係なく、デザインが変化するたびにその値をチェックする必要があるためです。
組み合わせロジックの場合、感度リストを最新に保つ問題と、合成コードとは異なる動作をするシミュレーションの可能性があるため、プロセスの使用を完全に避けます。これはVHDL-2008のall
キーワードによって緩和されましたが、プロセスが役立つように長く複雑な組み合わせロジックを記述したいとはまだ思っていません。
シグナルがプロセスの感度リストにある場合、プロセスは「ウェイクアップ」し、そのシグナルの値が変化するたびに評価されます。感度リストにない場合、信号は変更できますが、プロセスは再評価されず、新しい出力がどうあるべきかを判断しません。
組み合わせロジックの場合:すべての入力信号を感度リストに含める必要があります。それらが感度リストに含まれていない場合、入力信号が変化しても出力は変化しません。これはよくあるエラーです(不注意による)。 VHDL 2008では、「all」キーワードを使用して、プロセスに必要なすべての信号を自動的に含め、ラッチの作成を回避できることに注意してください。
同期ロジックの場合:感度リストにクロック(およびおそらくリセット)信号のみが必要になる可能性があります。これは、システムクロックが変更されたときに、信号の値(クロック以外)のみに関心があるためです。これは、通常、クロックエッジでの出力値の変更のみを許可するレジスタ(フリップフロップで構成される)を記述するためです。
VHDLで記述した回路のサブセットのみがFPGA内に実際に実装できるため、これらすべては合成にHDLを使用する場合に混乱する可能性があります。たとえば、2つの独立したクロックエッジに敏感なプリミティブメモリ要素は、感度リストに2つのクロックを含めることでそのような回路を記述することはできません。
また、合成ツール(この場合はザイリンクスXSTについて語っています)は、必ずしもプロセスの感度リストを尊重しているわけではありません。プロセスの本文で値が評価されるすべてのプロセスをリストしない場合、XSTは、値が評価される信号が感度リストにあると想定するという警告を発します。これにより、動作シミュレーションと実際のハードウェアに違いが生じる可能性があります。覚えておいてください。
...また、注意が必要です。感度リストは、合成後のデザインの動作に影響しません。シミュレーション中にのみ使用されます。したがって、機密リストの変更により、RTLと合成コードの動作に違いを導入するのは非常に簡単です。
Joshが提供するルールは優れていますが、何よりも、ツールが提供する警告を読み、それらに基づいて行動してください。彼らは通常、感度リストが正しいことを確認し、問題にフラグを立てます。 Emacs VHDLモードには、感度リストを更新するコマンドもあり、通常はかなり優れています。
うーん、忍者