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 コード生成時に内部最適化が容易になります。ループ ストリーミング最適化を使用して、生成されるハードウェアの量を削減する場合は、この方法が推奨されます。
次の例において、var1
と var2
は永続変数です。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