入力または出力として何かを宣言するとき、それをreg
またはwire
としても宣言する必要があるかどうかをどのように知るのですか?
reg
およびwire
は、オブジェクトの割り当て方法を指定するため、出力に対してのみ意味があります。
always
ブロック内など、シーケンシャルコードで出力を割り当てる場合は、reg
として宣言します(これは、Verilogの「変数」の誤称です)。それ以外の場合は、wire
である必要があり、これもデフォルトです。
output reg foo
は、output foo_wire; reg foo; assign foo_wire = foo
の省略形です。とにかくその出力を登録する予定がある場合に便利です。 input reg
はmodule
(おそらくtask
)にとって意味がないと思います。 input wire
およびoutput wire
は、input
およびoutput
と同じです。より明確です。
使用するVerilogコードコンパイラによって、haveの実行内容が決まります。不正な構文を使用すると、コンパイルエラーが発生します。
output
は、「手続き型割り当て」を使用して割り当てられている場合にのみ、reg
として宣言する必要があります。例えば:
output reg a;
always @* a = b;
output
をwire
として宣言する必要はありません。
input
をwire
またはreg
として宣言する必要はありません。
デジタル回路ドメインで見る
したがって、レジスタを作成して感度リストに従ってチェックする必要があるか、ポート/ピン割り当てを作成するかは、使用法に完全に依存します。
基本的に、regは値を格納するために使用されます。たとえば、カウンターが必要な場合(カウントするため、各カウントに値があります)、regを使用します。一方、0と1の2つの値を持つ単純な信号がある場合、wireとして宣言します。wireは値を保持できません。したがって、wireに値を割り当てると問題が発生します。