2017-06-21 6 views
5

私はparameterが渡されたモジュールを持っており、定義されたパラメータに対応する別のモジュールをインスタンス化します。コンパイル時にエラーをスローするLINT /合成安全ステートメントとは何ですか?

しかし、ケースは、パラメータの特定の組み合わせのために定義されていない場合には、私はそうのように、問題を強調するために、コンパイル時にスローされるようにエラーをしたいと思います:

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

end else begin 

    // throw an error at compile time if we haven't 
    // defined a case for those parameters 

end 
endgenerate 

をしかし、このコードは、挿入されたエラーにもかかわらず、まだ合成可能(SystemVerilogではなくVerilog)でLINTingを渡す必要があります。

この状況で私が何を使用できるのか誰も知っていますか?前もって感謝します。

答えて

4

私は姉妹サイトであるElectronics StackExchangeで "a way of conditionally triggering a compile-time error in verilog"と非常によく似た質問に答えました。解決策は、存在しないモジュールをインスタンス化することです。存在しないモジュールには非常に長い名前と意味のある名前を付けてエラーを説明することをお勧めします。これはまた、存在しないモジュールが誤って既存のモジュールと同じ名前を持つリスクを低減します。

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module(); 
end 
endgenerate 

これは、存在しないモジュールの存在を確認する作業が、エラボレーション段階でパラメータ値が評価されるまで行われないためです。


より良い解決策は、SystemVerilogアプローチを使用することです。具体的には、IEEE Std 1800-2009規格以上のシミュレータを補完します。その後、$error()を使用して、より意味のあるエラーメッセージを表示できます(たとえば、エラー状態を引き起こしたパラメータ値を表示するなど)。あなたはそれについてIEEE Std 1800-2012 20で読むことができます。11の推敲システムタスク

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    $error("Expected PRAM1/2 to be 1/2 or 2/1, but was %0d/%0d", PARAM1, PARAM2); 
end 
endgenerate 
0

いいえ。これはVerilogには何もありません。あなたは編集時にそれをすることはできません。

しかし、シミュレーションでエラーをダンプして時刻 '0'に終了することができます。あなたはアサーションを追加することができ、システムのVerilogで

initial assert(0) else $fatal("--error--"); 

か、単に

initial $fatal("--error--"); 

そうでない場合はそのような何か:

initial begin $display("--error--"); $finish; end 

どちらがの先頭にメッセージを提供しますシミュレーション。

+2

はSystemVerilogのでは、あなただけの '生成-if'のelse節に' $致命的な( "メッセージ")を行うことができます。 –

+0

vcs 2015では、これが実装されていますが、特別なコンパイルスイッチ "-assert svaext"が必要です。このような場合、vcsは素晴らしいコンパイル時のメッセージを生成します。それ以外の場合は、構文エラーを検出します。 'initial'を指定すると、問題なくコンパイルされ、実行時違反メッセージが生成されます。 – Serge

1

それは少し不格好だと私はあなたの糸くずのツールがチェックしているかわからないが、どのようにこれについて:

generate 
    if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

    end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

    end else begin 

    reg ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2; 
    reg DUMMYO, DUMMYI; 
    always @(posedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2 or negedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2) 
     DUMMYO <= DUMMYI; 

    end 
endgenerate 

これは私がセットのQuartusに次のエラーを与えるPARAM1 3:

エラー(10239):のVerilog HDL常にsynth_assertion.v(18)でエラーを構築:イベント制御は、可変の正と負の両方のエッジをテストすることができない "ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2"

関連する問題