Systemverilogには、次のように使用できるさまざまなデータ型があります。
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
それらの3つはどのように異なりますか?
reg
とwire
は元のタイプでした。ワイヤーは常に割り当てられ、regは特定のポイントで評価されます。ここでの利点は、シミュレーターが最適化を行うことです。
wire w_data;
assign w_data = y;
// Same function as above using reg
reg r_data;
always @*
r_data = y ;
Verilogを学習する際のよくある間違いは、regタイプがハードウェアのレジスタを意味すると仮定することです。シミュレーターの初期の最適化は、その使用状況のコンテキストを通じて実行できます。
これにより、wireとregの代わりに使用できるlogic
が導入されます。
logic w_data;
assign w_data = y;
// Same function as above using reg
logic r_data;
always @*
r_data = y ;
タイプbit
およびbyte
も作成されており、2つの状態0または1のみを保持でき、xまたはzはありません。 byte
はbit [7:0]
を意味します。これらのタイプを使用すると速度が少し向上しますが、RTLで使用しないことをお勧めします。検証では初期化されていない値や重大なリセットが失われる可能性があるためです。
bit
とbyte
の使用はテストベンチコンポーネントでより一般的ですが、データの破損と回復を刺激するためにxを駆動する必要がある場合に問題につながる可能性があります。
更新
この記事を書いている時点では、logic
はトライステートに使用できないという印象を受けていましたが、これに基づいた元の論文を見つけることができません。さらに更新、コメント、または編集するまで、logicはトライステートラインの作成に使用できないという主張を取り消します。
トライステートラインを明示的に定義するために、tri
タイプが追加されました。 wire
のプロパティに基づいており、logic
はreg
のプロパティに基づいています。
tri t_data;
assign t_data = (drive) ? y : 1'bz ;
下位互換性のあるVerilogをサポートする必要がなくなった場合は、logic
とtri
の使用に切り替えることをお勧めします。 logic
を使用するとリファクタリングが容易になり、tri
を使用するとトライステートラインの設計意図が反映されます。
名前のreg
の選択は誤りであることが判明しました 。代わりに、割り当ての実行方法に基づいてレジスタの存在が推測されるためです。このため、reg
の使用は、実際には同じタイプであるlogic
を優先して廃止されます。
logic
は1ビットの4状態データ型です
bit
は1ビットの2状態データ型で、logic
よりも高速にシミュレートできますlogic
もwire
として宣言されている場合、複数のドライバーをサポートする追加機能があります。デフォルトではwire
はwire logic
と同等であることに注意してください。wire
やtri
など)は、通信バスの設計に最も適しています。実際には、 [〜#〜] rtl [〜#〜] の場合、通常、reg
、logic
、またはwire
で宣言するかどうかは関係ありません。 。ただし、4状態型の明示的な宣言を行う必要がある場合( とは反対に とは対照的に)、通常はlogic
を選択する必要がありますそれは言語が意図しているものだからです。
関連記事:
コメントを追加できないので、新しい回答のように見えるが、そうではないものを書く必要があります。はぁ!
@ e19293001、@ Morgan、logic
はbit
とは異なり4状態変数を定義するため、logic
変数を使用して1'bz
したがって、次のコードは有効であり、コンパイルされます。
logic t_data;
assign t_data = (drive) ? y : 1'bz ;
しかし、これらの場合、tri
の代わりにlogic
を使用する必要があるという設計意図を反映することに同意します(tri
の代わりにlogic
を使用している人はいません。 _/wire
が多すぎる)。
論理データ型は、複数のドライバーを許可しません。複数のドライバーが異なる値でそれらを駆動しようとすると、複数の割り当て.Reg/Wireデータ型の場合、最後の割り当てが優先されます。論理データ型は、単に最後の割り当て値を割り当てます。
regとlogicはまったく同じです。これらのデータ型は、常にブロックまたは初期ブロック内に表示され、値を格納します。つまり、常に@(a)b <= a;です.reg bは、「a」が変更された場合にのみ評価されますが、そうでない場合は、最後に割り当てられた値を単に格納します。
ワイヤは単なる接続であり、継続的に駆動する必要があります。 @Morganが言及したのと同じように振る舞うことができることに同意しますが、値が変更されるのは相手側の値のみであるか、ソースが変更されるハードワイヤーの一部であると想像できます。