このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。
インテルのみ表示可能 — GUID: mwh1409959599013
Ixiasoft
インテルのみ表示可能 — GUID: mwh1409959599013
Ixiasoft
1.5.3.1. 意図しないラッチ生成を回避する
コードが意図せずにラッチを作成する場合、RTLを変更してラッチを削除します。
- HDLコードがクロックエッジの外側の信号に値を割り当てた場合(たとえば、非同期resetを使用 する場合)、合成はラッチを推測しますが、コードはエッジ・トリガー・デザイン・ブロックの値を割り当てません。
- また、HDLコードがエッジ・トリガー・デザイン・ブロックの信号に値を割り当てるときに意図しないラッチが発生しますが、合成の最適化によりそのロジックが削除されます。たとえば、 CASEまたはIFステートメントがFALSEと評価される条件のみをテストする場合、合成は最適化中にそのステートメントのロジックまたは信号の割り当てを削除します。この最適化により、信号のラッチが推論される場合があります。
- IFまたはCASEステートメントで最後のELSEまたはWHEN OTHERS句を省略すると、ラッチが生成されることもあります。デフォルト条件のDo n't care( X )割り当ては、ラッチ生成を防ぐのに役立ちます。最適なロジック最適化のために、ロジック値の代わりにデフォルトのCASEまたは最終ELSE値をドントケア( X )に割り当てます。
Verilog HDLデザインでは、 full_case属性を使用して、未指定のケースをドントケア値( X )として扱います。ただし、 full_case属性は合成のみであるため、シミュレーションツールは未指定のケースをラッチとして処理するため、シミュレーションの不一致が発生する可能性があります。
VHDL Code Preventing Unintentional Latch Creation
最後のELSE句がない場合、次のコードは意図しないラッチを作成して、 SEL入力の残りの組み合わせをカバーします。をターゲットにしているとき Stratix® このコードを持つシリーズデバイスでは、最終ELSE条件を省略すると、合成ツールはELSEステートメントで使用する3つではなく、最大6つのLEを使用する可能性があります。さらに、最終的なELSE句をXではなく1に割り当てると、ドントケア値ではなく定数値を指定すると合成ツールが最適化を実行できないため、LEがわずかに多くなる可能性があります。
LIBRARY ieee; USE IEEE.std_logic_1164.all; ENTITY nolatch IS PORT (a,b,c: IN STD_LOGIC; sel: IN STD_LOGIC_VECTOR (4 DOWNTO 0); oput: OUT STD_LOGIC); END nolatch; ARCHITECTURE rtl OF nolatch IS BEGIN PROCESS (a,b,c,sel) BEGIN IF sel = "00000" THEN oput <= a; ELSIF sel = "00001" THEN oput <= b; ELSIF sel = "00010" THEN oput <= c; ELSE --- Prevents latch inference oput <= 'X'; --/ END IF; END PROCESS; END rtl;