インテル® Quartus® Prime プロ・エディションのユーザーガイド: デザインの推奨事項

ID 683082
日付 8/03/2023
Public
ドキュメント目次

1.5.3.1. 意図しないラッチ生成の回避

組み合わせロジックを設計する際に、コーディング・スタイルによっては意図しないラッチが作成される場合があります。 例えば、CASE または IF ステートメントですべての発生し得る入力条件をカバーしていない場合に、新しい出力値が割り当てられていないと、合成ツールはラッチを推論して出力を保持することがあります。合成ツールのメッセージで、推論されたラッチへのリファレンスを確認します。

コードから意図しないラッチが作成される場合は、RTLを変更してラッチを削除します。

  • 合成におけるラッチの推論は、HDLコードでクロックエッジ外で信号に値を割り当てており (例えば、非同期 reset などで)、エッジでトリガーされるデザインブロックに値を割り当てていない場合に発生します。
  • 意図しないラッチは、エッジでトリガーされるデザインブロックの信号にHDLコードで値を割り当てており、合成の最適化によってそのロジックが削除された場合にも発生します。例えば、CASE または IF ステートメントでテストしている条件がFALSEのみに評価される場合、合成時の最適化ではそのステートメントのロジックまたは信号割り当てが削除されます。この最適化により、信号のラッチが推論される場合があります。
  • IF または CASE ステートメントで最後の ELSE または WHEN OTHERS 句を省略すると、ラッチが生成されることがあります。デフォルト条件のDon’t care (X) 割り当ては、ラッチ生成の防止に役立ちます。最良のロジック最適化を実現するには、ロジック値の代わりにデフォルトの CASE または最後の ELSE 値をDon’t care (X) に割り当てます。

Verilog HDLのデザインでは、full_case 属性を使用して、未指定の場合をDon’t care値 (X) として扱います。ただし、full_case 属性は合成専用のため、シミュレーションの不一致が発生する可能性があります。シミュレーション・ツールは未指定の場合をラッチとして処理します。

VHDLコードにおける意図しないラッチ生成の防止

最後の ELSE 句がないと、次のコードでは、意図しないラッチを作成して SEL 入力の残りの組み合わせに対応します。このコードで Stratix® シリーズのデバイスをターゲットにしている場合に、最後の ELSE 条件を省略すると、合成ツールでは、ELSE ステートメントで使用する3つではなく最大6つのLEを使用するようになります。さらに、最後の ELSE 句を X ではなく 1 に割り当てると、LEがわずかに多くなる可能性があります。Don’t care値ではなく定数値を指定している場合、合成ツールでは多くの最適化を実行することができません。

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;