Main Content

HDL コード生成に関する for ループのベスト プラクティス

HDL コードを MATLAB® 設計から生成する場合、アルゴリズムをハードウェア面積と速度の要件を満たすアーキテクチャに変換します。HDL コード生成用の MATLAB コードでループを使用する場合のベスト プラクティスは、次のとおりです。

  • インクリメントが 1 の単調増加ループ カウンターを使用して、HDL コードで生成されるハードウェアの量を最小限に抑えます。

  • インデックス値を検索するループを実装するときは、ループの内部で条件付き if-else ステートメントを使用します。

  • ループのストリームによる最適化を使用する場合:

    • ループ内の永続変数に新しい値を代入する場合、代入式の右辺に別の永続変数を使用しないでください。代わりに、中間変数を使用します。

    • ループにより永続配列のいずれかの要素が変更される場合、そのループでは永続配列のすべての要素を変更する必要があります。

単調増加ループ カウンター

インクリメントが 1 の単調増加ループ カウンターを使用すると、HDL コードで生成されるハードウェアの量を削減できます。次のループは、インクリメントが 1 の単調増加ループ カウンターの例です。

a=1;
for i=1:10
    a=a+1;
end

ループ カウンターのインクリメントが 1 以外の値である場合、生成される HDL コードではさらに加算器が必要な場合もあります。この追加のハードウェアを考慮し、次のようなループは使用しないでください。

a=1;
for i=1:2:10
    a=a+1;
end

ループ カウンターの値が減少していく場合、生成される HDL コードではさらに加算器が必要な場合もあります。この追加のハードウェアを考慮し、次のようなループは使用しないでください。

a=1;
for i=10:-1:1
    a=a+1;
end

ループを使用したインデックスの検索

HDL コードを生成するときは、制御フローのようなブレークは使用できません。サポートされている MATLAB データ型、演算子、制御フロー ステートメントを参照してください。for ループでは実行する反復回数が定数でなければならないため、ループを使用してインデックスを検索するには、ループの内部で if-else などの条件付きステートメントを使用します。たとえば、配列 u で 1 の最初のインデックスを検索するには、次のコードを使用できます。

function y = fcn(u)

y = fi(0, 0, ceil(log2(numel(u))), 0);

for ii = cast(1:numel(u), 'like', y)
    if y == 0 && u(ii) == true
        y = ii;
    end
end
end

y の最終値が、配列 u で 1 を含むインデックスの可能な最小の固定小数点値になります。

ループ内の永続変数

ループに複数の永続変数がある場合、永続変数に値を代入する際には、代入式の右辺で永続的でない中間変数を使用します。これにより、コンパイラが依存関係を明確に認識できるようになり、HDL コード生成時に内部最適化が容易になります。ループ ストリーミング最適化を使用して、生成されるハードウェアの量を削減する場合は、この方法が推奨されます。

次の例において、var1var2 は永続変数です。var1 は、代入式の右辺で使用されています。代入式の右辺に永続変数があるため、次のようなループは使用しないでください。

for i=1:10
    var1 = 1 + i;
    var2 = var1 * 2;
end

代入式の右辺では、var1 の代わりに、永続的でない中間変数を使用します。次の例では、中間変数 var_intermediate を使用してこの方式を説明します。

for i=1:10
    var_intermediate = 1 + i;
    var1 = var_intermediate;
    var2 = var_intermediate * 2;
end

ループ内の永続配列

ループにより永続配列の要素が変更される場合、そのループでは永続配列のすべての要素を変更する必要があります。ループ内で永続配列のすべての要素が変更されないと、HDL Coder™ がループのストリーミングによる最適化を実行できません。

以下の例では、a は永続配列です。最初の要素はループの外で変更されています。このようなループは使用しないでください。

for i=2:10
    a(i)=1+i;
 end
 a(1)=24;

最初の要素をループの外で変更するのではなく、すべての要素をループ内で変更します。

for i=1:10
   if i==1
      a(i)=24;
   else
      a(i)=1+i;
   end
end

参考

アプリ

オブジェクト

関数

関連するトピック