2016-11-02 6 views
3

C/C++、Fortran、Juliaなどのコンピュータ言語向けの最新のコンパイラのより有用な機能の1つは、バイナリを生成する前にコードの最適化を実行できることです。 VerilogにFPGAの「ハードウェア」特殊機能を作るための関数を書くとすれば、コンパイラは最適化を実行しますか?具体的な例として、Estrin's scheme for parallelized evaluationを使用する多項式エバリュエーターを設定したいとし、係数の一部が0であるとすれば、コンパイラはそれを見て有効なNOOPを最適化しますか?FPGA言語のコンパイラは最適化を実行しますか?

答えて

5

はい。あなたの例での最適化は、 "定数伝播"と呼ばれています。ブール式や算術式の最適化については、すべてのコンパイラで同じです。コンパイラは、できる表現を単純化します。別の最適化は「デッドコード削除」です。分岐条件が定数であると判明した場合は、選択されていない分岐を削除し、分岐を無条件にします。しかし、RTLがハードウェア表現に変換された後、最適化プロセスはソフトウェアコンパイラとは大きく異なります。

+0

ループに適度な一定数の反復がある場合、コンパイラはそれをハードウェアに展開しますか?この種の言語では、標準の並列アンロール(ループが独立している場合)とシリアルアンロール(各繰り返しがある値を変更している場合)の両方の可能性があるようです。 –

+2

_loops_はハードウェアに存在しません。ハードウェアには手順上の記述が存在しません。 RTLコードのウェイ・ループがハードウェアで実装されるのは、このフォーラムにとっては広すぎるトピックです。 –

+0

これは当てはまりませんか?私はハードウェアの人ではないので、間違っている可能性がありますが、ハードウェアは、減少するカウンタがゼロでなく、「次の反復の準備ができました」フラグが設定されているときに実行される繰り返しを実装できるはずです。それらは可能ではない、あるいは何らかの形で実用的でない(すなわち不安定である)か? –

0

Verilogには、合成時に常に完全にアンロールされるgenerate文のループがあります。

+1

Verilogに書き込む_Any_ループは、生成するかどうかを問わず、ハードウェアに展開する必要があります。 –

関連する問題