回答:
動作コードは高レベルであり、通常は合成できません。ループ、遅延、「初期」ステートメントなどの構造は動作です。
RTLコードは下位レベルであり、合成を目的としています。これは、相互接続されたレジスタとそれらのレジスタ間の信号に対して実行される操作の組み合わせとして回路を定義します。
Yahoo Answersから取得し、Googleですぐに見つかりました!
「レジスタ転送レベル」コードは、レジスタとそれらの間にある組み合わせロジックの観点から記述されたコードであり、合成ツールへの入力として使用することを目的としています。コードは、言語の合成可能なサブセット[1]に固執します。明示的な遅延はなく、すべてのタイミングはクロックエッジに関するものです。レベルでトリガーされるラッチを表す構造体は、一般的に回避されます。レジスタは、通常、タイミングアナライザに詳細を提供できる少数のクロックでクロックされます。組み合わせロジックは通常、複雑さを制限する単一のクロックサイクル内で安定することが期待されています[2]。これはゲートレベルモデルよりも高いレベルですが、すべてのレジスタがすべてのクロックサイクルで持つ値を定義します。
「動作」コードは一般に、シミュレーションで使用するためのより高いレベルの動作を記述するコードですが、合成可能にすることは意図されていません。シミュレーションでデザインを取り巻く環境を説明するために使用できます。これは、個々のモジュールの詳細なRTL設計に取り掛かる前に、全体的な設計を整えるための設計の初期段階として使用できます。
[1]許可される正確なサブセットは、合成ツールによって異なります。
[2]シミュレーションよりも1サイクル以内に安定しない場合、合成によって異なる結果が得られる可能性があり、タイミングアナライザーは、明示的に指示されない限り違反を示します。
それは同じ言語ですが、異なるスタイルが使用されています。経験を積むと、すぐに見分けることができます。それぞれの特徴をいくつか次に示します。
通常、動作のVerilogコードは、initial begin
ブロック内で上から下に実行される順次コンピュータープログラムのように見えます。出力は、コンソール$display()
やファイルシステム、$open
またはを使用した波形ダンパーなどのシミュレータ機能への出力となる可能性があるため、最上位の動作モジュールで定義された入出力ポートがない場合が$dumpfile
あり$dumpvars
ます。長いシミュレーション時間待機#4000
などを使用して実装されたステートメントとタスクの呼び出しの間の遅延に注意してくださいwishbone_master.checked_read(addr, value)
。これらのより高いレベルの構成では、同等の合成テクノロジーがどのようなものであるか、または可能であるかは明らかではありません。
合成用のVerilogには常に入力/出力ポートがあります。ポートが接続されていない場合、モジュールには副作用がなく、削除できるためです[1]。遅延はおそらく特定のクロックのサイクルをカウントすることによって実装されます。一部のVerilogシステム関数は、たとえば$clog2(PARAMETER)
合成用のコードで許可される場合があるため、の存在は$function
どちらの方法でも保証されないことに注意してください。合成用のコードは、それぞれが機密リストを持つ独立した「プロセス」の多くで構成される傾向があります。一部のテクノロジではinitial begin
、メモリの初期化のためにブロックを許可しているため、保証はありません。
最終的に、設計者は自分が書くコードの目的を知っており、合成ツールセットまたはシミュレータでそれを適切に呼び出します。
[1] JTAGなどの内部チップ設備へのバックドア接続を行う可能性がある特定のIPブロックを除く