8

std_logic_vector でさまざまなビットをテストする必要があるとします。各ビットに対して for ループを実行する単一のプロセスを実装するか、各プロセスが 1 ビットをテストする for-generate を使用して「n」個のプロセスをインスタンス化する方がよいでしょうか?

FORループ

my_process: process(clk, reset) begin
  if rising_edge (clk) then
    if reset = '1' then
      --init stuff
    else
      for_loop: for i in 0 to n loop
        test_array_bit(i);
      end loop;
    end if;      
  end if; 
end process;

生成する

for_generate: for i in 0 to n generate begin
my_process: process(clk, reset) begin
  if rising_edge (clk) then
    if reset = '1' then
      --init stuff
    else
      test_array_bit(i);
    end if;
  end if; 
end process;
end generate;

この場合、FPGA および ASIC の実装にどのような影響がありますか? CADツールで扱いやすいのは?

編集:私の質問をより明確にするために、私が1人の助っ人に与えた応答を追加するだけです:

たとえば、ISE で for ループを使用してコードを実行したとき、合成の要約では公正な結果が得られ、すべてを計算するのに長い時間がかかりました。今回は for-generate を使用していくつかのプロセスを使用してデザインを再コーディングしたとき、使用する領域が少し増えましたが、ツールはすべてをはるかに高速に計算でき、タイミング結果も向上しました。それで、それは、余分な領域のコストと複雑さの低い for-generates を使用する方が常に良いというルールを暗示していますか、それとも実装の可能性をすべて検証する必要があるケースの 1 つですか?

4

2 に答える 2

4

リセット機能とテスト機能のロジックが比較的単純であると仮定すると (たとえば、隣接するビット間の相互作用がないなど)、両方が同じロジックを生成すると予想されます。

ループ全体が 1 クロック サイクルで実行されるため、合成はループを展開し、入力ビットごとforに個別のインスタンスを生成することを理解してください。test_array_bitしたがって、少なくともこの単純な例では、合成ツールが両方のバージョンに対して同一のロジックを生成する可能性は十分にあります。

for ... loopそれに基づいて、プログラムロジックをローカライズするバージョンを(わずかに)好みますが、「生成」バージョンはそれをグローバル化し、processボイラープレートの外に配置します。バージョンの方が少し読みやすいと感じた場合はloop、ある程度同意できます。

ただし、スタイルについて独断的であることは報われません。あなたの実験はこれを示していますloop。劣ったハードウェアへの統合です。合成ツールは、高度に最適化されたコンパイラのように複雑で不完全なソフトウェアであり、多くの同じ問題を共有しています。「明らかな」最適化を見逃すこともあれば、(ソフトウェアなどで) 複雑な最適化を行うこともあります。これは、サイズが大きくなったためにキャッシュが壊れるため、実行速度が遅くなります。

そのため、可能な限りクリーンなスタイルで記述することが望ましいですが、ツールの制限や場合によっては実際のツールの欠陥に対処するための柔軟性を備えています。

ツールのバージョンが異なると、このような欠陥が取り除かれます (場合によっては導入されます)。ISE の [新しいパーサーを使用] オプション (Spartan-6 より前のパーツの場合) または Vivado または Synplicity では、ISE の古いパーサーでは適切に処理されない場合があります。(たとえば、プロシージャからシグナルを渡す場合、古い ISE バージョンには深刻なバグがありました)。

例を変更して、最も単純なケースで合成が「うまくいく」(同じハードウェアを生成する) かどうかを確認し、どの構造が失敗するかがわかるまで複雑さを再導入することは有益かもしれません。

この方法で何か具体的なことを発見した場合は、ここで報告する価値があります (ご自身の質問に回答してください)。ザイリンクスは、Webcase システムを介してそのような欠陥を報告することを奨励していました。最終的には修正されました!しかし、彼らはそれを止めたようですが、ここ1、2年で.

于 2015-07-14T11:06:20.453 に答える
0

最初のスニペットは次と同等です。

my_process: process(clk, reset) begin
  if rising_edge (clk) then
    if reset = '1' then
      --init stuff
    else
      test_array_bit(0);
      test_array_bit(1);
      ............
      test_array_bit(n);
    end if;      
  end if; 
end process;

2番目のものは、リセットロジックとすべてとともに、 各のn+1 プロセスを生成します(そのロジックは異なるプロセスから同じ信号を駆動しようとするため、問題になる可能性があります)。一般に、ループは順次ステートメントを含む順次ステートメントです (つまり、各反復は前の反復の後に実行されるように順序付けられます)。ループは並行ステートメントを含む並行ステートメントであり、これを使用して、たとえばコンポーネントの複数のインスタンスを作成することができます。i
forfor-generate

于 2015-07-13T21:37:18.047 に答える