このVHDLの行列-ベクトル乗算関数は並列化されていますか?


9

与えられたmxn行列aをnx1ベクトルで乗算する次のVHDL関数がありますb

function matrix_multiply_by_vector(a: integer_matrix; b: integer_vector; m: integer; n: integer)
return integer_vector is variable c : integer_vector(m-1 downto 0) := (others => 0);
begin
    for i in 0 to m-1 loop
        for j in 0 to n-1 loop
            c(i) := c(i) + (a(i,j) * b(j));
        end loop;
    end loop;
    return c;
end matrix_multiply_by_vector;

それはうまく機能しますが、これは実際にハードウェアで何を実装しますか?具体的には、内部のforループを並列化して、基本的に行列の各行の内積を計算できることが十分に賢明かどうかを知りたいです。そうでない場合、行列とベクトルの乗算を並列化する最も簡単な(つまり、良い構文)方法は何ですか?


1
それがなかった場合は、メモリのいくつかの種類があり、シリアル値のすべてをロードし、そのパイプラインのスタイル「実行」する必要があります
電圧スパイク

回答:


9

「ハードウェア」(VHDLまたはVerilog)では、すべてのループが展開され、並列に実行されます。

したがって、内側のループだけでなく、外側のループも展開されます。

これが、コンパイル時にループサイズを知る必要がある理由でもあります。ループ長が不明な場合、合成ツールは文句を言うでしょう。


これは、SW言語の初心者にとってよく知られた罠です。彼らは変換しようとします:

int a,b,c;
   c = 0;
   while (a--)
     c +=  b;

VHDL / Verilogハードウェアに。問題は、シミュレーションですべて正常に機能することです。しかし、合成ツールは加算器を生成する必要があります: c = b+b+b+b...b;

そのため、ツールは作成する加算器の数を知る必要があります。a一定であれば大丈夫です!(たとえそれが4.000.000であっても、それはゲートを使い果たしますが、試みます!)

しかしa、変数の場合は失われます。


この場合、それは単に乗算であるため、aは単に被乗数であり、したがって可変になる可能性があります...
Harry Svensson

1

処理のサブセットを制御するイベントを定義していないため、このコードは両方のループを並列化します。ループは、関数を生成するために必要なだけのハードウェアを生成します。プロセスが必要です。

プロセスには、リスト内のノードの1つが変更されない限りプロセスが呼び出されないことをVHDL(またはシンセサイザ)に通知する機密リストがあります。これを使用して、ラッチを合成し、純粋な組み合わせ実装の領域を超えて拡張できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.