web-dev-qa-db-ja.com

SystemVerilogデータ型の違い(reg、logic、bit)

Systemverilogには、次のように使用できるさまざまなデータ型があります。

reg [31:0] data;
logic [31:0] data;
bit [31:0] data;

それらの3つはどのように異なりますか?

19
e19293001

regwireは元のタイプでした。ワイヤーは常に割り当てられ、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はありません。 bytebit [7:0]を意味します。これらのタイプを使用すると速度が少し向上しますが、RTLで使用しないことをお勧めします。検証では初期化されていない値や重大なリセットが失われる可能性があるためです。

bitbyteの使用はテストベンチコンポーネントでより一般的ですが、データの破損と回復を刺激するためにxを駆動する必要がある場合に問題につながる可能性があります。


更新

この記事を書いている時点では、logicはトライステートに使用できないという印象を受けていましたが、これに基づいた元の論文を見つけることができません。さらに更新、コメント、または編集するまで、logicはトライステートラインの作成に使用できないという主張を取り消します。


トライステートラインを明示的に定義するために、triタイプが追加されました。 wireのプロパティに基づいており、logicregのプロパティに基づいています。

tri t_data;
assign t_data = (drive) ? y : 1'bz ;

下位互換性のあるVerilogをサポートする必要がなくなった場合は、logictriの使用に切り替えることをお勧めします。 logicを使用するとリファクタリングが容易になり、triを使用するとトライステートラインの設計意図が反映されます。

26
Morgan
  • 名前のregの選択は誤りであることが判明しました 。代わりに、割り当ての実行方法に基づいてレジスタの存在が推測されるためです。このため、regの使用は、実際には同じタイプであるlogicを優先して廃止されます。

  • logicは1ビットの4状態データ型です

  • bitは1ビットの2状態データ型で、logicよりも高速にシミュレートできます
  • logicwireとして宣言されている場合、複数のドライバーをサポートする追加機能があります。デフォルトではwirewire logicと同等であることに注意してください。
  • 一般に、「 nets 」(wiretriなど)は、通信バスの設計に最も適しています。

実際には、 [〜#〜] rtl [〜#〜] の場合、通常、reglogic、またはwireで宣言するかどうかは関係ありません。 。ただし、4状態型の明示的な宣言を行う必要がある場合( とは反対に とは対照的に)、通常はlogicを選択する必要がありますそれは言語が意図しているものだからです。


関連記事:

5
nobar

コメントを追加できないので、新しい回答のように見えるが、そうではないものを書く必要があります。はぁ!

@ e19293001、@ Morgan、logicbitとは異なり4状態変数を定義するため、logic変数を使用して1'bzしたがって、次のコードは有効であり、コンパイルされます。

logic t_data;
assign t_data = (drive) ? y : 1'bz ;

しかし、これらの場合、triの代わりにlogicを使用する必要があるという設計意図を反映することに同意します(triの代わりにlogicを使用している人はいません。 _/wireが多すぎる)。

2
Paddu

論理データ型は、複数のドライバーを許可しません。複数のドライバーが異なる値でそれらを駆動しようとすると、複数の割り当て.Reg/Wireデータ型の場合、最後の割り当てが優先されます。論理データ型は、単に最後の割り当て値を割り当てます。

0

regとlogicはまったく同じです。これらのデータ型は、常にブロックまたは初期ブロック内に表示され、値を格納します。つまり、常に@(a)b <= a;です.reg bは、「a」が変更された場合にのみ評価されますが、そうでない場合は、最後に割り当てられた値を単に格納します。

ワイヤは単なる接続であり、継続的に駆動する必要があります。 @Morganが言及したのと同じように振る舞うことができることに同意しますが、値が変更されるのは相手側の値のみであるか、ソースが変更されるハードワイヤーの一部であると想像できます。

0
Vinayak Bhat