5.サブモジュール

5-1.サブモジュールの解説(入出力)

サブモジュールは階層構造を記述するための構文です。
階層構造を作るためには上位と下位の最低2個のモジュールを用意する必要があります。

サブモジュール宣言は上位モジュールで行います。
また、サブモジュール化する下位モジュールのことを”テンプレート”と呼びます。
サブモジュール宣言は、テンプレートを指定して実体化します。
この実体化したテンプレートを” インスタンス”(実体) と呼びます。

テンプレートのインスタンスを作成することで、
・インスタンスへの入力データ線への任意の値を入力
・インスタンスの制御入力信号の呼び出し
・インスタンスの制御出力信号の受け取り
などが可能になります。
サブモジュール構文は以下の方法で宣言します。

テンプレート名 インスタンス名

また、インスタンス名をカンマで区切って複数記述することで、
インスタンスを複数用意することが可能です。

また、同じ名前で、複数のインスタンスを作る“多重度”も指定できます。
多重度は以下の用に宣言します。

テンプレート名 インスタンス名[多重度数]

多重度数は自然数で表記します。

サブモジュール構文を使用すると、上位モジュールからインスタンスの各端子を操作することができます。
また、インスタンスから上位モジュールにデータを渡す等のアクションができます。
インスタンスのデータや制御線など各端子を指定する場合は以下の様に記述します。

インスタンス名.端子名

これを用いることで、インスタンスの値読み出しや転送を行うことができます。

サブモジュール構文の使用例として以下の例題31を見てみましょう。

【例題31.サブモジュール使用例】
//サブモジュール sub_ex31
declare sub_ex31 {
   input a[4], b[4] ;
   output f[4] ;
}
module sub_ex31 {
   f = a + b ;
}

//トップモジュール ex31
declare ex31 {
   input inA[4], inB[4] ;
   output outF[4] ;
}
module ex31 {
   //サブモジュールsub_ex30を、SUBという名前でインスタンス化
   sub_ex31 SUB ; //式1

   {
      SUB.a = inA ; //式2
      SUB.b = inB ; //式3

      outF = SUB.f ; //式4
   }
}

例題31はトップモジュールex31とサブモジュールsub_ex31で構成しています。
sub_ex31はex31内の式1で、SUBという名前でインスタンス化を宣言しています。
式2は、inAをSUBのデータ入力端子aに代入するという意味のアクションです。
式3は、inBをSUBのデータ入力端子bに代入するという意味のアクションです。
そして、式4はSUBのデータ出力端子fをoutFに代入するという意味のアクションです。

それでは、例題31のシミュレーション結果を見てみましょう。

5-2.サブモジュールの解説(制御端子)

サブモジュール構文を使えば、インスタンスの制御端子を呼び出すことも可能です。
インスタンスの制御入力端子を呼び出す場合は以下の様に記述します。

インスタンス名.制御入力端子名()

また、インスタンスの制御入力端子に実引数を持たせる場合は以下の様に記述します。

インスタンス名.制御入力端子名(
<実引数>, <実引数>, <実引数>, …)

実引数を複数持たせる場合は、カンマ”,” で区切って下さい。
そして、制御入力端子を呼び出すと同時に、出力信号を受け取る場合の記述方法は以下の様に記述します。

インスタンス名.制御入力端子名(
<実引数>).端子名

サブモジュール構文の制御端子の使用例として、以下の例題32を見てみましょう。

【例題32.サブモジュール使用例(制御端子)】
//サブモジュール sub_ex32
declare sub_ex32 {
   input a[4], b[4] ;
   output f[4] ;

   func_in exec_start(a, b) ;
   func_out end_call(f) ;
}
module sub_ex32 {
   wire w1[4] ;

   function exec_start {
      w1 = a + b ;
      end_call(w1) ;
   }

}
//トップモジュール ex32
declare ex32 {
   input inA[4], inB[4] ;
}
module ex32 {
   reg result_reg[4] ;
   reg r1=0, r2=0, r3=0 ;

   //サブモジュールsub_ex32をU_SUBという名前でインスタンス化
   sub_ex32 U_SUB ; //式1

   r1 := 0b1 ; r2 := r1 ; r3 := r2 ;

   if(r1 & r2 & ~r3) U_SUB.exec_start(inA, inB) ; //式2

   if(U_SUB.end_call) result_reg := U_SUB.f ; //式3
}

例題32は、サブモジュール内部の制御端子を使用する例題です。
例題32は、トップモジュールex32とサブモジュールsub_ex32で構成しています。
初めに、ex32内部の式1で、sub_ex32をU_SUBという名前でインスタンス化しています。
式2では、if条件文が真の場合、U_SUBの制御入力端子startを引数1を与えて呼び出しています。
そして式3は、if条件文でU_SUBの制御出力端子end_callが真ならば、
レジスタreg_buffにU_SUBのデータ出力端子fを代入するというアクションです。

では、例題32のシミュレーション結果を見てみましょう。

5-3.サブモジュールの解説(パラメータ渡し)

●パラメータの宣言
サブモジュール構文を使ったパラメータ渡しについて解説します。
パラメータ構文は、上位モジュールと下位モジュールの階層構造を作成した場合、
上位から下位へパラメータを渡す場合に使用する構文です。
パラメータは、下位モジュールを作成する際の設定値になります。
下位モジュールに任意のパラメータを渡すことで、起動時の状態を変化させることが可能となります。

パラメータ構文は「ソースコードを開示しないモジュール」を作る場合などに利用できます。

また、モジュールのパラメータはdeclare 構文で宣言し、整数値型と文字列型の2種類が利用可能です。
パラメータの宣言例

param_int パラメータ名 // 整数値型パラメータ(符号付き32bit整数)

param_str パラメータ名 // 文字列型パラメータ(制限無し。処理環境のメモリに依存)

パラメータ構文の使用例として以下の例題33を見てみましょう。

【例題33.サブモジュール使用例(パラメータ)】
// 下位モジュールとなるtest_sub
declare test_sub {
// パラメータの宣言
param_int A, B ; // 整数値型パラメータA,B の宣言
param_str C ; // 文字列型パラメータC の宣言
input in_A ;
input in_B ;
}
module test_sub {
// 内部構成要素の宣言部分
// 動作記述部分
}

// 上位モジュールとなるex32
declare ex33 {
// 入出力構成要素
}
module ex33 {
// 内部構成要素のサブモジュール宣言
test_sub SUB1(A=15, B=22, C = "NEKO") ; // パラメータをサブモジュール"SUB1" に渡して宣言。
test_sub SUB2 ; // 単体のサブモジュール宣言
test_sub SUB3, SUB4 ; // 複数のサブモジュール宣言

// 動作記述部分
}