モジュールとデータ型


モジュール

Verilog HDLでは,基本的にモジュール (module)という単位でシステムを設計していきます.
モジュールとは,ある機能を実現するブラックボックスです.以下のように定義します.

module モジュール名(ポートの定義);

モジュール内部の記述

endmodule

はじめに,moduleと記述し,その後ろにモジュール名を記述します.
このモジュール名は任意ですが,できるだけそのモジュールの機能がわかるような名前にしましょう.

そして,その次に記述するのは,モジュールのポートリストです.これは,モジュールにどのような入力や出力があるかを定義します.
ここでは,ポートの名前を宣言します.複数のポートがある場合には,カンマ( , )で区切ります.

そして,次の行以降でどのようなポートの種類なのかを定義します.ここで定義できるポートの種類としては,以下の3つです.

  • input: 入力ポートを定義
  • output: 出力ポートを定義
  • inout: 双方向ポートの定義 入力と出力のどちらにも使用可能

ポートの定義は,上のキーワードを記述した後,任意のポート名を記述することで行えます.

そして,具体的なモジュール内部の記述を書き,最後にendmoduleとすることで,1つのモジュールの記述ができます.注意点としては,moduleキーワードの行末はセミコロン( ; )であるのに対し,endmoduleキーワードの後ろには何も記述しないということです.

例えば,clkという入力を持つ,verilog_exerciseという名前のモジュールは以下のように宣言します.

ビット幅

上記のようにモジュールのポートを定義しますが,実際の信号線は1ビットのものもあれば,複数のビットを持つバスラインにしたい場合もあるでしょう.
このように,ビット幅を指定したい場合には以下のように[]を使います.

input [ MSBのビット番号 : LSBのビット番号 ] ポート名;
ビット幅を何も指定しなければ1ビットになります.

例えば,”indata”という8ビットの入力ポートの場合,

input [7:0] indata;
とします.
bit

以下がモジュールの宣言とポートリスト定義の例です.

このように記述すると,verilog_exerciseという名前のモジュールが作成できます.
module

ちなみに,コメントに関してはC言語と同じで,「//」とスラッシュを2つ続けたり,「/*」「*/」でくくることで実現されます.

注意点
例えば,8ビット幅の2つの入力,indata1とindata2を宣言する場合,C言語のくせでついつい
というように2ついっぺんに宣言したくなると思いますが,こうするとindata1は8ビット幅になりますが,indata2は1ビットの入力となってしまいます.
正しく宣言するには,
と分けて宣言するようにしましょう.

データ型

ここまでは,モジュールの入出力に関する説明を行いました.ここからは,モジュールの具体的な中身を記述する方法を説明していきます.
モジュールの中身を記述するとき,Verilog HDLでは基本的に以下の2つのデータ型を用います.

  • wire
  • reg

wireはネット型,regはレジスタ型とそれぞれ呼びます.
wireは基本的に配線,regは基本的にレジスタを記述する際に用います.以下のように,配線やレジスタに名前をつけて宣言します.

wire 配線名;
reg レジスタ名;

この2つのデータ型についても,ビット幅を指定することが可能です.ビット幅に指定の仕方はポートの定義と同じです.

これらの具体的な使い方は,次節以降で述べたいと思います.