デザインがタイミングを満たさない理由は、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;