記事 ID: 000074260 コンテンツタイプ: トラブルシューティング 最終改訂日: 2021/08/28

ソースコードに変数シフト演算子が含まれているのに、Nios II C-to-Hardware (C2H) コンパイラーがアクセラレーターを生成するタイミングが失敗するのはなぜですか?

環境

  • インテル® Nios® II プロセッサー
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    詳細

    デザインがタイミングを満たさない理由は、1 つ以上のバレル・シフターが他の組み合わせロジックと直列に含まれていることです。シフト演算子が変数 「a = b << c;」などと共に使用される場合Nios® II C2H はバレルシフト・ロジックを生成します。C2H によって生成されるバレルシフト・ロジックは、デザインのタイミングに大きな影響を与える多数の組み合わせマルチプレクサーを実装します。 次の 2 つの例は、バレルシフターが原因でタイミングが劣化する可能性のあるソースコードを示しています。


    組み合わせシフト入力:

    以下は、タイミングの劣化を引き起こす可能性のあるバレル・シフターへの組み合わせシフト入力の例です。

    int a, b, c, d, result, shift_distance;
    result = (a b c d) >> shift_distance;

    加算結果はシフト演算子の受け取りとして使用されるため、いずれかの加算入力と「結果」の間に長いタイミングパスが作成されます。パイプライン処理の量を増やすには、以下のように追加結果を一時変数に割り当てます。

    int a, b, c, d, addition_result, shift_distance;
    addition_result = a b c d;
    result = addition_result >> shift_distance;


    組み合わせシフト出力:

    以下は、タイミングの劣化を引き起こす可能性のあるバレル・シフターからの組み合わせシフト出力の例です。

    int a, b, c, d, result, shift_distance;
    result = (a >> shift_distance) b c d;

    シフト結果は加算演算子の臆伴として使用されるため、「a」と「結果」の間に長いタイミングパスが作成されます。パイプライン処理の量を増やすには、以下のようにシフト結果を変数に割り当てます。

    int a, b, c, d, result, shift_result, shift_distance;
    shift_result = a >> shift_distance;
    result = shift_result b c d;

    関連製品

    本記事の適用対象: 1 製品

    インテル® プログラマブル・デバイス

    このページのコンテンツは、元の英語のコンテンツを人力翻訳および機械翻訳したものが混在しています。この内容は参考情報および一般的な情報を提供するためものであり、情報の正確さと完全性を保証するものではありません。インテルは不正確な翻訳があった場合でもいかなる責任を負いません。このページの英語版と翻訳の間に矛盾がある場合は、英語版に準拠します。 このページの英語版をご覧ください。