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

ID 683082
日付 4/13/2020
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

1.5.3.1. 意図しないラッチ生成を回避する

組み合わせロジックをデザインする場合、特定のコーディング・スタイルが意図しないラッチを作成する可能性があります。 たとえば、 CASEまたはIFステートメントがすべての可能な入力条件をカバーしていない場合、新しい出力値が割り当てられていない場合、合成ツールはラッチを推測して出力を保持できます。推論されたラッチへの参照については、合成ツールのメッセージを確認してください。

コードが意図せずにラッチを作成する場合、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;