verilog~module内パラメーターの階層間受け渡し

こんにちは、お久しぶりです。Keymaleです。
今回は verilogのパラメータについて説明します。
以前の記事で説明したDividerを例にして進めようと思います。以下に以前紹介したdividerのプログラムを紹介します。

この中でdiv_numberをregで記述していますが、いろんな値に変えたいと思うとします。その時に、regのままでもいいのですが、わかりやすくするために

parameter div_number

と記述することができます。parameterは32bitのintで扱われます。
このままだったら別にparameterの良さがわからないと思います。
parameterの真価を発揮するのはmodule化した時です。module化した際に様々なdiv_numberのdividerを作りたくなった時には、上位階層から下位階層であるdividerのparameterをいじることができるのですが、少し工夫が必要です。
まず以下のようにparameterを記述する位置を変更しましょう。

変化した場所はわかりましたか?moduleと宣言した後に変化場所があります。
今までは

として、このmodule宣言後のかっこで囲われた中でinput outputを宣言し、上位階層のmoduleとの信号の受け渡し部分になっていましたが、ここにさらにparameterの受け渡し部分を

inputやoutput宣言の前にmodule名の後に#をつけてかっこ内にparameterを宣言することで、上位モジュールからここで宣言したparameterを操作することができます。また、上位モジュールで下位モジュールのparamterをいじらないときは、下位モジュールで宣言したparameter値が読み込まれるので、どっちにしろparameterの宣言はこの場所にしておいてよさそうです。何より、parameterをいろんなところで宣言するとわかりにくいので、module宣言の後に宣言すると決めておくといいでしょう。他にもdefparamで行う方法もあるようですが、私はこの方法を推奨します。
上位moduleからこのmoduleを呼び出すときは以下のように記述します。

上記のようになります。一般的に書くと以下のようになります。

パラメータ値には直接数字を入れてもいいですし、変数でも問題ないです。
以上でパラメータの階層間での受け渡しの説明を終わりにします。
最後まで見ていただいてありがとうございますした。
次回はfor文とgenerate文について説明したいと思います。