Verilog / SystemVerilogにおける暗黙のnet宣言について
Verilog / SystemVerilogでは1bit netに関しては宣言なしで使えるという暗黙のnet宣言(implicit net declaration)という仕様があります。この部分の仕様にはVerilog / SystemVerilog間で注意すべき仕様の変更があります。
このあたりの仕様について整理します。
暗黙のnet宣言とは
通常、Verilog/SystemVerilogでは変数は使用前に宣言が必要ですが、暗黙のnet宣言とは、宣言なしで使用した変数をnet宣言とみなすという仕様になります。
(無宣言のnetがいきなりでてくるので、verilogコードのソフトウェア処理をする際には、なかなかに厄介な存在です。)
ただし、これはどこでも使えるわけではなく、
- continuous assignmentの左辺
- module/interface/program/checkerをinstanceした際のport接続
にのみ使えます。
continuous assignmentの右辺や、procedual assigment(=や<=による代入)には使用できません。
このとき生成されるnetの種類は`default_nettypeコンパイラディレクティブで決定されます。
default_nettypeでの規定wire指定
Verilogではdefault_nettypeに以下が指定できます
- wire
- tri
- tri0
- wand
- triand
- wor
- trior
- trireg
- none
SystemVerilogでは加えて以下も使用できます。
- tri1
- uwire
default_nettypeのデフォルト値はwireになっています。noneは暗黙のnet宣言を禁止する設定です。この設定が有効な場合、暗黙のnet宣言はエラーとなります。
module(building block)外で以下のように指定します。
`default_nettype none
コンパイラディレクティブに関する注意
コンパイラディレクティブはコンパイル中に最後に指定した値が後の処理にも引き継がれます。すなわち各実装ファイル中でコンパイラディレクティブを操作すると、各ファイルのコンパイルile順によって動作が変わるという問題を引き起こします。これを起こしてしまうとなかなか発見が難しい問題に直結します。
これを避けるために各ファイルの最初でresetallディレクティブを使って設定をdefault値にリセットする、という対策方法があります。
VerilogとSystemVerilogのdefault_netypeの扱いの変更
default_nettypeに関しては注意すべきVerilog/SystemVerilog間の仕様の違いがあります。 SystemVerilogではportの型定義を省略した場合にも
defaut_nettypeが使われます。
input wire a;
input b; // net宣言が省略されている。ここではdefault_nettypeが使われる。
しかし、verilogの場合はportの型定義を省略した場合には常にwireになります。
`default_nettypeにwire以外の値を設定すると、verilogとsystemVerilogの場合違う定義が使われることになるので注意が必要です。
Discussion