systemverilog には、次のように使用できるさまざまなデータ型があります。
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
それらの3つはどのように異なりますか?
systemverilog には、次のように使用できるさまざまなデータ型があります。
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
それらの3つはどのように異なりますか?
regそしてwire元のタイプでした。ワイヤは常に割り当てられ、レジスタは特定のポイントで評価されます。ここでの利点は、シミュレータが最適化を行うことです。
wire w_data;
assign w_data = y;
// Same function as above using reg
reg r_data;
always @*
r_data = y ;
Verilog を学習する際によくある間違いは、a reg 型がハードウェアのレジスタを意味すると想定することです。シミュレーターの以前の最適化は、その使用状況のコンテキストを通じて行うことができます。
logicこれは、ワイヤーとレッグの代わりに使用できるものを紹介します。
logic w_data;
assign w_data = y;
// Same function as above using reg
logic r_data;
always @*
r_data = y ;
0 または 1 の x または z のない 2 つの状態のみを保持できる型bitおよび型も作成されています。を意味します。これらのタイプを使用すると速度がわずかに向上しますが、初期化されていない値や重大なリセットが検証で見落とされる可能性があるため、RTL では使用しないことをお勧めします。bytebytebit [7:0]
との使用はbit、byteテストベンチ コンポーネントでより一般的ですが、データの破損と回復を刺激するために x を駆動する必要がある場合、問題が発生する可能性があります。
アップデート
これを書いている時点ではlogic、トライステートには使用できないという印象を受けていましたが、これに基づいた元の論文を見つけることができません。今後の更新、コメント、または編集が行われるまで、ロジックを使用してトライステート ラインを作成することはできないという私の主張を取り消します。
triトライステート ラインを明示的に定義するために、タイプが追加されました。のプロパティにwire基づいています。logicのプロパティに基づいていますreg。
tri t_data;
assign t_data = (drive) ? y : 1'bz ;
後方互換性 Verilog をサポートする必要がなくなった場合は、 and の使用logicに切り替えることをお勧めしtriます。を使用するlogicと、リファクタリングが容易になりtri 、トライステート ラインの設計意図が反映されます。
名前の選択はreg 間違いであることが判明しました。代わりに、割り当ての実行方法に基づいてレジスタの存在が推測されるためです。このため、 の使用は、実際には同じ型である をreg支持して、本質的に推奨されません。logic
logic1 ビット、4 状態のデータ型です
bitよりも高速にシミュレートできる 1 ビット、2 状態のデータ型です。logiclogicが としても宣言されている場合、wire複数のドライバーをサポートする追加機能があります。デフォルトwireでは と同等であることに注意してくださいwire logic。wire)triが最適です。実際には、RTLregでは通常、 、 またはlogic、 または で宣言するかどうかは問題ではありませんwire。ただし、4 状態型の明示的な宣言を行う必要がある場合 (そうしない場合とは対照的に)、通常はそれを選択する必要がありますlogic。これは、言語が意図していることだからです。
関連記事:
コメントを追加できないので、新しい回答のように見えるがそうではないものを書く必要があります。はぁ!
@ e19293001、@ Morgan はlogicとは異なり、4 状態の変数を定義しているbitため、logic変数を使用して保存1'bzできるため、次のコードは有効でコンパイルされます。
logic t_data;
assign t_data = (drive) ? y : 1'bz ;
しかし、デザインの意図を反映するには、これらの場合triの代わりに使用する必要があることに同意します (ただし、 /の代わりにlogic使用する人はあまり見かけません)。trilogicwire