web-dev-qa-db-ja.com

Verilogで入力または出力を使用してwireまたはregを使用する

入力または出力として何かを宣言するとき、それをregまたはwireとしても宣言する必要があるかどうかをどのように知るのですか?

32
node ninja

regおよびwireは、オブジェクトの割り当て方法を指定するため、出力に対してのみ意味があります。

alwaysブロック内など、シーケンシャルコードで出力を割り当てる場合は、regとして宣言します(これは、Verilogの「変数」の誤称です)。それ以外の場合は、wireである必要があり、これもデフォルトです。

30
Jan Decaluwe

output reg fooは、output foo_wire; reg foo; assign foo_wire = fooの省略形です。とにかくその出力を登録する予定がある場合に便利です。 input regmodule(おそらくtask)にとって意味がないと思います。 input wireおよびoutput wireは、inputおよびoutputと同じです。より明確です。

16
Ben Jackson

使用するVerilogコードコンパイラによって、haveの実行内容が決まります。不正な構文を使用すると、コンパイルエラーが発生します。

outputは、「手続き型割り当て」を使用して割り当てられている場合にのみ、regとして宣言する必要があります。例えば:

output reg a;
always @* a = b;

outputwireとして宣言する必要はありません。

inputwireまたはregとして宣言する必要はありません。

6
toolic

デジタル回路ドメインで見る

  1. Assignステートメントはポート/ピン接続を作成し、ワイヤーはポート/ピンに結合できるため、ワイヤーはassignステートメントを使用して任意の入力のみを割り当てることができるワイヤー出力を作成します
  2. Regは、感度リストに基づいて入力を取得または受信するレジスタ(D FLIP FLOP)を作成します。これは、クロック(立ち上がりまたは立ち下がり)または組み合わせEdgeのいずれかです。

したがって、レジスタを作成して感度リストに従ってチェックする必要があるか、ポート/ピン割り当てを作成するかは、使用法に完全に依存します。

4
Rahul Jain

基本的に、regは値を格納するために使用されます。たとえば、カウンターが必要な場合(カウントするため、各カウントに値があります)、regを使用します。一方、0と1の2つの値を持つ単純な信号がある場合、wireとして宣言します。wireは値を保持できません。したがって、wireに値を割り当てると問題が発生します。

2
john_conner