2017-12-23 11 views
2

パート1があります:私は常にコードの重複を避けるために、Verilogでの関数を使用するように言われましたなぜのverilogで使用する機能モジュール

に。しかし、私はモジュールでそれを行うことはできませんか?私の理解が正しいとすれば、すべての関数をVerilogでモジュールとして書き直すことができます。ただし、モジュールはalwaysブロックの内部からインスタンス化できません。この場合を除いて、私は常にモジュールに固執することができます。私は正しいですか?

パート2

私が正しいだ場合は、その理由のVerilogコンパイラは、モジュールは機能の治療を受けるように書くことができないのですか?つまり、なぜコンパイラはプログラマがnブロック内のモジュールをインスタンス化して関数をサポートしなくすることができないのでしょうか?

+0

実際には、 'parameters'ブロックと' generate'ブロックを使用して再帰モジュールを作成できます。この[32ビットALU(再帰的に定義されたLACを使用してコンピュータアーキテクチャ用に書いたもの)](https://gist.github.com/patrickroberts/3908606ece975eb4c20b4cd8f8b25dd6)を参照してください。 –

+0

@PatrickRobertsのリンクに感謝します。私は質問 – user3219492

+0

を編集しました。明確にするために、リンクの最上位モジュールの仕様のスクリーンショットをいくつか追加しました。私はあなたがそれをチェックしてうれしいです。好奇心のために、モジュール**ではなくコードの重複を避けるために関数を使用するように指示されましたか?それとも一般的には?一般的に適用されただけでは良いアドバイスだが、モジュールが特定の状況ではより意味をなさないと感じているので、このアドバイスが機能のためにモジュールの使用を積極的に妨げることを示唆しているかどうかは不明です。 –

答えて

2
  1. module!= function。 Verilogでのその使用法はまったく異なります。

    実際には、関数は拡張式であり、式で使用されます。これは、 'assign'ステートメントのrhs式や任意の手続き型ブロック内の式で使用できます。

    • 機能時間を消費しないすることができます。

    • 関数は値を返す必要があります。


    モジュールは、ハードウェア階層を発現し、(機能が含まれているかもしれない)同時手続きブロックを含むために使用されます。

    • モジュールが時間を消費することがあります。

    • モジュールは値を返すことができません。 (出力ポートが値を返されません)


    潜在的にあなたは、単一の内部は常に機能を返す常にブロックと同等のモジュールをブロックし、書き込み置き換える関数を作成することができます。しかし、これはそれです。

  2. あなたは正しくありません:)。 Verilogコンパイラは、すべてのVerilogコンパイラが従わなければならないVerilog標準が存在するため、このような方法で記述することはできません。さもなければそれはverilogではありません。

関連する問題